基于stm32f103c8的红外线避障小车
时间: 2023-05-14 12:00:32 浏览: 175
基于STM32F103C8的红外线避障小车是一种智能小车,它可以通过红外线传感器感知周围环境,避免与障碍物发生碰撞。该车使用STM32F103C8作为主控芯片,进行车辆的控制和信号处理。同时,红外线传感器可以实时感知车辆周围的障碍物。
在小车设计中,要考虑不同场景下的避障需求,使用适当的红外线传感器、电机、驱动器等模块,在使车体尽可能小巧的前提下实现车体的操作。在系统中,除了红外线传感器外,还可以利用其它传感器进行监测车体的姿态,通过PID算法进行稳定的反馈控制,实现运动的平稳性和精度。
在软件部分,通过C语言编写控制程序,实现红外线传感器数据的获取和处理,对车体进行控制。程序需充分优化,尽量减少CPU占用率,使小车能够更快、更准确地反应和响应环境变化。
总之,基于STM32F103C8的红外线避障小车结合了硬件与软件技术,在工业制造、学术教育等领域具有广泛的应用前景。
相关问题
stm32f103c8t6红外线避障寻迹小车代码
```c
// 引脚定义
#define IN1 PA0
#define IN2 PA1
#define IN3 PA2
#define IN4 PA3
#define LSA PA4
#define LSB PA5
#define LSC PA6
#define ENA PA7
#define ENB PB0
#define IR PA8
// 红外避障函数
void IR_avoidance()
{
if (GPIO_ReadInputDataBit(GPIOA, IR) == 0) // 红外检测到障碍物
{
TIM_SetCompare1(TIM3, 0); // 左轮停止
TIM_SetCompare2(TIM3, 0); // 右轮停止
delay_ms(500); // 停顿0.5秒
TIM_SetCompare1(TIM3, 500); // 左轮前进
TIM_SetCompare2(TIM3, 500); // 右轮前进
delay_ms(1000); // 前进1秒
TIM_SetCompare1(TIM3, 0); // 左轮停止
TIM_SetCompare2(TIM3, 0); // 右轮停止
delay_ms(500); // 停顿0.5秒
TIM_SetCompare1(TIM3, 500); // 左轮后退
TIM_SetCompare2(TIM3, 500); // 右轮后退
delay_ms(1000); // 后退1秒
TIM_SetCompare1(TIM3, 0); // 左轮停止
TIM_SetCompare2(TIM3, 0); // 右轮停止
delay_ms(500); // 停顿0.5秒
TIM_SetCompare1(TIM3, 500); // 左轮后退
TIM_SetCompare2(TIM3, 0); // 右轮前进
delay_ms(1000); // 左转1秒
}
}
// 红外寻迹函数
void IR_tracking()
{
if (GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 0) // 左偏
{
TIM_SetCompare1(TIM3, 500); // 左轮前进
TIM_SetCompare2(TIM3, 0); // 右轮停止
}
else if (GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 1) // 左偏
{
TIM_SetCompare1(TIM3, 500); // 左轮前进
TIM_SetCompare2(TIM3, 200); // 右轮前进
}
else if (GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 1 && GPIO_ReadInputDataBit(GPIOA, LSC) == 0) // 直行
{
TIM_SetCompare1(TIM3, 500); // 左轮前进
TIM_SetCompare2(TIM3, 500); // 右轮前进
}
else if (GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 1 && GPIO_ReadInputDataBit(GPIOA, LSC) == 1) // 直行
{
TIM_SetCompare1(TIM3, 500); // 左轮前进
TIM_SetCompare2(TIM3, 500); // 右轮前进
}
else if (GPIO_ReadInputDataBit(GPIOA, LSA) == 1 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 0) // 右偏
{
TIM_SetCompare1(TIM3, 0); // 左轮停止
TIM_SetCompare2(TIM3, 500); // 右轮前进
}
else if (GPIO_ReadInputDataBit(GPIOA, LSA) == 1 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 1) // 右偏
{
TIM_SetCompare1(TIM3, 200); // 左轮前进
TIM_SetCompare2(TIM3, 500); // 右轮前进
}
}
int main()
{
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = IN1 | IN2 | IN3 | IN4 | LSA | LSB | LSC | ENA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ENB;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = IR;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
while (1)
{
IR_avoidance(); // 红外避障
IR_tracking(); // 红外寻迹
}
}
```
--相关问题--:
1. 如何调试stm32f103c8t6红外线避障寻迹小
stm32f103c8t6避障小车
### STM32F103C8T6 单片机实现避障小车教程
#### 一、硬件准备
为了构建基于STM32F103C8T6的避障小车,需准备好如下材料[^1]:
- **核心控制板**:STM32F103C8T6最小系统开发板。
- **传感器模块**:超声波测距模块HC-SR04用于检测前方障碍物距离;红外线循迹传感器阵列帮助识别地面轨迹。
- **驱动部分**:L298N电机驱动器负责接收来自MCU指令并据此调整直流减速马达转速方向。
#### 二、软件环境搭建
安装必要的编程工具链来支持对STM32系列微控制器的应用程序编写与调试工作。推荐采用Keil MDK作为集成开发平台,并通过ST-LINK仿真下载器完成固件烧录操作。
#### 三、初始化设置
在项目启动之初,应当先配置好时钟源及时序参数,确保定时器能够正常运作以满足后续功能需求。此外还需开启相应外设接口(如USART串口通信),以便日后与其他设备交换数据信息。
#### 四、编码逻辑设计
针对本案例中的具体应用场景——即让机器人具备自主导航能力的同时避开路径上的静态物体,则主要涉及以下几个方面的工作内容:
- **信号采集处理**
- 利用ADC转换电路读取由各类型感知元件所反馈回来的数据值;
- 对获取到的结果实施滤波运算消除噪声干扰因素影响精度水平。
- **决策判断机制**
- 当探测范围内存在目标实体时触发紧急制动措施停止前进动作;
- 若两侧均无障碍则沿直线行驶继续前行直至遇到新的情况变化为止。
- **运动执行机构调控**
- 根据当前状态改变PWM脉宽调制占空比从而精确控制两轮差速转动速度大小关系达成转弯效果。
```c
// 示例代码片段展示如何利用TIM2定时中断服务函数周期性查询USONIC_ECHO引脚电平高低状况进而计算出实际测量所得的距离数值
void TIM2_IRQHandler(void){
if(TIM_GetITStatus(TIM2, TIM_IT_Update)){
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
GPIO_InitTypeDef GPIO_InitStructure;
uint16_t usonic_value=0;
/* Trig端子发送至少持续10us以上的高电平 */
GPIO_SetBits(GPIOA, USONIC_TRIG);
delay_us(15);
GPIO_ResetBits(GPIOA, USONIC_TRIG);
while(!GPIO_ReadInputDataBit(GPIOA, USONIC_ECHO));//等待ECHO变为低电平
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭滴答计数器
SysTick->VAL = 0x00;//清零重装载寄存器
SysTick->LOAD=(SystemCoreClock/1000)-1 ;//设定时间间隔为1ms
SysTick->CTRL|= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk ;
while(GPIO_ReadInputDataBit(GPIOA, USONIC_ECHO)){//当ECHO为高电平时进入循环
usonic_value++;
delay_ms(1);
if(usonic_value>57)//最大量程约为5米对应约57*10cm
break;
}
distance_cm=usonic_value*10;
}
}
```
阅读全文