STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)

虽然使用STM8S003F有一年了,但是对于其中的一些知识还是不是很详尽,从今天开始对照芯片资料做一个完整的学习。这篇文章作为模拟 / 数字转换器(ADC)的学习笔记,主要是根据《STM8S参考手册_中文》(以下简称《参考手册》)和《STM8S003K3_STM8S003F3_Datasheet_EN》(以下简称《数据手册》)来学习。

一 综述

根据《参数手册》我们知道,ADC1和ADC2是10位的逐次比较型模拟数字转换器。提供多达16个多功能的输入通道(实际准确的通道数量在数据手册的引脚描述说明)。A/D转换的各个通道可以执行单次和连续的转换模式。相对于ADC2,ADC1具有一些扩展功能,包括扫描模式、带缓存的连续模式、模拟看门狗。我们在使用的时候要根据《数据手册》来了解不同产品型号的ADC1和ADC2的功能信息。(STM8S003xx只有ADC1——编者注)

二 详细介绍

2.1 功能介绍

主要功能如下(ADC1和ADC2的功能):

  • 10位的分辨率 
  • 单次和连续的转换模式 
  • 可编程的(转换频率的)预分频:fMASTER 可以被分频 2 到 18 
  • 可以选择ADC专用外部中断(ADC_ETR)或者定时器触发信号(TRGO)来作为外部触发信号 
  • 模拟放大(对于具有VREF引脚的型号)
  • 转换结束时可产生中断 
  •  灵活的数据对齐方式 
  • ADC 输入电压范围: VSSA ≤ VIN ≤ VDDA
ADC1具有以下扩展功能
  • 带缓冲的连续转换模式(数据缓存大小依不同型号而异(10X10bit或8X10bit),详情参见《数据手册》)
  • 单次和连续转换的扫描模式 
  • 具有上限和下限门槛的模拟看门狗 
  • 模拟看门狗事件发生可产生中断

根据《数据手册》我们知道,STM8S003xx产品包含10位逐次比较A/D转换器(ADC1),最多包含5个外部多路输入通道,其他特性如下:

  • 输入电压范围:0~VDD
  • 转换时间:14个时钟周期
  • 有单次、连续和缓冲连续3种转换模式
  • 当n=输入通道数时,缓存区的大小为:n*10bits
  • 通道序列的单次和连续转换的扫描模式
  • 有可编程上限和下限阈值的模拟看门狗(具有上限和下限门槛的模拟看门狗 )
  • 模拟看门狗中断(模拟看门狗事件发生可产生中断 )
  • 外部触发输入
  • TIM1 TRGO的触发器
  • 转换结束(EOC)中断
根据《数据手册》我们知道,10位ADC特性如下(除另有规定外,VDD、fMASTER、TA都受一般操作条件的限制):
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
表44:ADC特性
(1)在采样时间期间,输入电容CAIN(最大3pF)可由外部源充电/放电。内部模拟源的电阻必须允许电容达到其最终电压水平tS。在最后采样时间tS底之后,模拟输入电压的变化对转换结果没有影响。采样时钟tS的值取决于编程。
ADC准确特性待完成【】

四 引脚描述

表64 ADC引脚(《参考手册》)
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)

五 功能描述

