本項(xiàng)目通過HC-SR04超聲波傳感器和STM32F411開發(fā)板,以精確到cm的精度測(cè)量目標(biāo)物體的距離。項(xiàng)目BOM表如下:
STM32F411RE開發(fā)板 x1
HC-SR04超聲波傳感器 x1
跳線 若干
其中,HC-SR04超聲波傳感器可以0.3cm精度讀取2-400cm范圍距離,而且超聲波發(fā)射器和接收器組合在一起,適合大多數(shù)個(gè)人愛好項(xiàng)目。主要性能包括:
工作電流:15mA
工作頻率:40KHz
最大距離:4m
最小距離:2cm
測(cè)量角度:15度
分辨率:0.3cm
觸發(fā)輸入信號(hào):10uS TTL脈沖
回升輸出信號(hào):TTL脈沖,與測(cè)量成距離成正比
?
當(dāng)傳感器接收到一個(gè)觸發(fā)信號(hào),就發(fā)出一個(gè)40KHz突發(fā)信號(hào)。該信號(hào)通過空氣傳播,在撞到目標(biāo)物體后返回傳感器,再由傳感器根據(jù)一定算法得出被測(cè)物體的距離。
HC-SR04傳感器與STM32的連接電路比較簡(jiǎn)單,傳感器Vcc與STM32板的5V連接,兩個(gè)板子的GND引腳連接,傳感器的Trig 引腳與開發(fā)板的A0 (PA0) 連接,echo引腳與開發(fā)板的A1 (PA1)引腳連接。
按照上述電路圖連接妥當(dāng)后,將以下代碼上傳到Arduino IDE。
#include "stm32f4xx.h"
// Device header
#define Trig_high GPIOA->BSRR=GPIO_BSRR_BS_0 // turn on PA0 (trig pin)
#define Trig_low GPIOA->BSRR=GPIO_BSRR_BR_0 // turn off PA0 (trig pin)
?
uint32_t duration;
float distance;
//prototypes of the used function
void delaymS(uint32_t ms);
void delayuS(uint32_t us);
uint32_t read_echo(uint32_t timeout);
?
int main(void)
?
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //enable GPIOA Clock
GPIOA->MODER |= (1<<0); //set PA0 to Output
//configure Timer1 to generate micorseconds delay
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; /*Enable TIM3 clock*/
TIM1->PSC = 16 -1; /* 16 000 000 /16 = 1000 000*/
TIM1->ARR = 1; /* 1000 000 /1 = 1000000*/
TIM1->CNT =0;
TIM1->CR1 =1;
while(1)
{
Trig_low; //turn off trig
delayuS(10); //wait 4uS
Trig_high; //turn on trig
delayuS(10);
Trig_low;
duration=read_echo(400000); //measure the time of echo pin
distance=duration/58; //distance=duration/2*SOUND_SPEED
delaymS(1000); //delay for 1 second between each read
}
?
}
?
void delaymS(uint32_t ms) //delay for certain amount in milliseconds
{
SysTick->LOAD=16000-1;
SysTick->VAL=0;
SysTick->CTRL=0x5;
for (int i=0;i;i++)<>
{
while(!(SysTick->CTRL &0x10000)){}
}
SysTick->CTRL=0;
}
void delayuS(uint32_t us) //delay for certain amount in microseconds
{
for(int i =0;i;i++){<>
while(!(TIM1->SR & 1)){} /*wait for UIF set*/
TIM1->SR &= ~1;
}
}
uint32_t read_echo(uint32_t timeout)
{
uint32_t duration;
while(!((GPIOA->IDR)&GPIO_IDR_ID1)){duration++;delayuS(1);
if(duration>timeout){return 0;}
}
duration=0;
while((GPIOA->IDR&GPIO_IDR_ID1)){duration++;delayuS(1);if(duration>timeout){return 0;} }
return duration;
}
如果一切正常,就可以開始測(cè)量物體的距離了,可通過serial monitor觀測(cè)結(jié)果。如果為了方便攜帶,也可連接OLED之類的顯示器件。
-
超聲波
+關(guān)注
關(guān)注
63文章
2991瀏覽量
138247 -
DIY
+關(guān)注
關(guān)注
176文章
886瀏覽量
348279 -
激光雷達(dá)
+關(guān)注
關(guān)注
967文章
3943瀏覽量
189622 -
LIDAR
+關(guān)注
關(guān)注
10文章
323瀏覽量
29363
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論