0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux驱动开发-编写超声波测距模块的驱动

DS小龙哥-嵌入式技术 2022-09-17 15:07 次阅读

【摘要】 当前采用的这种超声波测距模块在各大高校实验室、毕设、课设里用的很多,原理很简单,通过声波测距,发出的声音碰到障碍物会反弹,声音在空气里传播的速度是已知的,根据时间就能计算出测量的距离。这款超声波模块内部自带了时间计算电路,型号是HC-SR04 ,它可提供 2cm-400cm 的非接触式距离感测功能,距精度可达高到 3mm; 整个模块包括了超声波发射器、 接收器控制电路

1. 介绍

当前采用的这种超声波测距模块在各大高校实验室、毕设、课设里用的很多,原理很简单,通过声波测距,发出的声音碰到障碍物会反弹,声音在空气里传播的速度是已知的,根据时间就能计算出测量的距离。这款超声波模块内部自带了时间计算电路,型号是HC-SR04 ,它可提供 2cm-400cm 的非接触式距离感测功能,距精度可达高到 3mm; 整个模块包括了超声波发射器、 接收器与控制电路。

基本工作原理
(1) 采用 IO 口 TRIG 触发测距, 给至少 10us 的高电平信号;
(2) 模块自动发送 8 个 40khz 的方波, 自动检测是否有信号返回;
(3) 有信号返回, 通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。

测量距离的公式:

uS/58=厘米或者 uS/148=英寸; 
或是: 距离=高电平时间*声速(340M/S)/2;
建议测量周期为 60ms 以上, 以防止发射信号对回响信号的影响。

下面是超声波模块与开发板的连线方式:

2. 示例代码

下面是超声波测距模块的驱动代码,将超声波模块的输出脚接在开发板支持中断的IO口上,配置为上升沿触发,当超声波输出脚检测到高电平就进去中断服务函数,在中断服务函数里调度工作队列,最终在工作函数里完成高电平的时间长度获取,计算测量的距离,直接在驱动代码里打印出来。

下面是测量的结果:

image-20211229094915304

2.1 驱动代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 

static struct timer_list timer;
static struct work_struct work;
static int irq;
#define TRIG EXYNOS4_GPB(7)      //输出触发信号   第8个IO口
#define ECHO EXYNOS4_GPX1(0)    //ECHO 回响信号输出--中断   第9个IO口
/*获取高电平持续时间--us单位*/
static u32 GetTimeH(void)
{
	ktime_t my_time,my_time2;
	unsigned int i,j;
	my_time=ktime_get(); //获取当前时间
	i=ktime_to_us(my_time); //转 us
	while(gpio_get_value(ECHO)){}
	my_time2=ktime_get(); //获取当前时间
	j=ktime_to_us(my_time2); //转 us
	return j-i;
}

/*
工作函数
*/
static void csb_work_func(struct work_struct *work)
{
	u32 time=GetTimeH();
	printk("厘米:%d cm\n",time/58);
}

/*外部中断服务函数*/
irqreturn_t csb_irq_handler_func(int irq, void *dev)
{
	/*添加工作到工作队列*/
	schedule_work(&work);
	return IRQ_HANDLED;
}

/*内核定时器中断服务函数*/
static void timer_function(unsigned long data)
{
	static u8 i=0;
	mod_timer(&timer,msecs_to_jiffies(1000)+jiffies);
	i=!i;
	if(i)
	{
		gpio_set_value(TRIG,1);
	}
	else
	{
		gpio_set_value(TRIG,0);
	}
}

static int __init tiny4412_linux_csb_init(void)
{
	/*请求GPIO口使用权*/
	gpio_request(TRIG,"CSB");
    /*配置GPIO引脚*/
	s3c_gpio_cfgpin(TRIG,S3C_GPIO_OUTPUT);
	/*GPIO默认输出值*/
	gpio_set_value(TRIG,0);

	/*初始化工作函数*/
	INIT_WORK(&work,csb_work_func);
	/*1. 获取中断号*/
	irq=gpio_to_irq(ECHO);
	/*2. 注册中断*/
	request_irq(irq,csb_irq_handler_func,IRQF_TRIGGER_RISING,"tiny4412_csb",NULL);
	
	timer.expires=HZ+jiffies; /*单位是节拍*/
	timer.function=timer_function;
	timer.data=666;
	/*1. 初始化定时器*/
	init_timer(&timer);
	/*2. 添加定时器到内核*/
	add_timer(&timer);
    printk("驱动测试: 驱动安装成功\n");
    return 0;
}

static void __exit tiny4412_linux_csb_cleanup(void)
{
	/*3. 删除定时器*/
	del_timer_sync(&timer);
	free_irq(irq,NULL);
    printk("驱动测试: 驱动卸载成功\n");
}

module_init(tiny4412_linux_csb_init);    /*驱动入口--安装驱动的时候执行*/
module_exit(tiny4412_linux_csb_cleanup); /*驱动出口--卸载驱动的时候执行*/

MODULE_LICENSE("GPL");  /*设置模块的许可证--GPL*/

2.2 Makefile

KER_DRI=/home/wbyq/work/linux-3.5/linux-3.5
all:
	make -C $(KER_DRI) M=`pwd` modules
	cp *.ko /home/wbyq/work/rootfs/code -f
	make -C $(KER_DRI) M=`pwd` modules clean
