当前位置: 首页 > news >正文

STM32平衡小车进阶调试(调参篇)

1. PID调参前的准备工作

调参前需要确保硬件和基础代码已经就绪。我遇到过不少同学直接开始调PID,结果发现是电机极性接反或者MPU6050数据异常导致的"假故障"。这里分享几个必查项:

  • 机械中值校准:将小车放在绝对水平面上,用OLED显示MPU6050的俯仰角(Pitch),这个值就是机械中值。我的经验值是-3.2°,你的可能不同
  • 电机极性测试:分别给左右电机正电压,观察车轮转向。正确的转向应该是:正电压对应车轮向前转(编码器值增加)
  • 传感器数据验证:用串口打印以下数据:
    printf("Pitch:%.1f GyroY:%.1f EncL:%d EncR:%d\n", Pitch, gyroy, Read_Speed(2), Read_Speed(4));
    当车体前倾时,Pitch应增大,gyroY为正值;车轮向前时编码器值为正

注意:建议先用胶带固定小车,防止调试时突然失控摔倒。我当年第一个平衡车就是在调试时从桌上飞出去,电机轴都摔弯了...

2. 直立环调试(PD控制)

直立环是平衡车的核心,采用PD控制。公式很简单:

直立环输出 = Kp×角度偏差 + Kd×角速度

2.1 比例系数Kp调试

  1. 初始值设定:根据经验,Kp初始值=车身重量(g)×车轮半径(cm)×0.3。我的小车重300g,轮径6.5cm,所以Kp=300×6.5×0.3≈600

  2. 调试方法

    • 先将Kd设为0
    • 手持小车倾斜10度左右突然放手
    • 观察现象:
      • Kp过小:小车缓慢倒下,像"慢动作"
      • Kp适中:小车快速回正但有轻微振荡(这是我们想要的)
      • Kp过大:剧烈振荡甚至"跳舞"
  3. 实测技巧:用手机慢动作录像观察振荡次数。理想状态是2-3次振荡后稳定

2.2 微分系数Kd调试

Kd用于抑制振荡,相当于"阻尼力"。

  1. 初始值:Kd=Kp/10。我的Kp=600,所以Kd初始值60

  2. 调试现象

    • Kd过小:小车持续摆动(欠阻尼)
    • Kd适中:快速稳定无振荡(临界阻尼)
    • Kd过大:反应迟钝像"老年痴呆"
  3. 特殊技巧:用指尖轻敲车身,好的参数下小车应该像不倒翁一样快速回正

3. 速度环调试(PI控制)

速度环用于消除静态误差,防止小车缓慢移动。公式:

速度环输出 = Kp×速度偏差 + Ki×速度偏差积分

3.1 比例系数Kp调试

  1. 初始值:Kp=直立环Kp×0.1。我的直立环Kp=600,所以速度环Kp=60
  2. 调试方法
    • 给小车一个轻微推力
    • 观察现象:
      • Kp过小:推力导致持续移动
      • Kp适中:移动1-2cm后停止
      • Kp过大:出现"抽搐"现象

3.2 积分系数Ki调试

Ki用于消除静态误差,但容易导致积分饱和。

  1. 初始值:Ki=Kp/200。我的Kp=60,所以Ki=0.3
  2. 调试技巧
    • 在代码中加入积分限幅:
      if(Encoder_S > 10000) Encoder_S = 10000; if(Encoder_S < -10000) Encoder_S = -10000;
    • 观察长时间运行后小车是否出现"自发运动"

4. 转向环调试(P控制)

转向环相对简单,主要控制Z轴角速度:

转向环输出 = Kp×Z轴角速度
  1. 初始值:Kp=直立环Kp×0.05。我的Kp=600,转向环Kp=30
  2. 调试方法
    • 手持小车悬空,手动旋转
    • 观察车轮转向是否与旋转方向相反(产生抵抗旋转的力)
    • 在地面测试时,好的参数下小车应该能保持直线行驶

