10 11
Finish conversion then freeze(完成转换后冻结) Freeze Immediately(冻结模式下立刻冻结) 3、ATD0控制寄存器4---ATD0CTL4
ATD0CTL4用于选择时钟,选择采样转换时间以及选择8位/10位转换方式。寄存器ATD0CTL4如图20所示:
图20 ATD0CTL4寄存器
SRES8 : A/D 精度选择控制位
1 = 将采集到的模拟量以8位二进制数表示 0 = 将采集到的模拟量以10位二进制数表示
SMP0、SMP1 : 采样时间选择控制位 采样时间 SMP [1:0] 00 01 10 11 2 A/D 时钟周期 4 A/D 时钟周期 8 A/D 时钟周期 16 A/D 时钟周期 PPS[0:4] : 5 位 模数计数器预分频器 - 分频系数从 2 到 64
- A/D时钟计算公式 :ATDClock = BusClock/(PRS + 1) × 0.5 - A/D时钟频率应满足:
【注意】对于AD转换来说,它的转换周期包括采样时间和运算时间。如果频率太高,则采样时间过短。这对于输出阻抗比较大或信号频率比较高的信号来说,就会产生较大的采样误差,那么AD转换的精度就会受较大的影响。
4、ATD0控制寄存器4---ATD0CTL5
ATD0CTL5用于选择转换方式,选择转换通道,设置单/多通道转换和单次/连续转换模式以及对齐方式。寄存器ATD0CTL5如图20所示:
图20 寄存器ATD0CTL5
【注意】ATDCTRL5设置成多通道转换后,ATDCTRL3设置采集的通道数,此外ATDCTRL5中还需要设置多通道采集的起始通道。比如采集7个通道,起始通道是1,那么就采集从1-7通道,如果起始通道是2,就采集2-7,还有0通道。 【注意】在S12系列中,当转换序列长度设置为1(S8C:S1C=0001),MULT=0时,只对一个通道进行一次转换。
5、ATD0状态寄存器5---ATD0START0、ATD0START1
ATD0START0反映当前的转换通道、A/D转换是否结束、是否有外部触发等; ATD0START1反映转换序列中相应的转换是否完成。
寄存器ATD0START0、ATD0START1如图21所示:
SCF ---转换序列完成标志
在单次转换模式时,当转换完成后置位 (SCAN = 0).
在连续转换模式时,当第一次转换完成后置位 (SCAN = 1),当AFFC = 0,写 1 清零。
ETORF ---外部触发覆盖标志
如果在转换过程中高/低电平出现,置位 FIFOR
当结果寄存器在读出之前已经被写入时,置位 ( CCF 没有清零) CC[2:0]转换计数器---3位计数器指向下一个将要转换的通道
CCF7 -CCF0 ---独立通道转换完成标志位每个相应的通道转换结束后置位,当相应的 A/D 结果寄存器被读出时,清零,注意当 AFFC 位不同时的情况
A/D转换应用实例
要让 ATD 开始转换工作,必须经过以下三个步骤: 1.将 ADPU 置 1,使 ATD 启动;
2.按照要求对转换位数、扫描方式、采样时间、时钟频率及标志检查等方式 进行设置;
3.发出启动命令;
如果上电默认状态即能满足工作要求,那么只要将 ADPU 置 1,然后通过控 制寄存器发出转换命令,即可实现转换。
【例程2】
程序描述:由通道ATD0进行单通道A/D转换,转换值在B口显示 程序如下:
#include
#pragma LINK_INFO DERIVATIVE \初始化外围设备接口 /******定义变量********/
word AD_wValue;//AD转换结果 /*时钟初始化*/
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1) { //锁相环时钟=2*16*(2+1)/(1+1)=48MHz REFDV=1; //总线时钟=48/2=24MHz SYNR=2;
while(!(CRGFLG&0x08)); CLKSEL=0x80; }
/*AD初始化*/
void AD_Init(void) {
ATD0CTL2=0xC0; // 启动A/D, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x20; // 转换序列长度为4, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x85; // 8位精度, 2个时钟,
ATDClock=[BusClock*0.5]/[PRS+1]=2MHz;PRS=5,divider=12 ATD0CTL5=0xA0; // 右对齐无符号,单通道采样,通道0 ATD0DIEN=0x00; // 禁止数字输入 }
/*读取AD转换结果*/
void AD_GetValue(word *AD_wValue) {
*AD_wValue=ATD0DR0; //读取结果寄存器的值 }
/**********主函数**************/ void main(void) {
PLL_Init();
AD_Init(); DDRB=0xFF; PORTB=0x00; EnableInterrupts; for(;;) {
while(!ATD0STAT1_CCF0); // 等待转换结束while(ATDOSTAT1_CCF0==1) AD_GetValue(&AD_wValue); // 读取转换结果 PORTB = (byte)AD_wValue; // 在B口显示转换值 } }

