驱动开发-ADC转换技术_第1页
驱动开发-ADC转换技术_第2页
驱动开发-ADC转换技术_第3页
驱动开发-ADC转换技术_第4页
驱动开发-ADC转换技术_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ADC转换技术一、 确定任务1、 掌握基本的字符设备的驱动程序设计。2、 掌握基本的文件操作。3、 掌握在操作系统下的AD转换驱动程序的原理。二、 学习内容 1、 阅读S5PV210的数据手册,熟悉AD转换部分的原理。2、 编写AD转换的应用程序。3、 编写makefile文件。4、下载并调试AD转换的应用程序。三、基础知识1、 硬件原理:a) 原理图:由原理图可知,本实验使用AD通道。b) 系统框架图:c) 寄存器简介:寄存器ADCMUX设置AD转换的analog的来源。本实验中SEL_MUX3:0设置为0000 即选择AIN0作为输入。设置AD转换器的工作模式,如位数、通道、使能等。AD转

2、换值的存储寄存器,当AD转换工作在普通模式下,XPDATA存储的是转换后的值。四、代码设计 1、 AD转换器的原理:请读者自行查阅资料。2、 驱动原理:该驱动实现为一个字符设备,通过ioctl函数来设置祥光寄存器的值,通过read函数来获取转换之后的值。3、 驱动简析:该驱动主要实现了ioctl、read函数,包含头文件与AD转换有关部分的是mach/adc.h和/arch/arm/plat-s5pv210/include/plat/adc.h。主要驱动代码如下(详细代码请读者查看附件):static struct platform_driver s3c_adc_driver = .probe

3、 = s3c_adc_probe, .remove = s3c_adc_remove, .suspend = s3c_adc_suspend, .resume = s3c_adc_resume, .driver= .owner= THIS_MODULE,.name= "s3c-adc",;这个结构体用于定义一个平台资源。static const struct file_operations s3c_adc_fops = .owner= THIS_MODULE,.read= s3c_adc_read,.open= s3c_adc_open,.ioctl= s3c_adc_io

4、ctl,;static struct miscdevice s3c_adc_miscdev = .minor= ADC_MINOR,.name= "adc",.fops= &s3c_adc_fops,;这两个结构体用于定义AD转换的操作方法和adc设备结构的添加。a) 模块探测函数static int _devinit s3c_adc_probe(struct platform_device *pdev)res = platform_get_resource(pdev, IORESOURCE_MEM, 0); /获取平台资源adc_mem = request_mem

5、_region(res->start, size, pdev->name); /申请内存base_addr = ioremap(res->start, size); /映射寄存器控制基地址adc_clock = clk_get(&pdev->dev, "adc");clk_enable(adc_clock); /使能时钟plat_data = s3c_adc_get_platdata(&pdev->dev);writel(plat_data->delay & 0xffff, base_addr + S3C_ADCD

6、LY); /设置转换延时时间writel(readl(base_addr + S3C_ADCCON) | S3C_ADCCON_RESSEL_12BIT, base_addr + S3C_ADCCON);/设置AD转换通道 转换精度等writel(readl(base_addr + S3C_ADCCON) | S3C_ADCCON_STDBM) & S3C_ADCCON_PRSCEN, /设置预分频值base_addr + S3C_ADCCON);ret = misc_register(&s3c_adc_miscdev); /注册misc设备b) 设备读取和控制函数static

7、 ssize_t s3c_adc_read(struct file *file, char _user *buffer, size_t size, loff_t *pos)s3c_adc_save_SFR_on_ADC(); /保存寄存器值adc_value = s3c_adc_convert(); /AD转换s3c_adc_restore_SFR_on_ADC(); /恢复寄存器值if (copy_to_user(buffer, &adc_value, sizeof(unsigned int) /将转换好的AD数值传递给用户空间static int s3c_adc_ioctl(str

8、uct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)case ADC_INPUT_PIN: adc_port = (unsigned int) arg; /设置输入端口c) 模块入口函数和出口函数:int _init s3c_adc_init(void)return platform_driver_register(&s3c_adc_driver); /平台设备注册void _exit s3c_adc_exit(void)platform_driver_unregister(&s3c_a

9、dc_driver); /平台设备注销4、 驱动模块makefile请仿照前几章驱动模块形式编写。5、 测试程序int main(void)fprintf(stderr, "press Ctrl-C to stopn");int fd = open("/dev/adc", O_RDONLY); /打开设备if (fd < 0) perror("open ADC device:");return 1;ioctl(fd,'S',0); /选择AD转换的通道,由上面硬件原理图分析得本实验使用AIN0for(;) nsi

10、gned int i;read(fd, &i, sizeof(unsigned int); /读取AD转换后的值printf("adc = %dn",i);usleep(500* 1000);close(fd);测试程序请参考前面给出的通用makefile文件,并将TARGET修改为本实验的目标文件adc_test五、编译代码和运行1、 在PC机上建立目录/gec/adc/test将上述adc_test.c与makefile文件拷贝到该目录下,在在终端上键入make命令,即可生成目标文件。将adc_test文件下载到/tmp目录。详细见附件目录中的代码。2、 在终端输入:rootgec /tmp# chmod +x adc_test rootgec /tmp# ./adc_test 回车之后

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论