PID控制算法+倒立摆控制应用

2023-05-16

一、位式控制算法

传统的控制算法采用位式控制算法:

这里写图片描述

特点

  1. 位式控制算法输出信号只有H\L两种状态
  2. 算法输出信号OUT的依据:
二位式:
Pv < Sv -->H
pV >=Sv -->L
  1. 只考察控制对象当前的状态值

位式控制算法算法的缺点在于只考察控制对象当前传感器传回来的值与目标值之间有无偏差,并且只有两种状态导致无法精确控制在目标值上。

二、 PID控制算法

因为位式控制算法的缺陷,产生了在其之上改良的PID算法:
这里写图片描述

算法分析

1. 开机以来,传感器采样点的数据序列

X1,X2,X3 ······ ,Xk-2,Xk-1,Xk

2. 分析采样点的数据序列:可以挖掘3方面的信息

2.1 比例控制

基本思想: 只关心现在有无偏差

 Ek = Sv - Xk
EK>0; 当前控制未达标
Ek=0; 当前控制达标
Ek<0; 当前控制超标

POUT = Kp * Ek --------- 比例控制(输出信号大小与目前的误差值成比例)

比例控制有缺陷,当Ek=0时,便不控制,但周围环境会使系统有变化,控制不会很精准,可以加上一个常数 POUT=kp*Ek+OUT1

2.2 积分控制

基本思想: 根据历史状态来输出信号

把每一个采样点与目标值进行比较,得到历史偏差序列:
E1,E2,E3 ······ Ek-2,Ek-1,Ek
Sk = E1+E2+E3+······Ek-2+Ek-1+Ek(每一项都可正可负,不会无限大)
Sk>0; 所有偏差之和为正,控制总体偏低,未达标 (输出信号应该加强)
Sk=0;
Sk<0; 所有偏差之和为负,控制总体偏高,超标 (输出信号减弱)

IOUT = Ki * Sk ---------  积分控制

积分控制,当历史数据为0,认为现在没有问题,不控制,陷入失控,可以加上一个常数 IOUT = Ki*Sk+OUT2

2.3 微分控制

基本思想: 只关心偏差有没有变化趋势

最近两次的偏差相减
Dk = Ek -Ek-1 (得到两次变化的偏差之差)
Dk>0; 这一次的偏差值大于上一次,越来越偏离我们的目标,偏差有增大趋势
Dk=0; 前一次采样和后一次采样之间的变化没有产生变化
Dk<0;

DOUT = Kd * Dk ----------微分控制

同理,等于0时前一次采样和后一次采样之间的变化没有产生变化,为了在变化率没有改变的情况下系统不至于失控 DOUT = Kd*Dk+OUT3

三、倒立摆角度环与位置环

1. 角度环

1.1 算法设计

通过STM32用adc采集角位移传感器(WDD35D-4导电塑料电位器)的值,由之前学到的PID控制算法理论可以得出,通过控制电机的转动与PWM的值来使倒立摆达到我们所希望的角度。

根据所需要的系统要求,只需要让其达到所期望的角度,历史的差值对其影响并不大,所以只需要PD调节即可完成所需。

算法代码如下:

int balance(float Angle)//倾角PD控制
{
    float Bias;//倾角偏差
    static float Last_Bias,D_Bias;//PID相关变量
    int balance;//PWM返回值
    Bias=Angle-ZHONGZHI;//求出平衡的角度中值,ZHONGZHI即数直起来的ad值
    D_Bias=Bias-Last_Bias;//求出偏差的微分
    balance=KP*Bias-D_Bias*KD;//计算倾角PD控制的电机PWM
    Last_Bias=Bias;//保持上一次偏差
    return balance;
}

1.2 参数整定

KP:逐渐增大KP的值,直到出现反向或者低频抖动的情况

KD:微分控制,控制偏差的变化趋势,实际中便是用来抑制转动惯量(即转动过猛)

2. 位置环

单纯进行角度环的控制,会稳定一段时间,但是最终会朝一个方向运动下去,因此还必须加上位置环的控制

位置环就是尽可能的让转动的轴不要移动,同样采用PD控制,代码如下:

int Position(int Encoder)
{  
   static float Position_PWM,Last_Position,Position_Bias,Position_Differential;
     static float Position_Least;
    Position_Least =Encoder-Position_Zero;             //===
    Position_Bias *=0.8;           
    Position_Bias += Position_Least*0.2;                 //===一阶低通滤波器  
      Position_Differential=Position_Bias-Last_Position;
      Last_Position=Position_Bias;
        Position_PWM=Position_Bias*Position_KP+Position_Differential*Position_KD; //===速度控制 
      return Position_PWM;
}

低通滤波的作用是降低位置控制对角度控制的影响,毕竟角度控制是主要的,而位置控制是会对角度控制造成影响,尽可能消除这一影响

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

