RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于CW32模塊的SR04超聲波測(cè)距傳感器設(shè)計(jì)

jf_qE49KoVBr8 ? 來(lái)源:武漢芯源半導(dǎo)體 ? 2024-11-12 11:19 ? 次閱讀

01 模塊來(lái)源

模塊實(shí)物展示:

e8ef7c16-a09e-11ef-93f3-92fbcf53809c.png

02 規(guī)格參數(shù)

工作電壓:3-5.5V

工作電流:5.3MA

感應(yīng)角度:小于15度

探測(cè)距離:2CM-600CM

探測(cè)精度:0.1CM+1%

輸出方式: GPIO

管腳數(shù)量:4 Pin

以上信息見(jiàn)廠家資料文件

03 移植過(guò)程

我們的目標(biāo)是將例程移植至CW32F030C8T6開(kāi)發(fā)板上【能夠判斷前方障礙物距離的功能】。首先要獲取資料,查看數(shù)據(jù)手冊(cè)應(yīng)如何實(shí)現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。

3.1 查看資料

e9127d38-a09e-11ef-93f3-92fbcf53809c.png

只需要在 Trig 管腳(觸發(fā)信號(hào))輸入一個(gè) 10US 以上的高電平,系統(tǒng)便可發(fā)出 8 個(gè) 40KHZ 的超聲波脈沖,然后檢測(cè)回波信號(hào)。當(dāng)檢測(cè)到回波信號(hào)后,通過(guò) Echo 管腳輸出。根據(jù) Echo 管腳輸出高電平的持續(xù)時(shí)間可以計(jì)算距離值。即距離值為:(高電平時(shí)間*340m/s)/2。

??當(dāng)測(cè)量距離超過(guò) HC-SR04 的測(cè)量范圍時(shí),仍會(huì)通過(guò) Echo管腳輸出高電平的信號(hào),高電平的寬度約為 66ms。如圖所示:

e925fc5a-a09e-11ef-93f3-92fbcf53809c.png

測(cè)量周期:當(dāng)接收到 HC-SR04 通過(guò) Echo 管腳輸出的高電平脈沖后,便可進(jìn)行下一次測(cè)量,所以測(cè)量周期取決于測(cè)量距離,當(dāng)距離被測(cè)物體很近時(shí),Echo 返回的脈沖寬度較窄,測(cè)量周期 就很短;當(dāng)距離被測(cè)物體比較遠(yuǎn)時(shí),Echo 返回的脈沖寬度較寬,測(cè)量周期也就相應(yīng)的變長(zhǎng)。最壞情況下,被測(cè)物體超出超聲波模塊的測(cè)量范圍,此時(shí) 返回的脈沖寬度最長(zhǎng),約為 66ms,所以最壞情況下的測(cè)量周期稍大于 66ms 即可(取 70ms 足夠)。

3.2 引腳選擇

e92d60f8-a09e-11ef-93f3-92fbcf53809c.png

接線(xiàn)表

3.3 移植至工程

工程模板參考入門(mén)手冊(cè)的工程模板

移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_ultrasonic.c與bsp_ultrasonic.h。這里不再過(guò)多講述,移植完成后面修改相關(guān)代碼。

在文件bsp_ultrasonic.c中,編寫(xiě)如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */


#include "bsp_ultrasonic.h"




unsigned char msHcCount = 0;//ms計(jì)數(shù)
float distance = 0;


/******************************************************************
 * 函 數(shù) 名 稱(chēng):bsp_ultrasonic
 * 函 數(shù) 說(shuō) 明:超聲波初始化
 * 函 數(shù) 形 參:無(wú)
 * 函 數(shù) 返 回:無(wú)
 * 作       者:LC
 * 備       注:TRIG引腳負(fù)責(zé)發(fā)送超聲波脈沖串
******************************************************************/
void Ultrasonic_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct; // 定時(shí)器基本初始化結(jié)構(gòu)體


        RCC_SR04_ENABLE();        // 使能GPIO時(shí)鐘
        RCC_TIMER_ENABLE(); // 使能定時(shí)器時(shí)鐘


        // GPIO配置參數(shù)
        GPIO_InitStructure.Pins = GPIO_TRIG;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出
        GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;


        GPIO_Init(PORT_SR04, &GPIO_InitStructure);




        GPIO_InitStructure.Pins = GPIO_ECHO;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入


        GPIO_Init(PORT_SR04, &GPIO_InitStructure);


        // 禁止中斷,以安全地配置NVIC
        __disable_irq();


        // 開(kāi)啟BTIM1中斷,并關(guān)聯(lián)到NVIC
        NVIC_EnableIRQ(TIMER_IRQ);


        // 允許中斷,恢復(fù)中斷狀態(tài)
        __enable_irq();


        // 配置定時(shí)器模式、周期和預(yù)分頻器
        BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER; // 設(shè)置為定時(shí)器模式
        BTIM_TimeBaseInitStruct.BTIM_Period = 1000 - 1;   // 設(shè)置周期,使得定時(shí)器每1ms產(chǎn)生一次溢出中斷
        BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV64; // 預(yù)分頻器設(shè)置為64,以降低時(shí)鐘頻率


    // 使用上述配置初始化定時(shí)器BTIM1
        BTIM_TimeBaseInit(PORT_TIMER, &BTIM_TimeBaseInitStruct);


        // 使能BTIM1的溢出中斷
        BTIM_ITConfig(PORT_TIMER, BTIM_IT_OV, ENABLE);


