- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 STM32F4 微 Controller 上使用 CMSIS 库开发 PID Controller 。我实在无法理解PID参数的归一化。现在我有了 PID Controller 的三个 Kp、Ki、Kd 参数,我必须将它们放入系统中。我知道它们需要标准化,所以我必须从整数转换为 q15。问题来了。就我而言,我有:
kp = 2.7056
ki = 0.085
kd = 0
据我了解,我需要找到一个因子使这些数字可以在 -32768...32767 中表示,因此我使用 2^13
作为因子:
kp = 2.7056 * 2^13 = 22164
ki = 0.085 * 2^13 = 696
我不明白的是我是否需要除以PID计算的结果。如果我除以,当误差较低时 pid 输出为零:让我们有一个常数误差 e(n) = 2。在PID计算中(我使用函数arm_pid_q15()中here描述的公式):
y(n) = y(n-1) + (kp+ki)*e(n) - kp*e(n-1)
y(n) = y(n-1) + (22164+696)*2 - 22164*2 = y(n-1) + 1392
如果y(n-1) = 0
,y(n) = 1392
。如果除以 2^13
因子,则得到 y(n) = 0
(整数)。
另一方面,如果我不除 PID 输出,就相当于将比例增益乘以 2^13
因子。
有人可以帮我理解这一点吗?谢谢。
最佳答案
我绝不是控制理论方面的专家,但这里有一个实用的方法。
这些 float 只是通用数字,在您定义之前没有任何意义。通常,您会在编译时将它们与有意义的常量相乘,然后也在编译时转换为定点。
该常量应该是诸如 PWM、ADT 的分辨率或您希望整数值表示的任何内容。定义这些值到底代表什么,例如 PWM 占空比刻度。使用适合 MCU 的单元。
你应该有类似这样的东西:
#define kp (int32_t)(2.7056f * PID_SCALE)
#define ki (int32_t)(0.0850f * PID_SCALE)
#define kd (int32_t)(0.0000f * PID_SCALE)
(注意:这可能会或可能不会强制/需要浮点库来与您的程序链接,即使您实际上并未使用它。)
其中 PID_SCALE 是一些合适的整数常量。请注意,如果您正在寻找纯定点调节器,则不应在上述定义之外的任何地方使用浮点类型。我怀疑你的问题可能与此有关,在这种情况下,问题出在 C 代码实现上,而不是控制理论和数学上。
在伪代码中,您最终会得到如下内容:
p = kp * error
check that p is in range, if not set it to min/max
i = prev_i + error
check that i is in range, if not set it to min/max
prev_i = i
i = ki * i
pi = (p + i) / PID_SCALE
这样,您就可以将每一项与常数相乘,分别跟踪I
,并在计算完成后进行除法。
关于c - 如何正确标准化 q15 定点中的 pid 系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57854690/
当我在定点 Z3Py 中启用解释生成选项时,我收到包含以下消息的核心转储。 Error setting 'DL_GENERATE_EXPLANATIONS', reason: unknown opti
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我有一个关于在 MATLAB 中为 Texas Instruments TMS320C64xx DSP 编写算法的问题: 我在 MATLAB 中草率地实现了我的过滤器。我的目标是使用 MATLAB E
我需要将 float 转换为Q31定点,Q31表示1个符号位,0位表示整数部分,31位表示小数部分。这意味着 Q31 只能表示 [-1,0.9999] 范围内的数字。 根据定义,从浮点转换为定点时,会
我正在使用第 3 方定点 antilog() 函数来计算分贝 out_mag = 10^( in_db/20 ) 的幅度。 antilog() 采用 Q6.25 格式作为输入,并在输出时提供 Q16.
我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。我想计算z = y/x,知道abs(x)>abs(y)。因此,z<1,因此可以表示为另一个Q31/
我是一名优秀的程序员,十分优秀!