380 likes | 620 Views
第八章 A/D 转换模块. 本节提要. 一、 A/D 转换基础知识 二、 ATD 模块简介 三、 ATD 模块寄存器 四、 ATD 模块编程范例. 本节提要. 一、 A/D 转换基础知识 二、 ATD 模块简介 三、 ATD 模块寄存器 四、 ATD 模块编程范例. ADC 概述. 微控制器处理的是离散量 ( 数字量 ) ,而现实中往往是连续量 ( 模拟量 ) 物理量如:温度 , 压力 , 湿度以及速度等等 传感器 将物理量转换为电信号 ( 电压 , 电流 ) 需要模拟 - 数字转换器将电信号转换为数字量以供微控制器处理. 基本概念.
E N D
第八章 A/D转换模块 单片机原理与应用
本节提要 一、A/D转换基础知识 二、ATD模块简介 三、ATD模块寄存器 四、ATD模块编程范例 单片机原理与应用
本节提要 一、A/D转换基础知识 二、ATD模块简介 三、ATD模块寄存器 四、ATD模块编程范例 单片机原理与应用
ADC概述 • 微控制器处理的是离散量 (数字量) ,而现实中往往是连续量 (模拟量) • 物理量如:温度, 压力,湿度以及速度等等 • 传感器 将物理量转换为电信号(电压, 电流) • 需要模拟-数字转换器将电信号转换为数字量以供微控制器处理 单片机原理与应用
基本概念 传感器 控制器 执行器 单片机原理与应用
ADC 工作原理 + - • 将输入电压与若干等间距的参考电压进行比较 • 因此需要比较器 • Uin > Uref Uout=V+ ‘1’ • Uin < Uref Uout=0V ‘0’ Uin 1位ADC Uout Uref 单片机原理与应用
ADC 工作原理 + + + - - - • 3 个比较器可将电压分成4 级 (以 2位来表示) Uout3 Uref3 Umax Rank3 Uout2 Uref3 Rank2 Uref2 Uref2 Rank1 Uout1 Uref1 Uref1 Rank0 Uin Umin Quiz1: For voltage in rank2, Uout1 = ? Uout2 = ? Uout3 = ? 单片机原理与应用
ADC工作原理 + + + - - - • 2位ADC Uref R R D1 编码器 D0 R R Uin 8位 ADC, 需要多少个比较器? 单片机原理与应用
ADC工作原理 + - Uin 逐次逼近寄存器 D/A 转换器 Uref 结果 • Flash Converter ADC • 优点: 速度极快 • 缺点: 非常复杂 • 逐次逼近式A/D转换器 单片机原理与应用
ADC工作原理 逐次逼近式转换器转换过程 ( 4位 ) SA-ADC 完成一次转换至少需要 n 个时钟周期 单片机原理与应用
ADC工作原理 + - Uin • 必须进行采样保持以避免输入电压在转换期间发生变化 单片机原理与应用
ADC工作原理 通道选择寄存器 SA-ADC • 逐次逼近式转换器( SA-ADC ) • 非常快 • 比较复杂 • SA-ADC在单片机中较为常见 • 单片机中常见 • 典型为8-12位 • 具有多个多路复用的模拟通道 单片机原理与应用
ADC 参数 • 转换位数(Bits) • 分辨率 = 2-n (8bits = 0.39%) • 转换速度(Speed) • 由工作时钟频率和转换位数确定 • 转换范围(Range) • 0~5V, 0~10V, -5V~+5V. Etc.. • 转换通道数(Channels) • Distinguish the channel and converter 单片机原理与应用
本节提要 一、A/D转换基础知识 二、ATD模块简介 三、ATD模块寄存器 四、ATD模块编程范例 单片机原理与应用
S12单片机ADC特性 • 8/10/12位可选 • 转换速度较高,10位精度,单次转换时间为7usec • 采样时间可编程设置 • 多种转换模式:数据对齐方式、单次/连续转换、 转换结果比较 • 外触发控制 • 转换结束可产生中断 • 可用于8个模拟输入通道的模拟输入多路转换器. • 模拟/数字输入引脚复用 1~8 转换序列长度. • 多通道扫描 单片机原理与应用
S12单片机ADC转换时间 Always 2 Clocks 2, 4, 8, 16 Clocks 转换时间计算举例: (假设A/D 时钟为2MHz,10位精度) 转换时间 = Initial Sample Time + Programmed Sample Time + Resolution Period = 2 + 2 + 10 = 14 A/D Clocks = 7uSec 单片机原理与应用
S12单片机ADC模块框图 ADC 结果寄存器 参考电压 模拟 输入 通道 ADC 引脚可用于数字输入 单片机原理与应用
本节提要 一、A/D转换基础知识 二、ATD模块简介 三、ATD模块寄存器 四、ATD模块编程范例 单片机原理与应用
ATD 模块寄存器 • 共27个寄存器 • 控制寄存器(ATDCTL0~ATDCTL5,6个) • 状态寄存器(ATDSTAT0~ATDSTAT1,2个 ) • 比较使能寄存器(ATDCMPE, 1个) • 比较方式寄存器(ATDCMPHT , 1个,) • 转换输入使能寄存器(ATDDIEN , 1个) • 转换结果寄存器(ATDDR0~ATDDR15,16个) 其中: 8位寄存器: ATDCTL0~ATDCTL5, ATDSTAT0 16位寄存器:其余 单片机原理与应用
ATD Registers 1/12 ATD Control Register 0 (ATDCTL0) WRAP[3-0] - Wrap Around Channel Select 0 = Reserved X = 多通道转换模式 从ANx回绕到AN0 1≤x ≤ 15 仅在ATDCTL5的MULT=1时有效 单片机原理与应用
ATD Registers 2/12 ATD Control Register 1 (ATDCTL1) 注:写ATDCTL1会终止当前转换序列 ETRIGSEL - External Trigger Source Select S12XS此位无效 ETRIGCH[3:0] - External Trigger Channel Select SMP_DIS - Discharge Before Sampling Bit 0=No discharge 1 = discharge SRES[1:0] - A/D Resolution Select 单片机原理与应用
ATD Registers 3/12 ATD Control Register 2 (ATDCTL2) 注:写ATDCTL2会终止当前转换序列 AFFC - ATD Fast Flag Clear All 0 = 向CCF[n] 标志位写1则清零 1 =读ATD转换结果寄存器则CCF[n] 标志位清零(当比较功能被禁止) 写ATD转换结果寄存器则CCF[n] 标志位清零(当比较功能被使能) ETRIGE - External Trigger Mode Enable 0 = 禁止外部触发信号 1 = 使能外部触发信号 ICLKSTP - Internal Clock in Stop Mode Bit 0 = 停止模式下,停止当前转换,退出停止模式后ATD转换自动重新开始 1 = 停止模式下,可继续使用内部时钟进行ATD转换 ASCIE- ATD Sequence Complete Interrupt Enable 0 = 禁止ATD转换序列结束中断 1 = 使能ATD转换序列结束中断 ETRIGLE - External Trigger Level/Edge Control ETRIGP - External Trigger Polarity ACMPIE - Internal Clock in Stop Mode Bit 0 = 禁止比较中断 1 = 使能比较中断 单片机原理与应用
ATD Registers 4/12 ATD Control Register 3 (ATDCTL3) 注:写ATDCTL3会终止当前转换序列 S8C, S4C,S2C, S1C - Conversion Sequence Length DJM - Result Register Data Justification 0=Left justified data in the result registers 1=Right justified data in the result registers FIFO - Result Register FIFO Mode 0=Conversion results are placed in the corresponding result register up to the selected sequence length. 1=Conversion results are placed in consecutive result registers (wrap around at end). FRZ[1:0] - Background Debug Freeze Enable 单片机原理与应用
ATD Registers 5/12 PRS0-PRS4 Divide By 2 SYSTEM CLOCK 5-Bit Modulus Counter Prescaler A/D Clock ATD Control Register 4 (ATDCTL4) 注:写ATDCTL4会终止当前转换序列 PRS[4:0] - ATD Clock Prescaler SMP[2:0] - Sample Time Select 设置预分频因子时,0.25MHz≤AEDCLK ≤8.3MHz 采样时间长,采样点电平更准确的逼近外部信号电平 单片机原理与应用
ATD Registers 6/12 ATD Control Register 5 (ATDCTL5) SCAN - Continuous Conversion Sequence Mode 0=Single conversion sequence 1=Continuous conversion sequences (scan mode) MULT - Multi-Channel Sample 0=Sample only one channel 1=Sample across several channels SC - Special Channel Conversion 0=Special channel conversions disabled 1=Special channel conversions enabled CD,CC,CB,CA - Analog Input Channel Select Code ATD启动: 写ATDCTL5会终止当前转换序列,并开始新一次转换 此后,若外部触发信号每次满足触发条件都会开始一次ATD转换 单片机原理与应用
ADC 工作方式 • 单通道,单次转换 • 多通道,单次转换 • 单通道,序列转换模式 • 多通道,序列转换模式 • 特殊通道测试模式 单片机原理与应用
ATD Registers 7/12 ATD Status Register 0 (ATDSTAT0) SCF - Sequence Complete Flag 0=Conversion sequence not completed 1=Conversion sequence has completed CC[3:0] - Conversion Counter 当前转换结果将写入的结果寄存器编号 例如: CC[3:0]=0110, 转换结果写入第6个结果寄存器 先入先出模式下,不被初始化,当计数到最大值回最小值 非先入先出模式下,转换开始和结束时被初始化为0 两种模式下终止ATD转换或开始新ATD转换均被清零 ETORF - External Trigger Overrun Flag 0=No External trigger over run error has occurred 1=External trigger over run error has occurred FIFOR- Result Register Over Run Flag 0=No over run has occurred 1=Overrun condition exists (result register has been written while associated CCFx flag was still set) 单片机原理与应用
ATD Registers 8/12 ATD Compare Enable Register (ATDCMPE) CMPE[15:0] - Compare Enable for Conversion Number n (n= 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) of a Sequence 0=No automatic compare 1= Automatic compare of results for conversion n of a sequence is enabled • 对一个序列中第n次ATD转换结果进行比较,除CMPE[n]=1,还要完成如下设置: • 将比较阈值写入ATDDRn • 写ATDCPMHT的CMPHT[n]位选择比较方法 注:写ATDCMPE会终止当前转换序列 单片机原理与应用
ATD Registers 9/12 ATD Status Register 2 (ATDSTAT2) CCF[15:0] - Conversion Complete Flag n (n= 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) 0=Conversion number n not completed or successfully compared 1=If (CMPE[n]=0): Conversion number n has completed. Result is ready in ATDDRn. If (CMPE[n]=1): Compare for conversion result number n with compare value in ATDDRn, using compare operator CMPGT[n] is true. (No result available in ATDDRn) • 出现以下任一情况,CCF[n]被清零: • 写ATDCTL5 • 当AFFC=0,向CCF[n]写1 • 当AFFC=1,且CMPE[n]=1,写ATDDRn 单片机原理与应用
ATD Registers 10/12 ATD Input Enable Register (ATDDIEN) IEN[15:0] - ATD Digital Input Enable on channel x (x= 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) 0=Disable digital input buffer to ANx pin 1=Enable digital input buffer on ANx pin 通用I/O口AD口与ATD模块的模拟输入引脚复用 将某个模拟输入引脚作为通用输入引脚使用时,必须将对应IEN位置位 单片机原理与应用
ATD Registers 11/12 ATD Compare Higher Than Register (ATDCMPHT) CMPHT[15:0] - Compare Operation Higher Than Enable for conversion number n (n= 15, 14, …, 2, 1, 0) of a Sequence 0= If result of conversion n is lower or same than compare value in ATDDRn, this is flagged in ATDSTAT2 1= If result of conversion n is higher than compare value in ATDDRn, this is flagged in ATDSTAT2 注:写ATDCMPHT会终止当前转换序列 单片机原理与应用
ATD Registers 12/12- data format ATD Conversion Result Registers (ATDDRn) ATDDR0~ATDDR15 • 关闭比较操作时,ATD转换结果写入ATDDRn 要写入的ATDDRn的编号由ATDSTAT0的CC3~CC0转换计数给出 转换结果在ATDDRn中的放置位置与转换精度和结果对齐方式有关 • 使能比较功能时,ATD转换结果和比较阈值都总是12位,与SRES[1:0](ATDCTL1)无关 DJM=0 比较阈值左对齐 DJM=1 比较阈值右对齐 转换结果不放入结果寄存器,比较完成后丢失 单片机原理与应用
本节提要 一、A/D转换基础知识 二、ATD模块简介 三、ATD模块寄存器 四、ATD模块编程范例 单片机原理与应用
ATD模块编程范例 • ATD模块编程方法 • ATD初始化:先写除ATD0CTL5外的控制寄存器,再写ATD0CTL5完成初始化,并启动转换; • ATD结果读取:通过查询ATD0STAT0中的SCF位或采用中断方式,确定转换完成,读取相关结果寄存器取得ATD转换结果。 • ATD模块编程范例 任务:分别对特殊通道VRH、VRL和(VRH+VRL)/2进行 ATD转换 单片机原理与应用
ATD模块编程范例(续1) //******************************** // *S12X128 ATD模块范例程序* //******************************** #include <hidef.h> /* common defines and macros */ #include <mc9s12XS128.h> //SCI相关函数 //SCI初始化函数 void SCI_init(void); void SCISendChar(char c1); void SCISendString(char * pc2); void SCISendHex(char c1); unsigned char dtoa(char c1); //ATD相关函数 //ATD初始化函数 void ATD_init(void) ; 单片机原理与应用
ATD模块编程范例(续2) /*******主程序********/ void main(void) { SCI_init(); ATD_init(); ATD0CTL5=0x45; //单次转换,单通道,选择特殊通道VRL while(!(ATD0STAT0&0x80)); //查询ATD是否完成 SCISendString("VRL="); SCISendHex(ATD0DR0H); SCISendString("\r\n"); ATD0CTL5=0x44; //单次转换,单通道,选择特殊通道VRH while(!(ATD0STAT0&0x80));//查询ATD是否完成 SCISendString("VRH="); SCISendHex(ATD0DR0H); SCISendString("\r\n"); ATD0CTL5=0x46; //单次转换,单通道,选择特殊通道(VRL+VRH)/2 while(!(ATD0STAT0&0x80));//查询ATD是否完成 SCISendString("(VRL+VRH)/2="); SCISendHex(ATD0DR0H); SCISendString("\r\n"); for(;;) { } } //END OF MIAN 单片机原理与应用
ATD模块编程范例(续3) /****SCI相关函数****/ void SCI_init(void) { SCI0BDH=0; SCI0BDL=52; SCI0CR2=0x0C; } void SCISendChar(char c1) { while(SCI0SR1_TC==0); SCI0DRL=c1; } void SCISendString(char *pc1){ while((*pc1)!=0) { SCISendChar(*pc1); pc1++ ; } } void SCISendHex(char c1){ SCISendChar(dtoa((c1&0xF0)>>4)); SCISendChar(dtoa((c1&0x0F)) ); } unsigned char dtoa(char c1){ return(c1>=10)?(c1+0x37):(c1+0x30); } 单片机原理与应用
ATD模块编程范例(续4) /****ATD相关函数****/ //ATD初始化函数 void ATD_init(void) { ATD0CTL1=0x0F; //选择8位转换精度 ATD0CTL2=0x40; //打开CCF快速清零,关闭外部触发输入,关闭中断 ATD0CTL3=0x08; //数据左对齐,non-fifo,转换序列长度为1 ATD0CTL4=0xE3; //采样时间为24个ATD时钟周期,ATDClk=8MB/8=1MHz } 单片机原理与应用