首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 ADC值读数过高

STM32 ADC值读数过高
EN

Stack Overflow用户
提问于 2014-07-17 08:12:26
回答 4查看 8.2K关注 0票数 3

我使用STM3240G-EVAL板从ADC读入值。我使用下面的打印功能将ADC的值打印到我板上的LCD上。我将温度传感器物理连接到评估板上的3.3V、ADC3和GND。返回的值太大。ADC分辨率应为12位,因此4096应为ADC_GetConversionValue函数输出的最大值。我正在接收室温下的5000+值!有没有人能直觉地知道为什么ADC值会变大?

代码语言:javascript
复制
////// stm324xg_eval.c
// to configure the ADC
void STM_EVAL_TEMPInit(Temp_TypeDef Temp) 
{

RCC_PCLK2Config(RCC_HCLK_Div8);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
/* Enable the GPIO_TEMP Clock */
RCC_AHB1PeriphClockCmd(GPIO_TEMP_CLK[Temp], ENABLE);

/* Configure the GPIO_TEMP pin */
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_TEMP_PIN[Temp];
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_TEMP_PORT[Temp], &GPIO_InitStructure);


/* Enable ADC3 Clock */
ADC_InitTypeDef           ADC_InitStructure;
ADC_CommonInitTypeDef     ADC_CommonInitStructure;

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;
ADC_CommonInit(&ADC_CommonInitStructure);

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;      
ADC_Init(ADC3, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC3, ADC_Channel_4, 1, ADC_SampleTime_144Cycles);
ADC_Cmd(ADC3, ENABLE);
}


////// main.cpp
// to print to lcd  
ADC_SoftwareStartConv(ADC3);
temp_value = ADC_GetConversionValue(ADC3);
uint8_t mymsg[20];
sprintf((char *)mymsg, "ADC = %d",(int)temp_value);
LCD_DisplayStringLine(Line6, mymsg);


////// stm32f4xx_adc.c
// ADC_GetConversionValue function
/**
* @brief  Returns the last ADCx conversion result data for regular channel.
* @param  ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
* @retval The Data conversion value.
*/
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
{
   /* Check the parameters */
   assert_param(IS_ADC_ALL_PERIPH(ADCx));
   /* Return the selected ADC conversion value */
   return (uint16_t) ADCx->DR;
}
EN

回答 4

Stack Overflow用户

发布于 2014-08-05 23:42:36

我缺少一个ADC配置;

代码语言:javascript
复制
ADC_InitStructure.ADC_NbrOfConversion = 1;

确保在使用ADC时使用了所有配置,并且没有遗漏任何配置。在包含这个之后,我能够使用万用表获得与传感器读取的ADC值相同的电压。

新增说明:

这是因为您已经将以下结构定义为本地结构:

代码语言:javascript
复制
ADC_InitTypeDef           ADC_InitStructure;

ADC_CommonInitTypeDef     ADC_CommonInitStructure;

并且局部变量具有不可靠(随机)初始值,因此当其已被写入相应的寄存器中时,其可能导致例如变为不适当的数字,从而造成这样的问题。

票数 3
EN

Stack Overflow用户

发布于 2014-07-18 05:37:52

您必须等待转换完成:

代码语言:javascript
复制
ADC_SoftwareStartConv(ADC3);

while( ADC_GetFlagStatus( ADC3, ADC_FLAG_EOC ) == RESET )
{
    // do nothing (or something useful perhaps)
}

temp_value = ADC_GetConversionValue(ADC3);
票数 2
EN

Stack Overflow用户

发布于 2014-07-17 10:09:29

您是否测量了温度传感器上的电压、ACD输入端上的电压和设备上的VCC电压?最好在获取此5000+输出时包含它们的运行时值。

您是否尝试将已知的提前电压(例如3.3V)馈送到相同的ADC输入,并比较测量/获得的值?因为你测量的电压和4+V一样,取5000+。

至于代码,最好屏蔽返回值,以便只考虑12位:

return (uint16_t) ((ADCx->DR) & 0xFFF)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24792904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档