導航:首頁 > 製冷設備 > 超聲波時序圖怎麼畫

超聲波時序圖怎麼畫

發布時間:2023-12-14 17:42:21

⑴ 基於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)的開發,到時候,我們的界面就會變得比較美觀了。敬請期待~

閱讀全文

與超聲波時序圖怎麼畫相關的資料

熱點內容
儀表空氣管道一般用什麼閥門 瀏覽:677
南湖五金大市場怎麼樣 瀏覽:821
常州市躍達電動工具有限公司怎麼樣 瀏覽:372
小型空調掛脖子是用什麼製冷劑 瀏覽:103
工業激光設備用在哪些行業 瀏覽:606
天津工業大學機械工程多少分 瀏覽:308
閥門用什麼銅 瀏覽:270
銅都閥門廠工資待遇 瀏覽:974
貴州有什麼機械廠 瀏覽:347
山東德州五金市場最近的 瀏覽:116
汽車萬向傳動裝置的組成答案 瀏覽:37
分離軸承沒有裝好會出現什麼現象 瀏覽:465
給排水中閥門怎麼選擇 瀏覽:587
怎麼查qq最近登陸的設備 瀏覽:745
在哪裡考光電儀器操作證書是什麼 瀏覽:37
減肥用什麼儀器較好 瀏覽:897
哪個設備實現aaa物聯網客戶 瀏覽:719
酸性介質採用什麼材質的閥門 瀏覽:530
鋁合金鑄造機怎麼賣 瀏覽:390
中北大學機械多少分 瀏覽:824