打印

PID算法的输出如何与PWM的占空比相对应

[复制链接]
25093|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiero39|  楼主 | 2014-12-7 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
         我的工作是做一个温控系统(不带冷却装置),加热装置就是陶瓷加热棒。通过采集所得的温度误差,经PID算法得出控制量,再利用控制量去改变由单片机输出的PWM波的占空比。最后将PWM波送到继电器以控制加热棒加热和不加热。      
    我的做法是:占空比=(当前PID输出量)/(PID控制量的最大值—0),其中我认为PID控制量的最大值=Kp*温度最大误差。因为在我的PID算法中采用的是积分分离,即在温度误差<3℃时,才用积分环节。所以输出量的最大值我认为是Kp*温度最大误差      
    但是问题是,这不是Kp完全不起作用吗?因为,当前PID输出量=Kp*ek+(Kp*Ts/Ti)*(e(k)+e(k-1)+.......)+(Kp*Td/Ts)*(e(k)-e(k-1)), 比上PID控制量的最大值不就将Kp约掉了吗?那还怎么通过Kp调节呀?

相关帖子

沙发
k_ryan| | 2014-12-7 23:43 | 只看该作者
在这里很难问出东西出来的,感觉这个论坛已经没落了
我现在也正在做pid,我们可以共同探讨

使用特权

评论回复
板凳
yangbinge| | 2014-12-8 08:40 | 只看该作者
PWM控制继电器?还是控制可控硅好一点吧。

使用特权

评论回复
地板
mazhao141| | 2014-12-8 08:57 | 只看该作者
我不知道你这个算法哪找到的,但是就你这个算法本身来说,占空比本身就是个比例值。PID的最大值为波形宽度,PID当前值为有效电平宽度,它们的意义不在于比例这么简单。如果你Kp变大了,整个波形就会变宽。这会产生什么效果,你自己做实验吧。另外这里必然是要用固态继电器的。

使用特权

评论回复
5
jiero39|  楼主 | 2014-12-8 14:57 | 只看该作者
k_ryan 发表于 2014-12-7 23:43
在这里很难问出东西出来的,感觉这个论坛已经没落了
我现在也正在做pid,我们可以共同探讨 ...

可以加我的QQ:598097387

使用特权

评论回复
6
hjjadg| | 2014-12-8 18:29 | 只看该作者
控制普通继电器不能用PWM,除非是固态继电器。如果是普通继电器,建议做时间上面的**。

使用特权

评论回复
7
苏山人家| | 2014-12-8 21:39 | 只看该作者
pwm不能用普通继电器
温度滞后很大,而且你只能靠自然冷却,所以pid尽量不要超调,用pi控制,微分不能加。

使用特权

评论回复
8
k_ryan| | 2014-12-8 22:05 | 只看该作者
楼主,我的pid调整今天已经做好了,
你怎么会说kp没作用呢?
你应该搞错了吧
Kp怎么会约掉呀?当前PID输出量和上一PID控制量,两者的ek都不一样呢?
约不掉的。是不是我理解错了,还是你表达有问题,
仔细看清楚呀哦

使用特权

评论回复
9
emailli| | 2014-12-8 22:06 | 只看该作者
几年前我在21IC的博客里面详细解析了 PID算法的 51单片机实现

我相信可以帮到楼主

2楼,这里还是有点货的。虽然这些干货不一定是那么高深的东西。

使用特权

评论回复
10
jiero39|  楼主 | 2014-12-9 09:48 | 只看该作者
k_ryan 发表于 2014-12-8 22:05
楼主,我的pid调整今天已经做好了,
你怎么会说kp没作用呢?
你应该搞错了吧

那你的PID输出的控制量如何与PWM波的占空比相对应呢?你是怎么确定PID输出控制量的最大值?

使用特权

评论回复
11
yefengling| | 2014-12-9 17:57 | 只看该作者
我也想知道啊

使用特权

评论回复
12
jiero39|  楼主 | 2014-12-9 21:06 | 只看该作者
emailli 发表于 2014-12-8 22:06
几年前我在21IC的博客里面详细解析了 PID算法的 51单片机实现

我相信可以帮到楼主

        刚看完您若干年前写的关于PID算法的**,受益匪浅!根据您在**中的讲解,那现在我只要将PID算法输出的控制量直接给定时器寄存器就可以了,然后调节相应的PID参数即可,对吗?
    由于项目中要求不能有超过10%的超调量,且陶瓷加热棒比热容非常小,而如果在一开始就引入积分项的话,就必然引起很大的超调量。所以,我只是在开始阶段引入比例和微分,在误差很小(比如3摄氏度以内)时,才加入积分、比例和微分。这样意味着,我的控制量输出是一个一直减小,到最后接近目标值时才有一个小的波动。那么,这就是说,如果我只将PID算法输出的控制量直接给定时器寄存器(16位定时器,最大值:65536),当我使用不同的比例参数Kp的话,真实控制量的最大值就有可能小于65536。也就是说,最后的占空比可能不是0~100%,而是0~80%,或者0~90%,等等。你看,我这样的理解对吗?
   

