www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 程序員小哈
[導(dǎo)讀]HC-SR04超聲波測(cè)距模塊可提供2cm-400cm的非接觸式距離感測(cè)功能,測(cè)距精度可達(dá)3mm; 模塊包括超聲波發(fā)射器、接收器與控制電路。 在智能小車(chē)的測(cè)距、避障,盲人拐杖,視力保護(hù)器(坐姿矯正),倒車(chē)?yán)走_(dá)等應(yīng)用中時(shí)常使用。 工作原理 HC-SR04基本工作原理: 使用

HC-SR04超聲波測(cè)距模塊可提供2cm-400cm的非接觸式距離感測(cè)功能,測(cè)距精度可達(dá)3mm;

模塊包括超聲波發(fā)射器、接收器與控制電路。

在智能小車(chē)的測(cè)距、避障,盲人拐杖,視力保護(hù)器(坐姿矯正),倒車(chē)?yán)走_(dá)等應(yīng)用中時(shí)常使用。

工作原理

HC-SR04基本工作原理:

  1. 使用單片機(jī)的一個(gè)引腳發(fā)送一個(gè)至少10us高電平的TTL脈沖信號(hào)到模塊的Trig引腳,用于觸發(fā)模塊工作。

  2. 模塊檢測(cè)到觸發(fā)信號(hào)之后,會(huì)自動(dòng)發(fā)送8個(gè)40khz的方波,然后自動(dòng)切換至監(jiān)測(cè)模式,監(jiān)測(cè)是否有信號(hào)返回(超聲波信號(hào)遇障礙物會(huì)返回)。

  3. 如果有信號(hào)返回,通過(guò)模塊的Echo引腳會(huì)輸出一個(gè)高電平, 高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。

  4. 因?yàn)槁曇粼诳諝庵械乃俣葹?40米/秒,即可計(jì)算出所測(cè)的距離。

代碼實(shí)現(xiàn)

通過(guò)上面的分析,我們知道,獲得超聲波模塊測(cè)得的距離的難點(diǎn)就是求得Echo引腳輸出脈沖的高電平持續(xù)時(shí)間。

實(shí)現(xiàn)步驟:

  1. 初始化Trig引腳PA2為輸出模式,Echo引腳PA3為浮空輸入模式;
    初始化TIM4為1ms的定時(shí)器,msHcCount變量用于記錄定時(shí)器中斷次數(shù)。
//文件"sr04.h"中添加定義extern u32 msHcCount;
//超聲波硬件接口定義#define HCSR04_PORT GPIOA#define HCSR04_CLK RCC_APB2Periph_GPIOA#define HCSR04_TRIG GPIO_Pin_2#define HCSR04_ECHO GPIO_Pin_3
#define TRIG_Send PAout(2)#define ECHO_Reci GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
//文件"sr04.c"中void Hcsr04Init(){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG); GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_DeInit(TIM4); TIM_TimeBaseStructure.TIM_Period = (1000-1); TIM_TimeBaseStructure.TIM_Prescaler =(72-1); TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); Hcsr04_NVIC(); TIM_Cmd(TIM4,DISABLE); }


  1. 測(cè)量距離,下面代碼實(shí)現(xiàn)的是五次測(cè)量取平均值作為最終的結(jié)果。
    單次距離測(cè)量的方法采用了兩種實(shí)現(xiàn)方式:定時(shí)器方式和延時(shí)函數(shù)的方式。

  • 定時(shí)器方式,通過(guò)定時(shí)器4計(jì)數(shù)器值計(jì)算距離

當(dāng)ECHO_Reci引腳的輸入電平由低變高時(shí):即while(ECHO_Reci == 0); 循環(huán)為假時(shí)開(kāi)始計(jì)時(shí):OpenTimerForHc();

當(dāng)ECHO_Reci引腳的輸入電平由高變低時(shí),即while(ECHO_Reci == 1); 循環(huán)為假時(shí)結(jié)束計(jì)時(shí):CloseTimerForHc();

計(jì)時(shí)結(jié)束,調(diào)用GetEchoTimer(void)函數(shù)計(jì)算總耗時(shí),單位us。

u32 GetEchoTimer(void){ u32 t = 0; t = msHcCount*1000; t += TIM_GetCounter(TIM4); TIM4->CNT = 0;  delay_ms(50); return t;}

通過(guò)定時(shí)器4計(jì)數(shù)器值計(jì)算距離的具體實(shí)現(xiàn)代碼如下所示:

float Hcsr04GetLength(void ){ u32 t = 0; int i = 0; float lengthTemp = 0; float sum = 0; while(i<5) { TRIG_Send = 1;  delay_us(20); TRIG_Send = 0; while(ECHO_Reci == 0);  OpenTimerForHc();  i = i + 1; while(ECHO_Reci == 1); CloseTimerForHc();  t = GetEchoTimer();   lengthTemp = ((float)t/58.0);  sum = lengthTemp + sum ;  }  lengthTemp = sum/5.0; return lengthTemp;}
  • 延時(shí)函數(shù)方式計(jì)算距離

也是取五次測(cè)量值的平均值作為結(jié)果,在計(jì)算Echo引腳輸出高電平時(shí)間的時(shí)候,只要while(ECHO_Reci)為真,計(jì)時(shí)即+10us,直至高電平結(jié)束,即可獲得高電平持續(xù)的總時(shí)間。

測(cè)試結(jié)果部分可以看出此方法誤差較大,大家可以想想,問(wèn)題出在哪里?

