无舵机stm32超声波避障小车
时间: 2023-11-13 17:50:04 浏览: 148
这里提供一个基于STM32的超声波避障小车的代码示例,使用的是无舵机方案。
代码实现思路:
1. 初始化超声波模块和电机控制模块
2. 循环执行以下操作:
- 发送超声波信号并获取反射回来的信号
- 根据反射信号计算出前方距离
- 根据距离控制电机运动
- 延时一定时间,再次执行以上操作
代码示例:
```c
#include "stm32f10x.h"
#include "ultrasonic.h"
#include "motor.h"
int main(void)
{
// 初始化超声波模块
Ultrasonic_Init();
// 初始化电机控制模块
Motor_Init();
while (1) {
// 发送超声波信号并获取反射回来的信号
uint32_t distance = Ultrasonic_GetDistance();
// 根据距离控制电机运动
if (distance > 30) {
// 前进
Motor_Forward();
} else {
// 停止
Motor_Stop();
}
// 延时一定时间
delay_ms(50);
}
}
```
其中,超声波模块和电机控制模块的具体实现可以参考以下代码:
超声波模块:
```c
#include "stm32f10x.h"
#include "ultrasonic.h"
void Ultrasonic_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
// 初始化GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化TIM
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InitStruct.TIM_Prescaler = 72 - 1;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period = 0xFFFF;
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0;
TIM_ICInit(TIM2, &TIM_ICInitStruct);
TIM_Cmd(TIM2, ENABLE);
}
uint32_t Ultrasonic_GetDistance(void)
{
uint32_t distance = 0;
// 发送超声波信号
GPIO_SetBits(GPIOA, GPIO_Pin_0);
delay_us(10);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
// 获取反射回来的信号
while (!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));
TIM_SetCounter(TIM2, 0);
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));
distance = TIM_GetCounter(TIM2);
// 计算距离
distance = distance * 17 / 1000;
return distance;
}
```
电机控制模块:
```c
#include "stm32f10x.h"
#include "motor.h"
void Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
// 初始化GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
// 初始化TIM
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_InitStruct.TIM_Prescaler = 72 - 1;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period = 1000 - 1;
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStruct.TIM_Pulse = 0;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC1Init(TIM3, &TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2Init(TIM3, &TIM_OCInitStruct);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC3Init(TIM3, &TIM_OCInitStruct);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC4Init(TIM3, &TIM_OCInitStruct);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
void Motor_Forward(void)
{
TIM_SetCompare1(TIM3, 800); // 左前轮
TIM_SetCompare2(TIM3, 800); // 右前轮
TIM_SetCompare3(TIM3, 0); // 左后轮
TIM_SetCompare4(TIM3, 0); // 右后轮
}
void Motor_Backward(void)
{
TIM_SetCompare1(TIM3, 0); // 左前轮
TIM_SetCompare2(TIM3, 0); // 右前轮
TIM_SetCompare3(TIM3, 800); // 左后轮
TIM_SetCompare4(TIM3, 800); // 右后轮
}
void Motor_Left(void)
{
TIM_SetCompare1(TIM3, 0); // 左前轮
TIM_SetCompare2(TIM3, 800); // 右前轮
TIM_SetCompare3(TIM3, 0); // 左后轮
TIM_SetCompare4(TIM3, 800); // 右后轮
}
void Motor_Right(void)
{
TIM_SetCompare1(TIM3, 800); // 左前轮
TIM_SetCompare2(TIM3, 0); // 右前轮
TIM_SetCompare3(TIM3, 800); // 左后轮
TIM_SetCompare4(TIM3, 0); // 右后轮
}
void Motor_Stop(void)
{
TIM_SetCompare1(TIM3, 0); // 左前轮
TIM_SetCompare2(TIM3, 0); // 右前轮
TIM_SetCompare3(TIM3, 0); // 左后轮
TIM_SetCompare4(TIM3, 0); // 右后轮
}
```