基于STM32F103C8T6与PWM的简易四足机器人步态实现 📅 2026/7/15 5:59:13 1. 从零开始认识STM32F103C8T6第一次拿到这块蓝色小板子时我差点以为是个玩具——直到发现它能流畅运行32位ARM Cortex-M3内核主频高达72MHz。STM32F103C8T6作为STMicroelectronics的经典之作64KB闪存和20KB RAM的配置对于控制8个舵机绰绰有余。记得当时用万用表测量GPIO口电压时3.3V的逻辑电平让我意识到需要特别注意与5V舵机的电平匹配问题。这块芯片最吸引我的地方是它的定时器资源。TIM2和TIM4两个通用定时器正好对应8个PWM输出通道每个定时器4个完美匹配四足机器人的8个舵机需求。实际测试时用示波器观察PA0引脚输出的PWM波形调整ARR和PSC参数的过程就像在调校一台精密仪器——720的分频系数配合2000的自动重装载值产生的20ms周期信号让SG90舵机立刻有了反应。2. PWM信号生成的底层原理刚开始调PWM时我对着数据手册研究了整整三天。关键是要理解这三个寄存器ARRAuto-Reload Register决定脉冲周期PSCPrescaler控制时钟分频CCRCapture/Compare Register掌管占空比。举个例子当系统时钟72MHz经过720分频PSC719后计数器每递增一次耗时10μs。若设置ARR为1999则完整周期就是2000×10μs20ms正好满足舵机控制需求。最让我踩坑的是CCR值的映射关系。最初直接套用公式角度CCR/2000×180°结果舵机抖动严重。后来发现SG90的实际控制范围是0.5ms-2.5ms脉冲宽度对应CCR值应该是50-250当ARR1999时。这个非线性关系让我写了段校准代码uint16_t angle_to_ccr(uint8_t angle) { return (angle * 200 / 180) 50; // 映射0-180°到50-250 }3. 四足机器人的机械结构设计用SolidWorks建模时我犯了个典型错误——没考虑3D打印的收缩率。第一次打印的关节连接件比设计尺寸小了0.3mm导致舵机转轴卡死。后来在关键配合部位预留了0.5mm间隙问题迎刃而解。这里分享几个实测可用的参数舵机安装孔直径2.1mmM2螺丝过孔腿部摆动角度前肢±45°后肢±30°重心位置建议在机身中心偏前1/4处组装时有个小技巧先用代码让所有舵机归中CCR150再用热熔胶临时固定关节。等完成所有机械连接后通过串口命令逐个微调零点位置。这样比纯手工对齐精度高得多我的测试数据显示重复定位误差能控制在±2°以内。4. 基础步态算法的实现调试抬腿-摆动-落地动作时我发现直接线性插值会导致机器人剧烈抖动。后来改用余弦曲线做平滑过渡运动顿时流畅许多。以下是核心步态函数的伪代码void gait_move(uint8_t leg, float progress) { float height 30 * (1 - cos(progress * PI)); // 抬腿高度曲线 float stride 45 * sin(progress * PI/2); // 步幅曲线 if(progress 0.5) { // 抬腿阶段 set_angle(leg, UP, height); set_angle(leg, FORWARD, stride); } else { // 落地阶段 set_angle(leg, UP, 30 * (1 cos(progress * PI))); set_angle(leg, FORWARD, 45 * sin(progress * PI/2 PI/2)); } }实测发现每步周期控制在800ms时稳定性最佳其中抬腿占300ms摆动400ms落地缓冲100ms。通过调整这四个阶段的时长比例可以实现从慢走到小跑的不同速度模式。5. 多任务调度与能耗优化当尝试让机器人边走路边摇尾巴时裸机编程的局限性就暴露了。我改用定时器中断创建简单的时间片轮询void TIM3_IRQHandler() { static uint8_t tick 0; if(TIM_GetITStatus(TIM3, TIM_IT_Update)) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); tick; if(tick % 10 0) update_gait(); // 每100ms更新步态 if(tick % 5 0) update_tail(); // 每50ms更新尾巴 if(tick 100) tick 0; } }功耗方面实测全速运行时机体电流达1.2A。通过动态调整PWM频率运动时72MHz待机时8MHz配合TIM_Cmd()关闭闲置定时器待机电流成功降至200mA以下。锂电池供电时这个优化让续航从1小时提升到近4小时。6. 常见问题排查指南去年帮学弟调试时我们整理了一份死亡清单舵机抽搐99%是电源问题。单个SG90堵转电流可达500mA8个同时工作必须配5V/5A以上电源PWM无输出检查三点GPIO是否设置为复用推挽输出GPIO_Mode_AF_PP定时器时钟使能了吗RCC_APB1PeriphClockCmdTIM_Cmd()最后调用了吗动作不同步在关键位置添加延时微调TIM_SetCompare1(TIM2, 150); Delay_us(50); // 等待机械响应 TIM_SetCompare2(TIM2, 120);最诡异的bug是有次TIM4的CH3通道突然失效最后发现是PB8引脚虚焊。现在我的工具箱里常备放大镜和热风枪硬件检查永远是第一步。