第5章模数和数模转换器_第1页
第5章模数和数模转换器_第2页
第5章模数和数模转换器_第3页
第5章模数和数模转换器_第4页
第5章模数和数模转换器_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

模/数和数/模转换器模拟量随时间连续变化的量可以是电量,如模拟电压、电流,也可以是非电量,如温度、湿度、压力、气体浓度等数字量离散变化的量A/D转换器(ADC:AnalogtoDigitalConverter)是一种能把模拟量转换成相应的数字量的电子器件。一般先用传感器或变送器采集非电模拟量转换成电模拟量D/A转换器(DAC:DigitaltoAnalogConverter)则相反,它能把数字量转换成相应的模拟量。数据采集过程控制单片机实时闭环控制系统示意图

多路开关A/D其它功能

D/A被控实体单片机传感器传感器模拟→数字数字→模拟非电模拟量→电模拟量选择一路5.1模/数转换器5.2数/模转换器

5.3电压基准

5.4比较器第5章

模/数和数/模转换器5.1模/数转换器5.1.1模数转换原理和性能指标5.1.2C8051F020的ADC0功能结构5.1.3模拟多路选择器和PGA5.1.4ADC的工作方式5.1.5ADC0可编程窗口检测器5.1.6ADC1(8位ADC)5.1.7模数转换举例5.1模/数转换器A/D是将模拟量转换成数字量的器件。模拟量可以是电压、电流等电信号,也可以是声、光、压力、湿度、温度等随时间连续变化的非电的物理量。非电的模拟量可通过合适的传感器(如光电传感器、压力传感器、温度传感器)转换成电信号。C8051F020片内包含一个9通道的12位的模数转换器ADC0和一个8通道8位的模数转换器ADC1。5.1.1模数转换原理即性能指标1.转换原理种类(按转换原理分)计数式简单、速度慢,很少使用并行式速度最快、结构复杂、价格高,用于速度要求极高场合双积分式抗干扰能力强、精度高、速度较慢,用于仪器仪表逐次逼近式

结构简单、速度较高,计算机测控中常用转换原理—计数式时钟复位数字输出比较器模拟输入计数器D/A转换器转换结束以最低位为增减量的逐步计数法转换原理—逐次逼近式

N位寄存器VsABVxN位D/A控制逻辑比较器模拟量输入启动DONE从最高位开始的逐位试探法(1)逐次逼近式A/D转换器控制逻辑先将结果寄存器的最高位Dn-1置1若Vx>Vs则保留此位Dn-1(为1),否则将Dn-1清0。然后控制逻辑将结果寄存器的次高位Dn-2置1Vs再和Vx比较,以决定Dn-2位保留为1还是清成“0”,依次类推到最低位D0。结果寄存器的状态便是与输入的模拟量Vx对应的数字量。转换原理—双积分式

也称二重积分式,其实质是测量和比较两个积分的时间。一个是对输入模拟电压积分的时间T0,此时间往往是固定的;另一个是以充电后的电压Vi为初值,对参考电源Vref反向积分,积分电容被放电至零所需的时间Ti(Vref

与Vi符号相反)。模拟输入电压Vi与参考电压Vref之比,等于上述两个时间之比。由于Vref

、T0

固定,而放电时间Ti可以测出,因而可计算出模拟输入电压的大小。

双积分式A/D转换器工作原理图Ti1tA控制逻辑B-+计数器时钟Vi模拟输入Vref标准电压Vi2Vi1Ti2固定积分时间积分输出开始斜率固定(b)积分原理(a)原理框图T02.性能指标(1)衡量A/D性能的主要参数是:(1)

分辨率(resolution)分辨率是指输出的数字量变化一个相邻的值所对应的输入模拟量的变化值;取决于输出数字量的二进制位数。一个n位的A/D转换器所能分辨的最小输入模拟增量定义为满量程值的2-n倍。例如,满量程为10V的8位A/D芯片的分辨率为

10V×2-8=39mV;而16位的A/D是

