已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

半开环算法基本已经稳定 趁还有点时间  开始写PID及其测试

PID算法是简单的 我这么说不是高兴的 而是无奈的 我曾经加了杂七杂八的东西 期待优化它 但是最后几乎都一一取消 

  1. 首先是系统复杂度和敏感性 远超理论 看MT6701的响应曲线就知道了 里面有太多杂质了 而且信号变化极快 比方说 转速16圈每秒的时候  50极电机一个周期 也只有20次采样和处理 和一般至少能给几百次采样处理机会的PID控制系统完全不同

  2. 死区设计:  取消 因为输入信号本身并不准确 死区设计为1-2步没有意义 甚至影响了系统精度

  3. 积分抗饱和: 还在 采用最简单的根据输出量进行分离 以及限幅 (实际上因为整数计算 许多步骤都会考虑限幅) 其实意义不算太大 因为积分系数是很小的 

  4. 不完全微分: 取消 没有效果 因为传感器信号并不是有噪声 相反是本身已经被过分滤波了 我在实测中 没有遇到一次突兀的噪声点 

  5. 大多数优化措施没有正面效果 相反 因为引入更多的非线性 在这个响应速度极高 本身信号又被污染的系统 带来的收益是负的

  6. Kp 假如开环的等效Kp是1的话 我测试下来 这里不能使用超过1的Kp 否则震荡是必然的 没震只是MCU还没睡醒 一般合适的Kp只能在0.1以下 0.2已经有点暴躁的迹象了 这导致PID算法的动态刚性只有开环的1/10 .....网上看到的扭电机看它恢复角度 有时候是种不得已 因为系统环路太复杂了 而对比之下 开环系统的磁链反馈几乎是及时性的 就这样也不能避免小的震荡

  7. Ti 需要很大 远比我在上面的各种理论分析和仿真要大得多 否则极可能导致震荡 我曾经想计算一个伯德图出来  但是看到传感器那复杂的动态曲线 已经觉得其他部件的相位延迟没有必要考虑太多了 Ti应该至少覆盖传感器带来的延迟 目前我这里测试下来 Ti应该是100个采样周期才能比较稳定(6-7ms) 50个的话 有震荡的迹象 实际上如果要消除过冲 Ti会需要更大 Ti的主要作用的提供很高的静态刚性 实测下来静态精度开环要高不少 数据看误差几乎都是0

  8. Td 对抑制震荡有一些好处 但是实测下来 影响并不明显 大概因为传感器延迟复杂 并不能在及时抑制有多少作用 而且会参数莫名奇妙的问题(下面有叙述) 主要作用是抑制较慢速度的过冲

  9. PID的响应时间是可以感觉到的 用手给它乱加力 用力大的话 会感觉到它拼命甚至颤抖的样子(应该是Ti的作用) 但是又比我预想的高速很多  可以说 用力不大的话 感觉不到它是在你加力时候 才从0开始加力对抗的 仿佛已经有抗力存在在那

  10. PID的主要好处是耗电极低 在静态时候几乎没有电流消耗  我本来打算在静态时候加个电流进行锁定的 现在放弃了 (但是可能在下一个混合算法实现) 这是骨子里对省电的执着吧 (比方说 有些半电流的电路 都是国人后加的 原始应用样例是没有的) ... 毕竟开环下 就算1/6满电流 发热也很大 而满电流 没多久就会到50度以上 让我不敢继续下去 .... 因此 这样纯PID的算法 是需要的

.......... TD ................

TD可以抑制过冲 然而 图形有点怪异

pid-td-error.png

从图中看出 一开始TD=25时候 因为马达惯性 存在过冲 (此时Ki为0 不是由于积分引起) 于是我设置TD=50 从图上看出 过冲似乎被抑制住了 马达甚至没到达0位就停了下来 但是此时却反而出现了一个向上的平台 我分析认为 这是传感器输出问题导致的

从图上看 每个位置转折处 都有平台 不符合物理实际 从物理上说 这些地方应该是连续光滑的 可以自己脑补个正弦波形补上

从理论上说 TD可以随意增大来抑制过冲 然而实际上 这是不可能的 因为TD会放大各种噪声 非线性 传感器的错误等等  比方说 当TD为100时候 

pid-td-error2.png

所以 需要先确定系统的稳定局限在哪 从测试看 本系统的TD不宜超过50 如果仍然需要抑制过冲 只能减少Kp和Ki了

同时 TD也不能太小 太小等于系统缺乏阻尼 尤其是我现在马达并没有负载 实测TD为0  一样引起震荡 TD应该取10以上

从测试发现  过冲是基本存在的 所以TD往大里取  又不能太大 就定下来40吧

............. TI ....................

KP既然只合适取0.1左右 那么 就TI决定了最大的刚性多久能到达 这就需要在过冲和响应速度之间衡量了 此外 TD太小 没有覆盖系统总体延时 也会带来震荡 此处最需考虑的是传感器的延时 实测TD=30时候 等效时间1.9ms 系统正好不会震荡 所以 更安全的值 应该在TI=50以上

pid-ti-error.png

测试下来 TI=300的时候 到381*3*64us=73ms处还未到达精度 而TI=160 已经差不多可以达到精度 虽然TI=100时候 只需要40ms 但是过冲偏大  所以TI缺省值我会设为160  和TD=40缺省值正好4倍  像ZN整定致敬

 ............. KF....................

这个参数就有点尴尬了 在系统TD受限严重 本身无法避免过冲的时候 虽然KF=0时候 可以变为纯粹的微分先行  能减少输入变化带来的过冲 但是设为0恐怕会影响对输入响应的速度 这点在这个测试中不一定看得出来(被系统本身的过冲掩盖)  pid-kf-error.png

就以上参数 目前测试下来

  1. 稳定性: 稳定 没有震荡 用手施加扭矩 基本没有松动感 略微有反馈

  2. 计算负担(主循环速度): 空闲时 93次/ms 算法启动后 49次/ms 加上RS485满速率工作 38次/ms 

  3. 最高也是17转每秒

  4. 静态和跟踪测试如下图

pid-trace-error.png

当动态跟踪的时候 KF似乎有较大影响 尤其是听觉上  当KF=1.0时候 听起来马达有沙沙的声音 这应该是放大了指令流的存在 这时候跟踪误差也比KF=0要大  似乎 KF=0应该设为缺省值 就是完全微分先行 这时候没有指令流的声音 听起来很安静 ... 实测当KF为0.2 声音也几乎听不到 0.3时候  声音有点明显 算了 设为0.2吧

静态的跟踪就显然是细微误差不断积累 不断纠正的过程 这个周期很长 但是精度很高 (但我认为这个得靠传感器精度 在轻负载时候 精度还是得看开环的 毕竟传感器本身 就是在无负载下通过开环校正的)

至此 基本PID算法定型了

文号 / 927223

百炼成钢
名片发私信
学术分 1
总主题 48 帖总回复 808 楼拥有证书:进士 学者 机友
注册于 2020-01-22 18:44最后登录 2024-05-13 01:07
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:上海

个人简介

个人开源项目: m24h.github.io

文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传,正在处理中
空空如也~
处理中...
处理失败
加载中...
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
插入公式
评论控制
加载中...
文号:{{pid}}
加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
ID: {{user.uid}}