freescalemc9s12xs128adc.docx
《freescalemc9s12xs128adc.docx》由会员分享,可在线阅读,更多相关《freescalemc9s12xs128adc.docx(13页珍藏版)》请在冰豆网上搜索。
freescalemc9s12xs128adc
FREESCALEMC9S12XS128ADC
单位:
安徽师范大学物理与电子信息学院通信工程系
作者:
刘永学
和PWM模块一样,下面来总结一下128的另一个模块,AD模块,这个模块用的较多,自己着这个模块还有一些理解的也不是那么的透彻,也希望通过这次的整理能够把自己的思路重新来整理一下。
言归正传!
从这个模块的寄存器开始来!
12中A/D转换共有两个方块,每个方块各有8个输入通道,使用时应以标头ATD0或ATD1标识。
8/10/12位精度;7us,10-位单次转换时间.;采样缓冲放大器;可编程采样时间;左/右对齐,有符号/无符号结果数据;外部触发控制;转换完成中断;模拟输入8通道复用;模拟/数字输入引脚复用;1到8转换序列长度;连续转换模式;多通道扫描方式。
ATD模块有模拟量前端、模拟量转换、控制部分及结果存储等四部分组成。
其中模拟前端包括多路转换开关、采样缓冲器、放大器等,结果存储部分主要有8个16位的存储器和反映工作状态的若干标志位。
要完成ATD转换的特定功能,必须对相关寄存器有所了解。
在12AD模块中,ATDCTL2,3,4,5为常用的控制寄存器,ATDSTAT0,1为常用的两个状态控制器,ATDDR0-7为八个结果寄存器。
ATD工作时,由CPU发出启动命令,然后经采样、模数转换,最后将结果保存到相应的寄存器。
ATD每次启动要进行若干个扫描循环,每个扫描循环称为一个转换序列,每个转换序列能包含1-8最多8次转换,由控制寄存器ATDCTL3中的S8C/S4C/S2C/S1C等位来决定。
这些转换序列可以针对某个单一通道,也可以针对几个相邻通道,每个通道可以使外部模拟输入,也可以是参考电压或其他保留信号,ATD可支持多种不同的通道信号组合。
每次转换包括哪些通道由ATDCTL5中的CC、CB、CA决定的。
对单一通道连续进行多次转换有利于实现滤波,一次转换多个通道则可以通过一次启动命令快速浏览多个信号,中间无需CPU干涉,节约了CPU时间。
ATD的运行方式分为单次和连续运行两种。
在单次方式下,每个转换序列完成后,寄存器ATDSTAT中的SCF置位,然后ATD模块暂停。
在连续方式下,转换以转换序列为单位连续进行,当第一个转换序列完成后,SCF置位,同时ATD模块开始下一个转换序列。
在上述两种方式下,每个通道的转换结果进入到对应结果寄存器后,寄存器ATDSTAT1种对应的CCF位置1,对存放转换结果的寄存器进行读操作后,CCF位将自动清0。
转换过程的启动是通过写入寄存器5ATDCTL5实现的。
ATD转换所需要的时钟周期数是固定不变的,但是采样时间和时钟频率可以通过ATDCTL4在一定范围内选择,因此转换时间也可以选
首先认识一下该模块的构造
接下来就看一下该模块的寄存器:
ADC模块的寄存器值较多,学习起来较为麻烦。
1、AD控制寄存器0(ATDCTL0)
WRAP3—WRAP0:
回绕通道选择位。
在任何时候都可以进行读写操作不过这些位只有在ATDCTL5的MULT为1的情况下,就是多通道转换模式下才有效。
2、AD控制寄存器1(ATDCTL1)
其中D7位ETRIGESL位外部触发源选择,这个寄存器主要用的是ETRIGCH0、ETRIGCH1、ETRIGCH2、ETRIGCH3、外部触发通道选择SMP_DIS采样放电控制位、SRES1、SRES0这两位为采样精度选择位当这两位分别00是为8位采样精度、01时为10为采样精度、10时为12位的采样精度!
在使用时基本上设置好采样精度就行了。
3、AD控制寄存器2(ATDCTL2)
AFFC:
AD快速清所有标志位
1=快速标志位清零顺序每次读取结果寄存器自动清零
0=正常标志位清零顺序需要手动对状态标志位清零
ICLKSTP:
停止模式中内部时钟位,该位在停止模式中使能AD转换
ETRIGLE、ETRIGP:
外部触发信号触发条件选择位
ETRIGE:
外部触发信号使能位,1时使能外部触发信号,0时禁止外部触发信号
ASCIE:
AD完成中断使能位。
为1时AD转换结果时使能中断、为0时AD转换结果不会引发中断
ACMPIE:
AD比较中断使能位,为1时使能AD比较中断请求,为0时禁用AD中断请求。
3、AD控制寄存器3(ATDCTL3)
这个寄存器相对用得较多,理解起来也不太容易,
DJM:
结果寄存器数据对齐位0左对齐,1右对齐
S8C—S1C:
AD转换序列的长度选择位,这些位控制每一个AD的转换序列长度下面是控制长度列表。
FIFO:
结果寄存器先进先出模式选择位,为0时非先进先出模式,根据装换序列的先后顺序将装转换结果放入结果寄存器。
在这里需要做一个说明,就是这个部分采样值存放的问题,也就是按顺序放到结果寄存器里面,为1时先进先出模式,转换结果依次顺延放到结果寄存器中,当使用完最后一个结果寄存器后重新回到第一个结果寄存器。
FRZ0-FRZ1:
背景调试冻结使能位这两位为00AD转换继续工作,01完成当前的转换后进入冻结模式,10时保留值。
4、AD控制寄存器4(ATDCTL4)
这三个位采样时间选择位
PRS[4:
0]:
AD转换时钟预分频因子计算公式为:
fATDCLK=Fbus/(2×(PRS+1))
注意使用时应使fATDCLK的范围在0.25M到8.3M
5、AD控制寄存器5(ATDCTL5)
MULT为0时:
单个通道采样。
ATD的队列控制器只从指定的输入通道进行采样,可以使用ATDCTL5寄存器中的CC、CB和CA三位来指定需要采样的模拟量输入通道。
S8C、S4C、S2C和S1C控制位来指定转换次数。
1时:
对多个的通道进行采样。
每次采样的通道数量由S8C、S4C、S2C和S1C控制位来指定,第一个采样通道由CC、CB和CA控制位来指定,其它采样通道由通道选择码CC、CB和CA的增加来决定。
6、状态寄存器0(ATDSTAT0)
FIFOR:
FIFO溢出标志。
1=有FIFO溢出,0=无FIFO溢出。
如果转换完成标志(CCF)在没有被清零时结果寄存器被写入新值(覆盖),则置位。
清零条件:
对此位写1;写控制寄存器5,开始一个新队列
CC3、CC2、CC1、CC0:
转换计数器。
代表了哪个结果寄存器将要接收当前转换的结果。
非FIFO模式(FIFO=0),这4位的初始值为0,计数完成后又会回到初始值。
FIFO模式(FIFO=1),转换计数器处于循环计数状态
7、状态寄存器2(ATDSTAT2)
CCFx:
1=完成队列中的第x个转换;在完成队列转换中的某个AD转换时,相对应的CCFx位就会被置位,结果存储在ATDDRx中。
0=转换未完成。
清零条件:
写控制寄存器5,开始一个新队列;
AFFC=1,对结果寄存器访问;
AFFC=0,首先读状态寄存器1,然后访问结果寄存器
8、AD转换结果寄存器(ATDDRn)
单片机120引脚:
ATDDR0—ATDDR15:
0—15通道的结果寄存器。
A/D转换的结果需要从这几个寄存器中读取。
每个16位寄存器可以分成2个8位的寄存器来读取,分别为ATDDRxH和ATDDRxL。
注意转换结果在这16个16位寄存器中的存储格式。
以10位左、右对齐为例:
左对齐10位数据
右对齐10位数据
另外还要注意有符号数据和无符号数据的区别
单片机80引脚:
ATDDR0—ATDDR7:
0—7通道的结果寄存器。
A/D转换的结果需要从这几个寄存器中读取。
每个16位寄存器可以分成2个8位的寄存器来读取,分别为ATDDRxH和ATDDRxL。
注意转换结果在这8个16位寄存器中的存储格式。
以10位左、右对齐为例:
左对齐10位数据
右对齐10位数据
另外还要注意有符号数据和无符号数据的区别。
AD模块用的差不多就是这些寄存器,我列举一下自己在AD模块编写的一点初始化程序,和总结一下AD初始化编程的一些简单的步骤。
voidADC_Init(void)
{
ATD0CTL1=0x40;
ATD0CTL2=0x40;//禁止外部触发,中断禁止
ATD0CTL3=0xB0;//a右对齐无符号,每次转换6个序列,NoFIFO,Freeze模式下继续转
ATD0CTL4=0x0f;
ATD0CTL5=0x30;
ATD0DIEN=0x00;//禁止数字输//禁止数字输入
}
初始化编程的一些步骤:
1.ATD启动;
2.按照要求对转换为数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;
也即根据自己的需要对AD的控制寄存器进行设置即可,最后就是禁止AD!
!