10V×2-16=153µV。2.性能指标(2)(2)满刻度误差(fullscaleerror) 满刻度误差也称增益误差,即输出全1时输入电压与理想输入量之差。(3)转换速率(conversionrate) 转换速率是指完成一次A/D转换所需时间的倒数,A/D转换器型号不同,转换速度差别很大。(4)转换精度(conversionaccuracy) 转换精度由模拟误差和数字误差组成。模拟误差属于非固定误差,由器件质量决定,数字误差和A/D输出数字量的位数有关,位数越多,误差越小。5.1.2C8051F020的ADC0功能结构(1)C8051F020的ADC0子系统是一个100ksps、12位分辨率的逐次逼近型ADC。一个9通道的可编程模拟多路选择器(AMUX0)一个可编程增益放大器(PGA0)一个100ksps、12位分辨率的逐次逼近型ADC,ADC中集成了跟踪保持电路和可编程窗口检测器。ADC0子系统功能框图

输入方式配置

通道选择

配置寄存器

控制寄存器内置温度传感器窗口寄存器窗口比较中断5.1.3模拟多路选择器和PGA(1)模拟多路选择器AMUX(AnalogMultiplexer)中的8个通道用于外部测量,而第9通道在内部被接到片内温度传感器。9个通道通过通道选择寄存器AMX0SL和配置寄存器AMX0CF进行选择和配置。可以将AMUX输入对编程为差分或单端方式。5.1.3模拟多路选择器和PGA(2)配置寄存器AMX0CF的格式如下:

R/WR/WR/WR/WR/WR/WR/WR/W复位值----AIN67ICAIN45ICAIN23ICAIN01IC00000000位7位6位5位4位3位2位1位0SFR地址:0xBA位3:AIN67IC:AIN6、AIN7输入对配置位

0:AIN6和AIN7为独立的单端输入

1:AIN6,AIN7为+,-差分输入对注:差分通道输出的数据格式是2的补码5.1.3模拟多路选择器和PGA(3)通道选择寄存器AMX0SL的格式如下:

R/WR/WR/WR/WR/WR/WR/WR/W复位值----AMX0AD3AMX0AD2AMX0AD1AMX0AD000000000位7位6位5位4位3位2位1位0SFR地址:0xBB位3-0:AMX0AD3-0:AMUX0地址位0000-1111b:根据不同组合选择ADC输入的通道。

模拟通道配置5.1.3模拟多路选择器和PGA(4)PGA(programmablegainamplifier),可编程增益放大器。对AMUX输出信号的放大倍数由ADC0配置寄存器ADC0CF中的AMP0GN2-0确定。PGA增益可以用软件编程为0.5、1、2、4、8或16,复位后的默认增益为1。注意,PGA0的增益对温度传感器也起作用。P244ADC0CF格式5.1.4ADC的工作方式

(1)1.转换过程由控制寄存器ADC0CN来设置和控制,其格式如下:R/WR/WR/WR/WR/WR/WR/WR/W复位值AD0ENAD0TMAD0INTAD0BUSYAD0CM1AD0CM0AD0WINTAD0LJST00000000位7使能位

位6跟踪方式位5转换结束中断位4忙标志

位3启动方式

位2启动方式位1窗口比较中断位0对齐方式SFR地址:0xE85.1.4ADC的工作方式

(2)C8051F020的ADC0有4种转换启动方式,由ADC0CN中的ADC0启动转换方式位(AD0CM1,AD0CM0)的状态决定。00:向AD0BUSY写1时启动01:定时器3溢出时启动10:CNVSTR上升沿启动11:定时器2溢出时启动AD0BUSY位在转换期间为1,转换结束后复0,并置中断标志AD0INT。查询方式编程步骤(1)写0到AD0INT;(2)向AD0BUSY写1,启动转换;(3)查询并等待AD0INT变1;(4)处理ADC0数据

AD0INT=0; AD0BUSY=1; while(!AD0INT); result=ADC0;2.跟踪方式

每次ADC转换之前都必须有一段最小的跟踪时间,以保证得到精确的转换结果ADC0CN中的AD0TM位控制ADC0的跟踪保持方式。在缺省状态,除了转换期间ADC0输入被连续跟踪。当AD0TM=1,ADC0工作在低功耗跟踪保持方式。每次转换之前都有3个SAR时钟的跟踪周期(在启动转换信号有效之后)。当CNVSTR信号用于在低功耗跟踪保持方式启动转换时,ADC0只在CNVSTR为低电平时跟踪;在CNVSTR的上升沿开始转换。当整个芯片处于低功耗待机或休眠方式时,跟踪可以被禁止(关断)。12位ADC跟踪和转换时序

