一文搞定PID!嵌入式STM32-PID位置环和速度环_stm32 pid

server/2024/10/17 4:59:03/

在嵌入式系统开发中,PID控制器因其简单有效而被广泛应用。本文将详细介绍如何在STM32微控制器上实现PID控制,包括位置环和速度环的PID算法及其代码实现。

PID基础知识

PID控制器由比例(P)、积分(I)和微分(D)三个部分组成,通过调整这三个参数,可以对系统进行精确控制。PID算法的基本公式如下:

[ u(t) = K_p e(t) + K_i \int_0^t e(\tau) d\tau + K_d \frac{de(t)}{dt} ]

其中,( u(t) )是控制器输出,( e(t) )是偏差(期望值与实际值之差),( K_p )、( K_i )和( K_d )分别是比例、积分和微分增益。

位置环PID

位置环PID控制通常用于需要精确位置控制的场合,如电机控制。在位置环PID中,控制器输出直接对应于被控对象的位置。

位置环PID代码示例
typedef struct _PID {float Kp;         // 比例系数float Ki;         // 积分系数float Kd;         // 微分系数float pre_error;  // 上一次的误差float integral;   // 误差积分
} PID;// PID初始化
void PID_Init(PID *pid, float Kp, float Ki, float Kd) {pid->Kp = Kp;pid->Ki = Ki;pid->Kd = Kd;pid->pre_error = 0.0;pid->integral = 0.0;
}// PID计算
float PID_Calc(PID *pid, float setpoint, float actual) {float error = setpoint - actual;  // 计算偏差pid->integral += error;           // 积分项累加float derivative = error - pid->pre_error;  // 计算微分项float output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;  // 计算输出pid->pre_error = error;  // 更新上一次的误差return output;
}

速度环PID

速度环PID控制通常用于需要精确速度控制的场合,如电机调速。在速度环PID中,控制器输出对应于被控对象的速度。

速度环PID代码示例
typedef struct _SpeedPID {float Kp;         // 比例系数float Ki;         // 积分系数float Kd;         // 微分系数float pre_error;  // 上一次的误差float integral;   // 误差积分
} SpeedPID;// 速度环PID初始化
void SpeedPID_Init(SpeedPID *spid, float Kp, float Ki, float Kd) {spid->Kp = Kp;spid->Ki = Ki;spid->Kd = Kd;spid->pre_error = 0.0;spid->integral = 0.0;
}// 速度环PID计算
float SpeedPID_Calc(SpeedPID *spid, float setpoint, float actual) {float error = setpoint - actual;  // 计算偏差spid->integral += error;          // 积分项累加float derivative = error - spid->pre_error;  // 计算微分项float output = spid->Kp * error + spid->Ki * spid->integral + spid->Kd * derivative;  // 计算输出spid->pre_error = error;  // 更新上一次的误差return output;
}

串级PID

在某些应用中,可能需要同时使用位置环和速度环,这时可以使用串级PID控制。在串级PID中,位置环的输出作为速度环的输入。

串级PID代码示例
typedef struct _CascadePID {PID position_pid;  // 位置环PIDPID speed_pid;     // 速度环PID
} CascadePID;// 串级PID初始化
void CascadePID_Init(CascadePID *cascade_pid, float Kp, float Ki, float Kd) {PID_Init(&cascade_pid->position_pid, Kp, Ki, Kd);PID_Init(&cascade_pid->speed_pid, Kp, Ki, Kd);
}// 串级PID计算
float CascadePID_Calc(CascadePID *cascade_pid, float position_setpoint, float speed_setpoint, float actual_position, float actual_speed) {float position_error = position_setpoint - actual_position;float speed_error = speed_setpoint - actual_speed;float position_output = PID_Calc(&cascade_pid->position_pid, position_setpoint, actual_position);float speed_output = PID_Calc(&cascade_pid->speed_pid, speed_setpoint, actual_speed);return position_output + speed_output;  // 输出为位置环和速度环输出的和
}

调参技巧

调参是PID控制中的关键环节,合理的参数可以使系统达到更好的控制效果。以下是一些基本的调参技巧:

  1. 纯Kp调节:逐渐增加比例系数,直到系统出现轻微振荡。
  2. Ki调节:逐渐增加积分系数,直到系统消除稳态误差。
  3. Kd调节:逐渐增加微分系数,直到系统响应速度变快且振荡减小。

总结

本文详细介绍了在STM32上实现PID控制的方法,包括位置环、速度环和串级PID。通过合理配置PID参数,可以实现对系统的精确控制。希望本文对你有所帮助。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料


http://www.ppmy.cn/server/132063.html

相关文章

专题1:方向导数与梯度

一、回忆偏导数 多元函数(比如有x、y两个变量)在某个点有两个偏导数,一个是关于x的偏导数,一个是关于y的偏导数。如下所示: 所谓偏导数,其实就是某点处函数在x的正方向或y的正方向上的变化率。从图像上来看…

使用JVM分析服务性能问题

在Java应用开发和运维过程中,性能问题往往是一个重要的挑战。而Java虚拟机(JVM)作为Java应用的运行环境,其性能调优对于提升应用性能至关重要。本文将详细介绍如何使用JVM工具分析服务性能问题,并通过实战示例展示具体…

《Image Processing GNN: Breaking Rigidity in Super-Resolution》CVPR2024

摘要 这篇论文提出了一种名为Image Processing Graph Neural Networks (IPG) 的模型,旨在通过利用图的灵活性来突破超分辨率(Super-Resolution, SR)中的固有刚性问题。在现有的SR模型中,无论是基于卷积神经网络(CNNs&…

异配图对比学习24整理

数据集介绍: 大类数据集名称pyg‘cora’ ,‘citeseer’ ,‘pubmed’,‘cornell’,‘texas’,wisconsin’,flickr,reddit,actoryandexchameleon_filtered, squirrel_filtered, roman_empire, amazon_rating…

框架一 Mybatis Spring SpringMVC(东西居多 后边的没怎么处理)

Mybatis 使用简单的XML或注解来配置和映射原生类型、接 口和Java的POJO (Plain Old Java Objects,普通老式Java对象)为数据库中的记录。 ${}和#{}的区别是 ${}替换成变量的值 #{}替换成? Mybatis中,resultType和ResultMap的区别是 如果数据库列名和…

【React】React18核心源码解读

前言 本文使用 React18.2.0 的源码,如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章:VsCode查看React源码全是类型报错如何解决。 阅读源码的过程: 下载源码 观察 package…

Vite+Vue 3+TS环境搭建

文章目录 一、初始化项目二、安装状态管理工具pinia三、安装路由vue-router四、封装请求、响应拦截器、api五、跨域代理六、rem移动端适配七、配置vant库一、初始化项目 使用命令npm init vite创建项目,输入项目名称后语言选择Vue,然后选择TypeScript。然后进入项目使用命令…

基于resnet网络【系列】多类别图像识别、迁移学习:猫狗分类实战

目录 1、前言 2、resnet 猫狗分类实战 2.1 训练 2.2 推理 3、更换数据集训练 1、前言 ResNet(残差网络)是一种深度卷积神经网络架构,广泛用于图像分类任务。它是由微软研究院的研究人员于2015年推出的,以其通过使用残差连接…