原创
基于STM32F411RE的cm级超声波测距系统及代码
本项目通过HC-SR04超声波传感器和STM32F411开发板,以精确到cm的精度测量目标物体的距离。项目BOM表如下:
其中,HC-SR04超声波传感器可以0.3cm精度读取2-400cm范围距离,而且超声波发射器和接收器组合在一起,适合大多数个人爱好项目。主要性能包括:
当传感器接收到一个触发信号,就发出一个40KHz突发信号。该信号通过空气传播,在撞到目标物体后返回传感器,再由传感器根据一定算法得出被测物体的距离。
HC-SR04传感器与STM32的连接电路比较简单,传感器Vcc与STM32板的5V连接,两个板子的GND引脚连接,传感器的Trig 引脚与开发板的A0 (PA0) 连接,echo引脚与开发板的A1 (PA1)引脚连接。
按照上述电路图连接妥当后,将以下代码上传到Arduino IDE。
#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)
//prototypes of the used function
void delaymS(uint32_t ms);
void delayuS(uint32_t us);
uint32_t read_echo(uint32_t timeout);
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*/
Trig_low; //turn off trig
Trig_high; //turn on trig
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
while(!(SysTick->CTRL &0x10000)){}
void delayuS(uint32_t us) //delay for certain amount in microseconds
while(!(TIM1->SR & 1)){} /*wait for UIF set*/
uint32_t read_echo(uint32_t timeout)
while(!((GPIOA->IDR)&GPIO_IDR_ID1)){duration++;delayuS(1);
if(duration>timeout){return 0;}
while((GPIOA->IDR&GPIO_IDR_ID1)){duration++;delayuS(1);if(duration>timeout){return 0;} }
如果一切正常,就可以开始测量物体的距离了,可通过serial monitor观测结果。如果为了方便携带,也可连接OLED之类的显示器件。
作者: 硬之城Allchips, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3975615.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论