1. 综诉
想学会如何在STM8上使用ADC这个功能,我们先得了解单片机中ADC究竟是什么。
ADC是模拟信号转成数值信号,单片机只能识别TTL电平,其实就是 1 或者 0 ,但是如果我们给它一个3.3V电压,单片机就无法识别,,若想使用单片机读取出来得时候,它必须将模拟量变成数字量。
2. 关于STM8S103手册的ADC简介
由官方的全英手册可知。
----------------------------------------------------------------------------------------------------------------------------------
STM8中ADC1和ADC2主要功能如下:
- 10位分辨率
- 单词和连续的转换模式
- 可编程的(转换频率的)预分频,fMASTER 可以被分频 2到18
- 可选择ADC专用外部中断(ADC_ETR)或者定时器触发信号(TRGO)来作为外部触发信号
- 模拟放大(对于具有VREF引角的型号)
- 转换结束时可产生中断
- 灵活的数据对齐方式
- ADC输入电压范围:VSSA≤VIN≤VDDA
----------------------------------------------------------------------------------------------------------------------------------
ADC1具有以下拓展功能:
- 带缓冲的连续转换模式
- 单次和连续转换的扫描模式
- 具有上限和下限门槛的模拟看门狗
- 模拟看门狗时间发生可产生中断
----------------------------------------------------------------------------------------------------------------------------------
3. 例程
3.1 编译环境
我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。
3.2 主芯片
我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。
3.3 库文件的添加
我们的工程可以在IAR的例程中复制,操作过程:打开STM8S_StdPeriph_Lib(这是一个官方的库文件,下载IAR STM8包的时候就携带,里面有库文件和相对应的例程),将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,有可能你会看到一些C文件会有红色的小点报错,这是因为你选的芯片上没有该功能,你需要将其删掉才能不报错。如图。
添加成功后,我们需要将头文件添加进来,头文件的路径存放在 Libraries->STM8S_StdPeriph_Driver->inc中,如图。
3.4 代码编写
STM8SF003这款芯片能用的是5个AD采样通道,分别为为AIN2~AIN6。其一个通道AIN7,但在官方手册中我没找到有对其描述的,感兴趣的朋友可以去察看芯片的英文手册进行研究,也许会找到和我不一样的结果。
在ADC头文件中,将ADC1所有的ADC1_CHANNEL(ADC通道)都进行枚举,以方便调用。
1 /* Enum ----------------------------------------------------------------------*/ 2 3 enum ADC1_CHANNEL 4 { //bit 8 7 6 5 4 3 2 1 5 6 ADC1_CHANNEL2 = 0x01, // 0 0 0 0 0 0 0 1 7 ADC1_CHANNEL3 = 0x02, // 0 0 0 0 0 0 1 0 8 ADC1_CHANNEL4 = 0x04, // 0 0 0 0 0 1 0 0 9 ADC1_CHANNEL5 = 0x08, // 0 0 0 0 1 0 0 0 10 ADC1_CHANNEL6 = 0x10 // 0 0 0 1 0 0 0 0 11 12 };
在ADC.C文件中,分为了多个函数,降低他们的耦合性,也方便理解。
首先是ADC中引角的初始化,将你所选通道的引角进行初始化,没有选到的就不进行初始化。
1 /******************************************************************************* 2 * Function Name : MX_ADC_GPIO_Init 3 * Description : ADC GPIO Init 4 * Input : ADC1_CHANNEL
5 * Output : None 6 * Return : None 7 ********************************************************************************/ 8 9 void MX_ADC_GPIO_Init(uint8_t ADC1_CHANNEL) 10 { 11 switch(ADC1_CHANNEL) 12 { 13 case ADC1_CHANNEL2: GPIO_Init(ADC_Opt_GPIOC_Port,ADC_channe2_Pin,GPIO_MODE_IN_PU_NO_IT);break; 14 case ADC1_CHANNEL3: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe3_Pin,GPIO_MODE_IN_PU_NO_IT);break; 15 case ADC1_CHANNEL4: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe4_Pin,GPIO_MODE_IN_PU_NO_IT);break; 16 case ADC1_CHANNEL5: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe5_Pin,GPIO_MODE_IN_PU_NO_IT);break; 17 case ADC1_CHANNEL6: GPIO_Init(ADC_Opt_GPIOD_Port,ADC_channe6_Pin,GPIO_MODE_IN_PU_NO_IT);break; 18 } 19 20 }
然后是ADC1的选择通道初始化:ADC连续读取,所选的通道,二分频,外部转换触发,外部触发器不开启,数据右对齐,施密特触发,不开启。(注意:STMS8003中的串口使用了PD5和PD6,与ADC1中通道5、通道6发生冲突,故不可使用。如需使用,请将串口的TX\RX引角更改换为其它的引角。)
1 /************************************************************************