Linux设备驱动ADC部分:
1.1ADC硬件 模拟信号:声音,电压,电流,温度,湿度,压力,速度:数字信号:0.1这些数字量组成的信号 数字系统不能直接处理模拟信号,需要将模拟信号转换成对应的数字信号;不管是数字信号还是描述的同一个事物,只是这个信号在不同形式下的表现实现! 1.2信号之间的转换:AD:模拟信号转数字信号的过程;DA:数字信号转成模拟信号的过程ADC:将模拟信号转成数字信号的硬件单元
1.1ADC硬件 模拟信号:声音,电压,电流,温度,湿度,压力,速度:
数字信号:0.1这些数字量组成的信号
数字系统不能直接处理模拟信号,需要将模拟信号转换成对应的数字信号;
不管是数字信号还是描述的同一个事物,只是这个信号在不同形式下的表现实现!
1.2信号之间的转换:AD:模拟信号转数字信号的过程;DA:数字信号转成模拟信号的过程
ADC:将模拟信号转成数字信号的硬件单元 DAC: 将数字信号转成模拟信号的硬件单元
案例:手机的录音和放音 录音:就是将声音模拟信号转成数字信号的过程--ADC硬件单元-音频文件,二进制文件 放音:数字信号转成声音模拟信号的过程-DAC硬件单元
1.3 S5PV210自带的adc的硬件特性,芯片手册1978
模拟输入通道有10路:ain0-ain9。同一时刻只能转化一路模拟信号;这10个io不能复用,只能做input,工作频率:最大5mhz,时钟源为pclk=66mhz,注意降频工作。adc转换器一旦开启信号的转换,转换过程需要一定的时间,一旦转换结束,adc硬件给cpu产生一个中断信号,通知cpu来进行处理。衡量adc工作参数指标:分辨率,自带adc的分辨率为12为或者10位;如果分辨率采用10位,就是代表将模拟信号转成数字信号以后,有效的数字量为10位。如果分辨率采用12位,就是代表将模拟信号转成数字信号以后,有效的数字量为12
模拟输入电压的范围0-3.3v: 注意:最大的模拟输入电压为3.3v,
如果分辨率为10位:那么每一个bit对应的模拟电压为3.3/(1<<10)=0.0032=3.32mv
如果分辨率为12,那么每一个bit对应的模拟电压为3.3/(1<<12)=0.81mv
问:如果现在已知一个10bit的转换以后的数字量为0011000000,请问这个数字量对应的模拟量为? 模拟量的值=001100000 * 3.32mv;
1.3.1ADC操作设计寄存器:
寄存器组的基地址:0xe1700000 adc控制寄存器:
bit16-》配置分辨率,0:12 1:12位
bit15-》判断是否转换结束,0转换进行中:1:转换结束 判断是否转换结束:中断判断bit15或者轮询方式进行判断
bit14:是否使能分频 0 :no 1:yes
bit6-bit13:设置分频系统,如果adc的工作频率为3.3MHZ,这个寄存器设置为66/3.3-1=19使能方法:读使能,直接使能
bit0:启动adc转换,1:表示启动adc,一旦启动adc此位进行清0 0:表示结束
1.3.2 ADC数据寄存器:保存adc转换的结果
bit0-bit11:共12bit x位置转换的数据值或者正常的adc转换的值
范围0-0xfff 注意:普通的adc转换的有效值
分辨率为10位:data=数据寄存器的值&0x3ff
分辨率为12位:data=数据寄存器的值&0xfff
1.3.3 adc中断清除寄存器:清adc的中断,中断处理函数中
0xe170 1018 【0】:写0或者1清楚中断
1.3.4adc模拟通道选择寄存器:选择模拟输入通道 bit3-bit0:
1.4adc操作步骤: 1.设置正常的工作频率 3.3MHZ 2.设置分辨率,12位 3.设置模拟输入通道,AIN1
4.启动硬件adc,硬件adc开始对模拟电压信号进行转换 5.adc转换结束产生中断信号
6.中断处理函数中清中断,唤醒休眠的进程 7.进程读取转换以后的数字量,进行输出
1.5软件实现案例()
1.用户需求 在qt图形界面上,每隔5s动态刷新显示电压值,配置adc的分辨率和模拟输入通道
2.驱动的设计1.对用户提供的接口:read:读转换以后的电压值;启动adc;判断是否转换结束,如果没有,进入休眠;读取转换以后的数字量上报到用户空间ioctl:配置分辨率和模拟输入通道
2.采用混杂设备驱动实现方法3.寄存器地址要进行ioremap+ platform4.注册中断处理函数:irq_adc中断号5.由于adc的处理速度慢于cpu(应用程序的读取速度),所以在adc没有转换结束时,进行进入休眠状态(等待队列机制)6.adc正式工作之前,adc的默认工作参数。
3.linux内核对虚拟地址的访问读写,提供相关的函数: 读readb:读一字节readw:读2字节
readl:读4字节函数参数都是内核虚拟地址.
写:writeb:写1字节writew:写2字节writel:写4字节 writel(1(值),地址);
更多推荐
所有评论(0)