使用特权

评论回复
13
k_ryan| | 2014-12-9 22:10 | 只看该作者
jiero39 发表于 2014-12-9 21:06
刚看完您若干年前写的关于PID算法的**,受益匪浅!根据您在**中的讲解,那现在我只要将PID算 ...

我的做法和你这个理解差不多。
就是只需将输出量直接作为PWM的调整就行了。
反正我这样做就行了,估计你的项目也差不多

使用特权

评论回复
14
k_ryan| | 2014-12-9 22:14 | 只看该作者
我不明白为什么你要执着那个真实控制量的最大值?
其实你还可以再增加一个阀值的,超过这个阀值的范围,就取阀值。
我的项目是这么做的,这样做是为了防止PWM超出一定范围。
不知道对你是否有帮助?

使用特权

评论回复
15
cuya| | 2014-12-10 01:15 | 只看该作者
首先理解有误。
PWM控制量的最大值是加载在pwm驱动上的直流电压, 为固定值, 与Kp, Ki 无关。占空比为 1 时, 理论上的输出为最大值, 即直流驱动电压; 占空比为 0.5 时, 理论上的输出为直流驱动电压的一半.
加热之类的控制,用PI 即可,微分没有必要,而且会引入不必要的干扰.

使用特权

评论回复
16
cuya| | 2014-12-10 01:25 | 只看该作者
其次,实践时要有一个 pwm 软件或硬件模块来实现占空比,比如 65535 为最大值,即占空比为 1 ,那么pwm 模块的输入为32768时, 占空比应为 0.5.
如果理论计算的占空比大于 1 或小于 0, 则控制器进入了饱和或截止,这是必须考虑的控制理论问题。
超调过大意味着 Kp 过大,这是PID 参数设置的问题, 可以通过理论计算或是仿真来获取最佳的Kp, Ki 参数。如果不会仿真,那么就耐心的慢慢试吧。

使用特权

评论回复
17
k_ryan| | 2014-12-10 10:15 | 只看该作者
cuya 发表于 2014-12-10 01:15
首先理解有误。
PWM控制量的最大值是加载在pwm驱动上的直流电压, 为固定值, 与Kp, Ki 无关。占空比为 1  ...

你好,请问“加热之类的控制,用PI 即可”这个理论怎么得出的呢?
如果控制直流电机呢?是不是也用PI就行

使用特权

评论回复
18
wangtao478552| | 2014-12-10 16:52 | 只看该作者
jiero39 发表于 2014-12-9 21:06
刚看完您若干年前写的关于PID算法的**,受益匪浅!根据您在**中的讲解,那现在我只要将PID算 ...

从定时器输出到脉宽值之间你自己可以直接相等,也可以加一个基准值,因为PID控制器有负值而PWM没有。另外还要设置死区之类的,自己加入条件判断,举个例子,当PID控制器输出大于PWM最大值时,PWM输出的脉宽如何确定。软件没有那么死,自己灵活运用就是了。

使用特权

评论回复
19
jiero39|  楼主 | 2014-12-10 20:04 | 只看该作者
k_ryan 发表于 2014-12-9 22:14
我不明白为什么你要执着那个真实控制量的最大值?
其实你还可以再增加一个阀值的,超过这个阀值的范围,就 ...

非常感谢您的回复,让我启发不少!但是,我还是有两个问题:
     1、16位定时寄存器的范围是0~65536,对应的占空比是0~100%。按照我们之前的理解,直接将PID  输出的控制量给定时寄存器。那么,我的阀值上限要设成65536,下限要设成0,对吗?(也就是说,当输出控制量大于等于65536时,控制量强制赋值为65536;当输出控制量小于等于0时,控制量强制赋值为0。)
     2、由于我用的是积分分离的位置式(个人感觉对于没有**特性的执行机构,位置式和增量式都一样。因为在增量式中,PID的当前输出控制量还是要叠加上前一次的输出控制量,最后才是最终输出的PID控制量。倒不如用位置式简单明了。当然,前提是没有**特性的执行机构!),如之前提及的,输出的控制量是一直在减小,到了误差<3摄氏度(误差<3℃时,我将积分环节加进去了),由于积分的作用,控制量会在一个小范围内波动。纵观控制量变化的全过程,有可能它的变化永远不会超过65536,比如在-500~50000之间变化。那么给到定时寄存器就是0~50000之间变化,对应到占空比就是0~76.294%(50000/65536=0.7629394.........)之间变化。这就意味着,我的整个加热过程中,就不存在全速加热。

你看我的整个理解对吗?如果不对的话,麻烦您告知一声及您的阀值是如何设置的,谢谢!

   

使用特权

评论回复
20
jiero39|  楼主 | 2014-12-10 20:08 | 只看该作者
hjjadg 发表于 2014-12-8 18:29
控制普通继电器不能用PWM,除非是固态继电器。如果是普通继电器,建议做时间上面的**。 ...

是的,我的项目中用的正是固态继电器

使用特权

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

本版积分规则

3

主题

18

帖子

1

粉丝