CNVSTR低电平跟踪,上升沿开始转换只跟踪3个周期转换结束进入低功耗状态除转换外一直跟踪3.建立时间要求当ADC0输入配置发生改变时(AMUX或PGA的选择发生变化),在进行一次精确的转换之前需要有一个最小的跟踪时间,称建立时间。对于一个给定的建立精度(SA),所需要的ADC0建立时间可以用方程估算:

ADC0建立时间

:SA是建立精度,用一个LSB的分数表示(例如,建立精度0.25对应1/4LSB);t为所需要的建立时间,以秒为单位;RTOTAL为ADC0模拟多路器电阻与外部信号源电阻之和;n为ADC0的分辨率,用比特表示。

ADC0等效输入电路

4.转换结果格式12位转换结果存放在ADC0H、ADC0L中。AD0LJST=0:数据右对齐,ADC0H的位7-4为位3的符号扩展位、位3-0是12位ADC0数据字的高4位。ADC0L的位7-0为12位ADC0数据字的低8位。AD0LJST=1:数据左对齐,ADC0H位7-0为12位ADC0数据字的高8位。ADC0L的位7-4为12位ADC0数据字的低4位,ADC0L的位3-0恒为0。符号扩展ADC0H(4位)ADC0L(8位)ADC0H(8位)ADC0L(5位)000数据字转换表

AIN0为单端输入方式:数据是无符号数高4位为0(符号)低4位为0AIN0-AIN1为差分输入对:

数据为带符号数(右对齐,高四位为补码符号扩展)高4位为符号扩展低4位为05.1.5ADC0可编程窗口检测器

ADC0可编程窗口检测器提供一个中断,当ADC0转换值在下限(大于)寄存器ADC0GTH:ADC0GTL和上限(小于)寄存器ADC0LTH:ADC0LTL范围之内,并且中断开启时,引发相应中断。下限值<上限值时,检测值位于极限值内时有效,可引起中断。下限值>上限值时,检测值位于极限值以外时有效,可引起中断。默认下限值为0xffff,上限值为0x0000,全范围不引发中断。ADC0右对齐的单端数据窗口中断示例

数据在此范围中断ADC0右对齐的差分数据窗口中断示例数据在此范围中断ADC0左对齐的单端数据窗口中断示例数据在此范围中断ADC0左对齐的差分数据窗口中断示例数据在此范围中断5.1.6ADC1(8位ADC)

C8051F020还有一个ADC1子系统,包括一个8通道(无内置的温度通道)的可配置模拟多路开关(AMUX1),一个可编程增益放大器(PGA1)和一个500ksps、8位分辨率的逐次逼近型ADC,该ADC中集成了跟踪保持电路。

与ADC1工作有关的SFR有ADC1配置寄存器ADC1CF、AMUX配置寄存器AMX1SL、ADC1控制寄存器ADC1CN、ADC1数据寄存器ADC1。

与ADC0区别:无窗口比较功能,无差分方式,只有4种增益倍数,启动方式增加到5种。ADC1原理框图

选择通道

放大倍数

转换时钟频率

3.跟踪方式

ADC1CN中的AD1TM位控制ADC1的跟踪保持方式。工作原理与过程同ADC0类似。ADC1跟踪和转换时序举例

内容回顾A/D转换器把模拟量转换成相应数字量的电子器件。数据采集按原理分类并行式、计数式、逐次逼近式、双积分式分辨率:满量程电压/2nD/A转换器把数字量转换成相应模拟量的电子器件。自动控制单片机实时闭环控制系统示意图

多路开关A/D其它功能

D/A被控实体单片机传感器传感器数据采集自动控制内容回顾通道配置与选择差分、单端AMX0CF、AMX0SL增益放大与转换时钟控制0.5、1、2、4、8、16ADC0CF启动方式向AD0BUSY位写1T3溢出T2溢出外部信号启动(CNVSTR上升沿)跟踪方式每次ADC转换之前必须有一段最小的跟踪时间,以保证得到精确的转换结果连续跟踪(默认)低功耗跟踪(转换启动后跟踪3个SAR时钟周期或CNVSTR为低时跟踪)数据对齐方式左对齐、右对齐内容回顾—ADC0组成内容回顾可编程窗口检测器下限值<上限值时,检测值位于极限值内时有效,可引起中断。下限值>上限值时,检测值位于极限值以外时有效,可引起中断。软件启动转换、查询方式读结果方法写0到AD0INT;向AD0BUSY写1,启动转换;查询并等待AD0INT变1;处理ADC0数据5.1.7模数转换举例1.片内温度传感器数据采集C8051F020的ADC0中有一个片内温度传感器,温度传感器产生一个与器件内部温度成正比的电压,作为单端输入提供给AMUX,转换结果经简单数学运算可以转换成度数表示的温度。温度转换器的典型应用有系统环境检测、系统过热测试和在基于热电偶的应用中测量冷端温度。本例使用左对齐,这样可使代码的权值与ADC的位数(12或10)无关。ADC转换步骤

