半开环算法基本已经稳定 趁还有点时间 开始写PID及其测试
PID算法是简单的 我这么说不是高兴的 而是无奈的 我曾经加了杂七杂八的东西 期待优化它 但是最后几乎都一一取消
首先是系统复杂度和敏感性 远超理论 看MT6701的响应曲线就知道了 里面有太多杂质了 而且信号变化极快 比方说 转速16圈每秒的时候 50极电机一个周期 也只有20次采样和处理 和一般至少能给几百次采样处理机会的PID控制系统完全不同
死区设计: 取消 因为输入信号本身并不准确 死区设计为1-2步没有意义 甚至影响了系统精度
积分抗饱和: 还在 采用最简单的根据输出量进行分离 以及限幅 (实际上因为整数计算 许多步骤都会考虑限幅) 其实意义不算太大 因为积分系数是很小的
不完全微分: 取消 没有效果 因为传感器信号并不是有噪声 相反是本身已经被过分滤波了 我在实测中 没有遇到一次突兀的噪声点
大多数优化措施没有正面效果 相反 因为引入更多的非线性 在这个响应速度极高 本身信号又被污染的系统 带来的收益是负的
Kp 假如开环的等效Kp是1的话 我测试下来 这里不能使用超过1的Kp 否则震荡是必然的 没震只是MCU还没睡醒 一般合适的Kp只能在0.1以下 0.2已经有点暴躁的迹象了 这导致PID算法的动态刚性只有开环的1/10 .....网上看到的扭电机看它恢复角度 有时候是种不得已 因为系统环路太复杂了 而对比之下 开环系统的磁链反馈几乎是及时性的 就这样也不能避免小的震荡
Ti 需要很大 远比我在上面的各种理论分析和仿真要大得多 否则极可能导致震荡 我曾经想计算一个伯德图出来 但是看到传感器那复杂的动态曲线 已经觉得其他部件的相位延迟没有必要考虑太多了 Ti应该至少覆盖传感器带来的延迟 目前我这里测试下来 Ti应该是100个采样周期才能比较稳定(6-7ms) 50个的话 有震荡的迹象 实际上如果要消除过冲 Ti会需要更大 Ti的主要作用的提供很高的静态刚性 实测下来静态精度开环要高不少 数据看误差几乎都是0
Td 对抑制震荡有一些好处 但是实测下来 影响并不明显 大概因为传感器延迟复杂 并不能在及时抑制有多少作用 而且会参数莫名奇妙的问题(下面有叙述) 主要作用是抑制较慢速度的过冲
PID的响应时间是可以感觉到的 用手给它乱加力 用力大的话 会感觉到它拼命甚至颤抖的样子(应该是Ti的作用) 但是又比我预想的高速很多 可以说 用力不大的话 感觉不到它是在你加力时候 才从0开始加力对抗的 仿佛已经有抗力存在在那
PID的主要好处是耗电极低 在静态时候几乎没有电流消耗 我本来打算在静态时候加个电流进行锁定的 现在放弃了 (但是可能在下一个混合算法实现) 这是骨子里对省电的执着吧 (比方说 有些半电流的电路 都是国人后加的 原始应用样例是没有的) ... 毕竟开环下 就算1/6满电流 发热也很大 而满电流 没多久就会到50度以上 让我不敢继续下去 .... 因此 这样纯PID的算法 是需要的
.......... TD ................
TD可以抑制过冲 然而 图形有点怪异
从图中看出 一开始TD=25时候 因为马达惯性 存在过冲 (此时Ki为0 不是由于积分引起) 于是我设置TD=50 从图上看出 过冲似乎被抑制住了 马达甚至没到达0位就停了下来 但是此时却反而出现了一个向上的平台 我分析认为 这是传感器输出问题导致的
从图上看 每个位置转折处 都有平台 不符合物理实际 从物理上说 这些地方应该是连续光滑的 可以自己脑补个正弦波形补上
从理论上说 TD可以随意增大来抑制过冲 然而实际上 这是不可能的 因为TD会放大各种噪声 非线性 传感器的错误等等 比方说 当TD为100时候
所以 需要先确定系统的稳定局限在哪 从测试看 本系统的TD不宜超过50 如果仍然需要抑制过冲 只能减少Kp和Ki了
同时 TD也不能太小 太小等于系统缺乏阻尼 尤其是我现在马达并没有负载 实测TD为0 一样引起震荡 TD应该取10以上
从测试发现 过冲是基本存在的 所以TD往大里取 又不能太大 就定下来40吧
............. TI ....................
KP既然只合适取0.1左右 那么 就TI决定了最大的刚性多久能到达 这就需要在过冲和响应速度之间衡量了 此外 TD太小 没有覆盖系统总体延时 也会带来震荡 此处最需考虑的是传感器的延时 实测TD=30时候 等效时间1.9ms 系统正好不会震荡 所以 更安全的值 应该在TI=50以上
测试下来 TI=300的时候 到381*3*64us=73ms处还未到达精度 而TI=160 已经差不多可以达到精度 虽然TI=100时候 只需要40ms 但是过冲偏大 所以TI缺省值我会设为160 和TD=40缺省值正好4倍 像ZN整定致敬
............. KF....................
这个参数就有点尴尬了 在系统TD受限严重 本身无法避免过冲的时候 虽然KF=0时候 可以变为纯粹的微分先行 能减少输入变化带来的过冲 但是设为0恐怕会影响对输入响应的速度 这点在这个测试中不一定看得出来(被系统本身的过冲掩盖)
就以上参数 目前测试下来
稳定性: 稳定 没有震荡 用手施加扭矩 基本没有松动感 略微有反馈
计算负担(主循环速度): 空闲时 93次/ms 算法启动后 49次/ms 加上RS485满速率工作 38次/ms
最高也是17转每秒
静态和跟踪测试如下图
当动态跟踪的时候 KF似乎有较大影响 尤其是听觉上 当KF=1.0时候 听起来马达有沙沙的声音 这应该是放大了指令流的存在 这时候跟踪误差也比KF=0要大 似乎 KF=0应该设为缺省值 就是完全微分先行 这时候没有指令流的声音 听起来很安静 ... 实测当KF为0.2 声音也几乎听不到 0.3时候 声音有点明显 算了 设为0.2吧
静态的跟踪就显然是细微误差不断积累 不断纠正的过程 这个周期很长 但是精度很高 (但我认为这个得靠传感器精度 在轻负载时候 精度还是得看开环的 毕竟传感器本身 就是在无负载下通过开环校正的)
至此 基本PID算法定型了
200字以内,仅用于支线交流,主线讨论请采用回复功能。