利用网售的PID调制工具配置电机PID参数
STM32F103C8代码:
https://github.com/MontaukLaw/PID_Control_With_STM32F103
套件购买地址:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.lbDUDR&id=532496279494&_u=s124ig7aecc
电机购买地址:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.lbDUDR&id=20965620027&_u=s124ig777dc
这个系统, 总体来说就是利用上位机的图形, 去直观的修改pid值, 通过pwm输出控制电机转速.
1. 我使用了套件里面的评估板, 跟在别的地方买的冯哈勃电机, 带垃圾减速器,加垃圾编码器, 修改店家提供的源码, 通过这个叫MiniBalance的上位机程序, 可以直观的看到当前速度跟目标速度, 甚至当前的pwm.
2. 电源使用12伏供电, 速度的采样周期大约是10ms, 但是上位机最多只有20hz的速度, 所以看到的速度变化最快也就是50ms.
3. pwm的调制周期是5ms, 使用增量式调节, 公式是...算了, 自己去看github代码注释吧, 直接粘贴不了.
4. P.I. 这两个系数,是我研究了一会儿, 慢慢的出来的, 最后出来的曲线如上图, 以及文章最后的图:
5. 其实我很早就有这种想法, 利用串口把当前的速度啊, pwm啊, 设定值之类, 传到上位机, 然后用Java写个上位机程序, 方便PID系数的整定, 但是后来一直没接触到这类应用, 这次算是用一天时间解决一个问题.
6. 剩下的问题就是, 思岚的STM32示例代码里面的PID算法是位置式的, 可能需要修改这部分代码.
7. BB Ver 3.0上面的PID算法可能也需要修改.
8. 套件的电机驱动板上的编码器接口丝印, 信号引脚A0跟A1, 跟实际所使用的引脚PA0跟PA1是反过来的, 这点需要注意, 浪费了我一个小时.
9. 值得注意的是, 这个case中, PWM的输出量, 最大是3600, 而速度值, 在10ms下面, 如果不除一下或者换算成实际单位,毫米或者米之类, 10ms的编码器脉冲在12伏, PWM~100%下可能有1300次脉冲, 所以, Kp跟Ki很小, 稍微大点就会跑到最大值, 回不来了...
10. 图中的显示值都除了10, 因为minibalance这个上位机程序只能保留小数点前面3位.
PS: 另外, PWM调制之后, 这个电机可能出现高频啸叫, 原本的调制周期是10K, 后来改成20K, 啸叫消失了...算是意外收获吧.