Octave实现位置式PID算法

由于Matlab不让用,只能“你不让爷用,爷就用别的”,选择开源的Octave以及scilab进行相关领域的学习。Octave的代码和Matlab几乎是100%相同的,只有一些专用的包的函数,可能有些还没来得及写,或者有些差异。但这种差异,新手一般体会不到,老手应该能自己解决了吧。

目录

  • 数字PID控制
    • 位置式PID控制算法
    • 偏微分方程求解
    • 离散系统的数字PID控制仿真

数字PID控制

PID控制器是一种线性控制器,根据给定值 r i r_i ri与实际值构成控制偏差 e r r ( t ) = r i ( t ) − y o ( t ) err(t)=r_i(t)-y_o(t) err(t)=ri(t)yo(t)。其控制规律为

u ( t ) = k p ( e r r ( t ) + 1 T 1 ∫ 0 t e r r ( t ) d t + T D d e r r ( t ) d t ) u(t)=k_p(err(t)+\frac{1}{T_1}\int^{t}_{0}err(t)\text dt+\frac{T_D\text derr(t)}{\text dt}) u(t)=kp(err(t)+T110terr(t)dt+dtTDderr(t))

写成传递函数的形式为

G ( s ) = U ( s ) E ( s ) = k p ( 1 + 1 T 1 s + T D s ) G(s)=\frac{U(s)}{E(s)}=k_p(1+\frac{1}{T_1s}+T_Ds) G(s)=E(s)U(s)=kp(1+T1s1+TDs)

其中, k p k_p kp为比例系数; T 1 T_1 T1为积分时间常数; T D T_D TD为微分时间常数。 U ( s ) U(s) U(s)为输出量的拉氏量, E ( s ) E(s) E(s)为输入量的拉氏量。

PID控制器各校正环节如下:

  1. 比例环节:成比例地反应控制系统的偏差信号 e r r ( t ) err(t) err(t),偏差一旦产生,控制器立即产生控制作用,从而减少偏差。
  2. 积分环节:用于消除静差,提高系统的无差度。积分作用的强弱与积分时间常数 T 1 T_1 T1成负相关。
  3. 微分环节:反应偏差信号的变化趋势(变化速率),并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间。

位置式PID控制算法

以一系列的采样时刻点 k T kT kT代表连续时间 t t t,以举行法数值积分代替积分,以一阶后向差分近似代替微分,即

