跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

PID 控制算法:手动与自动模式切换机制

PID 控制中直接强制覆盖输出值会导致积分饱和及状态突变。通过引入手动/自动模式标志位,可在不中断内部计算逻辑的前提下安全切换控制权。本文展示了基于 C++ 的实现方案,重点在于 Compute 函数中的模式判断,确保仅在自动模式下更新输出和积分项,从而避免切换时的冲击。

beaabea发布于 2023/6/21更新于 2026/8/1743 浏览
PID 控制算法:手动与自动模式切换机制

为什么 PID 需要手动/自动模式

在调试 PID 算法时,我们偶尔需要强制系统输出某个特定值。最直接的做法是忽略计算结果,直接覆盖输出。虽然这看似简单,但实际工程中是个隐患。

想象一下,你让 PID 控制器辛苦计算,算出的结果却被你强行置零。这种行为会让控制器产生'积分饱和'现象:它以为自己在努力调节,实际上输出没变,于是它会不断增大误差积分项(ITerm),试图推动输出。当你停止覆写并切回 PID 控制时,巨大的积分项会导致输出瞬间飙升,造成系统震荡甚至损坏设备。

PID 控制示意图

解决方案:模式切换

解决这个问题的标准做法是引入状态标志,区分'手动'和'自动'模式。手动模式下,由外部指定输出;自动模式下,由 PID 算法接管。通过这种方式,我们既能保留 PID 的内部逻辑,又能安全地切换控制权。

下面是一个基于 C++ 的实现示例,核心在于 Compute 函数中的模式判断:

/* 工作变量 */
unsigned long lastTime;
double Input, Output, Setpoint;
double ITerm, lastInput;
double kp, ki, kd;
int SampleTime = 1000; // 采样周期 1 秒
double outMin, outMax;
bool inAuto = false; // 模式标志:false=手动,true=自动
#define MANUAL 0
#define AUTOMATIC 1

void Compute() {
    // 关键:如果不在自动模式,直接返回,不更新任何内部变量
    if(!inAuto) return;
    
    unsigned long now = millis();
    int timeChange = (now - lastTime);
    
    if(timeChange >= SampleTime) {
        /* 计算所有误差变量 */
        double error = Setpoint - Input;
        ITerm += (ki * error);
        
        /* 积分限幅 */
        if(ITerm > outMax) ITerm = outMax;
        else if(ITerm < outMin) ITerm = outMin;
        
        double dInput = (Input - lastInput);
        
        /* 计算 PID 输出 */
        Output = kp * error + ITerm - kd * dInput;
        
        /* 输出限幅 */
        if(Output > outMax) Output = outMax;
        else if(Output < outMin) Output = outMin;
        
        /* 保存变量供下次使用 */
        lastInput = Input;
        lastTime = now;
    }
}

void SetTunings(double Kp, double Ki, double Kd) {
    double SampleTimeInSec = ((double)SampleTime)/1000;
    kp = Kp;
    ki = Ki * SampleTimeInSec;
    kd = Kd / SampleTimeInSec;
}

void SetSampleTime(int NewSampleTime) {
    if (NewSampleTime > 0) {
        double ratio = (double)NewSampleTime / (double)SampleTime;
        ki *= ratio;
        kd /= ratio;
        SampleTime = (unsigned long)NewSampleTime;
    }
}

void SetOutputLimits(double Min, double Max) {
    if(Min > Max) return;
    outMin = Min;
    outMax = Max;
    if(Output > outMax) Output = outMax;
    else if(Output < outMin) Output = outMin;
    if(ITerm > outMax) ITerm = outMax;
    else if(ITerm < outMin) ITerm = outMin;
}

void SetMode(int Mode) {
    inAuto = (Mode == AUTOMATIC);
}

这个方案的核心在于 if(!inAuto) return;。当处于手动模式时,Compute 函数会立即退出,不会更新 ITerm 或 Output。这意味着即使你在手动调节,PID 的积分项也不会继续累积,从而避免了切换回自动模式时的冲击。

你可能会问,为什么不直接在调用 Compute 的地方加个判断?这样做虽然也能达到效果,但将逻辑封装在 Compute 内部更稳健。这样无论上层如何调用,只要模式未变,内部状态就是安全的。更重要的是,它让我们清楚地知道何时更改了模式,便于后续的状态追踪和调试。

目录

  1. 为什么 PID 需要手动/自动模式
  2. 解决方案:模式切换
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Spring 中 @Controller 与 @RestController 的区别详解
  • VS Code 禁用 GitHub Copilot 代码补全方法
  • Java 二叉树基础概念、遍历与基本操作
  • vLLM+Open-WebUI 部署 Meta-Llama-3-8B-Instruct 实战
  • Nginx 502 Bad Gateway:基于上游日志与 FastCGI 超时的深度排查
  • MySQL 与 MCP 集成:从环境构建到 AI 数据交互全流程
  • JavaScript 浮点数精度丢失与金额分摊解决方案
  • 基于 LangChain 搭建本地知识库系统
  • OpenClaw 跨平台安装与配置实战指南
  • Z-Image Turbo 本地部署与使用指南
  • Stable Diffusion WebUI 为何被淘汰:ComfyUI 的崛起与 AIGC 工具迭代
  • 三款主流云电脑部署 DeepSeek 模型实测对比
  • Linux 匿名管道通信:原理深挖与代码实战
  • 网络安全从业者必备的十大学习资源与工具平台
  • KaiwuDB 3.1.0 在 Ubuntu 22.04 部署实战:TLS 配置与性能测试
  • 复杂环境下移动机器人连接解决方案:Auto-Connect 架构解析
  • C++ 类与对象:深入解析默认成员函数
  • AI 赋能原则 10 解读:政府 2.0 与全民能力跃迁
  • 基于 Docker 在 Windows 部署闲鱼 AI 自动回复系统
  • AIGC 在日常生活里的真实落点

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online