Simulink建模:PID控制-串级PID

2023-05-16

本文研究串级PID控制的概念、应用场景以及Simulink模型实现。

文章目录

  • 1 问题引入
  • 2 串级PID控制
  • 3 Simulink建模
    • 3.1 建模前的理解
    • 3.2 建模过程
    • 3.3 代码生成
  • 4 总结

1 问题引入

在之前的博客《Simulink建模:PID控制模型》一文中,举了一个汽车加速到期望车速的例子,来解释单极PID控制的原理。实际上,这个场景对应了辅助驾驶系统中的定速巡航功能。ADAS中还有一个功能为自适应巡航,就需要自车和前车保持一个固定的距离,并且保持一个相同的车速。这就要求控制器不仅能够控制速度,还要能控制相对距离。

从执行器的角度来看,加速踏板对应改变发动机扭矩值,从而为汽车产生一个加速度。制动踏板对应改变制动主缸压力,从而为汽车产生一个减速度。加速度、减速度是改变物体速度大小的原因,但是无法直接改变物体的位置,因为改变物体的位置需要通过速度来改变。

由于执行器只能产生加速度,如果还是以单极PID来控制距离(控制自车与前车的相对位置),就只能设计为,PID的输入是距离偏差,输出是加速度。示意图就是如下所示。
在这里插入图片描述
因为不能直接控制距离,就需要先控制速度,再因为速度的变化改变距离。这样会导致一个问题,当期望距离和实际距离已经相等时,即err偏差为0时,速度是未知的(系统中没有速度的期望值)。速度可能和前车速度相差很多,导致了位置只是短暂地达到了期望,紧接着又偏离了很多。偏离了才会再次控制加速度或减速度,影响速度大小,从而影响位置大小。这样系统会导致实际距离在目标距离附近来回的震荡。其本质原因是由于设计的问题,而不是参数的问题,一直无法稳定下来。

2 串级PID控制

驾驶员开车的时候就不会出现上述问题,就能很好地控制位置和速度。当自车跟随前车运动,速度相同,保持相同的距离。假如这时驾驶员希望减小车距,并且达到预期的距离后继续以相同车速跟车行驶,会先提速减小车距,接着快要达到预期的距离时减速到原来的车速。为了先提速到预期的车速,就通过加速踏板产生加速度;后半段为了减速达到原先的车速,就通过制动踏板产生减速度。

上述过程中可以看出,并不是直接用加速度或减速度控制距离,而是先通过速度控制距离,再通过加速度控制速度。这一点很重要,是串级PID的核心思想。那么,按照这个思想可以设计串级PID控制框架。
在这里插入图片描述
首先,一级PID根据期望距离和实际距离输出期望速度,期望速度作为二级PID的输入。这里的期望速度是相对速度,因为如果实际距离小于期望距离,就需要减速,所以输出一个负的相对速度。所以期望速度还需要加上毫米波雷达探测的前车速度加上相对速度。

二级PID控制的参考速度是一级输出的参考绝对速度,减去轮速传感器计算的自车实际速度得到一个速度的偏差值,再由二级PID计算输出的加速度控制量,然后查表得出扭矩值或制动压力发送至CAN信号。

在产品级的ADAS控制器设计中,跟车的控制是非常复杂的,这里只是以此为例讲解串级PID的原理。

3 Simulink建模

3.1 建模前的理解

串级PID建模和单极PID建模在PID算法方面没什么区别,只不过从一个变成两个。不过还是有一些注意点。

  • 两级PID输出的是不同的控制量,所以应该将两部分分别定义在子系统内,这样显得架构清晰,有较好的可读性;
  • 两个PID用的两套参数,在命名上体现出来;
  • 对于输出的控制量和一些中间变量定义观测变量,以便在实车调试的时候可以观测;

3.2 建模过程

根据上一节的理解,进行建模;

1)在外层模型应该是两个子系统,分别对应一、二级PID控制;

在这里插入图片描述
图中,一级的输出是二级的一个输入。另外,两个子系统都配置成原子子系统,这样在生成代码的时候就可以封装成两个函数,调用更加清晰。

2)在一级PID控制子系统内,如下图所示;
在这里插入图片描述
参考值减实际值后又乘以-1,可以这样理解。当驾驶员请求的跟车距离更近时,Ref_Dis<Act_Dis,相减得出负值,再乘以-1后偏差就转为正值,对应了输出正的相对参考速度。

每个系数又加上了一个后缀_Spd,表明他们是一级控制的PID参数。

3)二级PID控制子系统内,如下图所示;

在这里插入图片描述
偏差计算用了一级输出的相对速度、毫米波雷达探测到的前车速度和自车当前速度运算得到。同样的,系数也是用名称区分开。

3.3 代码生成

生成的代码中,主函数分别调用了两个PID函数,对应模型中的两个子系统。
在这里插入图片描述
函数没有传参和返回值,因为输出输出和参数都是以全局变量的形式在函数内运算。

4 总结

本文研究串级PID控制的概念、应用场景以及Simulink模型实现。

