18[1]AD转换原理及其程序设计.ppt
A/D转换及其程序设计陈虎什么是A/D转换oA/D转换是外部世界模拟信号和计算机之间联系的接口。它将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。oA/D转换器件的种类非常多,其实现方式主要有逐次逼近式,双积分式,计数式、并行式等。比较常用的有双积分和逐次逼近式两种。逐次逼近式A/D转换器o包括比较器、控制电路、逐次逼近寄存器、D/A转换器构成。其基本原理是逐次逼近寄存器各位首先清”0”,然后设置最高位为”1”形成第一个试探值。该试探值通过D/A转换器后与待测量电压进行比较。如果待测量电压高于试探电压,则保持最高位不变;反之,则将最高位设置为”0”。然后将逼近寄存器的次高位设置为”1”,继续上述试探过程。通过从高位到低位地不断试探逼近寄存器各位值,最后得到转换结果。o逐次逼近式A/D转换器的特点是转换速度比较快,分辨率也较高,但是抗干扰能力比较差。逐次逼近A/D转换原理图采用试探方法!双积分式A/D转换器o转换过程包括两步:1)对输入电压进行固定时间的积分,获得一个输出电压V0;2)对V0通过参考电压进行反积分,使其降低为0V,并统计反积分时间。o双积分式A/D转换的抗干扰能力比较强,性能稳定,但是转换速度比较慢。双积分A/D转换原理A/D转换器的主要参数o量程,指所能转换的模拟输入电压范围,可以分为单极型和双极型两种。o分辨率(LSB),指A/D转换器所分辩的最小模拟输入量。n位A/D转换器能反应1/2n满量程的模拟输入电平。o精度,包括绝对精度和相对精度两种。其中绝对精度是指在A/D转换器输出端产生给定的数字量时,其实际模拟输入值同理想值之差,相对精度是指在满量程值已经校准的情况下,在量程范围内任意数字量输出,所对应的模拟量输入值与理论值之差。o转换时间,指从发出启动命令到转换结束获得整个数字信号为止所需要的时间间隔。S3C2410中的A/D转换器o8路10位,并支持触摸屏功能。o精度位1.5位,量程为03.3V,最大转换速率为500K。S3C2410中AD转换的寄存器o配置寄存器ADCCON(地址为0 x58000000)S3C2410中AD转换的寄存器o寄存器ADCDAT0(地址为0 x5800000C)oA/D转换结果,其中低10位为转换结果。此10位为全1时,表示输入电压为满量程3.3VLinux操作系统中进行A/D转换o需要调用操作系统来完成读取A/D转换结果的操作。A/D转换器被作为一个设备文件供应用程序访问,相应的驱动程序提供了4个操作方法:oopen():打开A/D转换器,并初始设置通道号和转换因子;owrite():设置A/D转换通道号和转换因子;oread():读取A/D转换结果;oclose():关闭A/D转换器。一个程序例子/初始化AD转换器#define ADC_DEV/dev/adc/0raw“static int adc_fd=-1;static int init_ADdevice(void)if(adc_fd=open(ADC_DEV,O_RDWR)0)printf(Error opening%s adc devicen,ADC_DEV);return-1;/读取AD转换的结果static int GetADresult(int channel)int PRESCALE=0XFF;int data=ADC_WRITE(channel,PRESCALE);write(adc_fd,&data,sizeof(data);read(adc_fd,&data,sizeof(data);return data;主程序/子线程获取用户输入static int stop=0;static void*comMonitor(void*data)getchar();stop=1;return NULL;int main(void)int i;float d;pthread_t th_com;void*retval;if(init_ADdevice()0)return-1;pthread_create(&th_com,NULL,comMonitor,0);while(stop=0)for(i=0;i=2;i+)d=(float)GetADresult(i)*3.3)/1024.0;printf(a%d=%8.4ft,i,d);usleep(1);printf(r);pthread_join(th_com,&retval);printf(n);return 0;