STM32F103C8T6用红外传感器防止从桌面跌落小车
时间: 2025-06-28 21:21:54 浏览: 11
### 使用 STM32F103C8T6 和 红外传感器 实现 小车防跌落 功能
为了实现小车的防跌落功能,可以采用如下方法:
#### 1. 硬件连接
将 A 和 B 两个红外传感器安装在小车底部前端两侧,并使它们稍微向下倾斜。这样可以在接近边缘时提前检测到地面消失的情况。
#### 2. 初始化配置
初始化 GPIO 口用于控制电机驱动以及读取来自红外传感器的状态信号。设置定时器中断来周期性地查询传感器状态并处理相应的动作逻辑。
```c
// 配置GPIO引脚作为输入模式给红外传感器使用
void IR_Sensor_Init(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 假设PA口
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // PA0, PA1 对应IR-A, IR-B
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
#### 3. 主要工作流程
不断监测这两个传感器的数据,在任意一个未能接收到反射光(即未探测到下方有物体)的情况下立即采取措施让车辆停下并向左旋转直至重新获得有效读数为止;如果两者均能正常感应,则继续沿原定路径前进[^1]。
#### 4. PID 控制优化转向精度
对于更精确的方向调整可引入PID控制器,基于当前偏差计算合适的角速度修正量应用于左右轮差速从而保持直线行驶或完成转弯操作而不至于过度偏移预定轨迹之外[^2]。
```c
float pid_compute(float setpoint, float process_varible) {
static float pre_error = 0;
static int integral = 0;
float error = setpoint - process_varible;
integral += error;
float derivative = (error - pre_error);
float output = Kp * error + Ki * integral + Kd * derivative;
pre_error = error;
return output;
}
// 调整参数Kp,Ki,Kd以适应实际环境需求
#define Kp 1.2f
#define Ki 0.05f
#define Kd 0.5f
int main() {
while(1) {
if (!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) || !HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)) {
stop_and_turn_left();
} else {
adjust_direction_with_pid(pid_compute(target_angle, current_angle));
}
delay_ms(10); // 循环间隔时间
}
}
```
通过上述方式能够有效地利用 STM32F103C8T6 单片机配合红外测距模块构建一套简单却实用的小车防坠保护机制。
阅读全文
相关推荐