//        // 啟動(dòng)定時(shí)器BTIM1
//        BTIM_Cmd(PORT_TIMER, ENABLE);




}
/******************************************************************
 * 函 數(shù) 名 稱(chēng):Open_Timer
 * 函 數(shù) 說(shuō) 明:打開(kāi)定時(shí)器
 * 函 數(shù) 形 參:無(wú)
 * 函 數(shù) 返 回:無(wú)
 * 作       者:LC
 * 備       注:
******************************************************************/
void Open_Timer(void)
{
    BTIM_SetCounter(PORT_TIMER, 0);   // 清除定時(shí)器計(jì)數(shù)


    msHcCount = 0;


    BTIM_Cmd(PORT_TIMER, ENABLE);   // 使能定時(shí)器
}


/******************************************************************
 * 函 數(shù) 名 稱(chēng):Get_TIMER_Count
 * 函 數(shù) 說(shuō) 明:獲取定時(shí)器定時(shí)時(shí)間
 * 函 數(shù) 形 參:無(wú)
 * 函 數(shù) 返 回:數(shù)據(jù)
 * 作       者:LC
 * 備       注:
******************************************************************/
uint32_t Get_TIMER_Count(void)
{
    uint32_t time  = 0;
    time   = msHcCount*1000;              // 得到us
    time  += BTIM_GetCounter(PORT_TIMER); // 得到ms


    BTIM_SetCounter(PORT_TIMER, 0);   // 清除定時(shí)器計(jì)數(shù)
    delay_ms(10);
    return time ;
}


/******************************************************************
 * 函 數(shù) 名 稱(chēng):Close_Timer
 * 函 數(shù) 說(shuō) 明:關(guān)閉定時(shí)器
 * 函 數(shù) 形 參:無(wú)
 * 函 數(shù) 返 回:無(wú)
 * 作       者:LC
 * 備       注:
******************************************************************/
void Close_Timer(void)
{
        BTIM_Cmd(PORT_TIMER, DISABLE);   // 關(guān)閉定時(shí)器
}


/******************************************************************
 * 函 數(shù) 名 稱(chēng):TIMER_IRQHandler
 * 函 數(shù) 說(shuō) 明:定時(shí)器中斷服務(wù)函數(shù)
 * 函 數(shù) 形 參:無(wú)
 * 函 數(shù) 返 回:無(wú)
 * 作       者:LC
 * 備       注:1ms進(jìn)入一次
******************************************************************/
void TIMER_IRQHandler(void)
{
    if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))   // 檢查定時(shí)器中斷發(fā)生
    {
                msHcCount++;


        BTIM_ClearITPendingBit(PORT_TIMER, BTIM_IT_OV);  // 清除中斷標(biāo)志
    }
}




