第九章 嵌入式Linux驱动程序开发课件.ppt
9.6 A/D和D/A转换一、一般测控系统组成,1传感器将物理量转换为电量2信号处理环节信号调理,一般含放大、阻抗匹配、高低通滤波等3多路转换开关多路选择一路,常用的有:CD4051、AD7501 (八选择一)4采样保持(采保)电路可工作于采样、保持二种状态。采样时,输出与输入相同;保持时在一定时间保持不变,一般用在A/D前端,保证在A/D转换期间输入电压不变,提高A/D精度。常用的有:LF398,(一) 转换原理1、权电阻式D/A转换器,二、 D/A(数模)转换,2T型电阻网络式D/A转换器,(二)指标1分辨率 分辨率是指最小输出电压(对应于输入数字量最低位增1所引起的输出电压增量)和最大输出电压(对应于输入数字量所有有效位全为1时的输出电压)之比,即表示DAC所能分辨的最小模拟信号的能力。2转换精度 绝对转换精度是指满刻度数字量输入时,模拟量输出接近理论值的程度 相对转换精度一般用绝对转换精度相对于满量程输出的百分数来表示,有时也用数字量的最小有效值(LSB)的几分之一来表示,3非线性误差D/A转换器的非线性误差定义为实际转换特性曲线与理想特性曲线之间的最大偏差,并以该偏差相对于满量程的百分数度量4转换速率/建立时间转换速率实际是由建立时间来反映的建立时间是指数字量为满刻度值(各位全为1)时,DAC的模拟输出电压达到某个规定值(比如90满量程)时所需要的时间,三、A/D(模数)转换,AD转换器是指通过一定的电路将模拟量转变为数字量。AD转换后,输出的数字信号有8位、l0位、12位和16位等。 类型:双积分、逐次逼近、并行等。,(一)A/D转换原理,(二)A/D转换器的主要性能参数,1. 分辨率 分辨率是指AD转换器能分辨的最小模拟输入量。通常用能转换成的数字量的位数来表示,如8位、10位、12位、16位等。 2. 转换时间 转换时间是AD完成一次转换所需的时间。 3. 量程 量程是指所能转换的输入电压范围。 4. 精度 AD转换精度分为绝对精度和相对精度两种。,(1)绝对精度:是指对应于个给定量,AD转换器的误差,其误差大小由实际模拟量输入值与理论值之差来度量。(2)相对精度:由相对误差决定。相对误差是指绝对误差与满刻度值之比,般用百分数表示。例如,对于个8位05V的AD转换器,如果其绝对误差为: 1/256 5=19.5mV 则其相对误差为0.39%。,1、采样保持电路 ( 1) 采样:把一个时间上连续变化的模拟量转换为一个脉冲串,脉冲的幅度取决于输入模拟量。 (2) 保持:是将采样得到的模拟量值保持下来,使之等于采样控制脉冲存在的最后瞬间的采样值。 (3) 采样定理:理论和实践都证明,只要满足下列条件,采样保持得到的输出信号在经过信号处理后便可还原成原来的模拟输入信号:,(三)A/D转换的辅助电路,S,(,t,),I,(,t,),SH,(,t,),T,1,T,2,T,3,T,4,T,5,T,6,T,7,T,8,t,t,t,O,O,O,(,a,),采样脉冲,(,b,),输入电压,(,c,),采样保持,2、 多路转换开关在实际应用时,要解决多个回路和AD、D/A转换器之间的切换问题。一般采用两种方法: ( 1) 一种方法是用独立的多路转换模拟开关轮流切换各回路和AD、DA之间的通路,对于AD转换来说,要用到多路输入一路输出的模拟开关电路,对于DA转换来说,要用到一路输入,多路输出的模拟开关电路。 (2)另一种方法是选择带有转换开关的AD、DA转换器。,四、S3C2410A中的A/D模块(一) 概述 具有 8 通道模拟输入的 10 位 模数转换器(ADC)。 在 2.5MHz 的 A/D 转换器时钟下,最大转化速率可 达到 500KSPS。A/D 转换器支持片上采样和保持功能。S3C2410A 的 AIN7和 AIN5可用于连接触摸屏的模拟信号输入。(二) 特性 逐次逼近式分辩率:10-位 线性度误差: 2.0 LSB 最大转换速率:500 KSPS 供电电压:3.3V 输入模拟电压范围:0 3.3V 片上采样保持功能 查询和中断模式,(三)ADC 控制寄存器(ADCCON) 地址: 0 x58000000,可读写,复位值: 0 x3FC4ECFLG(位15): AD转换结束标志(只读)。0 =A/D转换操作中,1 =A/D转换结束PRSCEN(位14):A/D转换器预分频器使能0 = 停止,1 = 使能 PRSCVL(位13:6):A/D 转换器预分频器数值, 数据值N范围:1 255,将PCLK进行(N+1)分频。 如PCLK=50MHZ, N=49,则A/D转换器频率= 50 MHz/(49+1) = 1 MHz转换时间= 1/1 MHz 5 = 5 us 注意:ADC频率应该设置成小于PLCK的5倍,即N应设置为大于4。,SEL_MUX (位 5:3) :模拟输入通道选择。000 = AIN 0001 = AIN 1010 = AIN 2011 = AIN 3100 = AIN 4101 = AIN 5110 = AIN 6111 = AIN 7STDBM(位2)0 = 普通模式1 = Standby模式,A/D停止转换, A/D数据寄存器保持原值,READ_ START (位1):通过读取来启动A/D转换0 = 停止通过读取启动,1 = 使能通过读取启动ENABLE_ START(位0):通过设置该位来启动A/D操作。如果READ_START是使能的,此位无效。0无操作1 = A/D转换启动,启动后该位被清零。,(四)ADC 转换数据寄存器(ADCDAT0)地址: 0 x5800000C ,可读写。位90为A/D转换的数字值。范围为:0 3FFH。思考:设计A/D驱动程序,使之能实现对多路模拟量的采集。,#define DRIVER_NAMEmyDriverstatic int myDriver_Major = 0;/* Driver Major Number */static int AD_READ (void) int i,j;int val,aa;val=0;ADCCON |= 0 x2; /ADC转换通过读操作来启动aa = ADCDAT0 ,/* Driver Operation Functions */static int myDriver_open(struct inode *inode, struct file *filp)MOD_INC_USE_COUNT; PRINTK(myDriver open called!n);/* 进行ADC模块设置,其中xn表示第n位设置为x(若x超过一位,则向高位顺延) */ ADCCON = (0 0) |/ ADC转换设置 未设置(0 1) | / 读AD数据触发AD转换 未使用(0 2) | / StandBy模式选择 为普通操作模式 (49 6) | / CLKDIV = Fpclk /(49+1) (1 14) ; /预分频器使能软件预设值 PRINTK( ADC INIT OK n); return 0;,static int myDriver_release(struct inode *inode, struct file *filp)MOD_DEC_USE_COUNT;PRINTK(myDriver release called!n);return 0;,static ssize_t myDriver_read(struct file *filp, char *adc_value, size_t count, loff_t *f_pos) int adc=0; size_t read_size = count; adc= AD_READ(); copy_to_user(adc_value, ,/* Driver Operation structure */static struct file_operations myDriver_fops = owner:THIS_MODULE,open:myDriver_open,ioctl: myDriver_ioctl,read:myDriver_read,release:myDriver_release,;/* Module Init #endif,static int _init myModule_init(void)/* Module init code */PRINTK(myModule_initn);/* Driver register */myDriver_Major = register_chrdev(0, DRIVER_NAME, ,static void _exit myModule_exit(void)/* Module exit code */PRINTK(myModule_exitn);/* Driver unregister */if(myDriver_Major 0)#ifdef CONFIG_DEVFS_FS devfs_unregister(devfs_myDriver_raw);#endifunregister_chrdev(myDriver_Major, DRIVER_NAME);return;MODULE_AUTHOR(myname);MODULE_LICENSE(GPL);module_init(myModule_init);module_exit(myModule_exit);,