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