基于stm32的多功能時鐘4——超聲波測距

????????hello绰垂,讀者們好室奏!

????????前兩章,主要講述了環(huán)境參量的測量獲取劲装,想必大家都有些許收獲胧沫。在這一章中,小編將介紹如何利用超聲波來測距占业。在現(xiàn)實生活中绒怨,利用超聲波測距的應(yīng)用很多,廣泛應(yīng)用于機器人避障 纺酸、物體測距 窖逗、液位檢測 址否、公共安防餐蔬、停車場檢測等領(lǐng)域。


1.模塊介紹

超聲波模塊

????????本次測距使用的超聲波為HC-SRO4佑附,該模塊共有4個引腳樊诺,分別是兩個電源引腳VCC和GND,一個觸發(fā)控制信號輸入(TRIG)和一個回響信號輸出(?ECHO)音同,性能穩(wěn)定词爬,測度距離精確,模塊高精度权均,盲區(qū)小顿膨。

????????那么锅锨,超聲波模塊測距原理是:首先,給Trig引腳至少10us的高電平信號恋沃,檢測Echo是否有信號返回必搞,若有信號返回,則Echo發(fā)出高電平囊咏。高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間恕洲,所以測試距離為(高電平時間*聲速)/2。下面梅割,就是超聲波模塊的時序圖霜第。

超聲波時序圖

????????本模塊使用方法簡單,配合stm32的定時器TIM4户辞,一個控制口發(fā)一個10us以上的高電平泌类,就可以在接收口等待高電平輸出。一有輸出就可以開定時器TIM4計時咆课,當(dāng)此口變?yōu)榈碗娖綍r就可以讀定時器TIM4的值末誓,此時就為此次測距的時間,方可算出距離书蚪。如此不斷的周期測喇澡,即可以達到你移動測量的值。

2.軟件編程

(1)配置超聲波的引腳

/*初始化超聲波引腳:Trig:PB0,Echo:PB1*/

void ultra_gpio_init(void)

{

? ? GPIO_InitTypeDef GPIO_InitStructure;

? ? /*使能GPIO的RCC時鐘*/

? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

? ? /*配置Trig引腳*/

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//Trig

? ? GPIO_Init(GPIOB,&GPIO_InitStructure);

? ? /*配置Echo引腳*/

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//Echo

? ? GPIO_Init(GPIOB,&GPIO_InitStructure);

}

????????由于PB0接超聲波Trig引腳殊校,所以選擇推挽輸出模式晴玖,PB1接超聲波Echo引腳,所以選擇浮空輸入模式为流。這樣呕屎,超聲波模塊引腳就配置完成。

(2)定時器TIM4初始化

/*定時器4的NVIC配置*/

void tim4_nvic_config(void)

{

? ? NVIC_InitTypeDef NVIC_InitStruct;

? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

? ? NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;

? ? NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//搶占優(yōu)先級為0

? ? NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子優(yōu)先級為0

? ? NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

? ? NVIC_Init(&NVIC_InitStruct);

}

/*定時器4初始化*/

void tim4_config(void)

{

? ? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

? ? tim4_nvic_config();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //配置NVIC

? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//開啟時鐘

? ? TIM_DeInit(TIM4);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定時器4復(fù)位

? ? TIM_TimeBaseInitStruct.TIM_Period = 1000-1;? ? ? ? ? ? ? ? ? //自動重裝載寄存器值

? ? TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;? ? ? ? ? ? ? //時鐘預(yù)分頻數(shù)

? ? TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;? ? //采樣分頻

? ? TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //計數(shù)模式

? ? TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);? ? ? ? ? ? //初始化TIM4

? ? TIM_ClearFlag(TIM4, TIM_FLAG_Update);? ? ? ? ? ? ? ? ? ? ? ? //清除溢出中斷標(biāo)志

? ? TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);

? ? TIM_Cmd(TIM4, DISABLE);

}

????????由于考慮到測距時的距離過大敬察,計數(shù)會溢出秀睛,出現(xiàn)不準(zhǔn)確的現(xiàn)象,這里需要用到長計時莲祸,并且使用TIM4中斷對計時變量進行自增蹂安,所以需要配置NVIC。這里設(shè)置的中斷優(yōu)先級比較高锐帜,因為測距不能被其他中斷打斷田盈,否則可能出現(xiàn)數(shù)據(jù)不準(zhǔn)的現(xiàn)象,或是數(shù)據(jù)抖動現(xiàn)象缴阎。其次允瞧,設(shè)置TIM4的中斷溢出時間為1ms,此時還不能開啟定時器TIM4。

(3)編寫定時器中斷程序

/*定時器4中斷服務(wù)函數(shù)*/

void TIM4_IRQHandler(void)

{

? ? if(TIM_GetITStatus(TIM4 ,TIM_IT_Update)!=RESET)

? ? {

? ? ? ? TIM4_NUM++;//長計時變量

? ? }

? ? TIM_ClearITPendingBit(TIM4 ,TIM_FLAG_Update);

}

