STM32
直播中

颜立歆

7年用户 919经验值
擅长:控制/MCU
私信 关注
[问答]

STM32F030F4 adc采集异常的原因?

单片机型号:STM32F030F4P6
问题:
做ADC采集时,如果不调用LED_Init()函数,ADC的读数最大值就会变成1024,只有10位精度,而且如果把LED 的初始化函数放在ADC初始化函数后面,读数也时最大1024,把LED 初始化函数放在ADC 初始化函数之前,读数就正常,精度变为12位,经排查,时钟源无异常,LED 初始化函数中,必须有GPIO_Init,其他的都可以没有,如果没有这个函数,ADC读数也会异常,求大神帮忙分析原因,感谢

  • #include "ALL_Includes.h"//包含所需的头文件


  • /************************
  • 函数功能:总初始化
  • 输入参数:无
  • 输出参数:无
  • 备    注:无
  • ************************/
  • void ALL_Config(void)
  • {

  •         USART1_Init(115200);
  •         Delay_Init(72);
  •         LED_Init();
  •         Adc_Init();
  • }

  • int main(void)
  • {
  •         ALL_Config();
  •         while(1)
  •         {

  •                 printf("PA1_IN1 = %d",Get_Adc1(1));
  •                 printf("        PA2_IN2 = %d",Get_Adc1(2));

  •                 delay_ms(50);
  •                 printf("rn");
  •         }
  • }



  • #include "ADC.h"

  • //初始化ADC
  • void  Adc_Init(void)
  • {
  •   GPIO_InitTypeDef  GPIO_InitStructure;
  •         ADC_InitTypeDef       ADC_InitStructure;

  •   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA时钟

  •   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC时钟

  •   //先初始化ADC1通道1 IO口
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA1 通道1
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  •   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  •   GPIO_Init(GPIOA,  GPIO_InitStructure);//初始化

  •   //先初始化ADC1通道1 IO口
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA2 通道2
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  •   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  •   GPIO_Init(GPIOA,  GPIO_InitStructure);//初始化

  •         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1复位
  •         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //复位结束


  •   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  •   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
  •   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  •   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
  •   ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
  •   ADC_Init(ADC1,  ADC_InitStructure);//ADC初始化

  •   ADC_GetCalibrationFactor(ADC1);

  •         ADC_TempSensorCmd(ENABLE);

  •   ADC_Cmd(ADC1, ENABLE);//开启AD转换器

  •         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN ));

  • }

  • u16 Get_Adc1(u8 ch)
  • {
  •   ADC_ChannelConfig(ADC1,1

回帖(1)

王桂兰

2024-4-12 16:04:06
问题的原因可能是电路布局或者电源噪声引起的干扰。

1. 当你调用LED_Init()函数时,它会初始化GPIO口,如果不调用LED_Init()函数,GPIO口可能没有被正确初始化,导致ADC引脚的输入电平不稳定。这可能会导致ADC读数异常。

2. 如果你将LED初始化函数放在ADC初始化函数后面,可能会导致ADC引脚的输入电平不稳定。这可能是因为在ADC初始化之前,LED引脚已经被激活为输出,当ADC初始化后改变为输入时,LED引脚上可能会有瞬态电平,导致ADC读数异常。

3. 如果将LED初始化函数放在ADC初始化函数之前,可能会导致ADC引脚的输入电平稳定。这是因为LED初始化函数中可能会对GPIO口进行初始化,这可能会导致GPIO口的电平变为默认的稳定状态,从而保证ADC引脚的输入电平稳定。

综上所述,你可能需要检查电路布局和电源噪声等因素,确保GPIO口和ADC引脚的输入电平稳定,并且按照正确的顺序进行初始化。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分