(1)通过将TEMPE(REF0CN.2,P276)设置为1来允许温度传感器工作。模拟偏置发生器和内部电压基准的允许位REF0CN.1和REF0CN.0也要置1。即:movREF0CN,#07h;允许温度传感器、模拟偏置发生器和电压基准(2)选择温度传感器作为ADC的输入。这可以通过写AMX0SL来完成,例如:movAMX0SL,#0fh;选择温度传感器作ADC输入,1×××(3)设置位于ADC0CF中的ADC0SAR时钟分频系数,特别是ADC转换时钟的周期至少应为500ns。ADC转换步骤(4)选择ADC的增益。如果使用内部电压基准,则该值大约为2.4V。温度传感器所能产生的最大电压值稍大于1V。因此,可以安全地将ADC的增益设置为2,以提高温度分辨率。设置ADC增益的配置位在ADC0CF中。所以,有

movADC0CF,#61h;设置ADC的时钟为SYSCLK/13、增益为2,P245(5)将ADC配置为低功耗跟踪方式,向AD0BUSY写1启动转换

movADC0CN,#C1H;允许ADC;AD0BUSY作转换启动信号(6)至此,可以通过将AD0BUSY写1来启动一次转换:

setbAD0BUSY

启动转换(7)用查询或中断方式(ADC0CN的AD0INT位)等待转换完成。ADC输出寄存器中的值就是与绝对温度成正比的代码。如何通过采样值得到温度的摄氏度数值:温度传感器产生一个与器件内部绝对温度成正比的电压输出。

Vtemp——温度传感器的输出电压;

Temp——器件内部的摄氏温度值。温度传感器的传输特性

A/D的输出值为:

CODE——左对齐的ADC输出代码;

Gain——PGA的增益;

VREF——电压基准的电压值。假设Gain=2和VREF=2.43V,得到输出温度值为式

其中

Temp——温度的摄氏度数值。

实际的环境温度测量温度传感器测量的是器件的内部温度。如果希望测量环境温度,则必须考虑器件的自热效应。由于器件功率消耗的原因,测量值很可能比环境温度值高几度。

一种方法是在器件上电之后立即启动一次转换,得到一个“冷”温度值;然后大约经过1min之后再测量一次,得到一个“热”温度值。这两个测量值的差就是因自热而产生的温度增加值。

另一种方法是让器件从一个低的SYSCLK频率开始工作,例如32kHz,进行一次温度测量,然后再让器件工作在较高频率,例如16MHz的内部振荡器,取两者之差。在时钟频率更低时自热值是可忽略的,因为此时器件的功耗很低。

(1)查询法程序ADC0配置为写AD0BUSY作为转换的开始信号;温度传感器的输出转换成摄氏温度由UART0传输出去;通过PC机超级终端(或其他串口调试程序)来观察温度采样值。假设在XTAL1和XTAL2之间连接22.1184MHz晶振系统时钟频率存储在全局常量SYSCLK中,目标器件UART波特率存储在全局常量BAUDRATE中

