新闻详情

新闻详情

首页 / 资讯中心 / 详情

双闭环PID控制:位置环与加速度环的设计、实现与参数整定

发布时间:2026/9/9 21:04:00来源:尧图网络
双闭环PID控制:位置环与加速度环的设计、实现与参数整定
简介双闭环PID控制程序面向电机伺服控制场景解决单闭环位置控制下电机满占空比运行、速度不可控的工程痛点。压缩包仅2个文件、约1KB包含1个C语言源文件与1个头文件声明与实现分离结构精简。核心控制思路是将位置环输出与速度环输出进行叠加当位置偏差较大时位置环虽输出极限值但速度环会依据实际速度偏差产生负向调节量抑制总输出从而兼顾定位精度与运行平顺接近目标位置时需关闭速度环避免过调。代码量小但逻辑清晰适合嵌入式开发者、自动化与控制方向学习者研究双闭环PID的工程实现也可作为电机调速/定位项目的移植基础。目前已有21809人学习下载说明该方案在同类资源中关注度较高。 搞运动控制的天天和PID打交道。单环PID调得好系统能跑但碰上负载变化大、轨迹要求高、或者机械结构本身弹性明显的场合单环往往力不从心。我之前在调一个高精度定位平台时试过单纯加大位置环增益结果是低频跟踪没问题一跑加减速段就开始抖后来改成双闭环而且是位置环套加速度环这个相对少见的组合把问题彻底解决了。这篇文章就围绕“双闭环PID程序位置环加速度环”这个主题把我实际调试过程中的设计思路、程序实现、参数整定和踩坑记录都梳理出来给正在做类似项目的朋友一个参考。这套方案适合谁看主要是做伺服/运动控制的嵌入式工程师比如用STM32、DSP做云台、机械臂关节、精密位移台、AGV驱动轮等场景也适合做毕业设计选了“双闭环PID控制”方向的同学。加速度环不像电流环和速度环那么常见但它在抗扰动和动态响应上有一套独特的优势理解它的原理和实现方式对控制系统设计能力的提升很有帮助。1. 双闭环结构的设计思路与选型考虑1.1 为什么是位置环和加速度环而不是经典的位置环加速度环先记住一个基本判断串级控制的本质是把扰动“关在”内环之外。外环只管给内环发指令内环负责摆平各种外部干扰这样外环就能把精力集中在轨迹跟踪上不用跟扰动死磕。经典的三环结构是位置环套速度环再套电流环。电流环在最内层带宽最高速度环居中位置环最外带宽最低。这种结构在工业伺服里是主流因为电机驱动对象天然就有“电流产生力矩→力矩改变速度→速度积分得到位置”这种层级关系每一层都有明确的物理量可测。那为什么还要用加速度环两个原因。第一有些系统没有方便测速的传感器但加速度信号好拿比如直接用加速度计或者用高分辨率编码器对位置做二次微分也能凑合。第二也是最关键的加速度环对惯量变化和力矩扰动更敏感。负载转动惯量一变速度环的增益余量就被吃掉一大块而加速度环的反馈量是角加速度和惯量是线性关系惯量变了反馈量成比例变化相当于环路增益自动调整鲁棒性反而更好。这一点我在做云台的时候体会很深云台上架不同重量的相机速度环参数经常要重调加速度环参数基本没动。另外加速度环带宽理论上比速度环更高。因为速度要经过机械积分滞后大加速度直接反映合外力矩动态快。内环带宽高意味着它能把高频扰动在还没“积累成速度误差”之前就压下去。1.2 加速度反馈对系统刚性和抗扰性的提升逻辑这里讲点能落地的物理直觉不堆公式。加速度环反馈的物理意义相当于给系统人为增加了一个“虚拟质量”。假设你推一个滑块如果只靠位置环去纠偏滑块被拍一下位置误差要经过“误差积累→位置环响应→输出力矩”这个链路的延迟才会被修正。但如果滑块带着加速度计被拍的一瞬间加速度值立刻跳变内环马上输出反向力去顶住这个冲击根本不会让它变成位移误差。这就是内环抗扰的核心逻辑扰动发生在内环的反馈通路之内就会被内环直接抑制掉。加速度环相当于把扰动抑制点从“位置误差”提前到了“加速度变化”这一级整整提前了一个积分环节的时间。在频域上看就是低频扰动抑制能力更强闭环刚度更大。所以如果你的应用场景里存在明显的直接作用于被控对象上的力扰动比如风载、重心偏移、摩擦突变加速度环比速度环更对症。如果你的系统里加速度计噪声处理不好或者执行器带宽很低那老老实实用速度环别盲目追新。2. 加速度信号的获取与处理2.1 三种加速度获取方式的对比加速度反馈听着好但信号从哪来是第一个实际问题。我试过三种方式各有各的坑。第一种直接用加速度计MEMS加速度计比如ADXL345、MPU6050的加速度通道。好处是频率响应宽不受机械安装柔性的影响坏处是噪声大尤其MEMS器件在振动环境下的噪声底很吓人而且温漂明显。第二种用高分辨率编码器的位置信号做二次微分。这个方法省硬件但微分一次就放大一次噪声二次微分之后噪声大到几乎不可用必须配强滤波滤波一强相位滞后就上来了反而吃掉带宽。第三种用控制指令估算即把电流环给定值或者占空比换算成预估加速度减去摩擦和重力补偿项。这个方法没有额外传感器成本但依赖模型准确度模型一偏反馈量失真控制效果甚至不如不带反馈。我做项目时加速度计和编码器二次微分两条路都走过。实话说低成本的编码器二次微分方案基本是死路除非码盘分辨率极高且机械安装非常刚性。后来用了加速度计方案关键在滤波。2.2 滤波器选型和相位滞后控制加速度计信号进控制环路之前滤波是绕不开的一步。但这步处理不好整个环路可能白搭——滤波滞后太大相位裕度直接被吃掉系统振荡甚至发散。我的做法是两步滤波硬件上加速度计输出端并一个小电容做一阶RC预滤波截止频率设在控制带宽5倍以上主要滤掉高频毛刺软件上再做一个二阶Butterworth低通截止频率在线调。这里有个工程经验低通滤波器的截止频率至少要高于你期望的加速度环开环穿越频率的3到5倍。为什么因为滤波器在截止频率附近会引入约45度到90度的相位滞后如果滞后的拐点落在穿越频率附近相位裕度就不够了。你把截止频率抬高到穿越频率的5倍以上滤波器在穿越频率处的相位滞后就只有十几度对系统稳定性影响可以接受。滤波之后还要注意一个细节加速度计安装位置。尽量靠近被控对象的质心离质心越远转动加速度和线加速度耦合越严重反馈信号里混入的交叉耦合量越大环路就越容易莫名振荡。3. 核心程序实现基于C语言的双闭环PID3.1 整体代码架构与执行周期分配先交代一下程序运行的背景。控制器我用的是MCUSTM32F4系列定时器中断固定频率2kHz作为控制节拍。加速度环需要快放在这个2kHz中断里执行位置环不需要那么快用软件分频每5个节拍执行一次即400Hz。这样省一个定时器资源逻辑也清晰。一点说明关于PID算法的具体公式、增量式/位置式的区别网上资料很多我不重复教科书内容只讲这个双闭环工程里的实现取舍。位置环和加速度环我用的都是增量式PID输出限幅配合积分分离和微分滤波。增量式的最大好处是天然带抗积分饱和能力因为输出的是增量累计值靠执行器本身的积分特性维持。加速度环毕竟在最内层反应灵敏输出增量太大会让执行器猛冲所以加速度环输出限幅一定要做小位置环输出即加速度环的给定限幅也要做。3.2 位置环与加速度环的PID核心代码先定义PID结构体包含比例、积分、微分系数以及上一拍的误差、输出、积分累计等状态变量。typedef struct { float Kp; // 比例系数 float Ki; // 积分系数 float Kd; // 微分系数 float T; // 控制周期单位秒 float err_now; // 当前误差 float err_last; // 上一拍误差 float err_pre; // 上上拍误差 float d_out; // 微分项输出 float d_last; // 上一拍微分项输出 float d_filter; // 微分低通系数 float out; // 本拍输出 float out_last; // 上一拍输出 float out_limit; // 输出限幅绝对值 float integral; // 积分累计值位置式用 } PID_TypeDef;初始化函数没什么好说的主要是把所有字段清零把控制周期传入。重点看核心计算函数。float PID_Calc_Inc(PID_TypeDef *pid, float ref, float fdb) { pid-err_now ref - fdb; // 微分项不完全微分带一阶低通抑制噪声放大 float d_diff (pid-err_now - pid-err_last) / pid-T; pid-d_out pid-d_last pid-d_filter * (d_diff - pid-d_last); pid-d_last pid-d_out; // 增量式PID输出 float inc pid-Kp * (pid-err_now - pid-err_last) pid-Ki * pid-err_now * pid-T pid-Kd * pid-d_out; // 输出限幅 pid-out inc; if (pid-out pid-out_limit) pid-out pid-out_limit; else if (pid-out -pid-out_limit) pid-out -pid-out_limit; pid-err_pre pid-err_last; pid-err_last pid-err_now; pid-out_last pid-out; return pid-out; }注意代码里的微分项处理。我没有直接用简单的Kd*(err_now-err_last)/T而是做了一阶低通滤波。原因是加速度环的反馈信号本身噪声就不小再对误差做纯微分高频噪声会被放大到能听见执行器“滋滋”响的程度。然后再看主控制函数。这个函数在2kHz定时器中断里被调用内部用分频变量区分位置环和加速度环的执行时机。#define POS_LOOP_DIV 5 // 2kHz中断每5次执行一次位置环即400Hz static uint8_t pos_div_cnt 0; static float pos_ref 0.0f; // 位置给定单位mm或deg static float pos_fdb 0.0f; // 位置反馈 static float acc_ref 0.0f; // 加速度给定位置环输出 static float acc_fdb 0.0f; // 加速度反馈 PID_TypeDef pid_pos; // 位置环 PID_TypeDef pid_acc; // 加速度环 void Control_Loop(void) { // 每拍都执行加速度环 acc_fdb Get_AccFeedback(); // 读取加速度信号已经滤波 float acc_cmd PID_Calc_Inc(pid_acc, acc_ref, acc_fdb); Motor_SetCurrent(acc_cmd); // 输出给电流/电压执行层 // 分频执行位置环 if (pos_div_cnt POS_LOOP_DIV) { pos_div_cnt 0; pos_fdb Get_PosFeedback(); // 读取编码器位置 float pos_cmd PID_Calc_Inc(pid_pos, pos_ref, pos_fdb); acc_ref pos_cmd; // 位置环输出作为加速度环给定 acc_ref Limit(acc_ref, ACC_REF_LIMIT); // 位置环输出限幅 } }这段代码有三个细节值得单独讲。第一加速度环的执行频率始终是2kHz不管位置环是否执行这保证了内环的快速性。第二位置环输出的限幅ACC_REF_LIMIT非常重要它规定了系统允许的最大加速度。这相当于给运动过程做了一个物理约束防止位置环在误差很大时要求一个不切实际的加速度导致执行器饱和。第三位置环输出给加速度环用的是同一个变量acc_ref两个环没有用缓冲数组接力因为位置环执行完毕到下一个加速度环执行之间只有0.5ms这种直接赋值的延迟可以忽略。3.3 程序中的限幅、抗饱和与积分处理细节增量式PID理论上不需要积分限幅因为积分项被隐含在累计输出里。但我在实际调的时候发现一个问题如果位置环长时间有稳态误差增量式PID的累计输出会慢慢漂到限幅值此时一旦误差反向由于累计值已经很大系统需要很长时间才能“退出来”表现为电机在反向启动时明显迟滞。这就是积分饱和增量式同样会染上只是表现得更隐蔽。解决办法是加一个积分分离逻辑。当误差绝对值超过设定阈值时把Ki临时置零只用PD控制。这个阈值一般设为满量程的5%到10%。调好之后大误差下系统快速逼近目标小误差下积分慢慢消除稳态误差效果立竿见影。还要注意一点加速度环的输出限幅不代表实际力矩限幅。如果你的执行器是通过PWM控制驱动器的电压模式那输出限幅对应的是电压上限如果是力矩模式对应的是力矩上限。限幅的绝对值要根据执行器额定值来定不要想当然给个大值。过大的内环限幅相当于没有限幅执行器照样饱和。4. 参数整定方法与调试心得4.1 由内向外整定先加速度环再位置环串级控制的整定顺序只有一个原则先内后外。外面环路的参数设计是以内环闭环特性为前提的你先把内环整出来得到它的闭环带宽和响应特性再决定外环能开多大增益。加速度环整定时先把位置环的Kp、Ki全设为0也就是让位置环“失效”直接给加速度环一个固定阶跃给定观察加速度反馈的阶跃响应。从一个比较保守的Kp开始比如0.5逐步加大直到响应出现等幅振荡然后回调一半到三分之二这就是比较稳的Kp。Ki加不加看稳态性能如果加速度阶跃响应有稳态误差加一点Ki没有就干脆不加积分项在这个环里容易引起超调。这里有一个我自己反复验证的经验加速度环的增益不能一味追求高。因为这个环离执行器最近增益高了以后执行器的输出电压会剧烈波动机械结构被高频激励听到尖锐的啸叫甚至噪声这就是增益过高的信号。把增益收到噪声消失的位置往往就是接近最佳值的位置。4.2 频率分配比例和系统带宽预估再讲一个决定双闭环能否稳定的核心参数内外环带宽的比例关系。工程上有个经验法则外环带宽要低于内环带宽的1/5到1/10。为什么要有这个比例因为外环看到的被控对象不是原始电机而是已经带内环闭环的新对象。这个新对象在低于内环带宽的频率范围内可以近似看成是一个一阶惯性环节滞后很小但一旦频率接近内环带宽内环的相位滞后就会叠加到外环上。外环如果在接近内环带宽的频率还保持高增益稳定裕度就不够了。实际操作中怎么预估先通过阶跃响应的上升时间估算加速度环闭环带宽。比如加速度环阶跃上升时间是20ms那么闭环带宽大约在0.35/t_r0.35/0.0217.5Hz。位置环带宽就取这个值的1/7左右也就是2.5Hz。然后位置环的增益可以从这个带宽目标反推位置环开环传递函数在穿越频率附近的斜率一般是-20dB/dec所以Kp大致等于期望的穿越频率乘以系统的等效增益系数。这个推导比较粗略但给了一个起步值后续再微调。4.3 调试工具与波形观察方法没有波形看调双闭环就是在盲人摸象。我调试时用STM32的DAC引脚直接输出内部变量再用示波器看波形。具体做法是初始化一个DAC通道把加速度给定、加速度反馈、位置误差等关键变量通过DAC_SetValue实时输出。DAC输出范围是0到3.3V变量需要做线性映射。比如加速度计输出范围是±4g映射到0到3.3V0g对应1.65V。这样一个示波器探头就能看到加速度环的阶跃响应和扰动波形比串口打印直观得多也快得多。这个方法调试效率提升非常明显强烈推荐。串口打印在2kHz的控制周期里根本跑不动打印一帧数据就要占好几个控制周期时序全乱了。DAC输出没有时序负担示波器上看到的波形就是控制器的真实行为。5. 常见问题与排查技巧实录5.1 加速度环高频振荡噪声还是相位不足加速度环最容易遇到的问题就是高频振荡症状是电机高频抖动伴随尖锐噪声加速度反馈波形上是密密麻麻的毛刺叠加正弦波。排查思路分两步。第一步先看噪声底。把加速度环增益降为零只让电机静止此时加速度反馈波形上的噪声幅度如果已经超过控制精度的10%说明信号质量本身不行得加重滤波或者换加速度计安装位置。第二步如果噪声底没问题那就是增益过高或者相位裕度不足。解决办法有降低加速度环Kp把微分低通系数调小即加强滤波或者把加速度环的执行频率降低来减少滞后。我遇到过一次情况很特殊把滤波截止频率从200Hz降到150Hz振荡反而更严重了。原因在于150Hz处滤波器相位滞后迅速增大而环路增益在这个频率还有余量形成了新的谐振点。后来是提高截止频率到250Hz同时把Kp降一点问题才解决。这个案例说明滤波器的截止频率不是越低越好要在噪声衰减和相位滞后之间找平衡最好用扫频或变频试验验证。5.2 位置环低速时出现爬行和抖动位置环在低速跟踪时会不时出现爬行现象实际位置一会儿往前走一小步一会儿停一下宏观上看起来像在“一格一格”地挪。这个问题的根源往往不在位置环而在加速度环的性能不足。低速时位置误差很小位置环输出给加速度环的给定也很小。如果加速度环本身有死区或者静差小加速度给定就驱动不动误差一直在累积直到累积到一定程度越过死区电机才动一下这就形成了爬行。解决思路有两条线。一条是提高加速度环的零速附近增益消除静差。另一条是给位置环加一个前馈项根据目标速度预估出加速度偏置直接叠加到加速度给定上。第二种方法更实用因为系统在正常运动时目标速度是已知的前馈可以把绝大部分控制任务从反馈中分走位置环只需要处理剩余误差。加了前馈之后低速爬行问题基本消除了。5.3 双闭环联调时的耦合振荡单独整定内环和外环都没问题合在一起却振荡了这是双闭环联调最常见的坑。现象是系统看起来在稳定运行但位置上叠加了一个低频正弦摆动周期大概几十毫秒到几百毫秒。排查思路是确认振荡频率落在哪个环节。用DAC观察位置误差和加速度给定两个波形如果发现加速度给定的振荡频率和位置误差的振荡频率基本一致且滞后约90度那就是内外环之间形成了耦合谐振。原因一般是外环带宽取得太高靠近了内环闭环带宽导致外环在穿越频率附近的相位滞后超过了安全范围。解决方法把位置环Kp降下来把位置环Ki也相应降低让位置环带宽远离加速度环带宽。如果应用确实需要更高的位置环带宽那就要反过来提高加速度环带宽换更高带宽的加速度计、降低滤波器截止频率的滞后影响、或者提高控制器执行频率。双闭环的性能天花板永远取决于内环能推多高。写在最后说点实战体会。双闭环PID里位置环加加速度环这个组合不常见但在特定场景下确实能解决速度环解决不了的问题。调试这套系统我最深的感触是串级控制调试的功夫多半花在信号链路上而不是PID公式上。加速度信号的滤波、安装、校准任何一个环节偷懒后面参数无论如何调都是事倍功半。给正在做类似项目的朋友一个建议先把加速度环这个内环的波形调到你觉得“干净”为止再碰位置环。内环不干净外环一定会尝到苦果。另外如果项目进度允许做一个简单的上位机波形记录工具串口加Python曲线绘制就行调试效率会再上一个台阶。控制程序本身没有多复杂真正复杂的都是藏在波形背后的物理细节而这些只能靠一次次试出来的经验去填平。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

TanStack Query(React Query)Network Mode 全解析:online / always / offlineFirst 三种联网模式的实现原理与实战配置 2026/9/9 21:40:07

TanStack Query(React Query)Network Mode 全解析:online / always / offlineFirst 三种联网模式的实现原理与实战配置

TanStack Query(React Query)Network Mode 全解析:online / always / offlineFirst 三种联网模式的实现原理与实战配置 【免费下载链接】query 🤖 Powerful asynchronous state management, server-state utilities and data fetc…

阅读更多 →
含可再生能源与储能的微电网多阶段鲁棒调度MATLAB复现 2026/9/9 21:40:07

含可再生能源与储能的微电网多阶段鲁棒调度MATLAB复现

MATLAB|含可再生能源和储能的区域微电网多阶段鲁棒调度模型:完整复现与调参思路大概一年前,我接到一个区域微电网项目,用户的核心诉求是“把可再生能源不确定性考虑进去,运行方案不能一遇到波动就废掉”。最开始我用的是常规的确定…

阅读更多 →
中考英语情态动词全攻略:核心考点、易错点与备考策略 2026/9/9 21:40:07

中考英语情态动词全攻略:核心考点、易错点与备考策略

1. 项目概述:为什么情态动词是中考英语的“必争之地”中考英语语法模块里,能让考生稳稳拿分又容易丢分的知识点并不多,情态动词绝对算一个。单看单选题,每年各地中考试卷中涉及情态动词的题目几乎稳定在2~4道,覆盖单项…

阅读更多 →
curl 手册页生成器 managen 完全指南:从选项文档到 curl.1 的自动化流水线 2026/9/9 21:40:07

curl 手册页生成器 managen 完全指南:从选项文档到 curl.1 的自动化流水线

curl 手册页生成器 managen 完全指南:从选项文档到 curl.1 的自动化流水线 【免费下载链接】curl A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, …

阅读更多 →
DeepSeek V4.1 Flash内测:速度飙升、性能暴涨,150人扩招开启成人礼? 2026/9/9 21:40:07

DeepSeek V4.1 Flash内测:速度飙升、性能暴涨,150人扩招开启成人礼?

【DeepSeek V4.1 Flash开启内测】没有任何预告,DeepSeek V4.1 Flash的中间版本deepseek-v4.1-flash-expires-on-0910开始内测。DeepSeek官方称,“DeepSeek V4.1 Flash采用了新的模型结构,原生多模态支持、能力更强、速度更快、且成本更低”。…

阅读更多 →
JavaWeb购物商城实战:Servlet+Tomcat+MySQL从开发到部署 2026/9/9 21:37:06

JavaWeb购物商城实战:Servlet+Tomcat+MySQL从开发到部署

简介:这是一份面向JavaWeb初学者的购物商城项目,基于JSPServletMySQL实现,覆盖用户注册登录、商品浏览、购物车管理、订单提交与管理员后台等完整电商流程,适合用来理解MVC分层、DAO模式以及会话与请求处理。压缩包共270个文件&am…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