我正在尝试用 C 创建一个简单的 PID 模拟器。它是一个简单的巡航控制系统,我选择将我的系统建模为低通滤波器。
我很难用 C 语言编写我的数学模型。
我发现了一个非常相似的问题和一个有点有用的答案:
将一阶传递函数转换为 c 代码但是我不完全理解答案。
我想创建一个接受输入的函数(稍后是我的 PID 的输出,但现在我想用一个步骤测试它)和我的采样时间,并为我提供从 0 到稳态的输出。
为简单起见,我想以 0.01 的采样率对以下传递函数 G(s) = 1/(s+10) 进行编程。
应用 tustin 转换后,我最终得到: (0.004762z + 0.004762)/(z-0.9048)
我如何从这里开始用 C 语言编写它?
从上面的链接提供的答案是:
double firstOrderLag(double input, double coeff, double dT, double *state){
// Function to implement the discretization of a continuous time first
// order lag sys = coeff/(s+coeff) using the Tustin (Bilinear) transformation.
double num = (1/(1+2/coeff/dT)); // numerator
double den = (1-2/coeff/dT)*num; // denominator
double temp;
double output;
temp = input - den*(*state);
output = num*(temp + (*state));
*state = temp;
return output;
}
所以在我的特殊情况下 num 将是 0.004762 和 den = -0.9048 我很好奇这是如何从 z 域传递函数中实现的。
我也不清楚指针变量状态是什么,因此很难理解其余的代码。
任何澄清这一点的帮助将不胜感激,因为我觉得如果我清楚地了解这个功能,我将能够在 for 循环中实现它来模拟开环响应、反馈响应并最终集成我的 PID 控制器。