在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);
} |