5. 常见问题排查

5.1 小车单方向跑偏

可能原因:

  1. 机械中值不准(重新校准)
  2. 电机输出不对称(在Load函数中加入补偿值)
  3. 地面不平(换个场地测试)

5.2 高频抖动

解决方案:

  1. 降低Kd值(每次减5)
  2. 检查MPU6050的DLPF设置(推荐配置为5Hz)
    MPU6050_SetDLPF(MPU6050_DLPF_BW_5);

5.3 响应迟钝

优化建议:

  1. 提高控制频率(建议200-500Hz)
  2. 检查MPU6050数据更新时间(DMP输出频率建议≥100Hz)

调试过程中建议保存多组参数备用。我的习惯是用Excel记录参数和现象:

参数组Kp直立Kd直立Kp速度Ki速度Kp转向现象描述
组160060600.330轻微振荡
组255065500.225响应略慢但稳定

最后分享一个实用技巧:用蓝牙模块实时调参。在代码中添加:

if(USART_RX_BUF[0]=='P') Vertical_Kp = atof(&USART_RX_BUF[1]);

这样通过手机串口APP发送"P550"就能实时修改Kp值

http://www.jsqmd.com/news/1196755/

相关文章:

  • 模板驱动型文档自动化:零代码实现动态内容填充与品牌一致性
  • 混沌初开:模糊算法与生命智能
  • 零代码量化软件试用验收:用一条低频规则检查回测与提醒
  • TFLite 异步推理流水线架构:用 C++ future/promise 榨干边缘 SoC 的每一毫秒计算力
  • 打卡第32天 - P1918 - 2026 - 7 - 15
  • 2026美妆护肤SEO/GEO服务商对比:从“被搜索”到“被推荐”,谁真正懂行? - GEO优化
  • 计算机软件工程毕业设计开题报告撰写全流程与避坑指南
  • Vite 生产部署的性能基线与持续回归检测方案
  • 配送--案例
  • 打破企业数据语义鸿沟:本体语义平台实战方法论
  • Agent 搜索栈正在替代 RAG
  • NCNN 多线程推理的负载均衡调度对决:按输出通道均分与按计算量均分两种策略的基准测试报告
  • 嵌入式接口时序设计:从建立时间到PCB布局的实战指南
  • 芝柏中国官方售后服务中心|地址与售后服务电话权威信息通知(2026年7月更新) - 亨得利钟表维修中心
  • 【进阶运营指南】CSDN原力等级:解锁社区影响力与创作权益的实战攻略
  • C++编程思想深度解析:从RAII到模板,构建系统级编程能力
  • C++实战-跨平台构建中静态库与动态库的配置与选择策略
  • C++实现文本转语音引擎:从架构设计到工程实践
  • 2026 年当下,靠谱的G657A2光纤公司怎么联系,揭秘:这个光纤如何让你网络速度飙升十倍? - 行业严选官
  • Java中的hashCode():从算法原理到高效实现
  • 学工系统:数字化重塑校园生活,解锁高效学生管理新体验
  • 工业场景优化器常见问题排查:10个典型故障场景与解决方案
  • 【网络协议实战】——FTP协议核心机制与典型应用场景解析
  • 【FPGA】Zynq RAM读写模式实战解析:写优先、读优先与不变模式的应用陷阱
  • C++多线程编程:从锁机制到高并发实战
  • 《编程通识》之多线程
  • 亲身探访上海欧米茄官方售后服务中心|全部网点地址与热线(2026年7月最新) - 欧米茄官方服务中心
  • 道路巡检路面堆沙路障坑洞检测数据集VOC+YOLO格式3009张3类别
  • 2026武穴黄金回收深度测评|本土30年老店无损检测,全城免费上门零扣费 - 华金汇黄金回收
  • 实战!GraphRAG实战,让AI真正读懂你的知识库