搜索
bottom↓
回复: 4

请教:STM8L151 HALT唤醒后ADC异常

[复制链接]

出0入55汤圆

发表于 2018-3-31 18:10:39 | 显示全部楼层 |阅读模式
  1. //ADC采集通道
  2. #define ADC_MAX_CHAN  10        //通道总数

  3. #define ADC_PORT_MP0  GPIOA
  4. #define ADC_PINS_MP0  GPIO_Pin_4

  5. #define ADC_PORT_MP1  GPIOA
  6. #define ADC_PINS_MP1  GPIO_Pin_7

  7. #define ADC_PORT_MA0  GPIOA
  8. #define ADC_PINS_MA0  GPIO_Pin_5

  9. #define ADC_PORT_MA1  GPIOA
  10. #define ADC_PINS_MA1  GPIO_Pin_6

  11. #define ADC_CHAN_MA0  ADC_Channel_1
  12. #define ADC_CHAN_MA1  ADC_Channel_0


  13. #define ADC_PORT_RP0  GPIOD
  14. #define ADC_PINS_RP0  GPIO_Pin_2

  15. #define ADC_PORT_RP1  GPIOB
  16. #define ADC_PINS_RP1  GPIO_Pin_1

  17. #define ADC_PORT_RA0  GPIOD
  18. #define ADC_PINS_RA0  GPIO_Pin_3

  19. #define ADC_PORT_RA1  GPIOB
  20. #define ADC_PINS_RA1  GPIO_Pin_0

  21. #define ADC_CHAN_RA0  ADC_Channel_19
  22. #define ADC_CHAN_RA1  ADC_Channel_18


  23. #define ADC_PORT_FP0  GPIOB
  24. #define ADC_PINS_FP0  GPIO_Pin_2

  25. #define ADC_PORT_FP1  GPIOB
  26. #define ADC_PINS_FP1  GPIO_Pin_5

  27. #define ADC_PORT_FA0  GPIOB
  28. #define ADC_PINS_FA0  GPIO_Pin_3

  29. #define ADC_PORT_FA1  GPIOB
  30. #define ADC_PINS_FA1  GPIO_Pin_4

  31. #define ADC_CHAN_FA0  ADC_Channel_15
  32. #define ADC_CHAN_FA1  ADC_Channel_14


  33. #define ADC_PORT_LP0  GPIOB
  34. #define ADC_PINS_LP0  GPIO_Pin_6

  35. #define ADC_PORT_LP1  GPIOF
  36. #define ADC_PINS_LP1  GPIO_Pin_1

  37. #define ADC_PORT_LA0  GPIOB
  38. #define ADC_PINS_LA0  GPIO_Pin_7

  39. #define ADC_PORT_LA1  GPIOF
  40. #define ADC_PINS_LA1  GPIO_Pin_0

  41. #define ADC_CHAN_LA0  ADC_Channel_11
  42. #define ADC_CHAN_LA1  ADC_Channel_24


  43. #define ADC_PORT_BP0  GPIOD
  44. #define ADC_PINS_BP0  GPIO_Pin_4

  45. #define ADC_PORT_BP1  GPIOD
  46. #define ADC_PINS_BP1  GPIO_Pin_7

  47. #define ADC_PORT_BA0  GPIOD
  48. #define ADC_PINS_BA0  GPIO_Pin_5

  49. #define ADC_PORT_BA1  GPIOD
  50. #define ADC_PINS_BA1  GPIO_Pin_6

  51. #define ADC_CHAN_BA0  ADC_Channel_9
  52. #define ADC_CHAN_BA1  ADC_Channel_8

  53. //按顺序排列,方便模块化
  54. GPIO_TypeDef*       ADCPORTSel[ADC_MAX_CHAN] = {ADC_PORT_MP0,ADC_PORT_MP1,ADC_PORT_RP0,ADC_PORT_RP1,ADC_PORT_FP0,ADC_PORT_FP1,ADC_PORT_LP0,ADC_PORT_LP1,ADC_PORT_BP0,ADC_PORT_BP1,};
  55. GPIO_Pin_TypeDef    ADCPINSSel[ADC_MAX_CHAN] = {ADC_PINS_MP0,ADC_PINS_MP1,ADC_PINS_RP0,ADC_PINS_RP1,ADC_PINS_FP0,ADC_PINS_FP1,ADC_PINS_LP0,ADC_PINS_LP1,ADC_PINS_BP0,ADC_PINS_BP1,};
  56. ADC_Channel_TypeDef ADCCHANSel[ADC_MAX_CHAN] = {ADC_CHAN_MA0,ADC_CHAN_MA1,ADC_CHAN_RA0,ADC_CHAN_RA1,ADC_CHAN_FA0,ADC_CHAN_FA1,ADC_CHAN_LA0,ADC_CHAN_LA1,ADC_CHAN_BA0,ADC_CHAN_BA1,};

  57. GPIO_TypeDef*       ADCPORTCH[ADC_MAX_CHAN]  = {ADC_PORT_MA0,ADC_PORT_MA1,ADC_PORT_RA0,ADC_PORT_RA1,ADC_PORT_FA0,ADC_PORT_FA1,ADC_PORT_LA0,ADC_PORT_LA1,ADC_PORT_BA0,ADC_PORT_BA1,};
  58. GPIO_Pin_TypeDef    ADCPINSCH[ADC_MAX_CHAN]  = {ADC_PINS_MA0,ADC_PINS_MA1,ADC_PINS_RA0,ADC_PINS_RA1,ADC_PINS_FA0,ADC_PINS_FA1,ADC_PINS_LA0,ADC_PINS_LA1,ADC_PINS_BA0,ADC_PINS_BA1,};

  59. //读到的当前数据
  60. uint16_t recCurVal[ADC_MAX_CHAN];


  61. void GetADCValue(unsigned char ch)
  62. {
  63.         uint16_t temp=0;
  64.        
  65.         if(ch<ADC_MAX_CHAN)                                                                                                          //防止越界跑飞
  66.         {       
  67.                   GPIO_Init(ADCPORTCH[ch], ADCPINSCH[ch], GPIO_Mode_In_FL_No_IT);                                //设置ADC脚为输入
  68.                 ADC1_Init();
  69.                   GPIO_SetBits(ADCPORTSel[ch], ADCPINSSel[ch]);                                                                //打开电源
  70.                 ADC_ChannelCmd (ADC1,ADCCHANSel[ch],ENABLE);                                                                //使能
  71.                 Delay(50);                                                                                                                                        //延时,电容充电要时间,约5ms
  72.                 ADC_SoftwareStartConv (ADC1);                                                                                                //开启软件转换
  73.                 while(!ADC_GetFlagStatus (ADC1,ADC_FLAG_EOC));                                                                //等待转换结束
  74.                 ADC_ClearFlag (ADC1,ADC_FLAG_EOC);                                                                                        //清除相关标识
  75.                 temp = ADC_GetConversionValue(ADC1);                                                                                //获取转换值
  76.                 GPIO_ResetBits(ADCPORTSel[ch], ADCPINSSel[ch]);                                                                //关闭电源
  77.                 ADC1_Closed();
  78.                 GPIO_Init(ADCPORTCH[ch] , ADCPINSCH[ch] , GPIO_Mode_Out_PP_Low_Slow);                //设置ADC脚为输出低
  79.                
  80.                 recCurVal[ch] = temp; //保存数据
  81.                
  82.                 #ifdef DEBUG
  83.                 temp = temp*3000UL/4095UL;        //转换成电压值
  84.                 USART1_SendInt(ch,temp);
  85.                 #endif
  86.         }
  87. }

  88. void main(void)
  89. {        
  90.           static unsigned char aaa=0;
  91.         PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能
  92.     RTC_Config();
  93.         PowerOn_Init();
  94.         aaa = 0;
  95.         while (1)
  96.         {
  97.                 GetADCValue(aaa);
  98.                 if(++aaa>=9) aaa = 0;
  99.                 GPIO_ResetBits(LED_PORT,LED_PINS);
  100.                 halt();
  101.                 GPIO_SetBits(LED_PORT,LED_PINS);
  102.         }
  103. }