>>返回个人博客总目录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Simulink建模:PID控制-串级PID 的相关文章

  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • # Arduino小车PID调速——整定参数初试水

    Arduino小车PID调速 整定参数初试水 在实现了小车较为可靠的测速基础上 便可以正式开展PID调速实验了 本文是基于使用Arduino平台上由Brett Beauregard大神写的PID库进行参数整定的 侧重于在对PID算法有基本了
  • Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析

    文章目录 1 定义 2 变换和处理 3 函数 4 实例演示 例1 单频正弦信号 整数周期采样 例2 单频正弦信号 非整数周期采样 例3 含有直流分量的单频正弦信号 例4 正弦复合信号 例5 含有随机干扰的正弦信号 例6 实际案例 5 拓展
  • 双向交错CCM图腾柱无桥单相PFC学习仿真与实现(2)SOGI_PLL学习仿真总结

    目录 前言 SOGI基本原理 锁相环基本原理 仿真实现及说明 总结 前言 前面总结了双向交错CCM图腾柱无桥单相PFC系统实现 后面把问题细分 关于SOGI锁相环的应用和学习在这里总结下 双向交错CCM图腾柱无桥单相PFC学习仿真与实现 1
  • 专家PID

    专家PID 专家控制 专家控制是模拟人类专家控制的方式 它具有大量的专门知识和经验 和专家控制一样不需要知道对象的模型的情况下 对系统进行控制 专家控制的基本结构 和人类专家控制一样 知识库越是丰富 推理机越是精确 控制效果也就越好 不同的
  • VSC/SMC(十六)——自适应鲁棒滑模控制

    目录 1 参数不定和扰动不定但有界的系统 2 滑模控制自适应律设计 2 1控制律设计总结 3 仿真分析 3 1 PD控制 3 2普通自适应律 3 3映射自适应律 3 4总结 4学习问题 1 参数不定和扰动不定但有界的系统 其中 2 滑模控制
  • 三个闭环负反馈PID调节系统:电流环、速度环和位置环的关系

    三个闭环负反馈PID调节系统 电流环 速度环和位置环的关系 伺服电机为了达到生产的精准控制 电机一般采用三环控制 这主要是为了使伺服电机系统形成闭环控制 所谓三环就是3个闭环负反馈PID调节系统 电压映射电流变化 电流映射转矩大小 转矩大小
  • copy_from_user() 的任何示例吗?内核和用户空间

    我正在寻找将 PID 值从用户空间复制到内核空间 这是我的代码快照 内核模块 include
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • 从 Simulink 模型获取模型拓扑

    我想在 Python 中创建一个代表 Simulink 模型的结构 我知道至少有两种方法可以做到这一点 通过解析 mdl 文件 或者使用 Matlab 的 api 与模型进行通信 您能推荐一些好的库或 API 来执行此操作吗 特别是 我需要
  • 如何迭代 PCB 以显示 Linux 内核模块中的信息?

    我想编写一个 Linux 内核模块 它可以显示所有正在运行的进程的 PID 我有以下代码 procInfo c My Kernel Module for process info include
  • 如何在 OSX 10.9 中从 ProcessSerialNum 获取 PID?

    GetProcessPID在 OSX 10 9 中被标记为已弃用 并附有注释 使用适当的 processIdentifier 属性 NSRunningApplication 对象 问题是构造类方法NSRunningApplication没有
  • 子进程和父进程ID

    只是与子进程块中的父 pid 值混淆了 我的程序如下 int main int argc char argv pid t pid pid fork if pid 1 perror fork failure exit EXIT FAILURE
  • 单元测试/与 Simulink/Stateflow 持续集成

    如何在 Simulink 或者最好是 Stateflow 中执行单元测试 我是敏捷软件方法的粉丝 包括测试驱动开发 我负责安全关键控制软件的开发 我们使用 Matlab Simulink Stateflow 来开发它 选择此工具集是因为与工
  • 使用批处理查找java PID

    我需要从 Windows 批处理控制台知道 java 进程 PID echo off set p CD FOR F tokens 1 A IN JAVA HOME bin jps exe v find p DO SET str A echo
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • fork()返回0,但是子进程getpid()!=0。为什么?

    这是测试 fork 系统调用的 C 代码 include
  • 将 Matlab Simulink 模型保存为带有紧密边界框的 PDF

    给定一个 Simulink 框图 模型 我想生成一个 屏幕截图 以便稍后在 LaTeX 文档中使用 我希望这个屏幕截图是带有紧密边框的 PDF 矢量图形 gt pdflatex 我的意思是图表周围没有不必要的空白 我搜索了网络 搜索了 st
  • 以编程方式连接两个子系统

    我正在尝试以编程方式重用我之前开发的一些自定义块 模型来构建一个复杂的模型 但我无法设法连接两个 PMC Port 这就是我所拥有的 Main system sys name model sys new system sys name op
  • 如何将 Simulink 编码器编译器版本设置为支持 C++11 的版本?

    我正在尝试将代码合并到 Simulink 及其嵌入式编码器中 该代码使用 C 11 扩展 跑步mex setup c 给出这个输出 mex setup c MEX configured to use Xcode Clang for C la

随机推荐