微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 使用STM8S105K4T6C 模数转换器的12通道

使用STM8S105K4T6C 模数转换器的12通道

时间:10-02 整理:3721RD 点击:

     分享前几天遇到的一个stm8s模数转换的小问题~~~


stm8s105k4t6c的管脚图


     我们知道这款单片机一共提供了7个模数转换通道,他们分别是AIN0-AIN5和AIN12。
     其中AIN0-AIN5的配置和使用方法如下:

  1. /*---------------------------------包含头文件---------------------------------*/
  2. #include "adc.h"

  3. #define    ADC    60                                                                  //滤波深度,不宜过高,防止越界 u16

  4. /*---------------------------------全局标志位---------------------------------*/

  5. /*----------------------------------函数定义----------------------------------*/

  6. //*----------------ADC1端口初始化函数---------------*/
  7. static void Adc_Gpio_Init(void)
  8. //使用第12通道
  9. {
  10.     GPIO_Init(GPIOF, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);
  11. }
  12. /*------------------ADC1初始化函数-----------------*/
  13. void Adc1_Init(void)
  14. {
  15.     Adc_Gpio_Init();
  16.     ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,                                         //连续转换
  17.              (ADC1_Channel_TypeDef)(ADC1_CHANNEL_12),                                 //开启12通道
  18.              ADC1_PRESSEL_FCPU_D2,                                                    //2分频
  19.              ADC1_EXTTRIG_TIM,
  20.              DISABLE,                                                                 //关闭外部触发
  21.              ADC1_ALIGN_RIGHT,                                                        //右对齐
  22.              (ADC1_SchmittTrigg_TypeDef)(ADC1_SCHMITTTRIG_CHANNEL12),
  23.              DISABLE);                                                                //关闭施密特触发器
  24.     ADC1_Cmd(ENABLE);                                                                 //使能ADC1
  25.     ADC1_DataBufferCmd(ENABLE);                                                       //开启缓存
  26.     ADC1_ScanModeCmd(ENABLE);                                                         //启用扫描模式
  27.     ADC1_StartConversion();                                                           //开始转换
  28. }
  29. /*-------------------ADC获取AD值------------------*/
  30. uint16_t Get_Adc1_Value(ADC1_Channel_TypeDef channel)
  31. {
  32.     uint8_t t;
  33.     uint16_t data = 0;

  34.     for(t=0;t<ADC;t++)
  35.     {
  36.       data+=ADC1_GetBufferValue(channel);
  37.     }
  38.       return (uint16_t)(data/ADC);                                                    //返回转换平均值
  39. }
  40. /*--------------Write-by-xiao-kai\2017\05\06\17\14----QQ-850637704------------*/
  41. /*-------------------------Always have a nice day-----------------------------*/

复制代码

   当我们想使用AIN12的时候,如果使用上面的代码就不能正确使用这个通道了。为什么?  看下图!



stm8s105k4t6c ADC1简介


     注意大红框中的NOTE:大概的意思是说:额外的AIN12通道不能用于ADC扫描模式和模拟看门狗模式,而且AIN12通道转换结果只会存在 ADC_DRH/ADC_DRL这两个寄存器中!  
     既然是这样:那我们应该去stm8s的固件库中去寻找可以操作AIN12的函数咯,要注意库寄存器的风格,查找的格式应该是“ADC1->DRL”或"ADC1->DRH",就会找到uint16_t ADC1_GetConversionValue(void),
而且就只有这个函数使用到了这两个寄存器,就是它了!
     然后把上面操作AIN0-AIN5的初始化函数注释掉ADC1_ScanModeCmd(ENABLE); //启用扫描模式,调用ADC1_GetConversionValue()就可以了,STM8S好用没毛病!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top