OpenEdv-开源电子网
标题:
STC8A8K64S4A12单片机PID调速调试记录
[打印本页]
作者:
Plly
时间:
2019-8-15 19:11
标题:
STC8A8K64S4A12单片机PID调速调试记录
最近在家做电机的PID调速,制作成功,特此将调试过程分享出来。
单片机使用的是STC8A8K64S4A12单片机(程序有兴趣的可以移植),使用的是普通的12v有刷电机,加上淘宝购买的红外对管加码盘反馈就构成了
(, 下载次数: 3)
上传
点击文件名下载附件
(, 下载次数: 0)
上传
点击文件名下载附件
原理图如下所示
(, 下载次数: 0)
上传
点击文件名下载附件
整个硬件如上所示,我直接就开始了写程序,使用定时器1ms间隔模拟PWM输出(当然单片机自身带硬件PWM的),因为红外对管反馈回来的是方波,所以使用中断1进入中断的次数计算电机转速,调了好久发现电机总是抖动,pid计算程序如下所示
(, 下载次数: 2)
上传
点击文件名下载附件
调pid调的我怀疑人生,最后开始反思自己的全部过程,就想从源头(电机的反馈频率数值)开始调一下,就用单片机串口输出测得的电机转速数值,发现在同样的转速下采集回来的数据抖动很大,有0xff的有0的有正常的,于是使用示波器测试反馈回来的波形,发现是这样的
(, 下载次数: 0)
上传
点击文件名下载附件
(, 下载次数: 0)
上传
点击文件名下载附件
也就是以上原因,在电机抖动的石油会有这样的抖动,导致单片机频繁进入中断,造成数据波动,于是想滤波,两种方法,一是使用软件滤波,在进入中断后适当延时100us,只是考虑这样占用运算时间,并且进入中断的时间太长,也不利于程序后期的移植,因为如果程序比较大的话这个100us还是很关键的,又想一进入中断马上关闭中断1,在main函数的主循环结束的位置打开中断1,又考虑到主函数运行时有时任务少,有时占用时间比较久(有运算有串口发送数据处理),所以使用硬件滤波,就使用了最简单的RC,经过测试波形发现,此时已经没有了杂波的影响,只是在频率比较高的时候,该信号直接成为了模拟量,所以又添加了二极管用来泄放电容上面的电压,之所以用SS14是因为正向导通压降低,如果使用4007或4148,压降0.7V,单片机会认为是1,也就不会有下降沿了,具体电路在原理图中有画,实测的波形如下所示。之所以先尖是RC滤波导致电压没有突变,当输出0后二极管器作用泄放电容上面的电荷,所以后面部分值直线下降。
(, 下载次数: 0)
上传
点击文件名下载附件
得到稳定的输出脉冲后,用串口再次返回电机转速,发现此时速度已经没有大的波动,较小的波动也是在±1变化,为了达到最稳定添加了一个去最大值最小值求平均的方法。此时的电机转速就是很平的一根线了。我原来为了数据的平滑性是PID的采样周期设置的比较大,然后求平均,再缩小,在这个过程中产生了一个问题缩小的时候是对folat型数据做除法我将结果返回给了u16型数据,这样folat计算的小数直接存在了u16里面就是一个不确定大小的数,一般是比较大的数,因为folat不能使用左移的方法所以用了除,发现此问题后我本来想将除数设置为2的n次方的数字,达到左移的效果,后来一想输出的数据已经很平均了,想要缩小数据于是直接缩短了PID的采样周期,这样脉冲的计数值也直接小了下来。
因为在13V的时候电机全速旋转,在我的硬件条件中,电机反馈回来的最大值为96,所以我将PWM的计数周期设置为了100,也是为了方便调整,让PID在运算的时候可以超调,开始调试之后先是使i参数d参数为0,只改变p,使电机有抖动在缩小p达到稳速,然后又调节i同样的方法,调整完毕后发现电机在电压比较高并且全速运行的时候稍微有点抖动所以添加了d参数,在电压改变的时候电机的转速返回值如图所示。
(, 下载次数: 1)
上传
点击文件名下载附件
在调整的时候我是供电电压突然升高,发现电机也能很快的回到设定值,如下所示。该波形显示软件使用的@杜洋工作室出品的上位机,使用单片机对串口发送u8型数据就显示图形。
(, 下载次数: 1)
上传
点击文件名下载附件
作者:
Plly
时间:
2019-8-15 19:24
经过杜洋老师同意,特将杜洋工作室出品的上位机分享出来
作者:
langcai
时间:
2019-8-23 13:31
谢谢楼主分享
作者:
w114512297
时间:
2020-4-25 10:02
谢谢楼主分享
作者:
changfen007
时间:
2021-7-12 21:03
谢谢楼主分享!
作者:
hzhanhai
时间:
2022-4-2 18:13
谢谢分享!
欢迎光临 OpenEdv-开源电子网 (https://www.openedv.com/)
Powered by Discuz! X3.4