超声波避障小车 STM32 程序
时间: 2023-09-13 17:14:02 浏览: 64
以下是基于STM32的超声波避障小车程序。本程序使用了HC-SR04超声波模块进行测距,并通过L298N电机驱动模块控制小车的运动。
```
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#define TRIG GPIO_Pin_0 //超声波模块控制引脚
#define ECHO GPIO_Pin_1 //超声波模块回传引脚
void TIM2_Init(void) //初始化TIM2
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 999; //计数器周期为1000
TIM_TimeBaseStructure.TIM_Prescaler = 71; //预分频器为72
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
}
void GPIO_Init(void) //初始化GPIO
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void L298N_Init(void) //初始化L298N电机驱动模块
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void delay_us(uint32_t us) //延时函数,单位为微秒
{
while (us--)
{
int i = 10;
while (i--)
;
}
}
void HC_SR04_Start(void) //启动超声波模块测距
{
GPIO_SetBits(GPIOA, TRIG); //发出一个高电平脉冲
delay_us(10);
GPIO_ResetBits(GPIOA, TRIG);
}
float HC_SR04_GetDistance(void) //获取超声波测距结果,单位为厘米
{
TIM2->CNT = 0; //计数器清零
while (!GPIO_ReadInputDataBit(GPIOA, ECHO)) //等待超声波模块回传引脚变高电平
;
TIM_Cmd(TIM2, ENABLE); //启动计数器
while (GPIO_ReadInputDataBit(GPIOA, ECHO)) //等待超声波模块回传引脚变低电平
;
float distance = TIM2->CNT / 58.0f; //计算距离,单位为厘米
TIM_Cmd(TIM2, DISABLE); //关闭计数器
return distance;
}
int main(void)
{
float distance;
USART1_Init(); //初始化串口
TIM2_Init(); //初始化计数器
GPIO_Init(); //初始化GPIO
L298N_Init(); //初始化L298N电机驱动模块
while (1)
{
HC_SR04_Start(); //启动超声波模块测距
distance = HC_SR04_GetDistance(); //获取距离
printf("Distance: %.2f cm\r\n", distance); //输出距离
if (distance < 30) //如果距离小于30厘米,后退
{
GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); //右轮后退
GPIO_ResetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11); //左轮后退
}
else //否则前进
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); //右轮前进
GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11); //左轮前进
}
}
}
```
注意:本程序是一个简单的示例程序,仅供参考。在实际项目中,需要根据具体需求进行修改和完善。