obj-m += linux_csb.o
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1822

    浏览量

    85121
  • 超声波测距模块

    关注

    1

    文章

    7

    浏览量

    4994
收藏 人收藏

    评论

    相关推荐

    光学超声波清洗机发生器

    索尼克超声(ucsonic) 多功能高频超声清洗机驱动板是超声清洗系统中的核心部件,它负责产生高频超声波信号,以
    的头像 发表于 10-09 10:05 137次阅读
    光学<b class='flag-5'>超声波</b>清洗机发生器

    RK3568教学实验箱_操作案例:5-19 超声波测距实验

    、熟悉Qt程序的开发流程; 2、掌握Qt Creator的基础开发使用; 3、通过编写Qt程序实现超声波测距的显示界面。 三、实验原理 Qt
    发表于 09-23 15:40

    第七章-V1.5 STM32超声波测距STM32F103C8t6超声波避障小车 超声波避障模块 STM32超声波测距

    5STM32超声波测距STM32F103C8t6超声波避障小车
    的头像 发表于 08-15 16:25 575次阅读
    第七章-V1.5 STM32<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>STM32F103C8t6<b class='flag-5'>超声波</b>避障小车 <b class='flag-5'>超声波</b>避障<b class='flag-5'>模块</b> STM32<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>

    超声波发生器-40khz脉冲功能的应用场景有哪些?-驱动

    索尼克超声(ucsonic) 超声波驱动板40kHz的脉冲功能在多个应用场景中发挥着重要作用,尤其是在需要高效、精确的清洗和清洁的领域。以下是几个主要的应用场景: 1.超声波清洗:在
    的头像 发表于 07-26 16:20 356次阅读
    <b class='flag-5'>超声波</b>发生器-40khz脉冲功能的应用场景有哪些?-<b class='flag-5'>驱动</b>板

    超声波驱动板-超声波它激式驱动

            超声波它激式驱动板是一种将电能转换为超声波能量的设备,主要用于驱动超声波换能器产生高频振动,进而实现各种
    的头像 发表于 06-14 11:54 739次阅读
    <b class='flag-5'>超声波</b><b class='flag-5'>驱动</b>板-<b class='flag-5'>超声波</b>它激式<b class='flag-5'>驱动</b>板

    超声波无损检测原理及应用

    超声波无损检测(Ultrasonic Non-Destructive Testing,简称UT)是一种利用超声波在材料内部传播的特性,检测材料内部缺陷和结构的无损检测技术。本文将详细介绍超声波无损
    的头像 发表于 05-24 16:48 4552次阅读

    在全志H616核桃派开发板上实现超声波传感器测距

    实现超声波传感器测距。 实验讲解​ 下图是一款市面上常用的HCSR04超声波模块模块参数 供电电压 3.3V~5V (核桃派需要使用支持3.3V的) 测量距离 2cm~450c
    发表于 05-08 16:21

    基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料

    设计要求 1.设计一个以51单片机为核心的超声波倒车雷达系统; 2.超声波测量范围在2cm~4m,测量精度3mm; 3.扩展DS18B20温度测量模块,读取环境温度和补偿超声波
    发表于 03-19 14:17

    超声波传感器和超声波测距原理分析

    声音是由振动产生的,能够产生超声波的装置就是超声波传感器,习惯上称为超声换能器,或者超声探头。
    发表于 01-29 09:20 732次阅读
    <b class='flag-5'>超声波</b>传感器和<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>原理分析

    超声波测距原理 超声波测距离传感器接线方法

    超声波测距是一种常用的测距方法,通过发射超声波脉冲,利用其在空气中传播速度较快的特点,测量出从传感器到目标物体的时间差,并进而计算出距离。超声波
    的头像 发表于 01-22 15:22 2118次阅读

    超声波传感器的工作原理 超声波传感器的应用

    超声波传感器是一种基于超声波的无接触式测距传感器,可以广泛应用于工业、医疗、军事等领域。本文将详细介绍超声波传感器的工作原理以及其在各个领域的应用。
    的头像 发表于 01-18 14:04 1506次阅读

    超声波传感器测距离的原理

    超声波传感器测距离的原理是利用声波在空气中的传播速度测量物体与传感器之间的距离。具体而言,传感器发送出一个超声波信号,然后测量信号从发送到接收所需的时间,并根据
    的头像 发表于 01-15 09:41 2601次阅读

    超声波发生器的原理

    超声波发生器又称超声波驱动电源、电子箱、超声波控制器,是大功率超声波系统的重要组成部分。超声波
    的头像 发表于 12-24 10:46 1641次阅读
    <b class='flag-5'>超声波</b>发生器的原理

    51单片机的超声波测距,并用74HC595驱动数码管显示超声波测距的距离

    个人是小白,实在不会写,麻烦大佬们帮忙写一个程序,实现51单片机的超声波测距,并用74HC595驱动数码管显示超声波测距的距离!!!
    发表于 11-23 15:19

    利用AT89C51单片机、超声波传感器测距实现超声波倒车雷达

    电子发烧友网站提供《利用AT89C51单片机、超声波传感器测距实现超声波倒车雷达.rar》资料免费下载
    发表于 11-17 15:47 3次下载
    利用AT89C51单片机、<b class='flag-5'>超声波</b>传感器<b class='flag-5'>测距</b>实现<b class='flag-5'>超声波</b>倒车雷达