導航:首頁 > 製冷設備 > stm32怎麼裝超聲波感測器

stm32怎麼裝超聲波感測器

發布時間:2022-12-14 12:25:01

『壹』 請求教,STM32超聲波如何定義管腳,給管腳高低電平,是如何寫的,稍微寫一下,我理解理解

一般就是兩個管腳:TRIG、ECHO。超聲波又分兩種,一種是自己驅動的(自己畫超聲波部分電路),一種是驅動第三方做好的。

一、自己驅動的

  1. TRIG腳初始化為輸出,ECHO初始化為輸入。同時ECHO腳設置為外部中斷

2.TRIG腳發送脈沖,一般是循環發送8個脈沖。然後計時清0.

for(u8 i = 0; i < 8; i++)

{

TRIG_HIGH;

delay_us(10);

TRIG_LOW;

delay_us(10);

}

3.等待觸發ECHO腳的外部中斷,或者等待超時(這是為了前方空曠沒有超聲波返回)。

4.數據處理。((float)(SonicL.time.ms * 1000.0 + PULSE_TIME + WAIT_STABLE_TIME + SonicL.time.endCnt - SonicL.time.startCnt)/ 58.0);//cm

二、直接用模塊,這個模塊一般會有廠家提供手冊

  1. TRIG腳初始化為輸出,ECHO初始化為輸入。同時ECHO腳設置為外部中斷

  2. 2.TRIG腳發送脈沖,一般是循環發送8個脈沖。

    TRIG_HIGH; delay_us(20); TRIG_LOW;

3.等待觸發ECHO腳的外部中斷(上升沿中斷時計時清0.下降沿中斷時停止計時),或者等待超時(這是為了前方空曠沒有超聲波返回)

4.數據處理。((float)(SonicL.time.ms * 1000.0 + SonicL.time.endCnt - SonicL.time.startCnt)/ 58.0);//cm

『貳』 stm32避障小車,驅動是l298n,超聲波感測器是HY-SRF05,求程序,若成功還有追加財富值。麻煩大家了。

兄弟,你覺著可能會有人花時間給你做全套程序么。。。

『叄』 stm32中軟體部分如何利用感測器介面驅動超聲波測距

這個可以通過超聲波感測器的輸出埠採集,看感測器是數字介面還是模擬輸出。

『肆』 stm32引腳接超聲波介面用什麼模式

stm32引腳接超聲波介面用什麼模式
超聲波模塊測得的距離一直是固定值的同仁看過來:
如果你是用3.3v給開發板供電,但用到了開發板的5v給HC-SR04供電,那麼你就和我掉進的同一個坑
出現這個問題的原因是STM32開發板一般沒有升壓晶元或其他升壓措施,因此低於5v給開發板供電是不可能輸出5v電壓的 ,根據測量它只有2.86v,這就導致了HC-SR04供電不足的問題
在我認為是代碼問題並修改了16個小時的最後一分鍾,我發現他是供電不足引起的,這一結論真讓我哭笑不得
開篇閑諞:
耀風(鄙人)是一個STM32才入門的小白所以文章寫的不是很嚴謹,如果有錯誤歡迎大家指正。我寫這篇文章的目的有兩個:
第一,記錄本次實驗方便自己以後查看(畢竟卡了我16個小時,錯誤原因竟然是哭笑不得的供電不足)。
第二,分享給其他在學或還不知道怎麼使用超聲波模塊的同仁,避免犯和我一樣的錯誤。
編程IDE工具: KEIL5
實驗所需材料:
1.STM32F1系列單片機任意一款
2. HC_SR04超聲波模塊
3.杜邦線若干
引腳連接:
Tring —>PA4
Echo —>PA5
GND —>GND
VCC —>5v~5.5v
網上資料說超聲波模塊的供電電壓在3~5.5v,但是還是建議用5v左右,因為穩定。如果STM32不是5v供電,那麼就不要用STM32開發板上的引腳給HC_SR04供電。
原因就是STM32開發板一般沒有升壓晶元或其他升壓措施,因此低於5v給開發板供電是不可能輸出5v電壓的 (再啰嗦一遍)
實驗原理:
通過STM32的GPIO給HC_SR04模塊的Tring引腳輸出一個至少10us的高電平開啟超聲波模塊,然後超聲波模塊就會自動發送一個連續的由8個40KHZ脈沖組成的脈沖串,發送完成後HC_SR04模塊的Echo引腳會變成低電平並且HC_SR04模塊的晶元也會開始時。如果HC_SR04發出的脈沖串遇到障礙物就會被反射回來,當超聲波模塊接收到返回的脈沖串時就會將Echo引腳變成高電平並且HC_SR04模塊的晶元也會停止計時,Echo引腳輸出高電平的時間就是脈沖串從發出到接收的時間。
由上面這巴拉巴拉的一段話我們可以知道驅動HC_SR04的步驟:
1. 通過STM32的GPIO給HC_SR04的Tring引腳輸出一個至少10us的高電平
2. 當HC_SR04的Echo引腳輸出高電平時開啟STM32的定時器或Systick定時器開始計時,當Echo引腳輸出低電平時停止計時,並記錄時間
3. 根據時間算距離
distance = T(所測時間)x 340m/s / 2 = T(所測時間) x 170m/s = T(所測時間) x 17000 cm / 1000 000 us = T(所測時間)/ 1000 000 us / 17000 cm = T(所測時間)/ 58.0(近似值)
不想看上面推導的朋友知道距離 distance = T(所測時間)/ 58.0 就可以了
代碼核心片段講解:
//**********引腳初始化*************
void init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/***********延時函數定義(使用Systick定時器實現)**************
1.用Systick定時器的原因就是它操作簡單一點,不用初始化,直接調用SysTick_Config()函數即可,然後在寫個相應中斷函數就可
2.因為在本項目中延時和定時不用同時運行,所以這兩個功能用一個定時器就好
*************************************************************/
void delay_ms(uint32_t time)
{
TIME = time;
State = 0; // 用於區分是Systick因延時的進入中斷還是因定時進入中斷
SysTick_Config(72000); //定時器每1ms計時一次
while(TIME!=0);
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; //關閉定時器
}