5.1 ADC开关控制
通过置位ADC_CR1寄存器的 ADON(bit0)位来开启ADC。当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置位 寄存器的 位。在转换结束时ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次的转换【注:置位(Set):使变量的某一位为1;复位(Reset):使变量的某一位为0;】。 如果长时间没有使用ADC,推荐ADON 位来实现。 当ADC模块上电后,所选通道对应的I/O口输出模块是被禁用的。因此推荐在ADC上电之前要选择合适的ADC转换通道。
5.2 ADC时钟
ADC 的时钟是由fMASTER时钟经过预分频后供给的。时钟的预分频因子是由 ADC_CR1寄存器的 SPSEL[2:0]决定的。
5.3 通道选择
STM8系列单片机有多达 16 个外部输入通道。但实际外部通道的数量取决于MCU 封装大小。STM3S003F3有5个外部输入通道。如果在一次转换过程中改变通道选择,那么当前的转换被复位同时一个新的开始指令脉冲被发 送到 ADC。
5.4 转换模式
ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。
5.4.1 单次模式
在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1寄存器的ADON位来启动的。
一旦转换完成,转换后的数据存储在ADC_DR寄存器中,EOC(转换结束,在ADC_CSR中)标志被置位,如果EOCIE (在ADC_CSR中)被置位将产生一个中断。(噪音采集用的单次) 
5.4.2 连续模式和带缓存的连续模式
在续转转换模式中 ADC在完成一次转换后就立刻开始下一次的转换。当CONT位被置位时即将ADC设为连续模式,该模式是通过置位 ADC_CR1寄存器的 ADON 位来启动的。
● 如果缓冲功能没有被使能(ADC_CR3寄存器的DBUF位=0),那么转换结果数据保存在ADC_DR寄存器中,同时 EOC 标志被置位。如果EOCIE 位已被置位时将产生一次中断。然后开始下一次转换。
● 如果缓存功能被使能(ADC_CR3寄存器的DBUF=1),那么某个选定通道上的8个或者10个连续的转换结果会填满数据缓存,当缓存被填满时,EOC(转换结束)标志被置位,如果EOCIE位已被置位,则会产生一个中断,然后一个新的转换自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR(在ADC_CR3中)标志将置1。(见24.5.5)
如果要停止连续转换,可以复位清零CONT位来停止转换或者复位清零ADON位来关闭ADC的电源。
5.4.3 单次扫描模式
一定要注意,单次模式和单次扫描模式是不一样的!该模式是用来转换从AIN0到AINn之间的一连串模拟通道,'n’是在 ADC_CSR寄存器的CH[3:0]位中指定的通道编号。在扫描转换的过程中,序号 CH[3:0]位的值是被硬件自动更新的。它总保存当前正在被转换的通道编号。单次转换模式可以在在SCAN 位(在    中)被置位且COUNT位以清零时通过置位ADON来启动。
注意:当使用扫描模式时,不可以将AIN0到AINn之间通道对应的I/O口设为输出状态,因为ADC的多路选择器已经将这些I/O口的输出模块禁用了。 对于单次扫描模式,转换是       从AIN0通道开始的,而且结果数据被存储在数据缓冲寄存器ADC_DBxR 中,当最后一个通道(通道‘n’)被转换完成后,EOC(转换结束)标志被置位,当
    EOCIE 位已被置位时将产生一个中断。
可以从缓冲寄存器中读取各个通道的转换结果值。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1。(见24.5.5)
转换序列正在进行过程中不要清零SCAN位;单次扫描模式可通过清零ADON位来立即停止。 为了开启一次新SCAN扫描转换,可以通过对ADC_CR1寄存器的EOC位清零和ADON位置位来实现。
5.4.4 连续扫描模式
该模式和单次扫描模式相近,只是每一次在最后通道转换完成时,一次新的从通道0到通道n扫描转换会自动开始。如果某个数据缓存寄存器在被读走之前被覆盖,OVR标志将置1(见24.5.5) 。连续扫描模式是在当SCAN位和CONT位已被置时,通过置位ADON位来启动的。 在转换序列正在进行过程中不要清零SCAN位。 连续扫描模式可以通过清零ADON位来立即停止。另外一种选择就是当转换过程中清除CONT位那么转换会在下一次的最后一个通道转换完成时停止。
注意:在扫描模式中,不要使用位操作指令(BRES)去清除EOC标志位,这是因为该指令是对整个ADC_CSR寄存器的一个读-修改-写操作。从CH[3:0]寄存器中读取当前的通道编号和写回该寄存器,将会改变扫描系列的最后通道编号。
在连续扫描模式中正确的清除EOC标志位的方法是 从一个RAM变量中载入一个字节到ADC_CSR寄存器,这样来清除 EOC标志位同时还重新载入扫描系列新的最后通道编号。 
5.4.5 溢出标志位
在带缓冲的连续模式,单次扫描模式或者连续扫描模式中,溢出错误标志位OVR位是由硬件置位的。它是用来指示10个缓冲寄存器中的某个值在被读走之前被一个新的转换结果值覆盖。在这种情况下,推荐重新开启一次新的转换过程(因为某个有效的结果已经被覆盖了)。(言外之一就是说,在出现错误就重启ADC转换,以前的值丢弃。——编者注) 
注意:置位ADON位会自动清除OVR标志位。
5.4.6 模拟看门狗
暂时未看
5.4.7 基于外部触发信号的转换
暂时未看
5.4.8 模拟放大
暂时未看
5.4.9 时序图
如 图149所示,在ADC上电后,在开始精确转换之前ADC需要一个稳定时间tSTAB (等于一次转换的时间 tCONV),对于之后接下来的转换就不需要稳定延时,而且ADON位只需要被置位一次。一次ADC转换需要14个时钟周期,在转换完成后EOC标志被置位,同时转换结果保存在10位ADC数据寄存器里面。
图149 单次模式的时序图(CONT=0)
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
图150 连续模式的时序图(CONT=1)
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)

