AD转换模块介绍
- 格式:doc
- 大小:148.00 KB
- 文档页数:9
>手把手教你写S12XS128程序(9)--A/D转换模块介绍1时间:2009-11-30 22:10来源:电子设计吧作者:dzsj8 点击:365次1、A/D转换原理A/D转换的过程是模拟信号依次通过取样、保持和量化、编码几个过程后转换为数字格式。
a)取样与保持一般取样与保持过程是同时完成的,取样-保持电路的原理图如图16所示,由输入放大器A1、输出放大器A2、保持电容CH和电子开关S组成,要求 AV1 * AV2= 1。
原理是:当开关S闭合时,电路处于取样阶段,电容器充电,由于 AV1 * AV2= 1,所以输出等于输入;当开关S断开时,由于A 2输入阻抗较大而且开关理想,可认为CH没有放电回路,输出电压保持不变。
图16 取样-保持电路取样-保持以均匀间隔对模拟信号进行抽样,并且在每个抽样运算后在足够的时间内保持抽样值恒定,以保证输出值可以被A/D 转换器精确转换。
b)量化与编码量化的方法,一般有舍尾取整法和四舍五入法,过程是先取顶量化单位Δ,量化单位取值越小,量化误差的绝对值就越小,具体过程在这里就不做介绍了。
将量化后的结果用二进制码表示叫做编码。
2、A/D转换器的技术指标a)分辨率分辨率说明A/D转换器对输入信号的分辨能力,理论上,n位A/D转换器能区分的输入电压的最小值为满量程的1/2n 。
也就是说,在参考电压一定时,输出位数越多,量化单位就越小,分辨率就越高。
S12的ATD模块中,若输出设置为8位的话,那么转换器能区分的输入信号最小电压为19.53mV。
b)转换时间A/D转换器按其工作原理可以分为并联比较型(转换速度快ns级)、逐次逼近型(转换速度适中us级)、双积分型(速度慢抗干扰能力强)。
不同类型的转化的A/D转换器转换时间不尽相同,S12的ATD模块中,8位数字量转换时间仅有6us,10位数字量转换时间仅有7us。
手把手教你写S12XS128程序(10)--A/D转换模块介绍2时间:2009-12-09 21:32来源:电子设计吧作者:dzsj8 点击:368次S12内置了2组10位/8位的A/D模块:ATD0和ATD1,共有16个模拟量输入通道,属于逐次逼近型A/D转换器(这个转换过程与用天平称物的原理相似)。
1、功能结构图图17 A/D 模块功能结构图图17所示的是A/D 模块的功能结构,这个功能模块被虚线划分成为图示所示的虚线所隔离的三个部分:IP 总线接口、转换模式控制/寄存器列表,自定义模拟量。
IP 总线接口负责该模块与总线的连接,实现A/D 模块和通用I/O 的目的,还起到分频的作用;转换模式控制寄存器列表中有控制该模块的所有的寄存器,执行左右对齐运行和连续扫描。
自定义模拟量负责实现模拟量到数字量的转换。
包括了执行一次简单转换所需的模拟量和数字量。
2、HCS12中A/D转化模块特点8/10 位精度;7 us, 10-位单次转换时间.;采样缓冲放大器;可编程采样时间;左/右对齐, 有符号/无符号结果数据;外部触发控制;转换完成中断;模拟输入8 通道复用;模拟/数字输入引脚复用;1 到8转换序列长度;连续转换模式;多通道扫描方式。
ATD 模块有模拟量前端、模拟量转换、控制部分及结果存储等四部分组成。
其中模拟前端包括多路转换开关、采样缓冲器、放大器等,结果存储部分主要有8个16 位的存储器和反映工作状态的若干标志位。
>手把手教你写S12XS128程序(11)--A/D寄存器说明1时间:2009-12-11 12:26来源:电子设计吧作者:dzsj8 点击:369次1、ATD0控制寄存器2---ATD0CTL2ATD0CTL2主要控制ATD0的启动、状态标志以及上电模式,对寄存器进行写操作时,将中断当前的转化过程。
寄存器ATD0CTL2如图18所示:图18ATD0CTL2寄存器ADPU:A/D 使能控制位,相当于一个开关,用来启动/禁止A/D转换1 = A/D 模块上电0 = 禁止A/D,以减少功耗AFFC:A/D 快速转换完成标志位清零1 = 快速标志位清零顺序,每次读取结果寄存器自动清零0 = 正常标志位清零顺序,需要软件方式对状态标志位清零AWAI:A/D 等待模式1 = 等待模式下,ATD继续运行0 = 等待模式下,ATD停止运行,以降低功耗接收到外部触发时,启动A/D转换,否则不进行转换。
0--忽略外部触发;1--有外部触发时开始转换,此时AN7不能用于A/D转换。
ASCIE:A/D 转化序列转换结束中断使能控制位1 = 允许ATD转换序列转换结束后发生中断0 = 禁止ATD 中断ASCIF:A/D转换序列转换结束中断标志,只用于读。
1 = 发生中断0 = 为发生中断手把手教你写S12XS128程序(12)--A/D寄存器说明2时间:2009-12-12 12:06来源:电子设计吧作者:dzsj8 点击:340次2、ATD0控制寄存器3---ATD0CTL3ATD0CTL3主要控制结果寄存器的映射,设置转换序列的长度,还可以暂时冻结ATD0模块,尤其确定ATD0在BDM状态下的行为。
寄存器ATD0CTL3如图19所示:图19ATD0CTL3寄存器S1C、S2C、S4C、S8C:转换序列长度选择位控制位【注意】ATD的每次启动要进行若干次扫描循环,每次扫描循环称为一个转换序列。
FIFO:结果寄存器FIFO模式控制位,1 = 结果寄存器映射到转换序列0 = 结果寄存器没有映射到转换序列>手把手教你写S12XS128程序(13)--A/D寄存器说明3时间:2009-12-14 11:50来源:电子设计吧作者:dzsj8 点击:325次3、ATD0控制寄存器4---ATD0CTL4ATD0CTL4用于选择时钟,选择采样转换时间以及选择8位/10位转换方式。
寄存器ATD0CTL4如图20所示:图20ATD0CTL4寄存器SRES8 :A/D精度选择控制位1 =将采集到的模拟量以8位二进制数表示0 = 将采集到的模拟量以10位二进制数表示SMP0、- 分频系数从2到64- A/D时钟计算公式:ATDClock = BusClock/(PRS + 1) × 0.5- A/D时钟频率应满足:【注意】对于AD转换来说,它的转换周期包括采样时间和运算时间。
如果频率太高,则采样时间过短。
这对于输出阻抗比较大或信号频率比较高的信号来说,就会产生较大的采样误差,那么AD转换的精度就会受较大的影响。
>手把手教你写S12XS128程序(14)--A/D寄存器说明4时间:2009-12-17 19:39来源:电子设计吧作者:dzsj8 点击:336次4、ATD0控制寄存器4---ATD0CTL5ATD0CTL5用于选择转换方式,选择转换通道,设置单/多通道转换和单次/连续转换模式以及对齐方式。
寄存器ATD0CTL5如图20所示:图20 寄存器ATD0CTL5【注意】ATDCTRL5设置成多通道转换后,ATDCTRL3设置采集的通道数,此外ATDCTRL5中还需要设置多通道采集的起始通道。
比如采集7个通道,起始通道是1,那么就采集从1-7通道,如果起始通道是2,就采集2-7,还有0通道。
【注意】在S12系列中,当转换序列长度设置为1(S8C:S1C=0001),MULT=0时,只对一个通道进行一次转换。
>手把手教你写S12XS128程序(15)--A/D寄存器说明5时间:2009-12-27 00:47来源:电子设计吧作者:dzsj8 点击:300次5、ATD0状态寄存器5---ATD0START0、ATD0START0ATD0START0反映当前的转换通道、A/D转换是否结束、是否有外部触发等;ATD0START1反映转换序列中相应的转换是否完成。
寄存器ATD0START0、ATD0START1如图21所示:SCF ---转换序列完成标志在单次转换模式时,当转换完成后置位(SCAN = 0)在连续转换模式时,当第一次转换完成后置位(SCAN = 1),当AFFC = 0,写1清零。
ETORF ---外部触发覆盖标志如果在转换过程中高/低电平出现,置位F IFOR当结果寄存器在读出之前已经被写入时,置位( CCF 没有清零)CC[2:0]转换计数器---3位计数器指向下一个将要转换的通道CCF7 -CCF0 ---独立通道转换完成标志位每个相应的通道转换结束后置位,当相应的A/D 结果寄存器被读出时,清零,注意当A FFC 位不同时的情况>手把手教你写S12XS128程序(16)--A/D转换应用实例时间:2009-12-27 00:51来源:电子设计吧作者:dzsj8 点击:396次第十六讲:A/D转换应用实例要让ATD 开始转换工作,必须经过以下三个步骤:1.将ADPU 置1,使ATD 启动;2.按照要求对转换为数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;3.发出启动命令;如果上电默认状态即能满足工作要求,那么只要将ADPU 置1,然后通过控制寄存器发出转换命令,即可实现转换。
【例程2】程序描述:由通道ATD0进行单通道A/D转换,转换值在B口显示程序如下:#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"/******定义变量********/word AD_wValue;//AD转换结果/*时钟初始化*/void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1){ //锁相环时钟=2*16*(2+1)/(1+1)=48MHzREFDV=1; //总线时钟=48/2=24MHzSYNR=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=12ATD0CTL5=0xA0; // 右对齐无符号,单通道采样,通道0ATD0DIEN=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口显示转换值}}。