基于Dragonboard 410c的超声波测距应用层激活驱动编写.doc

上传人:白大夫 文档编号:3409838 上传时间:2019-08-22 格式:DOC 页数:4 大小:22.50KB
返回 下载 相关 举报
基于Dragonboard 410c的超声波测距应用层激活驱动编写.doc_第1页
第1页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《基于Dragonboard 410c的超声波测距应用层激活驱动编写.doc》由会员分享,可在线阅读,更多相关《基于Dragonboard 410c的超声波测距应用层激活驱动编写.doc(4页珍藏版)》请在三一文库上搜索。

1、基于Dragonboard 410c的超声波测距应用层激活驱动编写前言:最近基于dragonboard410c上做一个demo,其中就要用到超声波模块来测距以达到当人靠近超声波一定距离的时候,驱动会上报single,激活应用层。这个驱动写的有点简单,如果大家有什么见解可以提出。一、硬件搭建1.Dragonboard410c开发板:低速接口中pin1,pin23,pin25,ping35对应的GPIO接口,见Low speed Expansion connector分布图2.US-100电平触发测距工作原理:在模块上电前,首先去掉模式选择跳线上的跳线帽,使模块处于电平触发模式。电平触发测距的时序

2、如图:只需要在 Trig/TX 管脚输入一个 10US 以上的高电平,系统便可发出 8 个 40KHZ 的超声波脉冲,然后检测回波信号。当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX 管脚输出。在此模式下,模块将距离值转化为 340m/s 时的时间值的 2倍,通过 Echo 端输出一高电平,可根据此高电平的持续时间来计算距离值。即距离值为:(高电平时间*340m/s)/2。3.按照下表的方式将US-100与开发板电气连接二、软件环境搭建根据blog教程在装有Ubuntu的主机上下载相应源码以及编译工具。注意:在dts中要修改a

3、pq8016-sbc.dtsi文件,增加超声波驱动的节点信息:sonarcompaTIble = thundersoft,sonar;thunder,poll_TIme =50;thunder,gpio_cmd = msm_gpio 13 0;thunder,gpio_irq = msm_gpio 36 0;三、驱动编写1./匹配设备树定义接口staTIc int parse_dt(struct platform_device* pdev,struct us100_data* data)int rc;struct device_node* node = pdev-dev.of_node;/将n

4、ode 50 写入到poll_TIme中rc = of_property_read_u32(node,thunder,poll_time,data-poll_time);if(rc)pr_warning(%s you should point time,_FUNCTION_);data-poll_time = 20;/* -TrigPin3-PIN25- gpio13- gpio_cmd -cmd_gpio- */data-cmd_gpio = of_get_named_gpio(node,thunder,gpio_cmd,0);/* -EchoPin2-PIN23- gpio36- gpio

5、_irp -echo_gpio- */data-echo_gpio = of_get_named_gpio(node,thunder,gpio_irq,0);if(data-cmd_gpio0 | data-echo_gpio0)pr_err(%s,error gpion,_FUNCTION_);return -EINVAL;return 0;2./启动、关闭方波产生static ssize_t hs100_store_enable(struct device *dev,struct device_attribute *attr,const char *buf, size_t size)str

6、uct us100_data* data = dev_get_drvdata(dev);int enable = simple_strtoul(buf,NULL,10);if(enable)/调用cmd_work_funcschedule_delayed_work(data-cmd_work,0);data-enable =1;else/取消调用cmd_work_funccancel_delayed_work_sync(data-cmd_work);data-enable=0;return size;3./实现12us的方波功能static void cmd_work_func(struct

7、work_struct* work)struct us100_data* data = container_of(work,struct us100_data,cmd_work.work);gpio_set_value(data-cmd_gpio,1);延迟12us产生方波udelay(12);gpio_set_value(data-cmd_gpio,0);/genarate a 12 us pluse/ printk(%s send cmdn,_FUNCTION_);/激活工作队列中的cmd_work_funcschedule_delayed_work(data-cmd_work,msecs

8、_to_jiffies(data-poll_time);/实现获得实际距离的功能static void report_work_func(struct work_struct* work)struct timespec now,last;s64 diff_time;/*-通过结构体中成员的首地址获结构体变量首地址-*/struct us100_data* data = container_of(work,struct us100_data,report_work);/时间格式转换now = ktime_to_timespec(data-now_ktime);last= ktime_to_tim

9、espec(data-last_ktime);/时间差diff_time = now.tv_sec*1000000000UL+now.tv_nsec-last.tv_sec*1000000000UL-last.tv_nsec;/ printk(ns=%lldn,diff_time);mutex_lock(data-data_lock);/实际距离data-distance = diff_time*170*100*10/1000000000UL;mutex_unlock(data-data_lock);data- data_ready = true;/ 唤醒data_queue 指定的注册在等待队列上的进程wake_up_interruptible(data-data_queue);/ printk(dis=%dn,data-distance);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1