较为全面的ADC驱动

您所在的位置:网站首页 单片机的驱动是什么意思 较为全面的ADC驱动

较为全面的ADC驱动

2024-07-08 06:14| 来源: 网络整理| 查看: 265

1、ADC硬件原理概述 我们从上面的结构图和数据手册可以知道,该ADC模块总共有8个通道可以进行模拟信号的输入,分别是AIN0、AIN1、AIN2、AIN3、YM、YP、XM、XP。那么ADC是怎么实现模拟信号到数字信号的转换呢?首先模拟信号从任一通道输入,然后设定寄存器中预分频器的值来确定AD转换器频率,最后ADC将模拟信号转换为数字信号保存到ADC数据寄存器0中(ADCDAT0),然后ADCDAT0中的数据可以通过中断或查询的方式来访问。对于ADC的各寄存器的操作和注意事项请参阅数据手册。 上图是mini2440上的ADC应用实例,开发板通过一个10K的电位器(可变电阻)来产生电压模拟信号,然后通过第一个通道(即:AIN0)将模拟信号输入ADC。左图中的Aref表示AD的参考电压是3.3V。ADC,模数转换器,将模拟量转换成数字量,采样,保持电路与AD转换器集成在一起。AD转换器模拟输入信号是直流电压信号,0~3.3V之间。S3C2440有8路模拟输入信号,AD转换器内部有一个模拟多路选择器,某一时刻只能将一路模拟输入信号,通过模拟多路选择器接通进行AD转换,而其他路模拟输入信号被断开。

2、ADC控制器

3、实现步骤 ADC设备在Linux中可以看做是简单的字符设备,也可以当做是一混杂设备(misc设备),这里我们就看做是misc设备来实现ADC的驱动。注意:这里我们获取AD转换后的数据将采用中断的方式,即当AD转换完成后产生AD中断,在中断服务程序中来读取ADCDAT0的第0-9位的值(即AD转换后的值)。

#include #include //printk() #include #include #include #include #include #include #include #include #include //包含很多驱动使用的内核API的定义。睡眠函数,变量声明 #include //定义IO映射 #include #include #include #include #include //ADC寄存器的定义 #include #include #include #include "s3c24xx-adc.h" #undef DEBUG //#define DEBUG #ifdef DEBUG #define DPRINTK(x...) {printk(__FUNCTION__"(%d): ",__LINE__);printk(##x);} #else #define DPRINTK(x...) (void)(0) #endif #define DEVICE_NAME "Myadc" //经过虚拟地址映射之后的内存地址 static void __iomem *base_addr; typedef struct { wait_queue_head_t wait;//阻塞 等待队列,进程读取设备,如果没有转换数据,就会睡眠在此队列上 int channel;//AD转换通道 s3c2440有八通道的ad,但是只有四个通道AIN[3:0]可以使用,其他四个用于触摸屏 int prescale;//预分频值 计算转换速率的时候使用 }ADC_DEV; //申请并初始化信号量 DECLARE_MUTEX(ADC_LOCK); //ADC驱动是否拥有AD转换器资源的状态变量 static int OwnADC = 0; static ADC_DEV adcdev; //adcdev static volatile int ev_adc = 0;//标识AD转换后的数据是否可以读取,0表示不可读取 static int adc_data;//保存读取后的AD转换的值,该值在ADC中断中读取 //保存从时钟平台队列中获取ADC的时钟 static struct clk *adc_clock; //定义ADC的寄存器 #define ADCCON (*(volatile unsigned long *)(base_addr + S3C2410_ADCCON)) //ADC control #define ADCTSC (*(volatile unsigned long *)(base_addr + S3C2410_ADCTSC)) //ADC touch screen control #define ADCDLY (*(volatile unsigned long *)(base_addr + S3C2410_ADCDLY)) //ADC start or Interval Delay #define ADCDAT0 (*(volatile unsigned long *)(base_addr + S3C2410_ADCDAT0)) //ADC conversion data 0 #define ADCDAT1 (*(volatile unsigned long *)(base_addr + S3C2410_ADCDAT1)) //ADC conversion data 1 #define ADCUPDN (*(volatile unsigned long *)(base_addr + 0x14)) //Stylus Up/Down interrupt status //以下都定义于ADCCON中 #define PRESCALE_DIS (0


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3