PID控制算法+倒立摆控制应用 的相关文章

  • OpenDaylight简介和安装

    目录 摘要 OpenDaylight简介 环境 下载 安装 OpenDaylight dlux的安装和启动 总结 参考文档 摘要 SDN是一种新的网络体系结构 xff0c 使用开放的协议提供集中 可编程的控制和网络设备监控 SDN的核心理念
  • jni开发中 接口为什么要冠extern "C"呢

    android studio jni开发默认是C 43 43 语言的 而且还都是静态注册 C 43 43 为了支持函数重载 xff0c 函数在被C 43 43 编译后在符号库中的名字与C语言的不同 假如某个函数的原型为void f int
  • JS 中的类数组对象如何转换为数组?

    类数组对象是什么 xff1f 类数组对象 xff0c 就是含有 length 属性的对象 xff0c 但这个对象不是数组 通常来说还会有 0 xff5e length 1 的属性 xff0c 结构表现上非常像一个数组 const arrli
  • js实现文字跑马灯效果

    lt doctype html gt lt html gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 viewport 34 content 61 34
  • vue 有滚动条 点击拖拽滑动自定义指令

    lt div class 61 34 wrap 34 v flowDrag gt directives flowDrag bind el binding vnode oldNode if binding return el onmoused
  • 微信小程序相互跳转如何携带参数

    wx navigateToMiniProgram 要跳转的小程序的appid appId 39 wx1b125bf4cf709150 39 跳转的目标页面 xff0c 参数可以在另外一个小程序的onLoad中通过options接收 path
  • js删除字符串最后一个字符方法总汇

    需求 xff1a 去掉js字符串末尾的标点符号 比如原字符串 xff1a csdn net 目标字符串 xff1a csdn net 解决方案 xff1a 方法一 xff1a str slice 0 str length 1 方法二 xff
  • Google Analytics | 学习笔记

    一 简介 1 什么是GA xff1f 是谷歌开发的一款分析网页流量的工具 xff0c 可以帮助网站解决数据分析与统计的问题 xff0c 并且将这些数据可视化展现报告出来 xff0c 帮助网站商家更好的分析受众 xff0c 流量等 xff0c
  • vscode 新版解决冲突界面 改回老版

    很多更新了vscode小伙伴发现新版的解决冲突界面很不适应 xff0c 无从下手 xff0c 只需要加一个东西就可以改回老版的样式 在setting json 里添加 34 git mergeEditor 34 false
  • vue3中defineComponent 的作用

    VUE3中 xff0c 新增了 defineComponent xff0c 它并没有实现任何的逻辑 xff0c 只是把接收的 Object 直接返回 xff0c 它的存在是完全让传入的整个对象获得对应的类型 xff0c 它的存在就是完全为了
  • js打印去除浏览器的默认的页眉页脚

    去除打印的页眉页脚 try var hkeyKey var hkeyRoot 61 34 HKEY CURRENT USER 34 var hkehkeyPath 61 34 Software Microsoft Internet Expl
  • 微信小程序如何判断是否已经订阅某条消息

    判断订阅消息是否已经订阅 res subscriptionsSetting itemSettings 返回的是所有订阅消息的对象集合 xff0c 39 accept 39 表示用户同意订阅这条消息 xff0c 39 reject 39 表示
  • js根据当前时间获取当月的1号和最后一号

    js根据当前时间获取当月的1号和最后一号 function getcurentMonth cdate cdate传来的当前的时间 当天 let thatDay 61 34 34 当月第一天 let oneDayTime 61 34 34 当
  • js判断文件上传的类型

    js判断文件上传的类型 64 param fileName 文件名称 64 param 数据返回 1 无后缀匹配 false 64 param 数据返回 2 匹配图片 image 64 param 数据返回 3 匹配 txt txt 64
  • js数据流文件下载

    js数据流文件下载 64 param fileType 文件类型 64 param fileName 文件名称 64 param data 数据流文件 function download fileType bucketName data l
  • vscode 全局搜索时屏蔽node_modules和dist 目录

    打开设置 setting json 在里面添加屏蔽的文件目录即可 快捷打开 方式 ctrl 43 p 搜索 setting json 34 search exclude 34 34 dist 34 true 34 node modules
  • NVM 安装及注意事项

    1 下载 nvm Releases coreybutler nvm windows GitHub win10 下载 nvm setup zip 版本 解压并安装 不要修改默认安装路径 会自动写入系统环境变量 控制台 nvm v 查看是否安装
  • eslint 配置项大全 含中文注释

    34 rules 34 定义对象的set存取器属性时 xff0c 强制定义get 34 accessor pairs 34 2 指定数组的元素之间要以空格隔开 后面 xff0c never参数 xff1a 之前和 之后不能带空格 xff0c
  • Linux 路由配置 route命令 /etc/sysconfig/static-routes

    一 临时添加路由 重启network服务失效 方法一 route命令 frags为路由标志 xff0c 标记当前网络节点的状态 add 增加路由 U Up表示此路由当前为启动状态 del 删除路由 H Host xff0c 表示此网关为一主
  • js生成1到100的数组方法

    生成1到100的数组的一种方法是使用JavaScript的Array from 方法 例如 xff0c 下面的将生成1到100的数组 xff1a const numbers 61 Array from Array 100 keys n 61

随机推荐