写一个基于stm32使用hc-sr04
时间: 2024-05-13 12:17:44 浏览: 103
基于stm32的HC-SR04超声波测距模块使用
5星 · 资源好评率100%
HC-SR04是一款常见的超声波测距模块,用于测量物体与传感器之间的距离。下面是一个基于STM32使用HC-SR04测距模块的示例代码:
```c
#include "stm32f4xx.h"
#define TRIG_PIN GPIO_Pin_0
#define ECHO_PIN GPIO_Pin_1
#define TRIG_PORT GPIOA
#define ECHO_PORT GPIOA
void delay_us(uint32_t us)
{
uint32_t i;
for (i = 0; i < us * 4; i++);
}
void HC_SR04_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(ECHO_PORT, &GPIO_InitStructure);
}
float HC_SR04_GetDistance(void)
{
uint32_t time_start, time_end;
float distance;
GPIO_SetBits(TRIG_PORT, TRIG_PIN);
delay_us(10);
GPIO_ResetBits(TRIG_PORT, TRIG_PIN);
while (GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == RESET);
time_start = TIM2->CNT;
while (GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == SET);
time_end = TIM2->CNT;
distance = (float)(time_end - time_start) / (float)58.0;
return distance;
}
int main(void)
{
float distance;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Prescaler = 84 - 1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 0xFFFFFFFF;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
HC_SR04_Init();
while (1)
{
distance = HC_SR04_GetDistance();
// 处理距离数据,例如通过串口发送到电脑上显示
}
}
```
这段代码实现了HC-SR04的初始化和获取距离的函数。其中,delay_us()函数用于实现微秒级的延时,HC_SR04_Init()函数用于初始化GPIO口,HC_SR04_GetDistance()函数用于获取距离数据。
需要注意的是,由于HC-SR04模块的测距范围在2cm-400cm之间,距离数据类型为浮点数,因此需要使用浮点数运算库(如math.h)来处理距离数据。同时,由于STM32的定时器是计数器,需要根据芯片型号和时钟频率来计算计数器频率和定时器分频系数。上述代码中使用的是STM32F407芯片,时钟频率为84MHz,定时器2的计数器频率为84MHz,定时器分频系数为1。
阅读全文