嵌入式linux驱动程序开发(3)课件

上传人:F****n 文档编号:88140829 上传时间:2019-04-19 格式:PPT 页数:27 大小:226.50KB
返回 下载 相关 举报
嵌入式linux驱动程序开发(3)课件_第1页
第1页 / 共27页
嵌入式linux驱动程序开发(3)课件_第2页
第2页 / 共27页
嵌入式linux驱动程序开发(3)课件_第3页
第3页 / 共27页
嵌入式linux驱动程序开发(3)课件_第4页
第4页 / 共27页
嵌入式linux驱动程序开发(3)课件_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《嵌入式linux驱动程序开发(3)课件》由会员分享,可在线阅读,更多相关《嵌入式linux驱动程序开发(3)课件(27页珍藏版)》请在金锄头文库上搜索。

1、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所引起的

2、输出电压增量)和最大输出电压(对应于输入数字量所有有效位全为1时的输出电压)之比,即表示DAC所能分辨的最小模拟信号的能力。 2转换精度 绝对转换精度是指满刻度数字量输入时,模拟量输出接近理论值的程度 相对转换精度一般用绝对转换精度相对于满量程输出的百分数来表示,有时也用数字量的最小有效值(LSB)的几分之一来表示,3非线性误差 D/A转换器的非线性误差定义为实际转换特性曲线与理想特性曲线之间的最大偏差,并以该偏差相对于满量程的百分数度量 4转换速率/建立时间 转换速率实际是由建立时间来反映的 建立时间是指数字量为满刻度值(各位全为1)时,DAC的模拟输出电压达到某个规定值(比如90满量程)时

3、所需要的时间,三、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转换器的误差,其误差大小由实际模拟

4、量输入值与理论值之差来度量。 (2)相对精度:由相对误差决定。相对误差是指绝对误差与满刻度值之比,般用百分数表示。例如,对于个8位05V的AD转换器,如果其绝对误差为: 1/256 5=19.5mV 则其相对误差为0.39%。,1、采样保持电路 ( 1) 采样:把一个时间上连续变化的模拟量转换为一个脉冲串,脉冲的幅度取决于输入模拟量。 (2) 保持:是将采样得到的模拟量值保持下来,使之等于采样控制脉冲存在的最后瞬间的采样值。 (3) 采样定理:理论和实践都证明,只要满足下列条件,采样保持得到的输出信号在经过信号处理后便可还原成原来的模拟输入信号:,(三)A/D转换的辅助电路,S,(,t,),I

5、,(,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模块 (一) 概述 具有

6、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) 地址: 0x58000000,可读写,复位值: 0x3FC4 ECFLG(位15): AD转换结束标志(只读)。

7、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 0 001 = AIN 1 010 = AIN 2 011 = AI

8、N 3 100 = AIN 4 101 = AIN 5 110 = AIN 6 111 = AIN 7 STDBM(位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) 地址: 0x5800000C ,可读写。 位90为A/D转

9、换的数字值。范围为:0 3FFH。 思考:设计A/D驱动程序,使之能实现对多路模拟量的采集。,#define DRIVER_NAME “myDriver“ static int myDriver_Major = 0; /* Driver Major Number */ static int AD_READ (void) int i,j; int val,aa; val=0; ADCCON |= 0x2; /ADC转换通过读操作来启动 aa = ADCDAT0 ,/* Driver Operation Functions */ static int myDriver_open(struct in

10、ode *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“); re

11、turn 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_u

12、ser(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(“m

13、yModule_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); #endif unregister_chrdev(myDriver_Major, DRIVER_NAME); return; MODULE_AUTHOR(“myname“); MODULE_LICENSE(“GPL“); module_init(myModule_init); module_exit(myModule_exit);,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号