STM8L052 IAR环境下ADC奇怪的现象

2019-12-17 21:29发布

本帖最后由 add00 于 2016-9-21 18:50 编辑

STM8L052 IAR环境下ADC单次采样,出现一个问题? 判断EOC后读出来的值和ADC_Cmd(ADC1,ENABLE)与ADC_SoftwareStartConv(ADC1)之间的延迟时间相关;
之前都说第一次采样的值不对,其实是第一次ADC_Cmd(ADC1,ENABLE)与ADC_SoftwareStartConv(ADC1)之间的延迟时间不够,当你加入足够的延时时,你会发现第一次采样的值也是正确的的。

IAR环境 HSI不分频
  1. while(1)
  2. {
  3.         /* Config ADC Channel AIN7 */
  4.         GPIO_Init(GPIOB,GPIO_Pin_1,GPIO_Mode_In_FL_No_IT );  
  5.   
  6.           /* Enable ADC clock */
  7.         CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);
  8.        
  9.         ADC_DeInit(ADC1);
  10.        
  11.         /* Initialize and configure ADC1 */
  12.         ADC_Init(ADC1,ADC_ConversionMode_Single,ADC_Resolution_12Bit,ADC_Prescaler_2);
  13.                                                                                         //单次转换 12位 2分频16/8 =2M
  14.         /* Config ADC Sampling Time */       
  15.         ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);

  16.         ADC_Cmd(ADC1,ENABLE);                                                //使能ADC       
  17.        
  18.         /* Enable ADC1 Channel 17*/
  19.         ADC1->SQR[1] =0x02;
  20. //        ADC_ChannelCmd(ADC1,ADC_Channel_17, ENABLE);
  21.        
  22.         /* Disable EOC interrupt */
  23. //        ADC_ITConfig(ADC1,ADC_IT_EOC,DISABLE);                        //禁止ADC中断
  24.        
  25.         ADC_DMACmd(ADC1,DISABLE);                                        //禁止DMA

  26.         Delay(2000);
  27.         Delay(2000);       
  28.         Delay(2000);       
  29.         Delay(2000);
  30.         Delay(2000);       
  31.        
  32.         ADC1->SR &=(~ADC_FLAG_EOC);                                        //清FLAG
  33.         ADC_SoftwareStartConv(ADC1);                                        //启动AD采样       
  34.         do
  35.         {
  36.                 End_Of_Conver =ADC1->SR;
  37.         }
  38.         while(0==(End_Of_Conver & ADC_FLAG_EOC));
  39.         BAT_AD=0;
  40.         BAT_AD=(uint8_t)(ADC_GetConversionValue(ADC1) >> 4);//取AD采样值高6位

  41. //        ADC_ChannelCmd(ADC1, ADC_Channel_17, DISABLE);
  42.         ADC1->SQR[1] =0x00;
  43.        
  44.         ADC_Cmd(ADC1,DISABLE);                                                //禁止ADC采样
  45.        
  46.         GPIO_Init(GPIOB,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow);        //端口输出拉低       
  47.        
  48.         CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);         //时钟停止
  49. }
复制代码

特殊应用,HALT ,所以每次初始化;
加断点时间最长        读数最大0932,200延时04CF,400延时0738,600延时0836,800延时08AC,1000延时08F0
具体效果见图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
Moon100
1楼-- · 2019-12-18 20:41
 精彩回答 2  元偷偷看……
cc1987
2楼-- · 2019-12-18 23:22
学习了,不错
amiok
3楼-- · 2019-12-19 00:44
标记下,谢谢分享
add00
4楼-- · 2019-12-19 03:32
折中处理 其他端口HALT前拉低,ADC采样端口不做拉低处理
功耗比全部拉低稍大,与其工作时延时还不如端口不变,全速工作时间短点
亮子
5楼-- · 2019-12-19 06:02
感谢分享,谢谢~

一周热门 更多>