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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版