使用STM8S105K4T6C 模数转换器的12通道
时间:10-02
整理:3721RD
点击:
分享前几天遇到的一个stm8s模数转换的小问题~~~
stm8s105k4t6c的管脚图
我们知道这款单片机一共提供了7个模数转换通道,他们分别是AIN0-AIN5和AIN12。
其中AIN0-AIN5的配置和使用方法如下:
- /*---------------------------------包含头文件---------------------------------*/
- #include "adc.h"
- #define ADC 60 //滤波深度,不宜过高,防止越界 u16
- /*---------------------------------全局标志位---------------------------------*/
- /*----------------------------------函数定义----------------------------------*/
- //*----------------ADC1端口初始化函数---------------*/
- static void Adc_Gpio_Init(void)
- //使用第12通道
- {
- GPIO_Init(GPIOF, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);
- }
- /*------------------ADC1初始化函数-----------------*/
- void Adc1_Init(void)
- {
- Adc_Gpio_Init();
- ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, //连续转换
- (ADC1_Channel_TypeDef)(ADC1_CHANNEL_12), //开启12通道
- ADC1_PRESSEL_FCPU_D2, //2分频
- ADC1_EXTTRIG_TIM,
- DISABLE, //关闭外部触发
- ADC1_ALIGN_RIGHT, //右对齐
- (ADC1_SchmittTrigg_TypeDef)(ADC1_SCHMITTTRIG_CHANNEL12),
- DISABLE); //关闭施密特触发器
- ADC1_Cmd(ENABLE); //使能ADC1
- ADC1_DataBufferCmd(ENABLE); //开启缓存
- ADC1_ScanModeCmd(ENABLE); //启用扫描模式
- ADC1_StartConversion(); //开始转换
- }
- /*-------------------ADC获取AD值------------------*/
- uint16_t Get_Adc1_Value(ADC1_Channel_TypeDef channel)
- {
- uint8_t t;
- uint16_t data = 0;
- for(t=0;t<ADC;t++)
- {
- data+=ADC1_GetBufferValue(channel);
- }
- return (uint16_t)(data/ADC); //返回转换平均值
- }
- /*--------------Write-by-xiao-kai\2017\05\06\17\14----QQ-850637704------------*/
- /*-------------------------Always have a nice day-----------------------------*/
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好用没毛病!