3

我正在尝试用 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 控制器。

4

0 回答 0