别只盯着PID!用STM32的PWM差速控制,让你的循迹小车转弯更稳(附源码分析)
STM32 PWM差速控制让循迹小车转弯更稳的实战技巧循迹小车的核心挑战之一是如何实现平滑稳定的转弯控制。许多开发者习惯性地直接套用PID算法却忽略了更基础的PWM差速控制策略。实际上通过精心设计的PWM占空比调整方案完全可以在不增加算法复杂度的前提下获得令人满意的转弯性能。1. 差速控制原理与PWM实现差速转向是轮式机器人的基本运动原理。当左右轮速不同时会产生转向力矩。在STM32平台上我们通过调节两路PWM输出的占空比来实现这一效果。关键参数关系转向角度 ∝ (右轮速 - 左轮速) / 轴距 轮速 ∝ PWM占空比典型的电机驱动电路如L298N需要四路控制信号IN1/IN2控制左电机转向IN3/IN4控制右电机转向EN1/EN2分别接PWM信号控制转速示例初始化代码// STM32 PWM初始化以TIM3为例 void PWM_Init(void) { TIM_OC_InitTypeDef sConfigOC {0}; htim3.Instance TIM3; htim3.Init.Prescaler 71; // 1MHz计数频率 htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 999; // 1kHz PWM HAL_TIM_PWM_Init(htim3); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; // 初始50%占空比 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); // 左电机 HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_2); // 右电机 }2. 传感器布局与转向决策合理的传感器布局是精准转向的前提。常见的三传感器方案中左传感器PA10检测左侧偏离中传感器PA11保持居中右传感器PA12检测右侧偏离转向决策逻辑可以简化为传感器状态左中右动作PWM调整方案0 1 0直行左右轮同速1 1 0轻微右转右轮降速10%0 1 1轻微左转左轮降速10%1 0 0急右转右轮降速30%0 0 1急左转左轮降速30%提示实际应用中建议将降速百分比定义为可调参数方便现场调试3. 进阶调优技巧3.1 动态响应优化简单的阈值控制容易产生抖动。我们可以引入死区控制小幅度偏差时不调整#define DEAD_ZONE 50 // 死区范围 if(abs(error) DEAD_ZONE) return;渐变调整避免占空比突变// 渐进式调整示例 void adjustPWM(uint16_t targetDuty) { static uint16_t currentDuty 500; int step (targetDuty currentDuty) ? 5 : -5; while(currentDuty ! targetDuty) { currentDuty step; __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, currentDuty); HAL_Delay(10); } }3.2 负载补偿不同地面摩擦系数会影响实际轮速。可通过以下方法补偿基准速度校准电池电压监测电机温度监测补偿公式示例实际占空比 设定占空比 × (基准电压/当前电压) × 温度系数4. 与PID控制的对比分析特性PWM差速控制PID控制实现复杂度低中高参数调整难度容易需要专业知识响应速度快可调过冲风险低可能发生硬件要求基础PWM功能可能需要编码器适用场景直线简单弯道复杂轨迹对于大多数校园竞赛级别的循迹小车精心调校的PWM差速方案已经足够应对90%的赛道情况。只有在特别复杂的S形弯道或需要精确位置控制的场景下才需要考虑引入PID算法。5. 实战源码解析以典型的左转处理函数为例void handleLeftTurn(void) { // 获取当前PWM值 uint16_t leftDuty __HAL_TIM_GET_COMPARE(htim3, TIM_CHANNEL_1); uint16_t rightDuty __HAL_TIM_GET_COMPARE(htim3, TIM_CHANNEL_2); // 计算新占空比右轮加速左轮减速 uint16_t newRight rightDuty TURN_GAIN * getDeviation(); uint16_t newLeft leftDuty - TURN_GAIN * getDeviation(); // 限幅保护 newRight (newRight MAX_DUTY) ? MAX_DUTY : newRight; newLeft (newLeft MIN_DUTY) ? MIN_DUTY : newLeft; // 应用新值 __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, newLeft); __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_2, newRight); // 转向保持计时 if(turnTimer 0) { turnTimer TURN_HOLD_TIME; } }关键参数建议值TURN_GAIN20-50根据电机响应调整MAX_DUTY900防止全速失控MIN_DUTY200确保最低转速TURN_HOLD_TIME50-100ms维持转向效果在赛道实测中这套方案的平均转向误差可以控制在±2cm以内完全满足大多数竞赛要求。相比直接上PID的方案不仅减少了参数调试的工作量还降低了处理器负载为后续功能扩展预留了资源空间。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2477672.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!