{ t ≈ k T , k = 0 , 1 , 2... ∫ 0 1 e r r ( t ) d t ≈ T ∑ j = 0 k e r r ( j T ) = T ∑ j = 0 k e r r j d e r r ( t ) d t ≈ e r r ( k T ) − e r r ( ( k − 1 ) T ) T = e r r k − e r r k − 1 T \left\{\begin{aligned} &t\approx kT, k=0,1,2...\\ &\int^1_0err(t)\text dt\approx T\sum^k_{j=0}err(jT)=T\sum^k_{j=0}err_j\\ &\frac{\text derr(t)}{\text dt}\approx\frac{err(kT)-err((k-1)T)}{T}=\frac{err_k-err_{k-1}}{T} \end{aligned}\right. tkT,k=0,1,2...01err(t)dtTj=0kerr(jT)=Tj=0kerrjdtderr(t)Terr(kT)err((k1)T)=Terrkerrk1

可得离散PID表达式

u ( k ) = k p ( e r r k + T T 1 ∑ j = 0 k e r r j + T D T ( e r r k − e r r k − 1 ) ) = k p e r r k + k I ∑ j = = 0 k e r r j T + k d e r r k − e r r k − 1 T \begin{aligned} u(k)=&k_p(err_k+\frac{T}{T_1}\sum^k_{j=0}err_j+\frac{T_D}{T}(err_k-err_{k-1}))\\ =&k_perr_k+k_I\sum^k_{j==0}err_jT+k_d\frac{err_k-err_{k-1}}{T} \end{aligned} u(k)==kp(errk+T1Tj=0kerrj+TTD(errkerrk1))kperrk+kIj==0kerrjT+kdTerrkerrk1

其中, k I = k p T 1 , k d = k p T D k_I=\frac{k_p}{T_1},k_d=k_pT_D kI=T1kp,kd=kpTD T T T为采样周期, k k k为采样序号, k = 1 , 2 , . . . k=1,2,... k=1,2,...。其控制系统为

在这里插入图片描述

偏微分方程求解

设被控对象为电机模型传递函数

G ( s ) = 1 J s 2 + B s , J = 0.0067 , B = 0.10 G(s)=\frac{1}{Js^2+Bs},J=0.0067,B=0.10 G(s)=Js2+Bs1,J=0.0067,B=0.10

则我们可以通过Octave通过ODE45的方法来求解方程,输入信号为 r i n ( k ) = 0.50 sin ⁡ ( 2 π t ) r_{in}(k)=0.50\sin(2\pi t) rin(k)=0.50sin(2πt),采用PID控制方法设计控制器,其中 k p = 20.0 , k d = 0.50 k_p=20.0,k_d=0.50 kp=20.0,kd=0.50

其中,ODE45的调用方法为

[t,x]=ode45(func,tspan,x0,op,para)

其返回值t是一个列向量,x是一个矩阵;参数func为待处理函数或其路径,tspan=[t0 tf]为微分方程组的积分区间,

代码为

ts = 0.001; %Sampling time
xk = zeros(2,1);
e1 = 0; u1 = 0; %初始化误差time = ts:ts:2000*ts
rin = 0.5*sin(1*2*pi*time);
for k = 1:1:2000para = u1;tSpan = [0 ts];[tt, xx] = ode45("test1_func", tSpan, xk, [], para);xk = xx(length(xx),:);yout(k) = xk(1);e(k) = rin(k) - yout(k);  %误差de(k) = (e(k)-e1)/ts;     %误差的一阶导数u(k) = 20.0*e(k)+0.5*de(k);u(k) = min(u(k),10.0);    %限制u(k)所在区间为[-10,10]u(k) = max(u(k),-10.0);u1 = u(k);e1 = e(k);
endsubplot(1,2,1)
plot(time, rin, 'r', time ,yout, 'b');
xlabel('time(s)'), ylabel('rin,yout');subplot(1,2,2)
plot(time, rin-yout, 'r');
xlabel('time(s)'), ylabel('error');

函数文件为

% test1_func.m
function dy=PlantModel(t,y,flag,para)u = para;J = 0.0067;B = 0.1;dy = zeros(2,1);dy(1) = y(2);dy(2) = -(B/J)*y(2)+(1/J)*u;

得到其结果为

在这里插入图片描述
此外,可以通过XCOS进行仿真,被控对象为三阶传递函数,采用XCOS与脚本结合的方式。主程序由XCOS实现,控制由scilab实现。

离散系统的数字PID控制仿真

控制对象为

G ( S ) = 523500 s 3 + 87.35 s 2 + 10470 s G(S)=\frac{523500}{s^3+87.35s^2+10470s} G(S)=s3+87.35s2+10470s523500

采样时间为1ms,采用z变换进行离散化,经过z变换后的离散化对象为

y o u t = − d e n ( 2 ) y o u t ( k − 1 ) − d e n ( 3 ) y o u t ( k − 2 ) − d e n ( 4 ) y o u t ( k − 3 ) + n u m ( 2 ) u ( k − 1 ) + n u m ( 3 ) u ( k − 2 ) + n u m ( 1 ) u ( k − 3 ) \begin{aligned} y_{out}=&-den(2)y_{out}(k-1)-den(3)y_{out}(k-2)-den(4)y_{out}(k-3)\\ &+num(2)u(k-1)+num(3)u(k-2)+num(1)u(k-3) \end{aligned} yout=den(2)yout(k1)den(3)yout(k2)den(4)yout(k3)+num(2)u(k1)+num(3)u(k2)+num(1)u(k3)

其Octave控制代码为

ts = 0.001; %采样时间
N = 1000;    %采样个数pkg load control    %载入control包,内含tf函数
pkg load tisean     %内含c2d函数sys = tf(2.235e5,[1,87.35,1.047e4,0]); 
dsys = c2d(sys,ts,'z'); %z变换
[num,den] = tfdata(dsys, 'v');titles = ["step signal";"square signal";"sin signal"]for s = 1:3
%参数初始化
u = zeros(1,3);y = zeros(1,3);x = zeros(1,3);
err = 0;time = ts:ts:ts*N;
rin = ones(1,N);
PDI = [2 0.001 0.001];          %表示P,D,I的分量
if s==2rin = sign(sin(2*2*pi*time)); %方波信号
elseif s==3rin = 0.5*sin(2*2*pi*time);   %正弦信号
endiffor k = 1:1:Nyout(k) = -sum(den(2:4).*y)+sum(num.*u);error(k) = rin(k)-yout(k);u(2:3) = u(1:2);  u(1) = sum(PDI.*x);  %PID 控制u(1) = sort([u(1),10,-10])(2)   %区间限制y = [yout(k) y(1:2)];x(1) = error(k);x(2) = (error(k)-err)/ts;x(3) = x(3) + error(k)*ts;err = error(k);
endsubplot(230+s)
plot(time, rin, 'b', time, yout, 'r')
xlabel('time(s)'), ylabel('rin, rout')
title(titles(s,:))subplot(233+s)
plot(time,error)
xlabel('time(s)'),ylabel('error')
end

在这里插入图片描述
这种PID控制算法的缺点是,每次输出均与过去的状态有关,故需要对误差量进行累加,如果位置传感器出现故障, u ( k ) u(k) u(k)可能会出现大幅度变化,从而引起执行机构位置的大幅度变化,从而产生事故。为避免这种情况发生,可采用增量式PID控制算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2773886.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络概念、组成、功能和分类

文章目录 概要1.怎么学习计算机网络2.概念3.功能、组成4.工作方式、功能组成5.分类 概要 概念、组成、功能和分类 1.怎么学习计算机网络 2.概念 通信设备:比如路由器、路由器 线路:将系统和通信设备两者联系的介质之类的 计算机网络是互连的、自治的的计…

如何用DT浏览器建立视频播放系统

在DT浏览器官方网站下载最新版软件,安装,在DT浏览器首页点视频直播,软件会自动检测手机相册里的视频并且显示出来,选择需要播放的视频在直播间里播放。如果要建立节目单,需要在服务器上把播放顺序,视频名称…

一起玩儿物联网人工智能小车(ESP32)——57. SPI总线协议初探(一)

摘要:介绍SPI总线的基本知识 前面已经学习过IIC总线协议,今天开始介绍另一个总线协议——SPI。SPI(Serial Peripheral Interface,串行外设接口)是由Motorola提出的一种高速、全双工、同步的通信总线。并且在芯片的管脚…

Oracle 面试题 | 17.精选Oracle高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

(每日持续更新)jdk api之ObjectInputFilter.Status基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

市场复盘总结 20240207

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率中 75% 最常用…

JavaScript中call、apply、bind方法的应用与区别

在JavaScript中,call、apply和bind是函数的三个重要方法,它们虽然功能不同,但都可以用来改变函数的执行上下文或者传递参数。本文将分别介绍call、apply和bind方法的应用和区别,并附带示例代码。 一、call方法 call方法的作用是…

移动光猫gs3101超级密码及改桥接模式教程

文章目录 超级管理员账号改桥接模式路由器连接光猫,PPPOE拨号即可!附录:如果需要改桥接的话不知道拨号密码咋办打开光猫Telnet功能Telnet 登录 参考文章 移动光猫吉比特GS3101超级账号获取更改桥接 移动光猫gs3101超级密码及改桥接模式教程 …

分享一下 uniapp 打包安卓apk

首先需要安装 Java 环境,这里就不做解释了 第二步:打开 mac 终端 / cmd 命令行工具 使用keytool -genkey命令生成证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore *testalias 是证书别名&am…

华大基因PMseq病原微生物高通量基因检测产品耐药数据库持续

23年肺炎支原体感染的患者数量持续上升,与此同时,由肺炎支原体感染引发的住院患者数量也在迅速增加。这就导致近期儿科和发热门诊都处于床位爆满状态。而在疑难危重的肺炎患者中,肺炎支原体的检出率也在不断提高。华大基因PM Online线上数据管…

ELAdmin 的 CRUD

数据表结构 弄个测试的数据表,不同类型的几个字段,表名位 mp_reply。 生成代码 ELAdmin 可以自动生成代码。 左侧目录系统工具–代码生成,点开以后可以看到上面创建的数据表mp_reply,点击配置。 进入的页面内容有两部分&#…

【Linux笔记】缓冲区的概念到标准库的模拟实现

一、缓冲区 “缓冲区”这个概念相信大家或多或少都听说过,大家其实在C语言阶段就已经接触到“缓冲区”这个东西,但是相信大家在C语言阶段并没有真正弄懂缓冲区到底是个什么东西,也相信大家在C语言阶段也因为缓冲区的问题写出过各种bug。 其…

Blender教程(基础)-顶点的移动、滑移-16

一、顶点的移动与缩放 ShiftA新建柱体、切换到编辑模式 点模式下,选择一个顶点、选择移动(GZ),发现顶点严Z轴移动,如下图所示 GY 按数字键盘7切换视图,选择这个面的所有顶点 按S把面缩放大 Ctrl…

TCP相关知识点

TCP相关知识点 参考: 《计算机网络》 (建议收藏)TCP协议灵魂之问,巩固你的网路底层基础 关于 TCP 三次握手和四次挥手,满分回答在此 (值得看) TCP处于网络体系结构中的运输层。 运输层主要为应用进程提供端到端的逻辑通信,然后对…

双非本科准备秋招(19.1)—— Synchronized优化

轻量级锁 流程 一个对象虽然有多线程加锁,但是加锁时间是错开的,那么可以用轻量级锁优化。 语法还是synchronized,只是对使用者是透明的。 static final Object obj new Object(); public static void method1() {synchronized( obj ) {//…

代码随想录算法训练营第42天 | 01背包理论基础 416.分割等和子集

01背包理论基础 问题定义:有n件物品和一个能装重量为w的背包,第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包获得的总价值最大。dp数组含义:dp[i][j] 表示从下标为 [0…

(篇九)MySQL常用内置函数

目录 ⌛数学函数 ⌛字符串函数 ⌛聚合函数 ⌛日期函数 📐获取当前时间 📐获取时间的某些内容 📐​编辑 📐格式化函数 📏format类型: ⌛系统信息函数 ⌛类型转换函数 数学函数 字符串函数 聚合函…

3060ti显卡+cuda12.1+win10编译安装生成fastdeploy的c++与python库

在cuda12中,调用官方发布的fastdeploy会出现报错,故此自行编译fastdeploy库。 官网编译教程:https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/gpu.md 可选编译选项 编译选项 无论是在何平台编译,编译时仅根据需求修改如下选项,勿…

【大模型上下文长度扩展】MedGPT:解决遗忘 + 永久记忆 + 无限上下文

MedGPT:解决遗忘 永久记忆 无限上下文 问题:如何提升语言模型在长对话中的记忆和处理能力?子问题1:有限上下文窗口的限制子问题2:复杂文档处理的挑战子问题3:长期记忆的维护子问题4:即时信息检…

cpp11新特性之智能指针(下):深入理解现代cpp中的智能指针shared_ptr、unique_ptr 以及 weak_ptr

目录 写在前面 unique_ptr shared_ptr weak_ptr 智能指针的使用陷阱 致谢 写在前面 上一篇文章同大家深入探讨了auto_ptr。今天给大家带来的是对于 shared_ptr、unique_ptr 以及 weak_ptr 的深入理解,通过测试案例和源码剖析对这三种重要的智能指针的使用方法&…