/******************************************************************
 * 函 數(shù) 名 稱(chēng):Hcsr04GetLength
 * 函 數(shù) 說(shuō) 明:獲取測(cè)量距離
 * 函 數(shù) 形 參:無(wú)
 * 函 數(shù) 返 回:測(cè)量距離
 * 作       者:LC
 * 備       注:無(wú)
******************************************************************/
float Hcsr04GetLength(void)
{
        /*測(cè)5次數(shù)據(jù)計(jì)算一次平均值*/
        float length = 0;
        float t = 0;
        float sum = 0;
        unsigned int  i = 0;
        while(i != 10)
        {


                SR04_TRIG(1);//trig拉高信號(hào),發(fā)出高電平
                delay_1us(20);//持續(xù)時(shí)間超過(guò)10us
                SR04_TRIG(0);//trig拉低信號(hào),發(fā)出低電平
                /*Echo發(fā)出信號(hào) 等待回響信號(hào)*/
                /*輸入方波后,模塊會(huì)自動(dòng)發(fā)射8個(gè)40KHz的聲波,與此同時(shí)回波引腳(echo)端的電平會(huì)由0變?yōu)?;
                (此時(shí)應(yīng)該啟動(dòng)定時(shí)器計(jì)時(shí));當(dāng)超聲波返回被模塊接收到時(shí),回波引 腳端的電平會(huì)由1變?yōu)?;
                (此時(shí)應(yīng)該停止定時(shí)器計(jì)數(shù)),定時(shí)器記下的這個(gè)時(shí)間即為
                                                                                超聲波由發(fā)射到返回的總時(shí)長(zhǎng);*/


                while(SR04_ECHO() == GPIO_Pin_RESET);//echo等待回響


                Open_Timer();   //打開(kāi)定時(shí)器


                i++;


                while(SR04_ECHO() == GPIO_Pin_SET);


                Close_Timer();   // 關(guān)閉定時(shí)器


                t = Get_TIMER_Count();   // 獲取時(shí)間,分辨率為1us
                length = (float)t / 58.0f;   // cm
                sum += length;
        }


        length = sum/10;//五次平均值
        distance = length;
        return length;
}

?

在文件bsp_ultrasonic.h中,編寫(xiě)如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */
#ifndef _BSP_ULTRASONIC_H_
#define _BSP_ULTRASONIC_H_


#include "board.h"


#define RCC_SR04_ENABLE()     __RCC_GPIOA_CLK_ENABLE()


#define PORT_SR04             CW_GPIOA


#define GPIO_TRIG             GPIO_PIN_1
#define GPIO_ECHO             GPIO_PIN_2


#define RCC_TIMER_ENABLE()    __RCC_BTIM_CLK_ENABLE()
#define PORT_TIMER            CW_BTIM1


#define TIMER_IRQ             BTIM1_IRQn
#define TIMER_IRQHandler      BTIM1_IRQHandler


#define SR04_TRIG(x)          GPIO_WritePin( PORT_SR04, GPIO_TRIG, x?GPIO_Pin_SET:GPIO_Pin_RESET)
#define SR04_ECHO()           GPIO_ReadPin( PORT_SR04, GPIO_ECHO )


void Ultrasonic_Init(void);//超聲波初始化
float Hcsr04GetLength(void );//獲取超聲波測(cè)距的距離


#endif

?04 移植驗(yàn)證

在自己工程中的main主函數(shù)中,編寫(xiě)如下。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "bsp_ultrasonic.h"


