【摘要】 當前采用的這種超聲波測距模塊在各大高校實驗室、畢設、課設里用的很多,原理很簡單,通過聲波測距,發出的聲音碰到障礙物會反彈,聲音在空氣里傳播的速度是已知的,根據時間就能計算出測量的距離。這款超聲波模塊內部自帶了時間計算電路,型號是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口上,配置為上升沿觸發,當超聲波輸出腳檢測到高電平就進去中斷服務函數,在中斷服務函數里調度工作隊列,最終在工作函數里完成高電平的時間長度獲取,計算測量的距離,直接在驅動代碼里打印出來。
下面是測量的結果:

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文章
1954瀏覽量
88522 -
超聲波測距模塊
+關注
關注
1文章
8瀏覽量
5207
發布評論請先 登錄
PGA460超聲波信號處理器與換能器驅動器的深度解析
超聲波功率放大器驅動可以做什么實驗
CW32L012/F030靈眸X1智能小車——超聲波模塊配置
無線超聲波測距傳感器:精準感知,開啟智能測距新時代
【Milk-V Duo S 開發板免費體驗】DuoS 超聲波測距 OLED 顯示
超聲波測距換能器:工業與生活中的測量利器
超聲波測距換能器:工業與生活中的測量利器
超聲波清洗機是什么,它如何通過超聲波振動來清洗物品?
超聲波換能器:原理與多領域應用解析
超聲波水下測距換能器:探索水下世界的“千里眼”
一文讀懂超聲波換能器:原理、應用與未來趨勢
超聲波換能器--聲波世界的 “神奇魔法師”
超聲波清洗的原理是什么?超聲波清洗是如何起作用的?
超聲波頻率和功率對在線式超聲波清洗的影響如何?
Linux驅動開發-編寫超聲波測距模塊的驅動
評論