STM32F103RCT6之超聲波測距(HC-SR04)測試
涉及到的東西: 單片機stm32f103rct6、 hc-sr04超聲波測距模塊、串口輸出設備
之前買的測距,今天終於弄好了,首先是介紹HC-SR04
引腳連線:
引腳 | 連接 |
---|---|
VCC | 5V |
GND | 負極 |
Echo | 接收端(PA0) |
Trig | 觸發端(PA1) |
Trig觸發端,是爲了觸發超聲波測距工作的引腳
Echo接收信號端:超聲波返回到單片機一個高電平,而我們就是通過高電平持續的時間計算距離。
原理:
(1)採用 IO 觸發測距,給至少 10us 的高電平信號;
(2)模塊自動發送 8 個 40khz 的方波,自動檢測是否有信號返回;
(3)有信號返回,通過 IO 輸出一高電平,高電平持續的時間就是
(4)超聲波從發射到返回的時間.測試距離=(高電平時間*聲速(340M/S))/2;
以上是超聲波的手冊,可以在網上自行查找 我這裏主要是講我寫代碼的測試的過程。
公式很重要:測試距離=(高電平時間*聲速(340M/S))/2;
開始正題
1.首先我們應該觸發塊:
Trig設置高電平時間至少 10us
下面展示一些 內聯代碼片
。
// PA1是觸發端
void hcsr04_init()
{
GPIOA->ODR |= GPIO_ODR_ODR1;
delay_us(20);//延時20us
GPIOA->ODR &=~ GPIO_ODR_ODR1;
}
2.然後我們進行下一步------接收信號判斷延時
此過程我遇到很多問題,用了很多辦法,輸入捕獲還不熟,最後使用的是外部觸發中斷完成的判斷高電平時間。
以下重點!!!仔細閱讀
思路: 當引腳PA0接收到信號後,就進入中斷函數,然後判斷,如果是高電平定時器計時,低電平暫停計時並且跟新計時器的CNT。這樣只要是進入高點平,就會開啓計時器計時,高電平結束進入低電平,停止計時,講CNT內容獲取,最終通過公式計算出距離。
下面展示 中斷函數
。
// TIM2計時,中斷是Echo PA0
int a = 0;
if(GPIOA->IDR& GPIO_IDR_IDR0)
{
TIM2->CR1 |= TIM_CR1_CEN;//開始計時
}
else
{
TIM2->CR1 &=~ TIM_CR1_CEN; //停止
TIM2->EGR = TIM_EGR_UG;
b= TIM2->CNT;//賦值
b=b*170/10000;//公式
printf("%dcm ",b);
for(int i = 0; i < 3000000; i++);
}
EXTI->PR = EXTI_PR_PR0;
注:我在公式中用時間us計算的,因爲我再TIM2配置的時間是us計算,公式340m/s。所以需要換算單位。
最後成功:(我的有小許誤差,後續修改,此爲測試階段)
(代碼工程後續上傳,如果您覺得有用就點個‘贊’吧!!!)
2020.3.30:工程地址
關注微信公衆號獲取工程“MeiXiangDao2020” 回覆:超聲波測距