本项目通过HC-SR04超声波传感器和STM32F411开发板,以精确到cm的精度测量目标物体的距离。
STM32F411RE开发板 x1
HC-SR04超声波传感器 x1
跳线 若干
其中,HC-SR04超声波传感器可以0.3cm精度读取2-400cm范围距离,而且超声波发射器和接收器组合在一起,适合大多数个人爱好项目。主要性能包括:
工作电源:5VDC
工作电流:15mA
工作频率:40KHz
最大距离:4m
最小距离:2cm
测量角度:15度
分辨率:0.3cm
触发输入信号:10uS TTL脉冲
回升输出信号:TTL脉冲,与测量成距离成正比
当传感器接收到一个触发信号,就发出一个40KHz突发信号。该信号通过空气传播,在撞到目标物体后返回传感器,再由传感器根据一定算法得出被测物体的距离。
HC-SR04传感器与STM32的连接电路比较简单,传感器Vcc与STM32板的5V连接,两个板子的GND引脚连接,传感器的Trig 引脚与开发板的A0 (PA0) 连接,echo引脚与开发板的A1 (PA1)引脚连接。
按照上述电路图连接妥当后,将以下代码上传到Arduino IDE。
#include "stm32f4xx.h"
// Device header
//macros for trigger pin
#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;
}
如果一切正常,就可以开始测量物体的距离了,可通过serial monitor观测结果。如果为了方便携带,也可连接OLED之类的显示器件。
相关文章