当前位置:首页 > STM8教程-第十五章 STM8S207ADC 及其应用
第十五章 STM8S207ADC 及其应用
在计算机过程控制的数据采集等系统中,经常要对一些过程参数进行测量和控制,这些参数往往是连续变化的物理量,如温度,压力,流量和速度等。这里所指的连续变化即数值是随着时间连续可变的,通常称这些物理量为模拟量,然而计算机本身所能识别和处理的都是数字量。这些模拟量在进入计算机之前必须转换成二进制数码表示的数字信号。能够把模拟量变成数字量的器件称之为模数转换器。
15.1 STM8S207ADC 模块概述
STM8S207 系列高性能产品包括了一个 10 位连续渐进式模数转换器 ADC2,(注意 STM8S2XX 都没有 ADC1)提供了多达 16 个多功能的输入通道。主要性能有:转换时间为 14 个时钟周期,带有参考电压引脚,可设置为单次或联系的转换模式,可设置转换结束产生中断。
15.2 ATD 模块接口组成和特点
STM8S207 单片机内置的 ADC 模块如下图所示:
ADC 模块可以通过 ADC_CR1 寄存器来开启或者关闭。然后 ADC 的时钟是有f_master 时钟经过预分频后提供的。STM8S207 高达 16 个输入通道,支持多种转换模式
15.3 ADC 模块寄存器设置
STM8S207 的 ADC 模块共有 8 个寄存器。分为 4 个设置寄存器,2 个数据寄存器和 2 个施密特触发禁止寄存器。
15.3.1 ADC 控制/状态寄存器 ADC_CSR
EOC:转换结束。此位在 AD 转换结束后由硬件置位。由软件写“0”来清零 0:转换未结束 1:转换结束
AWD:因为 STM8S207 没有 ADC1,所以此位无效 EOCIE:转换结束 EOC 的中断使能 0:禁止转换结束中断 1:使能转换结束中断
AWDIE:在 STM8S207 中无效位
CH:选择转换通道,分别选择 0 到 15 共 16 个通道
15.3.2 ADC 配置寄存器 1 ADC_CR1
SPSEL:预分频选择位 000:f_adc = f_master/2 001:f_adc = f_master/3 010:f_adc = f_master/4 011:f_adc = f_master/6 100:f_adc = f_master/8 101:f_adc = f_master/10 110:f_adc = f_master/12 111:f_adc = f_master/18 CONT:连续转换 0:单次转换模式 1:连续转换模式 ADON:AD 转换开关
0:禁止 ADC 转换,进入低功耗模式 1:使能 ADC 并开始转换
需要注意的是:如果此位是 0 时,并且写 1 到此位,那么将把 ADC 从低功耗模式下唤醒。如果此位是 1,并且写 1 到此位,那么将启动 AD 转换。一旦 ADC上电,所选通道的 IO 输出功能就被禁用了。
15.3.3 ADC 配置寄存器 2 ADC_CR2
EXTTRIG:外触发使能位 0:禁止外部触发转换 1:使能外部触发转换
注意:为了避免错误的触发事件,使用 BSET 指令来设置 EXTTRIG 位,不用改变其它位 EXTSEL:外部事件选择位
00:内部定时器 1TRG 事件 01:ADC_ETR 引脚的外部中断 10:保留 11:保留
ALIGN:数据排列
0:数据左对齐。高 8 位在 ADC_DRH,其余的在低位字节 1:数据右对齐。低 8 位在 ADC_DRL,其余的在高位字节 SCAN:STM8S207 无效
15.3.4 ADC 配置寄存器 3 ADC_CR3
STM8S207 此寄存器无效
15.3.5 ADC 数据寄存器 ADC_DRH、ADC_DRL
根据 ADC_CR2 中的 ALIGN 设置数据对齐方式,ADC_DRH 和 ADC_DRL 存放这转换结果。
15.3.6 ADC 施密特触发器禁止寄存器 ADC_TDRH、ADC_TDRL
这些位由软件设置。当 TDx 为 1 时,禁止施密特触发功能,降低 IO 的静态功耗;为 0 时开启施密特触发器。
15.4 ADC 模块基础应用实例
本节通过一个简单示例,让读者掌握 ADC 模块的使用和编程方法。 本实例硬件连接入下图所示,在 STM8S207 实验板中 ADC 的外部输入可以使光敏电阻或者热敏电阻,通过实物图的短路冒可以自行选择。本节 ADC 内容只是简单说明 ADC 的编程实例,通过 ADC 的转换,把高 8 位转换结果作为延时时间,所以通过 LED1 的闪耀程度来判断 ADC 的大小。LED1 的接口是 PD0,实验中使用的 AD 接口是 PF0,也就是 AIN10
程序清单:
#include \ void DelayMS(unsigned int ms); main() {
int i;
// 将PD3设置成推挽输出,以便推动LED PD_DDR = 0x08; PD_CR1 = 0x08; PD_CR2 = 0x00;
// 初始化A/D模块
ADC_CR2 = 0x00; // A/D结果数据左对齐
ADC_CR1 = 0x00; // ADC时钟=主时钟/2=1MHZ // ADC转换模式=单次 // 禁止ADC转换
ADC_CSR = 0x0a; // 选择通道10 for(;;) // 进入无限循环 {
ADC_CR1 = 0x01; // CR1寄存器的最低位置1,使能ADC转换
for(i=0;i<100;i++); // 延时一段时间,至少7uS,保证ADC模块的上电完成 ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1 // 使能ADC转换
while((ADC_CSR & 0x80) == 0); // 等待ADC结束 i = ADC_DRH; // 读出ADC结果的高8位 DelayMS(i); // 延时一段时间
PD_ODR = PD_ODR ^ 0x08; // 将PD3反相 } }
// 函数功能:延时函数
// 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ // 输出参数:无 // 返 回 值:无 // 备 注:无
void DelayMS(unsigned int ms) {
unsigned char i; while(ms != 0) {
for(i=0;i<250;i++); for(i=0;i<75;i++); ms--; } }
编译下载下载后选择光敏电阻作为输入,有光照和没光照时 LED 的闪耀程度不一样,证明 ADC 模块正常工作了。而验证的结果是当光敏电阻对着光照时,电阻变小,采样电压
变大了,所以高 8 位转换数据也变大,因此 LED 闪耀频率变小。
共分享92篇相关文档