第九章 数据采集编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

9.1 概述
D/A转换器(Digital to Analog Converter)是一种能把 数字量转换成模拟量的电子器件. A/D转换器(Analog to Digital Converter)则相反,它 能把模拟量转换成相应数字量.
9.2 D/A转换器DAC0832
9.2.1 D/A转换器的性能指标
DAC性能指标颇多,主要有以下四个: 分辨率(Resolution):D/A转换器能分辨的最小输出模拟增量, 取决于输入数字量的二进制位数.一个n位的DAC所能分 辨的最小电压增量定义为满量程值的2-n倍. 例如:满量程为10V的8位DAC芯片的分辨率为 10V×2-8=39mV;一个同样量程的16位DAC的分辨率高 达10V×2-16=153V . 转换精度(Conversion Accuracy):指满量程时DAC的实际模 拟输出值和理论值的接近程度.对T型电阻网络的DAC, 其转换精度和参考电压VREF,电阻值和电子开关的误差 有关. 例如:满量程时理论输出值为10V,实际输出值是在 9.99V—10.01V之间,其转换精度为±10mV .通常, DAC的转换精度为分辨率之半,即为LSB/2.LSB是分辨 率,是指最低一位数字量变化引起幅度的变化量.
C51源程序
void delay1(uchar x) /*延时函数*/ { uchar i; for(i=0;i<x;i++); } void adcck(void) /*时钟信号函数*/ { adcclk=1; delay1(2); adcclk=0; delay1(readadc(void) { uchar i; char ch0=0; adccs=0; /* 片选信号为0 */ adcck(); adcdi=1; /* 启动A/D信号 */ adcck(); adcdi=1; /* SGL=1 */ adcck(); adcdi=0; /* ODD=0,单极性,选中通道0 */ adcck(); /* 延时一个时钟期,产生一个时钟信号 */ for (;adcdo==1;) adcck(); for (i=0; i<8; i++) { adcck(); /*产生时钟信号*/ ch=(ch<<1)|adcdo; /*接收TLC0832输出的转换结果*/ } adccs=1; /*片选信号置1*/ return(ch); }
四位逐次逼近型A/D转换时序
10.3.2 ADC0809应用实例
ADC0809与单片机接口时序
ADC0809时序图
例9-3-1
在一控制系统中,巡回检测一遍8路模拟量输入. 解:ADC0809通道0端口地址为FEF0H.采用中断方式依次读取8 个通道的数据,分别存到外部RAM的0000H-0007H单元. 程序中定义了两个指针变量* ADC及* ADCdata,分别指向 ADC0809接口地址(0xfef0)和外部RAM单元地址. 源程序如下: #include <reg51.h> unsigned char xdata * ADC; /* 定义ADC0809端口指针 */ unsigned char xdata * ADCdata; /* 定义ADC0809数据缓冲器指针 */ unsigned char i;
/* 方波发生函数 */
源程序
void main(void) { uchar i,j; i=j=0xff; while(i--) { saw(); } while(j--) { square(); } }
/* 产生一段锯齿波 */
/* 产生一段方波 */
9.3 A/D转换器ADC0809
ADC0809是一种逐次逼近型A/D转换器. 转换一开始SAR向DAC置MSB(逻辑"1"),并通过 比较器,将DAC的模拟输出(1/2满量程)与模拟输入信号 比较.若DAC输出小于模拟输入,则MSB保留.若DAC的 输出大于模拟输入,则MSB丢弃(逻辑"0"),然后SAR 继续向DAC置入次高位,将它保留还是丢弃,取决于DAC 输出与模拟输入的比较结果.这种试探过程一直进行到 LSB为止,此时转换即告完成,数据由输出线送出.
9.2.1 D/A转换器的性能指标
偏移量误差(Offset Error):指输入数字量为零时, 输出模拟量对零的偏移值.这种误差通常可以通 过DAC的外接VREF和电位计加以调整. 线性度(Linearity):DAC的实际转换特性曲线和理 想直线之间的最大偏移差.通常,线性度不应超 出 ±LSB. 除上述指标外,转换速度(Conversion Rate)和温度灵敏度(Temperature Sensitivity) 也是DAC的重要技术参数.
9.4 8位A/D转换器TLC0832
TLC0832是美国TI公司推出的8 位串行A/D转换器,体 积小,引脚少,与微处理器接口电路简单,已取得广泛应 用.
9.4.1 主要技术特点
8位分辨率 易于和微处理器接口或独立使用 满比例尺工作或用5v基准电压 可单通道或差分输入选择 单5V供电,输入范围0~5V 输入和输出与TTL和CMOS兼容 在FCLOCK=250Hz时,转换时间为32us 非线性调整误差 ±1 LSB TLC0832有2个输入通道.
9.2.2 DAC0832引脚及内部结构
1)DAC0832内部结构 2)引脚功能
9.2.3 DAC0832的应用
9.2.3.1 DAC用作单极性电压输出 用作单极性电压输出
VREF/256为一常数. 显然,Vout和B成正比关系.输入数字量B为0时,Vout 也为0,输入数字量为256时,Vout为负的最大值,输出电 压为负的单极性.
源程序
void main() { ADC=0xfef0; ADCdata=0x0000; /* 定义端口地址和数据缓冲器地址 */ i=8; /* ADC0809有8个模拟输入通道 */ EA=1; EX1=1;IT1=1; /* 开中断 */ *ADC=i; /* 启动ADC0809 */ while(i); /* 等待8个通道A/D转换完毕 */ } void int1() interrupt 2 { unsigned char tmp; tmp=*ADC; /* 读取A/D转换结果 */ *ADCdata=tmp; /* 结果值存储到数据缓冲器 */ ADCdata++; /* 数据缓冲器指针地址加1 */ i--; *ADC=i; /* 启动下一个模拟输入通道A/D转换 */ }
例9-3-2 绝对地址访问
利用C51的绝对地址访问实现例9-3-1的数据采集功能. C51编译器提供一组预定义宏,该宏文件为 "absacc.h",利用它可以方便地实现对任何内存空间的直 接操作. 采用这种方法将上题改写为如下程序: #include <reg51.h> #include <absacc.h>/* 包含绝对地址操作预定义头文件 */ #define ADC 0xfef0 /* 定义ADC0809端口地址 */ #define ADCdata 0x0000 /* 定义数据缓冲器地址 */ unsigned char i;
源程序
void saw(void) { uchar i; for (i=0;i<255;i++) { DAC0832=i; } } void square(void) { DAC0832=0x00; delay(0x10); DAC0832=0xff; delay(0x10); } /* 锯齿波发生函数 */
9.3.3 A/D接口设计要点
选择合适的系统采样速度 减小A/D转换的孔径误差 合理选用A/D转换器 选择A/D转换芯片应遵循下述原则: 1)根据传感器接口通道的总误差,选择A/D转换器精度 及分辩率. 2)根据信号对象变化率及转换精度要求,确定A/D 转 换速度,以保证系统的实时性要求. 3)根据环境条件选择A/D转换芯片的一些环境参数要 求,如工作温度,功耗,可靠性等级等性能. 4)根据计算机接口特性,考虑如何选择A/D转换器的 输出状态. 5)另外还要考虑成本,资源,是否流行芯片等因素.
单片机接口技术(C51版)
第九章 数据采集编程
内容概述
本章主要介绍单片机系统数据采集的方法及软硬件设 计. 教学目标 1.了解D/A及A/D的转换在单片机系统的作用和意义. 2. 理解D/A转换器的分辩率,转换精度,线性度等主要性能 指标的含义,了解DAC0832的内部结构,掌握DAC0832的 单极性输出,双极性输出以及直通,单缓冲,双缓冲等工 作方式,能设计相关的接口电路并编写相应的C51源程序. 3.理解逐次逼近型A/D转换器的工作原理,理解ADC0809的 引脚工作时序,能设计ADC0809与单片机的接口电路,能 对查询,中断,延时三种工作方式的ADC0809编写相应的 C51程序. 4.了解串行输入输出A/D转换器TLC0832的结构及工作原理, 能设计该芯片的应用电路,并根据芯片的时序图编写 TLC0832读,写数据的C51源程序.
TLC0832的工作时序
图9-4-2
TLC0832时序图
TLC0832多路控制器逻辑表
9.4.3 应用实例
例9-4-1 图9-4-3是某温度数据采集系统的电路原理图,采 用热敏电阻作为温度传感器,使用TLC0832的通道0采集温 度数据.
C51源程序
关于TLC0832数据采集部分源程序如下,readadc()函 数返回A/D转换结果. // TLC0832数据采集程序 #include <reg52.h> #include <stdio.h> #include <absacc.h> #define uchar unsigned char #define uint unsigned int sbit adcdo=P1^4; sbit adccs=P1^2; sbit adcclk=P1^3; sbit adcdi=P1^0; void delay1(uchar x); uchar readadc(void); void adcck(void);
C51源程序
void main() { i=8; /* ADC0809有8个模拟输入通道 */ EA=1; EX1=1;IT1=1; /* 开中断 */ XBYTE[ADC]=i; /* 启动ADC0809 */ while(i); /* 等待8个通道A/D转换完毕 */ } void int1() interrupt 2 { unsigned char tmp; tmp=XBYTE[ADC]; /* 读取A/D转换结果 */ i--; XBYTE[ADCdata+i]=tmp; /* 结果值存储到数据缓冲器 */ XBYTE[ADC]=i; /* 启动下一个模拟输入通道A/D转换 */ }
9.4.2 TLC0832工作原理
TLC0832使用采样-数据-比较器的结构,用 逐次逼近流程,转换差分模拟输入信号.要转换 的输入电压连到一个输入端,相对于地(单端输 入)或另一输入端(差分输入).TLC0832的输 入端可以分配为正极(+)或负极(-),当连 到分配为正端的输入电压低于分配为负端的输入 电压时,转换结果为全0.
9.2.3.2 DAC0832用作双极性电压输出 用作双极性电压输出 接线方法

得出
9.2.4 DAC0832应用实例
1)直通方式 2)单缓冲方式
例9-2-1 DAC0832用作波形发生器
按上页的图接线,分别写出产生锯齿波和方波的程序. 解:在图9-2-5中,运算放大器OA输出端VOUT直接反 馈到RFB,故这种接线产生的模拟输出电压是单极性的. 源程序如下: #pragma db oe sb #include<reg51.h> #include<absacc.h> #define DAC0832 XBYTE[0x7fff] /* 定义DAC0832端口地址 */ #define uchar unsigned char void delay(uchar t) { /* 延时函数 */ while(t--); }
相关文档
最新文档