实验7 模数转换实验

实验7 模数转换实验

ID:18862950

大小:227.42 KB

页数:8页

时间:2018-09-26

实验7 模数转换实验_第1页
实验7 模数转换实验_第2页
实验7 模数转换实验_第3页
实验7 模数转换实验_第4页
实验7 模数转换实验_第5页
资源描述:

《实验7 模数转换实验》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、1.实验目的l通过实验理解S3C2410下ADC接口的操作方法;l通过实验掌握在Linux下应用程序的编写方法。2.实验内容l编写EduKit-IV实验箱Linux操作系统下ADC的应用程序,要求隔一小段时间打印得到的ADC值。3.主要仪器设备l一台装有Ubuntu系统的PC机(宿主机),至少要有一个串口;l目标板(或开发板),这里指英培特eduk4-s3c2410试验平台;l一根串口线,用于宿主机与开发板通信;l其他嵌入式软件包。4.操作方法和实验步骤4.1编译应用程序1.设置环境变量;source/us

2、r/local/src/EduKit-IV/Mini2410/set_env_linux.shsource/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/path.sh2.将路径切换到$SIMPLEDIR/8.3-adc_test/app下,执行以下命令make进行编译,结果如图4-1所示,生成adc_test。图4-1应用程序编译4.2编译驱动程序1.将路径切换到$SIMPLEDIR/8.3-adc_test/driver下,执行以下make命令编译驱动,

3、结果如图4-2所示,生成eduk4-adc.ko模块。图4-2驱动模块编译4.3测试1.将adc_test和eduk4-adc.ko文件通过串口和tftp传输至实验箱,加载模块并运行测试程序,效果如图4-3所示。可以看出数值介于0.0000~3.3000之间。图4-3测试效果图4.4问题与改进在对实验箱提供的源码进行分析的时候发现其中存在着一些问题。主要有:1.驱动中并未定义write接口,测试程序却调用。具体可以参见源码。其实,应用程序可以调用它未定义的函数(未定义的函数一般设置为NULL指针),因为在连

4、接过程能够解析外部引用从而使用适当的函数库;驱动程序仅仅被连接到内核,因此它仅能调用由内核导出的函数,而没有任何可连接的库。需要注意的是,不同的内核对于不同的函数接口有不同的处理方式。对于write接口,如果未定义,一般返回负值;对于ioctl接口,内核能够识别部分命令,不能识别的将返回负值。修改测试应用程序代码如图4-4所示。图4-4修改应用程序代码重新编译应用程序,并拷贝至实验箱,运行效果如图4-5所示。发现,内核返回负的错误值。图4-5修改后测试效果2.模拟信道选择channel无效根据对应用程序和驱

5、动程序的分析,很容易推测原作者想通过传递参数ADC_DEV.channel来选择模拟信道。虽然,S3C2410提供的ADC为8路转换,但是原作者忽略了实验箱上面的滑动变阻器紧紧连接到其中的一路即AIN0,电路图如图4-6所示,提供其他选择并未有什么效果。图4-6ADC接口电路推测迹象如下:迹象1:测试应用程序main函数中。adcdev.channel=0;adcdev.prescale=49;write(fd,&adcdev,sizeof(structADC_DEV));迹象2:位于驱动程序read函数中

6、。intchannel=MINOR(((structcdev*)(file->private_data))->dev);//startADCtmp=readl(base_addr+S3C2410_ADCCON)

7、S3C2410_ADCCON_ENABLE_START

8、S3C2410_ADCCON_SELMUX(channel);迹象3:位于驱动程序open函数中。filp->private_data=inode->i_cdev;3.传递参数的方法有问题即使假设可以进行模拟信道的选择,或者为了以后程序的扩展,

9、驱动程序提供模拟信道的选择。但是原作者的程序在操作上也不正确。最直接的,write函数未定义,参数根本无法传递。而且filp->private_data=inode->i_cdev却指向了cdev结构体,并使用次设备号进行了信道的选择,这本身就存在着明显错误。如此一来,整个驱动程序的逻辑就出现了问题。驱动程序原本想支持通过private_data传递数据adcdev到驱动进行channel的选择,但是此时却使用了错误的方法。如下面两段函数红色部分却使用了次设备号来作为channel的选择。解决方案:增加io

10、ctl接口进行参数设置。驱动程序代码如下所示:#defineDEVICE_NAME"adc"#defineCHANNEL_SEL0staticvoid__iomem*base_addr=0;staticintadc_major=0;staticintadc_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){unsigne

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。