????????為避免測量的距離過長述暂,這里我們需要進行長計時痹升,只需在中斷函數(shù)里這樣操作:TIM4_NUM++,同時記得在每次測量距離前對TIM4_NUM復(fù)位即可畦韭。

(4)編寫超聲波測距相關(guān)函數(shù)

/*啟動超聲波測距*/

u16 ultra_measure(void)

{

? ? u16 distance;

? ? TRIG_H;

? ? delay_us(20);

? ? TRIG_L;

? ? while(ECHO==RESET);

? ? TIM_SetCounter(TIM4,0);

? ? TIM4_NUM = 0;

? ? TIM_Cmd(TIM4, ENABLE);

? ? while(ECHO!=RESET);

? ? TIM_Cmd(TIM4, DISABLE);

? ? distance = (u16)ultra_get_distance();

? ? return distance;

}

/*獲取超聲波傳播時間,間接計算出距離*/

float ultra_get_distance(void)

{

? ? u32 time;

? ? float distance;

? ? time = TIM4_NUM*1000;

? ? time += TIM_GetCounter(TIM4);//獲取超聲波測距總時間

? ? TIM4->CNT = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? //定時器復(fù)位

? ? distance = (float)time*0.017;

? ? return distance;

}

????????這里视卢,需要查閱超聲波手冊中的時序圖,方可編寫程序廊驼。首先据过,向給trig 發(fā)送至少10 us的高電平脈沖,然后等待妒挎,捕捉 echo 端輸出上升沿绳锅,捕捉到上升沿的同時,打開定時器開始計時酝掩,再次等待捕捉echo的下降沿鳞芙,當(dāng)捕捉到下降沿,讀出計時器的時間期虾,這就是超聲波在空氣中運行的時間原朝,按照測試距離=(高電平時間*聲速)/2 就可以算出超聲波到障礙物的距離。

????????這里我們測算的距離:distance = (float)time*0.017镶苞,計算的距離單位為cm喳坠。

(5)主函數(shù)調(diào)用測距函數(shù)

最后,在主函數(shù)里茂蚓,調(diào)用測距函數(shù)即可獲取到距離值壕鹉,再通過lcd顯示函數(shù),顯示出距離值聋涨。

? ? value = ultra_measure();

? ? lcd_display_string(0,32,"測量距離");

? ? lcd_display_num_m(3, 48, value/1000);

? ? lcd_display_num_m(3, 56, (value%1000)/100);

? ? lcd_display_num_m(3, 64, (value%100)/10);

? ? lcd_display_num_m(3, 72, value%10);

超聲波測距1
超聲波測距2

????????通過本章的介紹晾浴,相信你對于超聲波測距應(yīng)該了解不少了吧,相信你也可以做出來的牍白。通過不斷改變超聲波和障礙物之間的位置脊凰,距離值會隨之改變,是不是很有趣啊~


? ? ? ? 到目前為止茂腥,多功能時鐘已經(jīng)具備了顯示時間狸涌、測量溫濕度、測量空氣質(zhì)量以及測距的功能础芍,但我們的LCD顯示部分還沒有優(yōu)化杈抢。在下一章中数尿,小編將帶著大家完成多功能時鐘人機交互界面(簡稱UI)的開發(fā)仑性,到時候,我們的界面就會變得比較美觀了右蹦。敬請期待~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诊杆,一起剝皮案震驚了整個濱河市歼捐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晨汹,老刑警劉巖豹储,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淘这,居然都是意外死亡剥扣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門铝穷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠怯,“玉大人,你說我怎么就攤上這事曙聂』薮叮” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵宁脊,是天一觀的道長断国。 經(jīng)常有香客問我,道長榆苞,這世上最難降的妖魔是什么稳衬? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮坐漏,結(jié)果婚禮上宋彼,老公的妹妹穿的比我還像新娘。我一直安慰自己仙畦,他們只是感情好输涕,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慨畸,像睡著了一般莱坎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寸士,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天檐什,我揣著相機與錄音,去河邊找鬼弱卡。 笑死乃正,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婶博。 我是一名探鬼主播瓮具,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了名党?” 一聲冷哼從身側(cè)響起叹阔,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎传睹,沒想到半個月后耳幢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡欧啤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年睛藻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邢隧。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡修档,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出府框,到底是詐尸還是另有隱情吱窝,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布迫靖,位于F島的核電站院峡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏系宜。R本人自食惡果不足惜照激,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹牧。 院中可真熱鬧俩垃,春花似錦、人聲如沸汰寓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽有滑。三九已至跃闹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毛好,已是汗流浹背望艺。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肌访,地道東北人找默。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像吼驶,于是被迫代替她去往敵國和親惩激。 傳聞我的和親對象是個殘疾皇子店煞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容