c++ - STM32 ADC 值读数太高

标签 c++ c embedded stm32 adc

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

////// 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;
}

最佳答案

我缺少 ADC 配置;

ADC_InitStructure.ADC_NbrOfConversion = 1;

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

添加说明:

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

ADC_InitTypeDef           ADC_InitStructure;

ADC_CommonInitTypeDef     ADC_CommonInitStructure;

并且局部变量有一个不可靠(随机)的初始值,这样它可能会导致例如ADC_NbrOfConversion变成不合适的数字,使得这样当它已写入相应的寄存器时出现问题。

关于c++ - STM32 ADC 值读数太高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24792904/

相关文章:

c++ - 字符串流转换错误

c - 得到 "error: expected identifier or ' ('"

c++ - opengl-es 二维绘图库

linux - 理解Linux内核中的异常

c++ - Linux - 如何为连接的设备设置自定义波特率

c++ - Mac OS X 上的 Emacs 24 和 GDB 6.3

确保释放已用内存的 C++ 宏?

过去 12 个月的晶体排序

c - 如何访问 C 变量以进行内联汇编操作?

c++ - 如何防止声明为局部变量的对象在堆栈中分配?