较为全面的ADC驱动 |
您所在的位置:网站首页 › 单片机的驱动是什么意思 › 较为全面的ADC驱动 |
1、ADC硬件原理概述 我们从上面的结构图和数据手册可以知道,该ADC模块总共有8个通道可以进行模拟信号的输入,分别是AIN0、AIN1、AIN2、AIN3、YM、YP、XM、XP。那么ADC是怎么实现模拟信号到数字信号的转换呢?首先模拟信号从任一通道输入,然后设定寄存器中预分频器的值来确定AD转换器频率,最后ADC将模拟信号转换为数字信号保存到ADC数据寄存器0中(ADCDAT0),然后ADCDAT0中的数据可以通过中断或查询的方式来访问。对于ADC的各寄存器的操作和注意事项请参阅数据手册。 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 |