void delay_us(uint32_t time)
{
TIME = time;
State = 0;// 用於區分是Systick因延時的進入中斷還是因定時進入中斷
SysTick_Config(72);//定時器每1us計時一次
while(TIME!=0);
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;//關閉定時器
}

//************測引腳電平持續時間函數定義******************
uint32_t pulseIn(GPIO_TypeDef* GPIOx,uint16_t Pin,STATE state)
{
uint32_t time = 0;
uint8_t i ;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)!state){}
State = 1;
TIME = 0;
SysTick_Config(72); //一定要以1us為溢出時間,因為算距離的公式中的T是以us為單位的
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)state){}

SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
time = TIME;
TIME = 0;
printf(" Time = %d\n",time);

return time;
}

extern int TIME;
extern uint8_t State;
void SysTick_Handler(void)
{
if(State == 0) //因延時函數中的SysTick定時器溢出進入
TIME--;
else if(State == 1) //因定時中的SysTick定時器溢出進入
TIME++;
}

int main(void)
{
init();
Usart_begin(USART1,9600); //這是我自己寫的STM32庫函數二次封裝中的USART1初始化函數
//啊吧啊吧,本來整個工程都是用我開發的二次封裝寫的,奈何我竟傻傻的16個小時都認為是代碼問題,所以就改掉了。
while(1){
float distance;
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
delay_us(10);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
delay_us(20);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);

distance = (float)pulseIn(GPIOA, GPIO_Pin_5,HIGH)/58.0; //算出距離(58.0的原因前面有講解)

printf("distance = %.2lf\n",distance);
delay_ms(200);
}
}
登錄後復制

後面我會專門寫一個這個二次封裝用法的文章的,大家先搞著用這個四不像的工程代碼吧。啊吧啊吧
輸出正常:

代碼分享:
耀風寫的代碼,需要請點擊下載
提取碼:YFJS

『伍』 使用超聲波感測器HY-SRF05時,VCC端接在STM32F103C8T6單片機的5V引腳

STM32F103的電源是3.3V的,而一般這個3.3V的電源都是從5V電源得來的;
如果你板上沒有5V電源,如是直接從鋰電池供電的,只需要加個小小的電源轉換模塊,3.3-->5V,便可得到5V電源,而感測器的耗電很小容易滿足;

『陸』 求教,stm32怎麼用超聲波模塊測距,用的是HC

超聲波測距模塊是感測器,輸出什麼信號,讓STM32來採集這個信號就能得到距離。這個你查看這個模塊的輸出介面與STM32鏈接就好了,一般是usart或者是spi,或者是AD,對應採集數據就完事了。

『柒』 基於stm32的多功能時鍾4——超聲波測距

        hello,讀者們好!

         前兩章,主要講述了環境參量的測量獲取,想必大家都有些許收獲。在這一章中,我將介紹如何利用超聲波來測距。在現實生活中,利用超聲波測距的應用很多,廣泛應用於機器人避障 、物體測距 、液位檢測 、公共安防、停車場檢測等領域。

        本次測距使用的超聲波為HC-SRO4,該模塊共有4個引腳,分別是兩個電源引腳VCC和GND,一個觸發控制信號輸入(TRIG)和一個回響信號輸出( ECHO),性能穩定,測度距離精確,模塊高精度,盲區小。

        那麼,超聲波模塊測距原理是:首先,給Trig引腳至少10us的高電平信號,檢測Echo是否有信號返回,若有信號返回,則Echo發出高電平。高電平持續的時間就是超聲波從發射到返回的時間,所以測試距離為(高電平時間*聲速)/2。下面,就是超聲波模塊的時序圖。

        本模塊使用方法簡單,配合stm32的定時器TIM4,一個控制口發一個10us以上的高電平,就可以在接收口等待高電平輸出。一有輸出就可以開定時器TIM4計時,當此口變為低電平時就可以讀定時器TIM4的值,此時就為此次測距的時間,方可算出距離。如此不斷的周期測,即可以達到你移動測量的值。

