【摘要】 當(dāng)前采用的這種超聲波測距模塊在各大高校實驗室、畢設(shè)、課設(shè)里用的很多,原理很簡單,通過聲波測距,發(fā)出的聲音碰到障礙物會反彈,聲音在空氣里傳播的速度是已知的,根據(jù)時間就能計算出測量的距離。這款超聲波模塊內(nèi)部自帶了時間計算電路,型號是HC-SR04 ,它可提供 2cm-400cm 的非接觸式距離感測功能,距精度可達(dá)高到 3mm; 整個模塊包括了超聲波發(fā)射器、 接收器與控制電路。
1. 介紹
當(dāng)前采用的這種超聲波測距模塊在各大高校實驗室、畢設(shè)、課設(shè)里用的很多,原理很簡單,通過聲波測距,發(fā)出的聲音碰到障礙物會反彈,聲音在空氣里傳播的速度是已知的,根據(jù)時間就能計算出測量的距離。這款超聲波模塊內(nèi)部自帶了時間計算電路,型號是HC-SR04 ,它可提供 2cm-400cm 的非接觸式距離感測功能,距精度可達(dá)高到 3mm; 整個模塊包括了超聲波發(fā)射器、 接收器與控制電路。
基本工作原理:
(1) 采用 IO 口 TRIG 觸發(fā)測距, 給至少 10us 的高電平信號;
(2) 模塊自動發(fā)送 8 個 40khz 的方波, 自動檢測是否有信號返回;
(3) 有信號返回, 通過 IO 口 ECHO 輸出一個高電平, 高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。
測量距離的公式:
uS/58=厘米或者 uS/148=英寸;
或是: 距離=高電平時間*聲速(340M/S)/2;
建議測量周期為 60ms 以上, 以防止發(fā)射信號對回響信號的影響。
下面是超聲波模塊與開發(fā)板的連線方式:
2. 示例代碼
下面是超聲波測距模塊的驅(qū)動代碼,將超聲波模塊的輸出腳接在開發(fā)板支持中斷的IO口上,配置為上升沿觸發(fā),當(dāng)超聲波輸出腳檢測到高電平就進(jìn)去中斷服務(wù)函數(shù),在中斷服務(wù)函數(shù)里調(diào)度工作隊列,最終在工作函數(shù)里完成高電平的時間長度獲取,計算測量的距離,直接在驅(qū)動代碼里打印出來。
下面是測量的結(jié)果:
2.1 驅(qū)動代碼
#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) //輸出觸發(fā)信號 第8個IO口
#define ECHO EXYNOS4_GPX1(0) //ECHO 回響信號輸出--中斷 第9個IO口
/*獲取高電平持續(xù)時間--us單位*/
static u32 GetTimeH(void)
{
ktime_t my_time,my_time2;
unsigned int i,j;
my_time=ktime_get(); //獲取當(dāng)前時間
i=ktime_to_us(my_time); //轉(zhuǎn) us
while(gpio_get_value(ECHO)){}
my_time2=ktime_get(); //獲取當(dāng)前時間
j=ktime_to_us(my_time2); //轉(zhuǎn) us
return j-i;
}
/*
工作函數(shù)
*/
static void csb_work_func(struct work_struct *work)
{
u32 time=GetTimeH();
printk("厘米:%d cm\n",time/58);
}
/*外部中斷服務(wù)函數(shù)*/
irqreturn_t csb_irq_handler_func(int irq, void *dev)
{
/*添加工作到工作隊列*/
schedule_work(&work);
return IRQ_HANDLED;
}
/*內(nèi)核定時器中斷服務(wù)函數(shù)*/
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口使用權(quán)*/
gpio_request(TRIG,"CSB");
/*配置GPIO引腳*/
s3c_gpio_cfgpin(TRIG,S3C_GPIO_OUTPUT);
/*GPIO默認(rèn)輸出值*/
gpio_set_value(TRIG,0);
/*初始化工作函數(shù)*/
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; /*單位是節(jié)拍*/
timer.function=timer_function;
timer.data=666;
/*1. 初始化定時器*/
init_timer(&timer);
/*2. 添加定時器到內(nèi)核*/
add_timer(&timer);
printk("驅(qū)動測試: 驅(qū)動安裝成功\n");
return 0;
}
static void __exit tiny4412_linux_csb_cleanup(void)
{
/*3. 刪除定時器*/
del_timer_sync(&timer);
free_irq(irq,NULL);
printk("驅(qū)動測試: 驅(qū)動卸載成功\n");
}
module_init(tiny4412_linux_csb_init); /*驅(qū)動入口--安裝驅(qū)動的時候執(zhí)行*/
module_exit(tiny4412_linux_csb_cleanup); /*驅(qū)動出口--卸載驅(qū)動的時候執(zhí)行*/
MODULE_LICENSE("GPL"); /*設(shè)置模塊的許可證--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
-
驅(qū)動
+關(guān)注
關(guān)注
12文章
1840瀏覽量
85324 -
超聲波測距模塊
+關(guān)注
關(guān)注
1文章
8瀏覽量
5010
發(fā)布評論請先 登錄
相關(guān)推薦
評論