打印

电机的速度不稳定,怎么整定呢

[复制链接]
5119|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
k_ryan|  楼主 | 2012-9-20 07:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的系统具体是这样子的:使用光电编码器,电机转动的时候,会带动码盘旋转,因为一黑一白条纹的关系,所以码盘会引起A,B两个光电器件产生波形。MCU根据A,B反馈的两个波形,就可以知道电机转动的位置。我目标是需要在指定的位置下停止电机转动。这是外国多年前的方案,我们是参考它的设计。电机控制我看过很多资料,本来想用三环控制,但外国公司的电路设计没有电压反馈,所以我估计不需要电流环,只是用速度环和位置环。在调整速度环的时候,采样时间使用1ms,然后PWM是用最大占空比,可以检测到系统最大速度是每1ms走70多个编码器反馈的信号。
参考多方面资料,我需要先整定速度环,将给定速度值设置为50,
意思就是每1ms的速度是50,这样从而可以保证每采样一次就使用一次PID调整。
在速度环调整时,我参考网上的资料,先使用纯比例模式,
下面是我详细的调试过程:
(1)KP=60, KI=0,KD=0时,检测到的速度数值在44和45上摆动;
(2)KP=80, KI=0,KD=0时,检测到的速度数值是以45为中心振荡,振荡区间是【44,47】
(3)KP=100,KI=0,KD=0时,检测到的速度数值也是以46为中心振荡,震荡区间是【44,49】;
(4)KP=150,KI=0,KD=0时,检测到的速度震荡区间是【43,50】;
(5)KP=180,KI=0,KD=0时,检测到的速度震荡区间是【43,51】;
(6)KP=250,KI=0,KD=0时,检测到的速度震荡区间还是【43,51】,但震荡曲线没有(5)那么正规了
后面我继续调试,KP=400,1000,10000,发现震荡很没规律了。
而后,我继续添加积分项,KP=66,KI=0.47,KD=0的时候,感觉好像最好了,但系统的也不能稳定在给定值50。
结论:
在纯比例模式下,发现,无论设置KP值多大,都无法得到以给定值50为中心的震荡曲线,而且也不会最后稳定在给定的速度值;增大KP值,也不能加快由静止起动到达给定速度50的响应时间。
有几个问题:
1、对于这个系统,我只用速度环和位置环行不行呢?
2、纯比例模式下,是不是必须调整到已给定值为中心的振荡的曲线呢?
    如果不是,那么我上面的调试过程,哪个值算是比较合适呢?
3、为什么我看很多资料,好像都说纯比例模式下,运行一段时间后,都会稳定在给定值,但我无论怎么设置KP值,系统都在振荡。在PI模式下,KP,KI的值无论怎么变化,系统也还在振荡,是不是我哪里调不好呢?想不通啊!!!
     第一次接触PID自动控制,完全没经验,已经调试了很长时间了,希望有好心人指点,万分感激。

相关帖子

沙发
yewuyi| | 2012-9-20 09:48 | 只看该作者
对于PWM驱动马达来说,建议不要积分环节,直接比例和微分即可

使用特权

评论回复
板凳
原野之狼| | 2012-9-20 10:14 | 只看该作者
用的什么样的驱动电路?
用的什么样的电机?

使用特权

评论回复
地板
k_ryan|  楼主 | 2012-9-20 13:05 | 只看该作者
是直流电机,由MCU发出PWM,经过驱动芯片,控制电机 3# 原野之狼

使用特权

评论回复
5
k_ryan|  楼主 | 2012-9-20 13:08 | 只看该作者
谢谢你的回复,调试了一下,取消积分项,不怎么行。KP值无论怎么取都会产生震荡,KD值试了很多值都无法抑制震荡,并且微分项取太大,会是引起很大的电机噪音 2# yewuyi

使用特权

