第5章:Linux 驱动程序设计.ppt

  1. 1、本文档共147页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章:Linux 驱动程序设计

* 驱动程序各函数的功能 A/d转换的步骤: (5) A/D转换完成后,唤醒程序继续执行。 (6)ADC数据寄存器的低10位就是模拟信息对应的数值。(因为S3C2410内部是10位A/D转换器) (7)将数据从内核态复制到用户态。 (8)给数据结构解锁。 * 1、文件说明 应用程序源文件:main.c 应用程序包括一个很重要的头文件:s3c2419-adc.h Makefile文件将main.c源文件编译成名为ad的可执行文件。 * 4.1 A/D转换的基础理论 4.2 A/D转换的驱动程序分析 4.3 A/D转换应用程序分析 5.4 A/D驱动和测试程序设计 * 1、应用程序 任务:测量0~2通道输入的模拟电压值 * * 2、驱动程序提供的入口函数 int open(char *filename, int access); int close(int handle); int read(int handle, void *buf, int count); int write(int handle, void *buf, int count); * (1)read函数 格式:int read(int handle, void *buf, int count); 功能:读出驱动程序内部结构指定通道模拟电压的数值量 1---表示3.3/1024 V 转换速度内部结构指定比例因子决定 * (2)write函数 格式:int write(int handle, void *buf, int count); 功能:向内部结构写通道值和比例因子值 数的合成由头文件s3c2410-adc.h提供的宏实现 #define ADC_WRITE(ch, prescale) ((ch)16|(prescale)) #define ADC_WRITE_GETCH(data) (((data)16)0x7) #define ADC_WRITE_GETPRE(data) ((data)0xff) * 3、应用程序的流程图 打开设备文件(/dev/adc/0raw) 写入通道和比例因子 读出AD转换后的值 转换成模拟电压值 显示结果 结束吗 * 4、程序运行介绍 运行ad程序的结果如下: [/host/exp/basic/04_ad]./ad Press Enter key exit! a0= 0.0032 a1= 3.2968 a3= 3.1178 * 5、实际应用 * * 电压与温度的转换公式如下: T=(V-0.5)*100 其中:T表示温度值(℃),V表示输出的电压值(V)。 * float GetTemperatureValue(int ch) { int i; float d,tem; if(init_ADdevice()0) //打开AD设备 return -1; d=((float)GetADresult(ch)*3.3)/1024.0; //计算出模拟电压值 close(adc_fd); tem=(d-0.5)*100; //将模拟电压值转换成对应的温度值 return tem; } int main() { int channel=2; //选择第2通道 printf(The temperature is: %4.2f ℃\n,GetTemperatureValue(channel)); return 0; } * #define ADC_DEV /dev/adc/0raw //设备文件 static int adc_fd = -1; /**打开设备***/ static int init_ADdevice(void) { if((adc_fd=open(ADC_DEV, O_RDWR))0){ printf(Error opening %s adc device\n, ADC_DEV); return -1; } } /**获取某通道的AD转换结果***/ static int GetADresult(int channel) { int PRESCALE=0XFF; int data=ADC_WRITE(channel, PRESCALE); write(adc_fd, data, sizeof(d

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档