A-D转换控制是指在A-D转换过程中进行的各种操作设定与流程控制,主要包含与A-D操作有关的执行流程控制和与A-D数据操作有关的数据处理。
1.A-D转换初始化
在使用ADC模块之前必须要对其进行初始化,具体流程如下。
1)更新配置寄存器(ADC1CFG),选择输入时钟源和用来生成内部时钟ADCK的分频系数;选择用于采样的时间和低功率配置。
2)更新状态和控制寄存器2(ADC1SC2),选择转换触发(软件或硬件)与比较功能选项。
3)更新状态和控制寄存器1(ADC1SC1),选择转换是连续转换还是一次转换,并使能或禁止ADC转换完成中断,同时通过ADCH位选择转换的通道启动转换,将数据结果寄存器、比较寄存器中的值清零。
使用时,如果选择软件触发操作,则在写入ADC1SC1的ADCH位选定通道后(不是全1)就会自动启动转换;如果选择硬件触发操作,那么在一个硬件触发(ADHWT)事件之后才会启动转换;当允许连续转换时,在转换完成将数据传到数据寄存器之后,自动开始下一次转换。
例如,ADC模块允许提供中断方式的一个单通道10位A-D转换,输入模拟量在通道1上,使用长采样时间、低功耗,内部的ADCK时钟由总线时钟提供,对应初始化中各寄存器的详细设置如表9-16~表9-18所示。
①ADC1CFG=0x98。
表9-16 初始化ADC1CFG寄存器各状态位
②ADC1SC2=0x00。
表9-17 初始化ADC1SC2寄存器各状态位
③ADC1SC1=0x41。
表9-18 初始化ADC1SC1寄存器各状态位
4)ADC1R=0x0000。
初始化时清空转换结果寄存器内容。
5)ADC1CV=0x0000。
当允许比较功能时,保存比较值,初始化时清空寄存器内容。(www.xing528.com)
6)APCTL1=0x02。
使能ADC输入通道1,禁止AD1引脚做I/O控制,其他引脚仍为通用I/O引脚。
2.启动A-D转换
若选用软件触发,即ADC1SC2寄存器中的ADTRG位为0,那么写ADC1SC1后将启动A-D转换;若选用硬件触发,即ADTRG位为1,那么在一个硬件触发(ADHWT)事件之后将启动A-D转换。
如果选定的是单次转换方式,即ADC1SC1寄存器中的ADCO位设为0,那么在选定软件触发方式之后每写一次ADC1SC1(ADCH位不全为1)就启动一次A-D转换,在选定硬件触发方式之后每出现一次ADHWT有效沿就启动一次转换。
如果选定的是连续转换方式,即ADCO位设为l,那么在选定软件触发方式之后只需写一次ADC1SC1就启动连续转换;在选定硬件触发方式之后只要出现一次ADHWT有效沿就启动连续转换。连续转换方式中,新一次的转换会在当前转换结果传送到结果数据寄存器之后自动启动,A-D转换会一直这样持续直到被中止为止。
3.A-D转换完成
当转换的结果传到数据结果寄存器ADC1RH和ADC1RL后表明转换完成,此时通过置位COCO标记位来表示。如果ADC1SC1寄存器的AIEN位为1,那么在COCO置位时会产生一个中断。写ADC1SC1或者读ADC1RL都会清零COCO标记位。
在10位精度模式中如果数据正在被读取,若ADC1RH已经被读但是ADC1RL还未被读,则互锁机制启动将保护原有数据,新的数据不会被写入到ADC1RH和ADC1RL中并且新数据将丢弃,COCO也不会置位,新的数据结果会被丢弃。
在允许比较功能的单个转换情况下,如比较条件为假,则互锁功能无效,ADC操作被终止。在其他情况下,当数据传送被锁时仍会启动下一次转换,而不论连续转换使能位ADCO的状态。
4.A-D转换终止
当下列情况发生时,任何正在执行的A-D转换都会终止。
1)写ADC1SC1操作发生,如果ADCH不是全1,则当前的转换被取消并开始一个新的转换。
2)写ADC1SC2、ADC1CFG、ADC1CVH或ADC1CVL操作发生,这表明转换模式发生改变,因此当前的转换无效,新的A-D转换被启动。
3)单片机发生复位操作。
4)单片机进入STOP模式并且禁止ADACK。
当一个A-D转换被终止后,数据寄存器ADC1RH和ADC1RL的内容不会发生改变,依旧保持上次转换完成后的传送的值。但在因复位导致的转换终止情况中,ADC1RH和ADC1RL返回到它们的复位值。
5.数据处理
当A-D转换结束后其数字结果以二进制形式保存在数据寄存器ADC1RH和ADC1RL中,而通常我们习惯用十进制来表示某一数值,这就需要对转换后的数据进行处理。在8位精度模式下,转换后的数据以一个字节的大小全部存放在ADC1RL中,可以使用C语言中的强制类型转换直接将其转换成十进制数。在10位精度模式下,由于结果的高2位数据存放在ADC1RH中而低8位数据存放在ADC1RL中,所以需要将两个寄存器中的数据组合起来使用。常用的组合方法有两种:一种是将ADC1RH中的数据左移8位暂存在一个16位的中间量中,然后将该中间量的低8位与ADC1RL结合(C语言中可使用“或”运算操作),最后再将该16位中间量转换成十进制即可。另一种方法是先分别将ADC1RH和ADC1RL中的数据转换成对应的十进制数x1和x2,然后将x1×256+x2就可以得到该转换后的十进制数据。
同时,为了防止信号扰动或环境干扰引起的误差,可以选择多次采样取平均值的方式,或者采用数据曲线拟合的方式进行数值处理。该部分内容请读者自行查阅相关算法,本书不做详细介绍。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。