评论回复
6
k_ryan|  楼主 | 2012-9-20 13:19 | 只看该作者
因为没有电流环,我直接将速度环经过PID转换后的值作为PWM的值,来控制直流电机,不知道这样的方式对不对呢?
而PWM是MCU定时器产生的,PWM会固定一个频率,
所以占空比0%对应定时器的值是0,占空比100%对应的值是1000。
也就是说PWM的值允许区间是[0,1000]
例如给定速度值是50,实际测出的速度值是10,
纯比例作用下,假如取KP值100,
那么此时PID的转换后的值就是(50-10)*100=4000。
但4000超出PWM的区间,所以这个时候取PWM最大值1000作为输出。
这个处理你觉得行不行呢?谢谢!
2# yewuyi

使用特权

评论回复
7
原野之狼| | 2012-9-20 13:38 | 只看该作者
PWM控制直流电机  为啥就不能在50上下振荡呢  我表示难以理解
在最大值输出的时候是否能够跨越50的限

使用特权

评论回复
8
k_ryan|  楼主 | 2012-9-20 13:57 | 只看该作者
你好!
在最大值输出的时候,速度可以达到80的。
我也一直很纠结为什么不能在给定速度值50上下震荡。
正如我上面说的,KP我已经尝试到10000了,此时震荡区间是[42,53],
而且差不多一直都是这样震荡,最后不会稳定在给定值50。
我开始怀疑是不是我的程序有问题,
但PID控制的算法就几条语句,我检查了数十次应该不会有问题吧!!
7# 原野之狼

使用特权

评论回复
9
k_ryan|  楼主 | 2012-9-20 14:30 | 只看该作者
7# 原野之狼
我的代码如下:
初始化pid如下:
Spid.sp = 50;     //sp是给定速度值
Spid.pv = 0;      //pv是实际速度值
Spid.lp = 0;      //lp是前一个PID输出值
Spid.KP = 0;      //比例
Spid.KI = 0;      //积分
Spid.KD = 0;      //微分
Spid.error[0] = 0;  //当前偏差
Spid.error[1] = 0;  //上次偏差
Spid.error[2] = 0;  //上上次偏差


采样时间是1ms,每1ms就中断一次,下面的pid处理是在中断函数里。
Spid.pv = TIME0;                  //TIME0是MCU定时器计数外部编码器波形的数目
Spid.error[0] = Spid.sp - Spid.pv;       //计算偏差
output  = Spid.KP * (Spid.error[0] - Spid.error[1]);  //output最后保存pid输出值。
output += Spid.KI * Spid.error[0];
output += Spid.KD * (Spid.error[0] - (Spid.error[1] * 2) + Spid.error[2]);
output += Spid.lp;                //这里是采用增量式PID
Spid.lp = output;                 //保存,作为下一次PID调整使用
if(output > 1000)    output = 1000;  //PWM值允许的区间是[0,1000]
else if(output < 0)  output = 0;
PWM = output;                //PWM是MCU的一个定时器,用于输出PWM控制电机。
Spid.error[2] = Spid.error[1];
Spid.error[1] = Spid.error[0];

这个处理不知道有没有问题呢

使用特权

评论回复
10
原野之狼| | 2012-9-20 14:52 | 只看该作者
本帖最后由 原野之狼 于 2012-9-20 14:56 编辑

先做到在50上下振荡  (根据你提供的信息,已经做到了)
然后做到等幅振荡  (从你提供的信息,貌似输出不够强,减速太明显,要不然你把电机供电电压再升高一些)

使用特权

评论回复
11
k_ryan|  楼主 | 2012-9-21 00:28 | 只看该作者
10# 原野之狼
KP=10000,震荡区间是[42,53],原来这样也属于在给定值50上下震荡的呀???
我一直还以为不属于呢,谢谢你了。
我明天试试提高一下电压,感谢你的建议:)

使用特权

评论回复
12
k_ryan|  楼主 | 2012-9-23 22:41 | 只看该作者
10# 原野之狼
斑竹,我尝试过了,好像效果不是很大:( ,不知道你还有更好的建议吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

39

帖子

2

粉丝