你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030F4 adc采集出现神奇异常,求围观解决

[复制链接]
dhhgvm 提问时间:2019-3-20 23:24 /
单片机型号:STM32F030F4P6
问题:

做ADC采集时,如果不调用LED_Init()函数,ADC的读数最大值就会变成1024,只有10位精度,而且如果把LED 的初始化函数放在ADC初始化函数后面,读数也时最大1024,把LED 初始化函数放在ADC 初始化函数之前,读数就正常,精度变为12位,经排查,时钟源无异常,LED 初始化函数中,必须有GPIO_Init,其他的都可以没有,如果没有这个函数,ADC读数也会异常,求大神帮忙分析原因,感谢
  1. #include "ALL_Includes.h"//包含所需的头文件


  2. /************************
  3. 函数功能:总初始化
  4. 输入参数:无
  5. 输出参数:无
  6. 备    注:无
  7. ************************/
  8. void ALL_Config(void)
  9. {
  10.        
  11.         USART1_Init(115200);
  12.         Delay_Init(72);
  13.         LED_Init();
  14.         Adc_Init();
  15. }

  16. int main(void)
  17. {       
  18.         ALL_Config();
  19.         while(1)
  20.         {
  21.                
  22.                 printf("PA1_IN1 = %d",Get_Adc1(1));
  23.                 printf("        PA2_IN2 = %d",Get_Adc1(2));
  24.                
  25.                 delay_ms(50);
  26.                 printf("\r\n");
  27.         }
  28. }
复制代码
  1. #include "ADC.h"

  2. //初始化ADC                                                                                                                          
  3. void  Adc_Init(void)
  4. {   
  5.   GPIO_InitTypeDef  GPIO_InitStructure;
  6.         ADC_InitTypeDef       ADC_InitStructure;
  7.                                
  8.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA时钟
  9.        
  10.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC时钟

  11.   //先初始化ADC1通道1 IO口
  12.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA1 通道1
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  14.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  15.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
  16.        
  17.   //先初始化ADC1通道1 IO口
  18.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA2 通道2
  19.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  20.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
  21.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
  22.          
  23.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1复位
  24.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //复位结束         

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

  32.   ADC_GetCalibrationFactor(ADC1);
  33.        
  34.         ADC_TempSensorCmd(ENABLE);       
  35.        
  36.   ADC_Cmd(ADC1, ENABLE);//开启AD转换器       
  37.        
  38.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN ));
  39.        
  40. }       

  41. u16 Get_Adc1(u8 ch)   
  42. {
  43.   ADC_ChannelConfig(ADC1,1<<ch,ADC_SampleTime_239_5Cycles);
  44.         ADC1->CHSELR = (u32)1<<ch;
  45.        
  46.         ADC_StopOfConversion(ADC1);//停止转换
  47.         ADC_ClearFlag(ADC1, ADC_FLAG_EOC);  //此处至关重要,一定要清除完成转换标志
  48.        
  49.         while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET)
  50.                 ;
  51.   ADC_StartOfConversion(ADC1);       
  52.        
  53.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
  54.        
  55.         return ADC_GetConversionValue(ADC1);       
  56. }
复制代码


无标题.png

STM32F030_ADC.zip

下载

4.46 MB, 下载次数: 30, 下载积分: ST金币 -1

收藏 评论11 发布时间:2019-3-20 23:24

举报

11个回答
wenyangzeng 回答时间:2019-3-21 10:01:53
不明白楼主为何在初始化完ADC后又来了这2句:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);  
貌似把初始化过程作废了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

dhhgvm 回答时间:2019-3-21 12:53:25
wenyangzeng 发表于 2019-3-21 10:01
不明白楼主为何在初始化完ADC后又来了这2句:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   
R ...

据说时初始化ADC状态,我删掉这两句试试
dhhgvm 回答时间:2019-3-21 17:51:36
wenyangzeng 发表于 2019-3-21 10:01
不明白楼主为何在初始化完ADC后又来了这2句:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   
R ...

这两句话没有产生任何影响
wenyangzeng 回答时间:2019-3-21 17:54:18
dhhgvm 发表于 2019-3-21 17:51
这两句话没有产生任何影响

官方例程可以参考:
ADC_DMA.rar (30.56 KB, 下载次数: 22)
edmundlee 回答时间:2019-3-21 19:36:07
我觉得楼主你先检查一下AVCC接没接到电源

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

dhhgvm 回答时间:2019-3-22 12:11:38
edmundlee 发表于 2019-3-21 19:36
我觉得楼主你先检查一下AVCC接没接到电源

请问AVCC是什么?
edmundlee 回答时间:2019-3-22 16:04:43
dhhgvm 发表于 2019-3-22 12:11
请问AVCC是什么?

写反了, 是VDDA
dhhgvm 回答时间:2019-3-23 20:36:34

接了,但是没有什么效果
jensen169 回答时间:2020-6-29 20:41:22
我测试了使用内部时钟就正常,不清楚原因,注释掉LED_Init();也正常
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版