打印

PID控制请教

[复制链接]
2991|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
此心向学|  楼主 | 2010-7-26 23:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在21上找了很多PID控制方面的资料,看了之后还是晕

如果要PID控制电源恒功率输出,应该怎么做啊???

只是单纯的PID控制电压来实现恒功率嘛???各位大侠给个思路,谢谢。

下面是一段增量PID的代码,也不知道些的对不对,请个位帮忙看看,给出出主意,感激不尽。

#include<avr/io.h>
#define KP 4//这些值是假定值(不知道P,I,D这几个值具体怎么确定。晕)
#define KI 2
#define KD 3
struct IncPID//增量PID结构体定义
{
float SetValue; //设定目标
float CurrentValue;//当前采样值
float LastValue;//上一次输出值
// float SumError; //误差累计
// float Proportion; //比例常数 Proportional Const
// float Integral; //积分常数 Integral Const
// float Derivative; //微分常数 Derivative Const
float LastError; //Error[-1]
float PrevError; //Error[-2]
}PID;

int main(void)
{
while(1);
}
//增量PID结构初始化
void IncPID_Init(void)
{
PID.SetValue = 0; //设定目标
PID.CurrentValue = 0;//当前采样值
PID.LastValue = 0;//上一次输出值
// PID.SumError = 0; //误差累计
// PID.Proportion = KP; //比例常数 Proportional Const
// PID.Integral = KI; //积分常数 Integral Const
// PID.Derivative = KD; //微分常数 Derivative Const
PID.LastError = 0; //E(k-1)
PID.PrevError = 0; //E(k-2)
}

/*********************************
PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)
函数入口: SV(设定值),CV(实际采样值)
函数出口: NewValue(新输出值)
//PID运算函数
********************************/
float PID_Operation (float SV,float CV)   
{
float CurrentError,IncValue,NewValue;//E(k),PID增量值,新输出值
PID.SetValue = SV;
PID.CurrentValue = CV;
CurrentError = PID.SetValue - PID.CurrentValue;//E(k)
IncValue = KP * (CurrentError - PID.LastError) + KI * CurrentError + KD * (CurrentError - 2 * PID.LastError + PID.PrevError);
NewValue = IncValue + PID.LastValue;
PID.LastValue = NewValue;
PID.LastError = CurrentError;
PID.PrevError = PID.LastError;
return(float)(NewValue);
}

相关帖子

沙发
不亦心| | 2010-7-27 08:28 | 只看该作者
打酱油的路过

使用特权

评论回复
板凳
yewuyi| | 2010-7-27 08:47 | 只看该作者
功率=I*V,检测电流然后控制电压输出大小即可,直接使用简单的比例即可,不需要微分和积分环节。

使用特权

评论回复
地板
highgear| | 2010-7-27 08:52 | 只看该作者
程序似乎是对的。但是有点啰嗦, 特别是在 mcu 下。除非计算间隔很大(> 100 ms), 否则轻易不要使用 float 类型. 上面的 PID 完全可以使用16bit 与 32bit 的整数运算实现。

控制电源恒功率输出, 要求有功率的测量或计算。将得到的功率与设定带入 PID_Operation 计算, 返回的值就是你的控制电压

使用特权

评论回复
5
此心向学|  楼主 | 2010-7-27 14:20 | 只看该作者
谢谢3,4楼的指教
KP,KI,KD的值具体怎么确定,不知很明白。看资料上说一般不取整数,所以我才用float类型的

使用特权

评论回复
6
highgear| | 2010-7-27 20:30 | 只看该作者
KP,KI,KD的值不取整数与用整数运算是两回事。例如, 假如你的最大电压是200V, 则把 200V 作为单位 1, 对应运算中的 32768, 则电压可以单位化:
Vdigital = V * 32768 / Vmax
这样 100V为 0.5PU, 被转换成运算中的 16384, 诸如此类。
不过, 这需要一定的技巧, 如果没有太多经验, 还是使用 float 吧。

使用特权

评论回复
7
此心向学|  楼主 | 2010-7-27 21:24 | 只看该作者
谢谢前辈指点,看明白你说的了,非常感谢
俺确实没有经验,没有技巧,我再好好琢磨消化一下
呵呵 6# highgear

使用特权

评论回复
8
不亦心| | 2010-7-27 21:40 | 只看该作者
围观,听highgear讲课

使用特权

评论回复
9
xlsbz| | 2010-7-27 21:50 | 只看该作者
PID这个东西 我不太懂,不过我知道有一本书写的很好  是个瑞典人写的书 书没在身边   上学时候老师推荐的  于是我就买了 将近50元   现在还几乎没看过几页。

记得一点  就是那个响应曲线也比较实用  那个极点什么的也比较实用 那个相位的理论忘记了是否实用

使用特权

评论回复
10
cao541603| | 2010-9-4 10:20 | 只看该作者
路过学习的

使用特权

评论回复
11
论坛游客| | 2010-9-4 10:33 | 只看该作者
PID这个东西 我不太懂,不过我知道有一本书写的很好  是个瑞典人写的书 书没在身边   上学时候老师推荐的  于是我就买了 将近50元   现在还几乎没看过几页。

记得一点  就是那个响应曲线也比较实用  那个极点什么的 ...
xlsbz 发表于 2010-7-27 21:50

要知道系统模型才管用

使用特权

评论回复
12
yuyi21ic| | 2010-9-4 15:04 | 只看该作者
不知道就慢慢的试吧!!!P别选的太大,I 选个零点几试试,一点点的调还是能发现规律的!

使用特权

评论回复
13
rclong| | 2010-9-4 15:22 | 只看该作者
高校里自动控制理论的教材应该都有讲吧

使用特权

评论回复
14
itelectron| | 2010-9-4 20:32 | 只看该作者
highgear  讲了  FFT   啥时候有闲情 讲讲PID:lol

使用特权

评论回复
15
highgear| | 2010-9-4 22:15 | 只看该作者
pid 对于有控制基础知识的人, 还好讲解, 我可以讲讲线性系统, 零极点配置以及如何实现。对于做 mcu 的人, 我真不知道从哪里讲起, 说些什么, 最多是讲讲公式, 程序也很简单, 没有什么好讲的。以后我尽量的解答 pid 的问题吧。

使用特权

评论回复
16
不亦心| | 2010-9-5 09:16 | 只看该作者
好,顶 15# highgear

使用特权

评论回复
17
论坛游客| | 2010-9-5 10:44 | 只看该作者
PID这个东西 我不太懂,不过我知道有一本书写的很好  是个瑞典人写的书 书没在身边   上学时候老师推荐的  于是我就买了 将近50元   现在还几乎没看过几页。

记得一点  就是那个响应曲线也比较实用  那个极点什么的 ...
xlsbz 发表于 2010-7-27 21:50

叫做计算机控制系统 理论与设计
是本英文教材
很多学校的博士生考试指定参考书

使用特权

评论回复
18
论坛游客| | 2010-9-5 10:47 | 只看该作者
PID参数比较容易调的  效果调好不容易
一般不知道系统模型的情况下 可以使用临界比例法来确定参数  具体的可以查查资料
另外 目前还有一种比PID更好地不需要系统模型的算法,叫做自抗扰控制器,是中科院数学所韩京清研究员提出的,现在不少地方已经有应用了

使用特权

评论回复
19
jzyjsjt| | 2020-5-18 16:46 | 只看该作者
@highgear 点赞

使用特权

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

本版积分规则

0

主题

70

帖子

1

粉丝