1. 程式人生 > >玩轉X-CTR100 l HC-SR04超聲波測距

玩轉X-CTR100 l HC-SR04超聲波測距

style eas 測量 方式 config abi 工作原理 主程序 prior

技術分享圖片

我造輪子,你造車,創客一起造起來!更多塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

技術分享圖片

超聲波測距模塊HC-SR04可以測量2cm~400cm的距離,本文使用X-CTR100控制器定時器進行超聲波距離測量。

原理

HC-SR04超聲波測距模塊可提供 2cm-400cm的非接觸式距離感測功能,測距精度可達高到 3mm;模塊包括超聲波發射器、接收器與控制電路。

基本工作原理:

(1)采用IO 口TRIG 觸發測距,給最少10us 的高電平信呈。

(2)模塊自動發送8 個40khz 的方波,自動檢測是否有信號返回;

(3)有信號返回,通過IO 口ECHO 輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2;

如下圖接線,VCC 供5V電源, GND 為地線,TRIG 觸發控制信號輸入,ECHO 回響信號輸出等四個接口端。

技術分享圖片

技術分享圖片

超聲波時序圖

技術分享圖片

以上時序圖表明你只需要提供一個10uS 以上脈沖觸發信號,該模塊內部將發出8 個40kHz 周期電平並檢測回波。一旦檢測到有回波信號則輸出回響信號。

回響信號的脈沖寬度與所測的距離成正比。由此通過發射信號到收到的回響信號時間間隔可以計算得到距離。

公式:uS/58=厘米或者uS/148=英寸;或是:距離=高電平時間*聲速(340M/S)/2;建議測量周期為60ms 以上,以防止發射信號對回響信號的影響

1、此模塊不宜帶電連接,若要帶電連接,則先讓模塊的 GND端先連接,否則會影響模塊的正常工作。

2、測距時,被測物體的面積不少於 0.5平方米且平面盡量要求平整,否則影響測量的結果。

例程

本例程實現X-CTR100控制器測量超聲波距離,並通過串口顯示。

硬件說明

硬件資源:

  • 串口UART1
  • LH接口(作為普通IO使用)
  • HC-SR04超聲波測距模塊(需自備)

硬件連接:

超聲波模塊連接LH接口,需要4根杜邦線,連接如下。

GND——GND

VCC——5V(紅色),

Trig——D0

Echo——D1

軟件生態

X-SOFT軟件生態,X-API擴展文件如下。

ax_sr04.c——HC-SR04超聲波測距源文件

ax_sr04.h——HC-SR04超聲波測距頭文件

測量方式采用邊沿中斷觸發,Echo上升沿啟動定時器,下降沿獲取定時器值作為測量值,代碼如下。

void EXTI1_IRQHandler(void)

{

//確認是否產生了EXTI Line中斷

if (EXTI_GetITStatus(EXTI_Line1) != RESET)

{

if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_1) != 0) // 高電平回波

{

TIM_Cmd(TIM7, ENABLE);

}

else

{

TIM_Cmd(TIM7, DISABLE);

sr04_measurement = TIM_GetCounter(TIM7);

TIM_SetCounter(TIM7, 0);

}

}

//清除中斷標誌位

EXTI_ClearITPendingBit(EXTI_Line1);

}

定時器周期為1us,sr04_measurement為測量時間值,與距離正比,通過多次實際測量值求得系數。

距離 = sr04_measurement*0.173-4.51 ,模型一次函數,多次實際測量後求得系數,經過實測,測量結果準確。

技術分享圖片

接口函數

void AX_SR04_Init(void); //SR04超聲波測距初始化

void AX_SR04_StartRanging(void); //SR04啟動測量

uint32_t AX_SR04_GetDistance(void); //SR04獲取距離值

軟件說明

每隔500ms測量一次,循環測量,結果通過串口顯示,主程序如下。

int main(void)

{

uint32_t temp;

//X-CTR100初始化

AX_Init(115200);

printf("***X-CTR100 SR04超聲波測距例程***\r\n\r\n");

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置中斷優先級分組

//SR04初始化

AX_SR04_Init();

while (1)

{

//啟動測量

AX_SR04_StartRanging();

AX_Delayms(500);

//獲取距離值

temp = AX_SR04_GetDistance();

printf("當前距離:%d MM \r\n", temp);

}

}

實現效果

測量結果顯示如下,與實際距離對比,誤差小於1CM。當然超聲波的傳播速度與溫度有關系,如需獲得更準確距離,需要進行溫度補償,尤其是遠距離測距。

技術分享圖片

玩轉X-CTR100 l HC-SR04超聲波測距