int32_t main(void)
{
    board_init();        // 開(kāi)發(fā)板初始化


    uart1_init(115200);        // 串口1波特率115200


    Ultrasonic_Init();
    printf("Start.......
");


    while(1)
    {
        printf((const char *)"距離為 = %.2fCM
",Hcsr04GetLength() );
        delay_ms(500);
    }
}

移植現(xiàn)象:距離20CM處擺放障礙物,輸出換算后的實(shí)際距離。

e94664fe-a09e-11ef-93f3-92fbcf53809c.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2550

    文章

    51035

    瀏覽量

    753061
  • 超聲波
    +關(guān)注

    關(guān)注

    63

    文章

    3014

    瀏覽量

    138347
  • 測(cè)距傳感器
    +關(guān)注

    關(guān)注

    0

    文章

    75

    瀏覽量

    20207
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    203

    瀏覽量

    626

原文標(biāo)題:【CW32模塊使用】SR04超聲波測(cè)距傳感器

文章出處:【微信號(hào):武漢芯源半導(dǎo)體,微信公眾號(hào):武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    超聲波傳感器HC-SR04測(cè)距實(shí)例軟件

    超聲波傳感器HC-SR04測(cè)距實(shí)例軟件STM32CubeMX,keil5,野火串口調(diào)試助手硬件stm32f103vet6開(kāi)發(fā)板,J-Link,超聲波
    發(fā)表于 07-30 07:03

    HC-SR04超聲波測(cè)距模塊原理

    、HC-SR04超聲波測(cè)距模塊原理1.模塊簡(jiǎn)介HC-SR04
    發(fā)表于 12-06 07:14

    HC-SR04超聲波測(cè)距模塊及程序

    HC-SR04超聲波測(cè)距模塊及程序HC-SR04超聲波測(cè)距
    發(fā)表于 12-08 16:50 ?83次下載

    HC_SR04超聲波測(cè)距模塊資料

    HC_SR04超聲波測(cè)距模塊資料,有程序和原理圖,歡迎下載。
    發(fā)表于 03-18 17:00 ?13次下載

    HC-SR04超聲波測(cè)距資料

    、HC-SR04超聲波測(cè)距資料幫你了解傳感器實(shí)驗(yàn)、使用快速入門(mén),你擁有值得。
    發(fā)表于 05-10 10:36 ?18次下載

    簡(jiǎn)單的超聲波測(cè)距模塊制作_HC-SR04超聲波測(cè)距模塊及制作圖詳解

    本文主要介紹的是HC-SR04超聲波測(cè)距模塊及制作圖詳解,首先介紹了超聲波測(cè)距原理及特點(diǎn),其次闡
    發(fā)表于 05-18 09:40 ?5.4w次閱讀
    簡(jiǎn)單的<b class='flag-5'>超聲波</b><b class='flag-5'>測(cè)距</b><b class='flag-5'>模塊</b>制作_HC-<b class='flag-5'>SR04</b><b class='flag-5'>超聲波</b><b class='flag-5'>測(cè)距</b><b class='flag-5'>模塊</b>及制作圖詳解

    ApmSonar超聲波SR04傳感器固件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是ApmSonar超聲波SR04傳感器固件免費(fèi)下載。
    發(fā)表于 09-25 08:00 ?16次下載

    HC-SR04超聲波傳感器模塊的示例代碼資料合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是HC-SR04超聲波傳感器模塊的示例代碼資料合集包括了:超聲波PIC單片機(jī)C程序,
    發(fā)表于 06-17 08:00 ?9次下載

    HC-SR04超聲波測(cè)距塊講解(附32單片機(jī)源碼)

    、HC-SR04超聲波測(cè)距模塊原理1.模塊簡(jiǎn)介HC-SR04
    發(fā)表于 11-23 18:21 ?133次下載
    HC-<b class='flag-5'>SR04</b><b class='flag-5'>超聲波</b><b class='flag-5'>測(cè)距</b>塊講解(附32單片機(jī)源碼)

    超聲波傳感器HC SR04與Arduino教程

    電子發(fā)燒友網(wǎng)站提供《超聲波傳感器HC SR04與Arduino教程.zip》資料免費(fèi)下載
    發(fā)表于 10-19 10:18 ?0次下載
    <b class='flag-5'>超聲波</b><b class='flag-5'>傳感器</b>HC <b class='flag-5'>SR04</b>與Arduino教程

    使用超聲波傳感器HC SR04和Arduino Uno制作超聲波距離傳感器

    電子發(fā)燒友網(wǎng)站提供《使用超聲波傳感器HC SR04和Arduino Uno制作超聲波距離傳感器.zip》資料免費(fèi)下載
    發(fā)表于 10-31 09:35 ?1次下載
    使用<b class='flag-5'>超聲波</b><b class='flag-5'>傳感器</b>HC <b class='flag-5'>SR04</b>和Arduino Uno制作<b class='flag-5'>超聲波</b>距離<b class='flag-5'>傳感器</b>

    超聲波測(cè)距模塊HC SR04與Arduino連接

    電子發(fā)燒友網(wǎng)站提供《將超聲波測(cè)距模塊HC SR04與Arduino連接.zip》資料免費(fèi)下載
    發(fā)表于 11-11 14:26 ?0次下載
    將<b class='flag-5'>超聲波</b><b class='flag-5'>測(cè)距</b><b class='flag-5'>模塊</b>HC <b class='flag-5'>SR04</b>與Arduino連接

    Arduino HC SR04超聲波距離傳感器

    電子發(fā)燒友網(wǎng)站提供《Arduino HC SR04超聲波距離傳感器.zip》資料免費(fèi)下載
    發(fā)表于 12-22 16:31 ?0次下載
    Arduino HC <b class='flag-5'>SR04</b><b class='flag-5'>超聲波</b>距離<b class='flag-5'>傳感器</b>

    使用HC SR04超聲波傳感器進(jìn)行速度測(cè)量

    電子發(fā)燒友網(wǎng)站提供《使用HC SR04超聲波傳感器進(jìn)行速度測(cè)量.zip》資料免費(fèi)下載
    發(fā)表于 02-07 14:37 ?12次下載
    使用HC <b class='flag-5'>SR04</b><b class='flag-5'>超聲波</b><b class='flag-5'>傳感器</b>進(jìn)行速度測(cè)量

    基于CW32超聲波模塊的應(yīng)用

    C-SR04超聲波模塊是一種常用的測(cè)距模塊,其通過(guò)發(fā)射超聲波并接收其反射信號(hào)來(lái)實(shí)現(xiàn)測(cè)距功能。
    的頭像 發(fā)表于 09-06 09:13 ?974次閱讀
    RM新时代网站-首页