void HCSR04_Ranging(float *p){ u8 i=0; u32 j=0; float HCSR04_Temp = 0.0;  for(i=0;i<5;i++) { TRIG_Send=1; delay_us(40); TRIG_Send=0; while(!ECHO_Reci); while(ECHO_Reci) { delay_us(10); j++; } HCSR04_Temp+=j*10; //模塊最大可測(cè)距4m  j=0; delay_ms(60);//防止發(fā)射信號(hào)對(duì)回響信號(hào)的影響 }
*p= HCSR04_Temp/5/58.0; }

注意:文中多次使用類(lèi)似while循環(huán):while(ECHO_Reci),其實(shí)這樣做容易讓單片機(jī)陷入死循環(huán),各位可以試著想想有沒(méi)有好的方式避免。

距離換算

查看手冊(cè),我們會(huì)看到,手冊(cè)上說(shuō):

測(cè)量距離(cm) = 高電平持續(xù)的us數(shù) / 58

為什么us值/58即是以cm為單位的距離值呢?

正常的換算公式為:

測(cè)試距離 = (高電平時(shí)間*聲速(340m/s))/2

除以2的原因是,超聲波的信號(hào)是往返的耗時(shí)等于高電平時(shí)間,我們求距離,需要除以2。

上面的測(cè)量距離單位為m,高電平時(shí)間為s, 如果我們把測(cè)量距離的單位換為cm,高電平時(shí)間改為us, 則上面的公式就修改為:

測(cè)量距離cm = (高電平時(shí)間us/1000000) * 340 / 2 * 100

即測(cè)量距離cm = 高電平時(shí)間us * 17 / 1000;

即測(cè)量距離cm = 高電平時(shí)間us / (1000/17);而1000/17 ≈ 58.82

所以一般為了方便計(jì)算,距離換算就是將求得的高電平時(shí)間除以58,即得距離值,單位cm。

硬件連接


目前HC-SR04這個(gè)模塊有很多版本,最好選用3.3V和5V兼容的版本。


我也拿了一個(gè)5V的老版本做了一下測(cè)試,使用3.3V供電,測(cè)量的數(shù)據(jù)不對(duì),什么也不改變的情況下,將電源引腳供電改為5V供電,返回的數(shù)據(jù)就正常了。

如果使用5V老版本的HC-SR04模塊,為了使系統(tǒng)能夠穩(wěn)定,最好選用5V耐受的IO引腳,諸如帶有下面FT標(biāo)識(shí)的引腳。


實(shí)際效果圖

下面硬件使用的STM32核心板為我們“2020.06每月一練的核心板,需要資料的可以后臺(tái)回復(fù)“每月一練”獲取。

測(cè)試結(jié)果

分別將HC-SR04放置于障礙物前30cm、20cm、10cm處各測(cè)量?jī)纱?,具體數(shù)據(jù)如下所示:

通過(guò)上面我們可以看出,定時(shí)器的方式的準(zhǔn)確度明顯高于延時(shí)函數(shù)的實(shí)現(xiàn)方式,自己分析一下,為什么延時(shí)函數(shù)的方式誤差會(huì)差這么多呢?

當(dāng)然這里面的誤差還包括我擺放的原因?qū)е碌恼`差。

資料獲取

微信公眾號(hào)后臺(tái)回復(fù)“SR04”,可以下載超聲波測(cè)距原理及實(shí)現(xiàn)網(wǎng)文對(duì)應(yīng)的工程源碼。

尾語(yǔ)

在找回新號(hào)之后,就面臨著兩個(gè)選擇,是選擇更好的交流體驗(yàn),選擇帶有留言功能的新號(hào)呢?還是為了辛辛苦苦積攢的讀者,將就使用「程序員小哈」那個(gè)老號(hào)呢?

舍棄意味著從新開(kāi)始,舍棄意味著讀者的數(shù)量也一并清零,猶豫再三,為了成為一個(gè)有靈魂的公眾號(hào),還是選擇了有留言功能的新號(hào)。

我相信,大家經(jīng)過(guò)一段時(shí)間與我的相處,大概知道我的為人,我相信在各位朋友的幫助下,我們的讀者數(shù)量很快就會(huì)超越老號(hào),整體更進(jìn)一步的。

希望各位新老朋友能幫忙宣傳一下,讓我們的公眾號(hào)越來(lái)越好,讓我有更多的熱情能夠?qū)懗龊玫奈恼路窒斫o大家。

程序員小哈這個(gè)公眾號(hào)也運(yùn)營(yíng)一段時(shí)間了,對(duì)其很有感情,也不想荒廢了。

未來(lái)兩個(gè)公眾號(hào)的定位:

程序員小哈」:分享嵌入式、物聯(lián)網(wǎng)相關(guān)領(lǐng)域精彩文章,分享圈內(nèi)人員的經(jīng)驗(yàn)心得,我會(huì)認(rèn)真篩選每一次的分享,希望各位能夠從中受益;

嵌入式從0到1」:堅(jiān)持原創(chuàng),每周2~3篇技術(shù)分享,每月DIY一個(gè)的小項(xiàng)目,大家一起玩,一起進(jìn)步,帶你走進(jìn)嵌入式工程師的大門(mén)。

希望你能兩個(gè)都關(guān)注一段時(shí)間,觀察一段時(shí)間,如果你感覺(jué)沒(méi)有收獲,隨時(shí)取關(guān),感謝你的支持!


PS:咱們的公眾號(hào)也有留言功能了,大家可以暢所欲言了^_^


新公眾號(hào)「嵌入式從0到1」,長(zhǎng)按關(guān)注一波哈。



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