(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;//搶占優先順序為0

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子優先順序為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復位

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

    TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;              //時鍾預分頻數

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

    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //計數模式

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

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

    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);

    TIM_Cmd(TIM4, DISABLE);

}

        由於考慮到測距時的距離過大,計數會溢出,出現不準確的現象,這里需要用到長計時,並且使用TIM4中斷對計時變數進行自增,所以需要配置NVIC。這里設置的中斷優先順序比較高,因為測距不能被其他中斷打斷,否則可能出現數據不準的現象,或是數據抖動現象。其次,設置TIM4的中斷溢出時間為1ms,此時還不能開啟定時器TIM4。

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

/*定時器4中斷服務函數*/

void TIM4_IRQHandler(void)

{

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

    {

        TIM4_NUM++;//長計時變數

    }

    TIM_ClearITPendingBit(TIM4 ,TIM_FLAG_Update);

}

        為避免測量的距離過長,這里我們需要進行長計時,只需在中斷函數里這樣操作:TIM4_NUM++,同時記得在每次測量距離前對TIM4_NUM復位即可。

(4)編寫超聲波測距相關函數

/*啟動超聲波測距*/

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;                            //定時器復位

    distance = (float)time*0.017;

    return distance;

}

        這里,需要查閱超聲波手冊中的時序圖,方可編寫程序。首先,向給trig 發送至少10 us的高電平脈沖,然後等待,捕捉 echo 端輸出上升沿,捕捉到上升沿的同時,打開定時器開始計時,再次等待捕捉echo的下降沿,當捕捉到下降沿,讀出計時器的時間,這就是超聲波在空氣中運行的時間,按照測試距離=(高電平時間*聲速)/2 就可以算出超聲波到障礙物的距離。

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

(5)主函數調用測距函數

最後,在主函數里,調用測距函數即可獲取到距離值,再通過lcd顯示函數,顯示出距離值。

    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);

        通過本章的介紹,相信你對於超聲波測距應該了解不少了吧,相信你也可以做出來的。通過不斷改變超聲波和障礙物之間的位置,距離值會隨之改變,是不是很有趣啊~

        到目前為止,多功能時鍾已經具備了顯示時間、測量溫濕度、測量空氣質量以及測距的功能,但我們的LCD顯示部分還沒有優化。在下一章中,我將帶著大家完成多功能時鍾人機交互界面(簡稱UI)的開發,到時候,我們的界面就會變得比較美觀了。敬請期待~

『捌』 關於stm32驅動超聲波測距模塊的問題,要瘋了QAQ

1、目前大部分超聲波模塊都是5V供電的,STM32是3.3V供電,如果你的模塊是3.3V那麼它是不能正常工作的。
2、另外,如果模塊使用5V供電,應當在通信口串聯限流電阻,避免5V信號直接灌入晶元,造成損壞。

『玖』 我用如圖的stm32板子,求一個超聲波感測器掃描到距離小於一個值便觸發震動電機的程序,急!

是餘震,你用示波器看下餘震波形和維持時間,要把餘震時間隔離開不進行計算距離

『拾』 求教,stm32怎麼用超聲波模塊測距,用的是HC-SR04

應該說在保修期,硬碟壞的話,應該直接換硬碟,一天足夠了,但是許多地方的筆記本商家,都沒有售後,只能送到大城市去修,所以時間 長,

閱讀全文

與stm32怎麼裝超聲波感測器相關的資料

熱點內容
蠕動探測裝置的作用 瀏覽:47
xposed框架魅工具箱 瀏覽:272
暖氣豎井閥門 瀏覽:319
什麼時候使用閥門定位器 瀏覽:503
尼爾機械紀元怎麼刷99級 瀏覽:872
埃馬克機床質量怎麼樣 瀏覽:165
頻率自動調節裝置屬於 瀏覽:150
設計並製作一套簡易的電池裝置視頻 瀏覽:761
杭州五金市場機電 瀏覽:234
自動勵磁裝置英文縮寫 瀏覽:898
如何提高學科專用設備的使用率 瀏覽:453
揭陽市固鵬五金製品廠 瀏覽:565
autocad電氣機械有什麼區別 瀏覽:504
特種設備安裝上報哪些材料 瀏覽:770
自動滅弧選線裝置 瀏覽:89
摩托車閥門什麼意思 瀏覽:190
液化氣閥門換膠墊 瀏覽:645
煤氣管道兩個閥門 瀏覽:213
自動排污泵控制裝置的研究 瀏覽:883
國產調心軸承外徑怎麼計算 瀏覽:321