MC9S12单片机AD模块模数转换ATD模块A/D转换的基本概念模数转换定义:将时间连续、幅值也连续的模拟信号转换为时间离散、幅值也离散的数字信号模数转换精度模数转换精度是指二进制的位数。9S12的AD模块有两种精度可选:8位精度(0—255)10位精度(0—1023)(2)转换速率:完成一次由模拟转换成数字所需的时间的倒数。(3)采样时间:两次转换之间的间隔。采样速率必须小于或等于转换速率。9S12的A/D模块主要特性8位/10位可选择的转换精度5/256=速度快每进行一次10位的转换,仅仅需要7uS采样时间可编程左对齐/右对齐的数据格式,有符号/无符号的转换结果;转换完毕可产生中断;使用PAD7外部触发控制。大部分的freescale的MCU都带有内置的AD转换模块。转换完毕中断转换队列长度1-8(或1-16)不间断转换模式多通道扫描AD口。ATD子系统输入或通用输入引脚。复位后默认为通用I/O输入引脚并且只能做输入对应于两个独立的ATD模块:ATDm(m=0或1)。9S12的A/D模块外部引脚VDDA(59)、VSSA(62):A/D模块提供电源。实验板上,VDDA接到VCC,VSSA接到GND。单独的供电引脚,可以不受其他模块的影响。VRH(60)、VRL(61):A/D转换模块的参考高电压和参考低电压。模拟输入信号的电压值在VRH---VRL之间才能得到正确的转换结果VRH应大于VRL,且VRH和VRL应在VDDA-VSSA之间。AN6/PAD6-AN0/PAD0(51-57):模拟量输入通道6-0,通用数字输入端口。不可以被用作外部触发引脚。AN7/ETRIG/PAD7(58):模拟量输入通道7,通用数字输入端口。它也可以被配置为A/D转换的外部触发引脚。寄存器4个控制寄存器ATDCTL2、3、4、52个状态寄存器ATDSTAT0、18个结果寄存器ATDDRx控制寄存器2—ATDCTL2电源、中断、外部触发ADPU:A/D模块的电源管理1=正常模式0=低功耗模式AFFC:标志位快速清零。1=对转换结果寄存器访问会自动清除标志位0=正常模式,访问结果寄存器前读状态寄存器1可以清除转换完成标志CCF。控制寄存器2—ATDCTL2AWAI1=等待时进入低功耗模式,0=等待时ATD保持运行。ETRIGLE、ETRIGP:外部触发的边沿/极性控制。ETRIGE:上两位的使能位。允许在PAD7输入外部触发信号,允许在外部触发到来的同时进行采样和AD转换。1=允许,0=禁止。注意:当使用外部触发式,ATD通道7将不能作为AD转换通道来使用控制寄存器2—ATDCTL2ASCIE:A/D队列转换完成中断允许。1=允许,并使标志位ASCIF=10=禁止。ASCIF:A/D队列转换完成中断标志。如果ASCIE=1,此标志位和SCF拥有相同的含义。此位只能读取到0,写入无效。控制寄存器3—ATDCTL3S8C、S4C、S2C、S1C:定义转换队列的长度。默认长度为4。控制寄存器3—ATDCTL3FIFO:结果寄存器先进先出模式。1=FIFO模式,转换结果是连续存放的0=非FIFO模式,转换结果放在对应的寄存器中。FRZ1、FRZ0:背景调试冻结模式允许。这两个控制位就决定了,当遇到断点时,A/D模块怎样反应。控制寄存器3—ATDCTL3FRZ1、FRZ0:背景调试冻结模式允许。这两个控制位就决定了,当遇到断点时,A/D模块怎样反应。控制寄存器4—ATDCTL4转换频率的预分频因子、采样时间和AD转换的精度。SRES8:转换精度选择。1=8位精度(0~255)0=10位精度(0~1023)控制寄存器4—ATDCTL4SMP1、SMP0:采样时间选择。采样时间分为两个阶段第一阶段长2个AD时钟周期第二阶段由SMP1、SMP0决定控制寄存器4—ATDCTL4PRS4、PRS3、PRS2、PRS1、PRS0:A/D时钟分频因子的选择。A/D时钟的计算公式如下图。最高可达总线时钟的一半。注意,A/D模块的时钟频率要在500KHz和2MHz之间,所以在选择分频因子时一定要注意。控制寄存器5—ATDCTL5DJM:16位结果寄存器数据的对齐方式。1=右对齐;0=左对齐。DSGN:结果寄存器中数据有无符号。1=有符号,0=无符号。SRES8、DJM和DSGN三位配合起来使用,决定了结果寄存器中数据的格式,一共有8种情况。控制寄存器5—ATDCTL5SCAN:连续转换队列的模式。此位定义了A/D转换是连续进行还是只进行一次。1=连续队列转换0=单次队列转换。控制寄存器5—ATDCTL5MULT0时:单个通道采样。ATD的队列控制器只从指定的输入通道进行采样,可以使用ATDCTL5寄存器中的CC、CB和CA三位来指定需要采样的模拟量输入通道。S8C、S4C、S2C和S1C控制位来指定转换次数。1时:对多个的通道进行采样。每次采样的通道数量由S8C、S4C、S2C和S1C控制位来指定,第一个采样通道由CC、CB和CA控制位来指定,其它采样通道由通道选择码CC、CB和CA的增加来决定。对ATDCTL5进行写操作会终止当前队列的转换,开始一个新的队列转换。状态寄存器0—ATDSTAT0SCF:队列完成标志。置1条件:当一个队列转换完毕后置位;如果处在SCAN模式,则每次转换完毕都置位。清0条件:对此位写1;写ATDCTL5,开始一个新的对列;ATDCTL2的AFFC=1(标志快速清除)且读结果寄存器。状态寄存器0—ATDSTAT0ETORF:外部触发溢出标志。置位条件:处于边沿触发模式时,如果第一个边沿触发的队列转换正在进行,而这时却检测到了第二个有效的边沿。清零条件:对此位写1;写控制寄存器2、3或4,终止当前队列;写控制寄存器5,开始一个新队列。状态寄存器0—ATDSTAT0FIFOR:FIFO溢出标志。1=有FIFO溢出,0=无FIFO溢出。如果转换完成标志(CCF)在没有被清零时结果寄存器被写入新值(覆盖),则置位。清零条件:对此位写1;写控制寄存器5,开始一个新队列。CC2、CC1、CC0:转换计数器。代表了哪个结果寄存器将要接收当前转换的结果。非FIFO模式(FIFO=0),这3位的初始值为0,计数完成后又会回到初始值。FIFO模式(FIFO=1),转换计数器处于循环计数状态。状态寄存器1—ATDSTAT1CCFx:1=完成队列中的第x个转换;在完成队列转换中的某个AD转换时,相对应的CCFx位就会被置位,结果存储在ATDDRx中。0=转换未完成。清零条件:写控制寄存器5,开始一个新队列;AFFC=1,对结果寄存器访问;AFFC=0,首先读状态寄存器1,然后访问结果寄存器。输入允许寄存器--ATDDIENIENx:通道x输入数字允许。这8个控制位控制了从输入端口到数据寄存器的数字输入缓冲区。1=缓冲区有效;0=无效。当端口作为模拟量输入端口时,也可以打开数字缓冲区,但是会增加功耗。数字输入寄存器PORTADPTADx:A/D模块的第x个通道(ANx)的数字输入。当对应通道的数字输入允许时,此位返回了相应引脚上的电平逻辑值。注意,引脚上的电平必须和VRH或VRL匹配,否则将返回一个不确定的值。如果响应通道的输入缓冲区无效(IENx=0),读取操作只返回1。注意,PORTAD端口模拟量和数字量是可以复用的。当输入模拟量时,会把模拟信号直接送到A/D转换器;当输入数字量时,会把外部数字信号送到PORTAD寄存器以供读取。A/D转换结果寄存器—ATDDRxATDDR0—ATDDR7:0—7通道的结果寄存器。A/D转换的结果需要从这几个寄存器中读取。每个16位寄存器可以分成2个8位的寄存器来读取,分别为ATDDRxH和ATDDRxL。注意转换结果在这8个16位寄存器中的存储格式。以10位左、右对齐为例:左对齐10位数据右对齐10位数据另外还要注意有符号数据和无符号数据的区别。√√√√√√√√√√××××××××××××√√√√√√√√√√A/D模块的中断系统ATD模块只有一个中断源--队列转换完毕中断ATDCTL2寄存器ASCIE:A/D队列转换完成中断允许。SCF:A/D队列转换完成中断标志。利用MCU的ATD模块进行AD转换实验。ATD通道0接电位器,通过通道0采集模拟量。实例unsignedintresult;voidmain(void){EnableInterrupts;ATD0CTL2=0x80;//使能AD,正常清除标志,不使用外部触发ATD0CTL3=0x08;//只转换一个通道ATD0CTL4=0x25;//10位精度,12分频ATD0CTL5=0xb0;//右对齐,无符号,扫描模式,使用通道0for(;;){while(!ATD0STAT0_SCF);//等待当前队列转换完成result=ATD0DR0;//读结果寄存器中的值以便使用ATD0STAT0_SCF=1;//清除队列完成标志/*以下是其他代码*/}}练习通道15,即ATD1的07通道。练习1:采用查询方式,只转换一个通道,队列长度为1,非FIFO模式,10位精度,12分频,右对齐、无符号、扫描模式不断转换。练习2:采用中断方式,只转换一个通道,队列长度为1,非FIFO模式,8位精度,8分频,右对齐、无符号、扫描模式不断转换。练习3:采用中断方式,只转换一个通道,队列长度为1,非FIFO模式,8位精度,10分频,右对齐,无符号,单次转换队列模式,但是要不断进行AD转换。练习4:采用中断方式,只转换一个通道,队列长度为8,非FIFO模式,8位精度,12分频,右对齐、无符号、扫描模式。将8结果“掐头去尾”求平均。练习5:将练习4的值用数码管显示(十进制)。谢谢!