有没有人知道如何将前馈运算放大器PID循环转换为C代码?我试图做这样的转换,说实话,不知道从哪里开始。我可以通过ADC,电压,电流等获得所有输入值,但编码前馈PID对我来说有点新鲜。有什么想法吗?
答案 0 :(得分:1)
您正在谈论用非线性控制系统的软件替换硬件。我认为你唯一的希望就是写一个硬件模拟。
我对PID没有任何了解,但谷歌的快速搜索发现了这一点:
http://www.cds.caltech.edu/~murray/books/AM05/pdf/am06-pid_16Sep06.pdf
它具有似乎描述理想PID控制系统的方程式和图形。您可以从编写实现这些方程式的代码开始。
在我想到你的问题之后,在我看来这可能是一个常见的问题。我在谷歌搜索“离散PID控制器模拟”,发现了Simulink,Matlab和Python的答案,以及更多的书籍参考。
您可能想要从Python配方开始。使用Python比使用Python更容易,更快,如果使用SciPy,您可以绘制结果并确保获得所需的数字。一旦你使用Python工作,然后根据需要移植到C.
http://code.activestate.com/recipes/577231-discrete-pid-controller/
答案 1 :(得分:1)
看起来像你要使用C模拟的模拟电路看起来像这样
Ci
|------| |--------------|
| Rp |
|----/\/\/\/\-----------|
| Rd Cd |
Rf |----/\/\/\---| |-------|
Vin o----/\/\/\---| |
| |\ |
| | \ |
|----|- \ |
| \ |
| \-------------|---------o Vout
| /
| /
|+ /
----| /
| |/
|
|
___|___ GND
_____
___
_
LEGEND:
Vin is the input signal.
Vout is the Output.
Rp controls the propotional term ( P in PID)
Ci controls the Integral term ( I in PID)
Rd and Cd controls the differential term ( D in PID)
Rf is the gain control, which is common to all of the above controllers.
我强烈建议你使用this source的电路进行学习。
即使设置有点繁琐,但在数学上它更容易分析,因为你可以直接将它与标准的数学形式联系起来而不是理想的数学形式。
最后,Vout会控制电机或任何需要控制的电机。 Vin是过程变量电压。
我假设您正在读取某种模数转换器的信号。如果没有,那么你必须模拟信号作为输入。
如果使用标准格式,
假设循环运行时间足够小(一个缓慢的过程),我们可以使用以下函数来计算输出,
PIDoutput = Kp * err + (Ki * int * dt) + (Kd * der /dt);
,其中
Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int = int from previous loop + err; ( i.e. integral error )
der = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.
最初'和' int'将是零。如果你在代码中使用延迟函数将循环频率调整为1 KHz,那么你的dt将是0.001秒。
现在前馈系统的输出将是,
FeedForwardOutput = Kf * Vin;
,其中 Kf =前馈系统的比例常数。
因此,带PID控制器的前馈系统的总输出为
Output = FeedForwardOutput + PIDoutput;
检查此link以进一步阅读带PID控制器的前馈系统。
我在C中找到了this优秀的PID代码,虽然它并没有覆盖它的每个方面,但它仍然很好。
//get value of setpoint from user
while(1){
// reset Timer
// write code to escape loop on receiving a keyboard interrupt.
// read the value of Vin from ADC ( Analogue to digital converter).
// Calculate the output using the formula discussed previously.
// Apply the calculated outpout to DAC ( digital to analogue converter).
// wait till the Timer reach 'dt' seconds.
}
如果我们采取缓慢的过程,那么我们可以使用较低的频率,使得dt>>>单循环的代码执行时间(远远大于)。在这种情况下,我们可以取消定时器并使用延迟功能。