复制代码


程序如上,问题在于:
1:如果人为的用 GetADCValue(0);  或者GetADCValue(1);  或者GetADCValue(3); 等,串口打印ADC读到的数据完全没有问题
2:如果像上面那样用一个变量控制,则第一个  GetADCValue(0); 和 GetADCValue(7);数据是正确的,其他数据为0或者很小(小于5)
求解

出0入10汤圆

发表于 2018-3-31 19:57:13 | 显示全部楼层
MCU刚唤醒ADC还没醒吧。忽略掉第一次的数据试试。

出0入55汤圆

 楼主| 发表于 2018-4-1 21:04:17 来自手机 | 显示全部楼层
mmiker 发表于 2018-3-31 19:57
MCU刚唤醒ADC还没醒吧。忽略掉第一次的数据试试。

感谢热心帮助,原因找到了。就是使能一个通道后要使用另外一个通道,必须关掉当前通道,否则出现以上莫名其妙的问题。也就是用完后加上ADC_ChannelCmd (ADC1,ADCCHANSel[ch],DISABLE);                                                                //关闭使能
就可以了

出0入0汤圆

发表于 2019-3-1 08:31:18 来自手机 | 显示全部楼层
楼主解决问题后,还来解释如何解决的。非常棒

出0入55汤圆

 楼主| 发表于 2019-3-1 09:00:54 | 显示全部楼层
ddxgung 发表于 2019-3-1 08:31
楼主解决问题后,还来解释如何解决的。非常棒

哈!谢谢夸奖哈!只是举手之劳。也方便他人和自己以后遇到这个问题可以快速解决
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 12:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表