六 低功耗模式

暂时未看

七 中断

暂时未看

八 数据对齐

ADC_CR2寄存器中的ALIGN位用于选择转换后数据的对齐方式。 数据可以按如下方式对齐:
左对齐:8个高位数据被写入ADC_DH寄存器中,其余的低位数据被写入ADC_DL寄存器中。读取时必须先读高位再读低位。
右对齐:8个低位数据被写入ADC_DL寄存器中,其余的高位数据被写入ADC_DH寄存器中。读取时必须须先读低位再读高位。

图152 数据左对齐

STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)图151 数据右对齐
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)

九 读取数据转换结果

当读取ADC转换结果时,须注意要依据所选择的数据对齐方式,按照指定的方式连续使用两条指令来读取数据寄存器 (什么叫连续使用两条指令?——编者注)。为了保证数据一致性,MCU采用内部锁存机制。对应ADC_DR的高位寄存器和低位寄存器,直到读取一个指定数据寄存器之前,另一个寄存器的转换数据结果不会被修改。因此,按照错误的顺序来读取寄存器将得到错误的结果。 寄存器读取顺序由数据对齐方式决定(参考《笔记1》——八 数据对齐) 
为了得到正确的结果:
● 在左对齐模式下,先读高位字节寄存器(ADC_DRH),再读低位字节寄存器(ADC_DRL)。
● 在右对齐模式下,先读低位字节寄存器(ADC_DRL),再读高位字节寄存器(ADC_DRH) 。此时,用户也可以选择使用LDW指令来读取整个ADC_DR,因为该指令和右对齐模式采用同样的读取顺序。

十 施密特触发器禁止寄存器

暂时未看

十一  寄存器描述

11.1 寄存器(ADC_DBxRH)(x=0..7 or 0..9) ADC高位数据缓存
暂时未写
11.2  ADC低位数据缓存寄存器(ADC_DBxRL)(x=0..7 or 0..9)
暂时未写
11.3 ADC控制/状态寄存器(ADC_CSR) configure state register
地址偏移值:0x00
复位值:0x00
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
11.4 ADC配置寄存器1(ADC_CR1 )configure register 1
地址偏移值:0x01
复位值: 0x00
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
11.5 ADC 配置寄存器 2 (ADC_CR2) configure register 2
地址偏移值:0x02
复位值: 0x00
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
STM8S003xx学习笔记(1):模拟 / 数字转换器(ADC)
11.5 ADC 配置寄存器 2 (ADC_CR2)
暂时未写
11.6 ADC配置寄存器 3 (ADC_CR3)
暂时未写
11.7 ADC 数据高位寄存器(ADC_DRH)
暂时未写
11.8 ADC 数据低位寄存器(ADC_DRL)
暂时未写
11.9 ADC 施密特触发器禁止寄存器高位 (ADC_TDRH)
暂时未写
11.10 ADC 施密特触发器禁止寄存器低位 (ADC_TDRL)
暂时未写
11.11 ADC 上限门槛值高位寄存器(ADC_HTRH)
暂时未写
11.12 ADC 上限门槛值低位寄存器(ADC_HTRL)
暂时未写
11.13 ADC 下限门槛值高位寄存器(ADC_LTRH)
暂时未写
11.14 ADC 下限门槛值低位寄存器(ADC_LTRL)
暂时未写
11.15 ADC看门狗状态高位寄存器(ADC_AWSRH)
暂时未写
11.16 ADC看门狗状态低位寄存器(ADC_AWSRL)
暂时未写
11.17 ADC看门狗控制高位寄存器(ADC_AWCRH)
暂时未写
11.18 ADC看门狗控制低位寄存器(ADC_AWCRL)
暂时未写
十一  ADC寄存器映像表和复位值
暂时未看
十二 结束语
这是一篇学习文档,由于内容较多,所以只对重点的地方和用到了的地方进行了一个阅读。