stm32f103c8t6超声波避障
时间: 2023-04-25 21:00:51 浏览: 299
STM32F103C8T6超声波避障是一种基于STM32F103C8T6微控制器的超声波避障系统。该系统通过超声波传感器检测前方障碍物的距离,然后根据距离信息控制机器人或车辆的运动,从而实现避障功能。该系统具有精度高、响应速度快、可靠性强等优点,广泛应用于机器人、智能车辆等领域。
相关问题
stm32f103c8t6Tim3超声波避障
以下是使用stm32f103c8t6的TIM3模块实现超声波避障的基本流程:
1. 配置GPIO口,设置超声波模块的控制引脚和回传引脚为输入输出模式;
2. 配置TIM3,设置计数器的时钟频率和计数模式等参数;
3. 开启TIM3定时器;
4. 通过控制引脚向超声波模块发送触发信号,启动一次距离测量;
5. 等待回传引脚输出高电平,开始计时;
6. 等待回传引脚输出低电平,结束计时;
7. 计算距离,并根据距离调整小车行驶方向。
具体的代码实现需要根据具体的硬件电路和超声波模块型号进行调整,以下是一个简单的示例代码:
```
#include "stm32f10x.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)
{
SysTick->LOAD = (us * 72) - 1;
SysTick->VAL = 0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
TIM_Cmd(TIM3, DISABLE);
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStruct.GPIO_Pin = TRIG_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = ECHO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ECHO_PORT, &GPIO_InitStruct);
TIM_InitStruct.TIM_Prescaler = 71; // 时钟频率为72MHz,计数器每1us加1
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period = 0xFFFF;
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
while(1)
{
GPIO_SetBits(TRIG_PORT, TRIG_PIN); // 发送触发信号
delay_us(10);
GPIO_ResetBits(TRIG_PORT, TRIG_PIN);
TIM_SetCounter(TIM3, 0);
TIM_Cmd(TIM3, ENABLE);
while(GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == RESET); // 等待回传引脚输出高电平
TIM_SetCounter(TIM3, 0);
while(GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) != RESET); // 等待回传引脚输出低电平
uint32_t distance = TIM_GetCounter(TIM3) / 58; // 计算距离,单位为厘米
// 根据距离调整小车行驶方向
if(distance < 10)
{
// 倒车避障
}
else if(distance < 30)
{
// 左转避障
}
else if(distance < 50)
{
// 直行
}
else
{
// 右转避障
}
delay_us(200);
}
}
```
stm32f103c8t6智能小车超声波避障
### STM32F103C8T6 智能小车超声波避障实现方案
#### 1. 系统概述
智能小车通过STM32F103C8T6微控制器来控制其运动和感知周围环境。为了实现避障功能,采用HC-SR04超声波传感器检测前方障碍物的距离,并据此调整行驶方向。
#### 2. 硬件连接
- **电源供电**
- STM32F103C8T6开发板需稳定的工作电压输入。
- HC-SR04模块应接到5V电源以确保正常工作[^3]。
- **信号线连接**
- 将HC-SR04的Trig引脚连到STM32的一个GPIO口作为触发端;Echo引脚也接入另一个GPIO用于接收回响脉冲宽度表示距离的信息。
#### 3. 软件编程逻辑
编写程序使MCU定时发出高电平给Trig启动测量周期,在此期间等待并记录下由Echo返回低至高的时间差从而计算目标物体离传感器的实际间距:
```c
#include "stm32f1xx_hal.h"
// 定义使用的IO端口号
#define TRIG_PIN GPIO_PIN_9
#define ECHO_PIN GPIO_PIN_8
#define TRIG_PORT GPIOA
#define ECHO_PORT GPIOB
void Ultrasonic_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置TRIG为推挽输出模式
GPIO_InitStruct.Pin = TRIG_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct);
// 配置ECHO为浮空输入模式
GPIO_InitStruct.Pin = ECHO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ECHO_PORT, &GPIO_InitStruct);
}
float Get_Distance(){
uint32_t start_time,end_time,duration;
float distance;
// 发送10us以上的正脉冲触发测距
HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)==GPIO_PIN_RESET);//等待上升沿到来
start_time=HAL_GetTick(); //记录开始时刻
while(HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)==GPIO_PIN_SET)//等待下降沿到来
end_time=HAL_GetTick(); //记录结束时刻
duration=end_time-start_time; //得到持续时间ms单位转换成cm
distance=(duration*0.034/2)*100; //声音速度取340m/s即0.034cm/us * 100 得厘米数
return distance;
}
```
上述代码实现了基本的超声波测距初始化以及获取当前距离的功能。
#### 4. 控制策略
当检测到前方有障碍物时(设定阈值),停止前进并向左转一定角度重新探测路径直至无障碍为止再继续直行前进。具体转向动作可通过PWM驱动电机完成。
---
阅读全文