主程序voidmain(void){longtemperature; //温度inttemp_int,temp_frac; //温度的整数和小数部分WDTCN=0xde; //禁止看门狗定时器WDTCN=0xad;SYSCLK_Init(); //初始化振荡器PORT_Init(); //初始化数据交叉开关和通用IO口UART0_Init(); //初始化UART0ADC0_Init(); //初始化和使能ADCwhile(1){AD0INT=0;

//清除转换结束标记,见P246步骤AD0BUSY=1;

//启动转换while(AD0INT==0); //等待转换结束temperature=ADC0; //读ADC0数据temperature=temperature-41857;

//减去偏移量,对应0℃的值。temperature=(temperature*100L)/154; //计算出对应的温度值temp_int=temperature/100; //得到温度值的整数部分temp_frac=temperature-(temp_int*100); //得到温度值的小数部分printf(“Temperatureis%+02d.%02d\n”,temp_int,temp_frac);//串口输出}}问题:temperature为什么要定义成long类型?C51用其实现UART通信系统时钟初始化//此程序初始化系统时钟使用外部22.1184MHz晶体作为时钟源voidSYSCLK_Init(void){inti; //延时计数器OSCXCN=0x67; //启动外部振荡器22.1184MHz晶体for(i=0;i<256;i++);//等待振荡器启动

(>1ms)while(!(OSCXCN&0x80)); //等待晶体振荡器稳定OSCICN=0x88;//选择外部振荡器为系统时钟源并使能时钟丢失检测器}

详见P75建议过程IO口初始化

//配置数据交叉开关和通用I/O口voidPORT_Init(void){XBR0=0x04; //使能UART0XBR1=0x00;//可去掉XBR2=0x40; //使能数据交叉开关和弱上拉P0MDOUT|=0x01; //使能TX0,推挽输出}同P179串口交叉开关配置UART0初始化//配置UART0使用定时器1产生波特率voidUART0_Init(void){SCON0=0x50; //SCON0:模式1,8位UART,允许RXTMOD=0x20; //TMOD:1定时器,

模式2,

8位重装TH1=-(SYSCLK/BAUDRATE/16);//T1重装值,P193公式TR1=1; //启动定时器1CKCON|=0x10; //定时器1使用系统时钟为时基PCON|=0x80; //SMOD0=1TI0=1; //表示发送就绪}ADC0初始化//配置ADC0使用AD0BUSY作为转换源,使用左对齐输出模式,//使用正常跟踪模式,测量片内温度传感器器输出//禁止ADC0转换结束中断和ADC0窗口比较器中断voidADC0_Init(void){ADC0CN=0x81; //ADC0使能;正常跟踪模式;写AD0BUSY时启动转换;

//数据左对齐REF0CN=0x07; //使能温度传感器片内VREF和VREF输出缓冲器AMX0SL=0x0f; //选择温度传感器作为ADC多路模拟转换器输出ADC0CF=(SYSCLK/2500000-1)<<3;//ADC转换时钟=2.5MHzADC0CF|=0x01; //PGA增益=2EIE2&=~0x02;

//禁止ADC0EOC中断EIE1&=~0x04;

//禁止ADC0窗口比较器中断}P244(2)中断方式程序

在中断模式使用T3溢出作为启动转换信号,

测量片内温度传感器输出。ADC0结果经简单的均值滤波处理,均值滤波计数值由常量INT_DEC给出。ADC结果经计算得出温度从UART0传输。假设在XTAL1和XTAL2之连接22.1184MHz晶体。系统时钟频率存储在全局常量SYSCLK目标UART波特率存储在全局常量BAUDRATE。

ADC0采样率存储在全局常量SAMPLERATE0。

主程序Timer3_Init(SYSCLK/SAMPLERATE0);//初始化定时器3溢出为采样速率ADC0_Init(); //初始化ADCAD0EN=1; //使能ADC,也可以放在初始化里使能EA=1; //使能所有中断while(1){EA=0; //禁止中断temperature=result;EA=1; //重新使能中断temperature=temperature-41857;//计算温度(百分之一精度)temperature=(temperature*100L)/154;temp_int=temperature/100;temp_frac=temperature-(temp_int*100);printf(“Temperatureis%+02d.%02d\n”,temp_int,temp_frac);}ADC0初始化//配置ADC0使用定时器3溢出作为转换源,转换结束产生中断//使用左对齐输出模式允许ADC转换结束中断,禁止ADCvoidADC0_Init(void){ADC0CN=0x05; //ADC0禁止;正常跟踪

mode;T3溢出开始转换

//数据左对齐REF0CN=0x07; //允许温度传感器片内VREF和VREF输出缓冲器AMX0SL=0x0f; //选择温度传感器作为ADC多路模拟转换输出ADC0CF=(SYSCLK/2500000-1)<<3;//ADC转换时钟=2.5MHzADC0CF|=0x01;//PGA增益=2EIE2|=0x02; //允许ADC中断}定时器3初始化//配置定时器3,自动重装间隔由“counts”指定,

不产生//中断,使用系统时钟为时基.voidTimer3_Init(intcounts){TMR3CN=0x02; //停止定时器3;清除

TF3;//使用系统时钟为时基TMR3RL=-counts; //初始化重装值TMR3=0xffff; //设置为立即重装EIE2&=~0x01; //禁止定时器3中断TMR3CN|=0x04; //起动定时器3}中断服务程序//得到ADC0采样值,将它加到运行总数accumulator中,//当int_dec为0时,在全局变量result放置数字滤波后的结果voidADC0_ISR(void)interrupt15{staticunsignedint_dec=INT_DEC;//数字滤波计数器,

//int_dec=0时重设新值staticlongaccumulator=0L;AD0INT=0; //清除ADC转换结束标志accumulator+=ADC0; //读ADC值并加到运行总数中int_dec--; //更新数字滤波计数器if(int_dec==0){ //如果为0,计算结果

int_dec=INT_DEC;

//重设计数器

result=accumulator>>8;

//除以256,求平均值(数字滤波)

accumulator=0L;

//复位accumulator}}2.多通道数据采集

ADC0工作在中断模式,使用定时器3溢出作为开始转换信号测量AIN0~AIN7的电压和温度传感器转换结果经过计算所得电压从UART0传输假设在XTAL1和XTAL2之间接22.1184MHz晶振系统时钟频率存储在全局常量SYSCLK目标UART波特率存储在全局常量BAUDRATEADC0采样频率存储在全局常量SAMPLERATE0电压参考值存储在VREF0

主程序voidmain(void){longvoltage; //电压以mV为单位inti; //循环计数器WDTCN=0xde; //禁止看门狗定时器WDTCN=0xad;SYSCLK_Init(); //初始化振荡器PORT_Init(); //初始化数据交叉开关和通用IOUART0_Init(); //初始化UART0Timer3_Init(SYSCLK/SAMPLERATE0);//初始化T3溢出作为采样率ADC0_Init(); //初始化ADCAD0EN=1; //允许ADCEA=1; //允许所有中断while(1){for(i=0;i<9;i++){EA=0; //禁止中断voltage=result[i]; //从全局变量取得ADC值EA=1; //重新使能中断//计算电压(mV)voltage=voltage*VREF0;voltage=voltage>>4;//右移4位,得到实际大小printf(“Channel‘%d’voltageis%ldmV\n”,i,voltage);}}}系统时钟初始化

//此程序初始化系统时钟使用22.1184MHz晶体作为系统时钟voidSYSCLK_Init(void){inti; //延时计数器OSCXCN=0x67; //起动外部振荡器22.1184MHz晶体for(i=0;i<256;i++); //等待振荡器启动(>1ms)while(!(OSCXCN&0x80));//等待晶体振荡器稳定OSCICN=0x88; //选择外部振荡器作为系统时钟

//源并允许丢失时钟检测器}IO口初始化

//配置数据交叉开关和通用IO口voidPORT_Init(void){XBR0=0x04; //使能UART0XBR1=0x00;XBR2=0x40;

//

使能数据交叉开关和弱上拉P0MDOUT|=0x01;//使能TX0,推挽输出}UART0初始化

//配置UART0使用定时1为波特率发生器voidUART0_Init(void){SCON0=0x50; //SCON0:模式1,8位UART,允许RXTMOD=0x20; //TMOD:定时器1,模式2,8位重装TH1=-(SYSCLK/BAUDRATE/16);//按波特率设置T1重装值TR1=1; //启动定时器1CKCON|=0x10; //定时器1使用系统时钟为时基PCON|=0x80; //SMOD0=1TI0=1; //表示TX0就绪}ADC0初始化

//配置ADC0使用定时器3溢出作为转换源,转换结束产生中断使用左对齐输出模式//使能ADC转换结束中断禁止ADC//注意:使能低功率跟踪模式保证当改变通道时的跟踪次数最少voidADC0_Init(void){ADC0CN=0x45; //ADC0禁止;低功率跟踪模式

//当T3溢出时ADC0转换开始;ADC0数据左对齐REF0CN=0x07; //使能温度传感器片内VREF和VREF输出缓冲器AMX0SL=0x00; //选择AIN0为ADC多路模拟输出ADC0CF=(SYSCLK/2500000)<<3;//ADC转换时钟=2.5MHzADC0CF&=~0x07; //PGA增益=1EIE2|=0x02; //允许ADC中断}定时器3初始化

//配置定时器3,自动重装间隔由“counts”指定

,不产生中断,使用系统时钟为时基。voidTimer3_Init(intcounts){TMR3CN=0x02; //停止定时器3;清除

TF3;//使用系统时钟为时基TMR3RL=-counts; //初始化重装值TMR3=0xffff; //设置为立即重装EIE2&=~0x01; //禁止定时器3中断TMR3CN|=0x04; //起动定时器3}中断服务程序//ADC0转换结束中断服务程序//得当ADC0采样值并存储在全局数组

<result>.//同时选择下一个通道转换voidADC0_ISR(void)interrupt15{staticunsignedcharchannel=0; //ADC多路模拟通道(0-8)AD0INT=0; //清除ADC转换结束标志result[channel]=ADC0; //读ADC值channel++; //改变通道if(channel==9){channel=0;}AMX0SL=channel; //设置多路模拟转换器到下一个通道}5.2数/模转换器

5.2.1D/A转换原理及性能指标

1.转换原理D/A转换器的原理很简单,可以总结为“按权展开,然后相加”几个字。D/A转换器内部必须有一个解码网络,以实现按权值分别进行D/A转换。解码网络通常有两种:二进制加权电阻网络T型电阻网络T型电阻网络D/A转换原理框图01RfIRfA-+VOUTDCBR2R2R2RVREFR2RI0I2I3I1IL0IL2IL3IL1b3

b2

b1

b0四位DAC寄存器OAS001S101S201S3IOUT1IOUT2运算放大器电子开关T型电阻网络虚地点T型电阻网络转换原理由图可得I0=IL0,根据基尔霍夫电流定律:IL1=IL0+I0,分析C点到A点的电阻及到地线的电阻可得

I1=IL1,则I0=1/2I1,同理可推得I1=1/2I2、I2=1/2I3,所以可得如下关系:T型电阻网络转换原理T型电阻网络转换原理事实上,S3~S0的状态是受b3b2b1b0控制的,并不一定是全“1”,所以流入A点的电流应该是:选取Rf=R,并考虑A点为虚地,则有可以得到:对于n位T型电阻网络T型电阻网络D/A转换原理框图01RfIRfA-+VOUTDCBR2R2R2RVREFR2RI0I2I3I1IL0IL2IL3IL1b3

b2

b1

b0四位DAC寄存器OAS001S101S201S3IOUT1IOUT2性能指标(1)分辨率(resolution)指D/A转换器能分辨的最小输出模拟增量,为满量程值的2-n倍。例如,满量程为10V的8位D/A芯片的分辨率为10V×2-8=39mV;而16位的D/A是10V×2-16=153µV。(2)

转换精度(conversionaccuracy)转换精度是指满量程时D/A的实际模拟输出值和理论值的接近程度。例如,满量程时理论输出值为10V,实际输出值是在9.99~10.01之间,则其转换精度为±10mV。通常为LSB/2。LSB(LeastSignificantBit)是分辨率,指最低1位数字变化引起输出电压幅度的变化量。性能指标(3)偏移量误差(offseterror)偏移量误差是指输入数字量为零时,输出模拟量对零的偏移值。这种误差通常可以通过D/A转换器的外接VREF和电位器加以调整。(4)线性度(linearity)线性度是指D/A转换器的实际转换特性曲线和理想直线之间的最大偏差。通常线性度不应超出±1/2LSB。除此以外,指标还有转换速度、温度灵敏度等,通常这些参数都很小,一般不予考虑。

5.2.2C8051F020的DAC功能C8051F020有两个片内12位电压方式数/模转换器。每个DAC的输出摆幅均为0~(VREF-1LSB)V,对应的输入码范围是0x000到0xFFF。控制寄存器DAC0CN和DAC1CN使能/禁止DAC0和DAC1。在被禁止时,DAC的输出保持在高阻状态,DAC的供电电流降到1µA或更小。每个DAC的电压基准由VREFD引脚提供。如果使用内部电压基准,为了使DAC输出有效,该基准必须被使能。

DAC功能框图

使能控制输出更新方式数字量输入控制DAC工作的主要是控制寄存器DAC0CN和DAC1CN。控制寄存器R/WR/WR/WR/WR/WR/WR/WR/W复位值DAC0EN--DAC0MD1DAC0MD0DAC0DF2DAC0DF1DAC0DF000000000位7位6位5位4位3位2位1位0SFR地址:0xD4位7(DAC0EN):DAC0使能位控制寄存器位4-3(DAC0MD1~DAC0MD10):DAC0更新方式位。00:写DAC0H时更新。01:定时器3溢出时更新。10:定时器4溢出时更新。11:定时器2溢出时更新。位2-0(DAC0DF2~DAC0DF20):DAC0数据格式位:000:DAC0数据字的高4位在DAC0H[3:0],低字节在DAC0L中。

其余类推。控制寄存器DAC0HDAC0L

MSB

LSB001:DAC0数据字的高5位在DAC0H[4:0],低7位在DAC0L[7:1]。

DAC0HDAC0L

MSB

LSB

5.2.3DAC输出更新每个DAC都具有灵活的输出更新机制,允许全量程内平滑变化并支持无抖动输出更新,适合于波形发生器应用。1.根据软件命令更新输出在缺省方式下(DAC0CN.[4:3]=00),DAC0的输出在写DAC0H时更新。注意:写DAC0L时数据被保持,对DAC0输出没有影响,直到对DAC0H的写操作发生。

5.2.3DAC输出更新2.基于定时器溢出的输出更新当DAC0MD位(DAC0CN.[4:3])被设置为01、10或11时(分别为定时器3、定时器4或定时器2),对DAC数据寄存器的写操作被保持,直到相应的定时器溢出事件发生时DAC0H:DAC0L的内容才被复制到DAC输入锁存器,允许DAC数据改变为新值。5.2.4.DAC输出定标/调整

对DAC0进行写入操作之前应对输入数据移位,以正确调整DAC输入寄存器中的数据。这种操作一般需要一个或多个装入和移位指令,因而增加软件开销和降低DAC的数据通过率。数据格式化功能为用户提供了一种能对数据寄存器DAC0H和DAC0L中的数据格式编程的手段。三个DAC0DF位(DAC0CN.[2:0])允许用户在5种数据字格式指定一种,见DAC0CN寄存器定义。5.2.5数模转换举例

D/A转换器的编程相对A/D转换器要简单。按照要求设置好输出更新的条件,将要转换的数值量送到DAC数据寄存器即可。下面是产生阶梯波和锯齿波的示例。将DAC0设置成输出更新发生在写DAC0H时,即软件更新,产生阶梯波。DAC1设置成输出更新发生在定时器2溢出时,产生锯齿波。

1、产生阶梯波

//DAC0用软件更新输出,产生一个阶梯波形。voidmain(void){ inti; config(); for(i=0;i<=4095;i+UP) //形成阶梯波形

{ DAC0=i;//送数字量到DAC0直接更新输出

d1ms(T); }}

TUP04095软件延时函数voidd1ms(intcount)//延时count毫秒{ intj; while(count--!=0) { for(j=0;j<100;j++);//约1ms }}配置程序

voidconfig(void){intn=0;

WDTCN=0xDE; //禁止看门狗,删除WDTCN=0x07;WDTCN=0xAD;

OSCXCN=0x67;

//外部振荡器寄存器,采用11.0952MHz for(n=0;n<255;n++);//等待振荡器启动

while((OSCXCN&0x80)==0);//等待晶振稳定,while(!(OSCXCN&0x80))OSCICN=0x88;//P73,使用外部时钟4步,P260例程

REF0CN=0x03; //内部偏压发生器工作

DAC0CN=0x80; //允许DAC0,程序直接更新输出,数据右对齐

DAC0L=0x00; //DAC1数据寄存器初值,或DAC0=0x00;

DAC0H=0x00; }voidmain(void){ config(); //配置

EA=1; //开中断

while(1);}2、产生锯齿波

中断程序voidT2_ISR()interrupt5{ TF2=0; //清中断标志

DAC1++;

//因为是T2溢出更新DAC1输出,

if(DAC1>=0x1000) DAC1=0; //形成锯齿波}配置程序voidconfig(void){

intn=0;

WDTCN=0xDE; //禁止看门狗

WDTCN=0xAD;

OSCXCN=0x67;

//外部振荡器寄存器,采用11.0952MHz for(n=0;n<255;n++);

//等待振荡器启动

while((OSCXCN&0x80)==0);//等待晶振稳定

OSCICN=0x88;

REF0CN=0x03;

//内部偏压发生器工作

DAC1CN=

0x98;//允许DAC1、T2溢出中断更新,数据右对齐

DAC1=0x00; RCAP2H=0x05;

//重新装入的时间常数

RCAP2L=0x00; TH2=0x05; TL2=0x00;//初始值

T2CON=0x04;

//T2方式0,启动T2} 方波发生器:写DAC0H时更新 $include(c8051f020.inc) org0000h ajmpmain org100hmain:movwdtcn,#0deh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论