MC9S12XS128AD转换详解知识讲解Word文档格式.docx
《MC9S12XS128AD转换详解知识讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《MC9S12XS128AD转换详解知识讲解Word文档格式.docx(11页珍藏版)》请在冰点文库上搜索。
![MC9S12XS128AD转换详解知识讲解Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/ffa1d6ba-bd17-4e0e-9302-52662c12a47a/ffa1d6ba-bd17-4e0e-9302-52662c12a47a1.gif)
也就是说,在参考电压一定时,输出位数越多,量化单位就越小,分辨率就越高。
S12的ATD模块中,若输出设置为8位的话,那么转换器能区分的输入信号最小电压为19.53mV。
b)转换时间
A/D转换器按其工作原理可以分为并联比较型(转换速度快ns级)、逐次逼近型(转换速度适中us级)、双积分型(速度慢抗干扰能力强)。
不同类型的转化的A/D转换器转换时间不尽相同,S12的ATD模块中,8位数字量转换时间仅有6us,10位数字量转换时间仅有7us。
S12内置了2组10位/8位的A/D模块:
ATD0和ATD1,共有16个模拟量输入通道,属于逐次逼近型A/D转换器(这个转换过程与用天平称物的原理相似)。
1、功能结构图
图17A/D模块功能结构图
图17所示的是A/D模块的功能结构,这个功能模块被虚线划分成为图示所示的虚线所隔离的三个部分:
IP总线接口、转换模式控制/寄存器列表,自定义模拟量。
IP总线接口负责该模块与总线的连接,实现A/D模块和通用I/O的目的,还起到分频的作用;
转换模式控制寄存器列表中有控制该模块的所有的寄存器,执行左右对齐运行和连续扫描。
自定义模拟量负责实现模拟量到数字量的转换。
包括了执行一次简单转换所需的模拟量和数字量。
2、HCS12中A/D转化模块特点
8/10位精度;
7us,10-位单次转换时间.;
采样缓冲放大器;
可编程采样时间;
左/右对齐,有符号/无符号结果数据;
外部触发控制;
转换完成中断;
模拟输入8通道复用;
模拟/数字输入引脚复用;
1到8转换序列长度;
连续转换模式;
多通道扫描方式。
ATD模块有模拟量前端、模拟量转换、控制部分及结果存储等四部分组成。
其中模拟前端包括多路转换开关、采样缓冲器、放大器等,结果存储部分主要有8个16位的存储器和反映工作状态的若干标志位。
A/D转换应用实例
要让ATD开始转换工作,必须经过以下三个步骤:
1.将ADPU置1,使ATD启动;
2.按照要求对转换位数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;
3.发出启动命令;
如果上电默认状态即能满足工作要求,那么只要将ADPU置1,然后通过控制寄存器发出转换命令,即可实现转换。
程序描述:
由通道ATD0进行单通道A/D转换,转换值在B口显示。
程序如下:
程序一:
#include<
hidef.h>
/*commondefinesandmacros*/
#include"
derivative.h"
/*derivative-specificdefinitions*/
bytead_value;
//AD转换结果
voidDelay(inti){//延时程序
intj;
for(;
i>
0;
i--)
for(j=500;
j>
j--)
;
}
/***---------------初始化程序---------------***/
voidInitBusClk(void){
CLKSEL=0X80;
//PLLSEL1:
BusClock=PLLCLK/2
//0:
BusClock=OSCCLK/2
PLLCTL_PLLON=1;
//开启PLL
SYNR=0;
REFDV=0X03;
//OSCCLK=16MHz
//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz
while(!
(CRGFLG_LOCK==1));
//直到LOCK=1,whenPLLisready,退出循环
CLKSEL_PLLSEL=1;
//PLLSEL1:
BusClock=PLLCLK/2=8MHz/2=4MHz
//0:
BusClock=OSCCLK/2=16M/2=8MHz
}
voidInitAD(void){
ATD0CTL2=0XC0;
//11000000启动A/D,快速清除标志位
//无等待模式,外部触发禁止(bit2=0),
中断禁止(bit1=0)
ATD0CTL3=0X0C;
//00001100转换序列为1、FIFO模式启动,冻结模式下继续转换
ATD0CTL4=0XE1;
//111000018位精度,16AD采样时间
//总线(1+1)*2=4分频,AD时钟=1MHz
ATD0CTL5=0X27;
//00100111右对齐,无符号,连续转换,单通道,起始通道ATD7
//DJMDSGNSCANMULT0CCCBCA
//DJM:
1-Rightjustified0-Leftjustified
//DSGN:
1-Signeddata0-Unsigneddata
//SCAN:
1-Continuous0-Singleconversion
//CCCBCA:
AnalogInputChannelSelectCode
ATD0DIEN=0X00;
//数字输入disabled
/***---------------主程序---------------***/
voidmain(void){
/*putyourowncodehere*/
_DISABLE_COP();
//关看门狗
InitBusClk();
InitAD();
DDRB=0XFF;
//设PORTB为输出口
PORTB=0x00;
EnableInterrupts;
//开放总中断
;
){
ATD0STAT2L_CCF7);
//等待转换结束,退出循环
ad_value=(byte)ATD0DR7H;
//左对齐,右对齐时转换结果都先存储在ATD0DRxH,后存储在ATD0DRxL.
Delay(200);
//延时
PORTB=ad_value;
//PORTB输出AD转换结果,并用8个LED发光二极管显示
//_FEED_COP();
/*feedsthedog*/
}/*loopforever*/
/*pleasemakesurethatyouneverleavemain*/
程序二:
(用指针实现AD转换)
byteAD_Value;
(初始化程序与上述相同)
/***---------------读取AD转换结果---------------***/
voidAD_GetValue(word*AD_Value){
*AD_Value=ATD0DR0;
//关看门狗
//设PORTB为输出口
AD_GetValue(&
AD_Value);
//读取转换结果
Delay(400);
PORTB=AD_Value;
//转换结果在B口显示
_FEED_COP();
}
程序三:
(用中断实现AD转换)
mc9s12xs128.h>
byteAD_Data=0;
//*
voidDelay(inti){
//*/
//PLLSEL1:
//开启PLL
//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz
//直到LOCK=1,whenPLLisready,退出循环
//0:
ATD0CTL2=0XC3;
//11000011启动A/D,快速清除标志位,无等待模式,外部触发禁止(bit2=0)
//中断开放(bit1=1,bit0=1)
//bit1:
ATDSequenceCompleteInterruptEnable
//bit0:
ATDSequenceCompleteInterruptFlag
ATD0CTL3=0X0C;
//总线(1+1)*2=4分频,AD时钟=1M
ATD0CTL5=0XA7;
//10100111右对齐,无符号,连续转换,单通道,起始通道ATD7
//数字输入disabled
DisableInterrupts;
//关中断
//设B口为输出口
PORTB=0X00;
//开中断
){
//while(!
PORTB=(byte)AD_Data;
//B口显示转换结构
}
/***---------------中断服务程序---------------***/
#pragmaCODE_SEGNON_BANKED
voidinterrupt22IntAD(void){//AD转换的中断向量号为33
AD_Data=ATD0DR0H;
//读取AD转换结果
//开中断
#pragmaCODE_SEGDEFAULT