此心向学 发表于 2010-7-26 23:02

PID控制请教

在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*+KI*E(k)+KD*;(增量型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 计算, 返回的值就是你的控制电压

此心向学 发表于 2010-7-27 14:20

谢谢3,4楼的指教
KP,KI,KD的值具体怎么确定,不知很明白。看资料上说一般不取整数,所以我才用float类型的

highgear 发表于 2010-7-27 20:30

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

此心向学 发表于 2010-7-27 21:24

谢谢前辈指点,看明白你说的了,非常感谢
俺确实没有经验,没有技巧,我再好好琢磨消化一下
呵呵 6# highgear

不亦心 发表于 2010-7-27 21:40

围观,听highgear讲课

xlsbz 发表于 2010-7-27 21:50

PID这个东西 我不太懂,不过我知道有一本书写的很好是个瑞典人写的书 书没在身边   上学时候老师推荐的于是我就买了 将近50元   现在还几乎没看过几页。

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

cao541603 发表于 2010-9-4 10:20

路过学习的

论坛游客 发表于 2010-9-4 10:33

PID这个东西 我不太懂,不过我知道有一本书写的很好是个瑞典人写的书 书没在身边   上学时候老师推荐的于是我就买了 将近50元   现在还几乎没看过几页。

记得一点就是那个响应曲线也比较实用那个极点什么的 ...
xlsbz 发表于 2010-7-27 21:50 https://bbs.21ic.com/images/common/back.gif
要知道系统模型才管用

yuyi21ic 发表于 2010-9-4 15:04

不知道就慢慢的试吧!!!P别选的太大,I 选个零点几试试,一点点的调还是能发现规律的!

rclong 发表于 2010-9-4 15:22

高校里自动控制理论的教材应该都有讲吧

itelectron 发表于 2010-9-4 20:32

highgear讲了FFT   啥时候有闲情 讲讲PID:lol

highgear 发表于 2010-9-4 22:15

pid 对于有控制基础知识的人, 还好讲解, 我可以讲讲线性系统, 零极点配置以及如何实现。对于做 mcu 的人, 我真不知道从哪里讲起, 说些什么, 最多是讲讲公式, 程序也很简单, 没有什么好讲的。以后我尽量的解答 pid 的问题吧。

不亦心 发表于 2010-9-5 09:16

好,顶 15# highgear

论坛游客 发表于 2010-9-5 10:44

PID这个东西 我不太懂,不过我知道有一本书写的很好是个瑞典人写的书 书没在身边   上学时候老师推荐的于是我就买了 将近50元   现在还几乎没看过几页。

记得一点就是那个响应曲线也比较实用那个极点什么的 ...
xlsbz 发表于 2010-7-27 21:50 https://bbs.21ic.com/images/common/back.gif
叫做计算机控制系统 理论与设计
是本英文教材
很多学校的博士生考试指定参考书

论坛游客 发表于 2010-9-5 10:47

PID参数比较容易调的效果调好不容易
一般不知道系统模型的情况下 可以使用临界比例法来确定参数具体的可以查查资料
另外 目前还有一种比PID更好地不需要系统模型的算法,叫做自抗扰控制器,是中科院数学所韩京清研究员提出的,现在不少地方已经有应用了

jzyjsjt 发表于 2020-5-18 16:46

@highgear 点赞
页: [1]
查看完整版本: PID控制请教