这里我们有比例积分微分控制器的基本公式。这是维基百科页面上关于该主题的公式
我想在我的系统中实现这种类型的控制器。目前,系统(软件中的功能)被输入一个 psi 值,并被告知将模拟输出设置为一个值,以便达到该压力。该函数,让我们称之为它SetPressure(int psi)
,可以访问 psi 与模拟信号输出的表,它进行快速二进制搜索并找到最接近的匹配并将模拟输出设置为该匹配。
当机器/阀门“磨损”时,这还不够好。
所以现在我可以使用压力传感器来告诉我我试图控制的管路中的实际压力。它为我的功能提供了模拟输入。我想弄清楚,给定这些命令值和实际值,如何创建软件 PID。
所以,第一个值很容易;P. 这是通过确定值中的误差error = DesiredValue - ActualValue
并将其乘以某个比例增益来发现的Kp
。所以P = Kp*error
这很容易理解。经过一些调整,我应该找到一个合适的值,Kp
这样我就可以更好地控制压力。
但是,如果我想找到 I 和 D 怎么办?
这个PID运行的软件是实时的。它每隔几毫秒被调用一次,读取输入并根据其状态确定输出。
我想首先,我从这里去哪里得到 I 和 D。我知道这些术语中的每一个都有收益,但我不确定我如何计算整个术语。
例如,我是否需要保存每个时间 t 的每个计算误差,以便我可以找到积分?这似乎会浪费内存,保存每个时刻的每个错误会在几秒钟内累积到一个巨大的列表中。
任何帮助表示赞赏。如果需要,请要求澄清,并注意这是我第一次使用这样的东西。
.
到目前为止的代码示例:
(anaOutput[PRESS_OUT_DAC] 已经在上面的模拟 vs psi 表的代码中确定)
float KpPressure = 1; // These gains are to be determined
float KiPressure = 1;
float KdPressure = 1;
float MVout = anaOutput[PRESS_OUT_DAC]; // Init to output
if(anaInput[PRESS_IN_DAC] != anaOutput[PRESS_OUT_DAC])
{
// error = SetPoint - ProcessValue
float error = (float)anaOutput[PRESS_OUT_DAC] - (float)anaInput[PRESS_IN_DAC];
// Pout = Kp * error
float Pout = KpPRessure * error;
// Iout = Ki * Int(0,t)[error(t)]
float Iout = KiPressure * 1; //// What should 1 be?
// Dout = Kd * (d/dt)[error(t)]
float Dout = KdPressure * 1; //// What should 1 be?
// Manipulated Output = Combination of PID
MVout = P + I + D;
}
if(MVout > MAX_SIGNAL)
MVout = MAX_SIGNAL;
anaOutput[PRESS_OUT_DAC] = (UWORD)MVout + ANALOG_ZERO;