STM32的DSP库中PID的使用介绍

本文介绍如何在STM32上实现PID控制。利用STM32的DSP库中提供的PID函数,通过设置比例、积分、微分参数来完成温度控制应用。文章详细展示了PID结构体的定义及初始化过程。

最近工程需要用到PID控制,正好STM32的DSP库有DIP函数,所以研究了下

先看数据参数:

typedef struct
{
    float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
    float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
    float32_t A2; /**< The derived gain, A2 = Kd . */
    float32_t state[3]; /**< The state array of length 3. */
    float32_t Kp; /**< The proportional gain. */
    float32_t Ki; /**< The integral gain. */
    float32_t Kd; /**< The derivative gain. */
} arm_pid_instance_f32;

使用的时候只需要设置比例、积分、微分的比例因子即可。

/*PID库中的PID参数结构体 是float_32格式数据 */

arm_pid_instance_f32 PID;

/* 1、设置PID参数 */
PID.Kp = PID_PARAM_KP; /* Proporcional --比例参数 */
PID.Ki =  PID_PARAM_KI;         /* Integral         --积分参数*/
PID.Kd = PID_PARAM_KD; /* Derivative     --微分参数*/

/* 2、初始化PID的参数, */

arm_pid_init_f32(&PID, 1);

       void arm_pid_init_f32(arm_pid_instance_f32 * S, int32_t resetStateFlag)

      该函数是通过用户配置了Kp,Ki,Kd后,通过该函数获得A0,A1,A2。第二个参数是初始化标志位,设1即为初始化。

      

while (1) {
			/* 计算误差 */
			float pid_error = TEMP_CURRENT - TEMP_WANT;
			
			/* Calculate PID here, argument is error */
			/* Output data will be returned, we will use it as duty cycle parameter */
			duty = arm_pid_f32(&PID, pid_error);


       

STM32DSP (由 ARM 提供并被 ST 集成到 STM32 的开发环境中)包含了一组用于数字信号处理的函数,其中包括 PID 控制器的实现。该提供了浮点和定点数版本的 PID 控制算法,适用于需要精确控制的应用场景,如电机控制、温度调节等。 ### 函数声明与参数说明 在 DSP 中,`arm_pid_instance_f32` 是用于配置浮点 PID 控制器的数据结构体,其定义如下: ```c typedef struct { float32_t A0; /* 比例项系数 */ float32_t A1; /* 积分项系数 */ float32_t A2; /* 微分项系数 */ float32_t state[3]; /* 状态变量 */ float32_t Kp; /* 比例增益 */ float32_t Ki; /* 积分增益 */ float32_t Kd; /* 微分增益 */ } arm_pid_instance_f32; ``` PID 控制计算通过以下函数完成: ```c static __INLINE float32_t arm_pid_f32(arm_pid_instance_f32 *S, float32_t in); ``` 其中 `S` 为指向 PID 实例的指针,`in` 为当前输入值(例如传感器反馈),返回值为 PID 控制器输出的控制量[^1]。 ### 使用流程 1. **初始化 PID 参数**:根据系统需求设定比例、积分和微分增益 `Kp`, `Ki`, `Kd`。 2. **调用初始化函数**:使用 `arm_pid_init_f32` 对 PID 实例进行初始化,该函数会自动计算出内部使用的系数 `A0`, `A1`, `A2`。 3. **执行 PID 运算**:每次获取新的输入值后,调用 `arm_pid_f32` 函数进行控制量计算。 ### 示例代码 以下是一个简单的使用示例: ```c #include "arm_math.h" // 定义 PID 实例 arm_pid_instance_f32 pid; // 设置 PID 增益 float32_t Kp = 1.0f; float32_t Ki = 0.1f; float32_t Kd = 0.01f; void setup() { // 初始化 PID 实例 arm_pid_init_f32(&pid, Kp, Ki, Kd); } void loop() { float32_t feedback = get_feedback(); // 获取当前反馈值 float32_t control_output = arm_pid_f32(&pid, feedback); // 计算控制输出 apply_control(control_output); // 应用控制输出至执行机构 } ``` ### 工程配置要点 - 在使用 DSP 之前,需确保工程中已正确引入 `arm_math.h` 和对应的 `.lib` 文件。 - 若使用 STM32CubeMX 创建项目,可在配置界面中启用 FPU 并选择包含 DSP 支持。 - 编译时应链接 CMSIS-DSP ,可通过 Keil、IAR 或 GCC 工具链配置静态或源码方式集成[^2]。 ### 注意事项 - 由于 DSP 依赖于 FPU,因此必须在启动文件或系统初始化阶段启用 FPU。 - 输入信号建议进行滤波处理以避免高频噪声影响 PID 输出稳定性。 - 在实时控制系统中,PID 调用频率应足够高,通常与系统的采样率一致。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值