文档章节

手把手教你看懂并理解Arduino PID控制库——采样时间

欧阳天华
 欧阳天华
发布于 2016/12/21 16:40
字数 900
阅读 1909
收藏 1
点赞 1
评论 1

引子

在《手把手教你看懂并理解Arduino PID控制库》中已经简单介绍过Brett Beauregard大神所提供的ArduinoPID控制库,此库不仅仅可以在Arduino使用,稍作简单的修改即可移植到别的平台。那么下面针对7个问题的第一个问题进行说明。

问题定义

一般来说,PID控制都是周期性调用(也就是意味着,每次计算的间隔都是固定的常量),但或多或少,由于各种需求会被奇葩的非周期调用。如果非得修改采样时间,对PID控制进行非周期调用,那么这样会导致以下问题:

观察这个“可恶”的方程

如果采样时间变化了,那么对于积分项和微分项(也就是KI和KD对应的项),这两项是和采样时间间隔有关的,那么则需要进行额外的微积分运算(不能再按照原来写好的代码进行运算,必须对时间参数进行调整)。

解决方案

如果算法被固定的周期间隔调用,那么运算将会变得很简单,并且也能够周期性的获取到精确的运算结果。那么朝着这个思路。需要想办法将已经被改变的采样周期让PID控制器认为没有改变,依旧沿用原来的运算过程。

代码

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
double kp, ki, kd;
int SampleTime = 1000; //1 sec
void Compute()
{
   unsigned long now = millis();
   int timeChange = (now - lastTime);
   if(timeChange>=SampleTime)
   {
      /*Compute all the working error variables*/
      double error = Setpoint - Input;
      errSum += error;
      double dErr = (error - lastErr);
 
      /*Compute PID Output*/
      Output = kp * error + ki * errSum + kd * dErr;
 
      /*Remember some variables for next time*/
      lastErr = error;
      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;
   }
}

观察SetTunings和SetSampleTime两个函数,这两个函数完成了适应采样间隔改变功能。其中SetSampleTime在采样间隔改变后,按照比例放大/缩小了与采样间隔改变相同的倍数。在SetTunings做归一化处理。为什么这里只对Ki和Kd进行处理在前面已经说过了,那么大家可能又会存在这样的疑问:

如果Ki变化了,那么和经典的PID控制公式结果不是会差很大吗?答案是差别不大!!

观察积分项,并改写为离散形式:

如果在调节过程中,Ki是一个常量的话,那么可以进一步改写为:

上式的第一项分别观察Ki 及 e(t),改变采样间隔后,e(t)受采样间隔影响会产生对应时间内的变化,而ki等比例反向放大/缩小,效果相当,证必。

结论

无论调用PID算法多么频繁,此算法还是仅仅会周期性的计算。这样的好处是,PID控制器可以按照它熟悉的路子走到底。

这里需要说明的是,系统必须在timechange溢出前进行维护。或者 说,可以增加一个简单的保护机制,在越界后,将时间计数重新计数。当然unsigned int 为32位整型,已经能够容忍差不多50天运行,足够啦。

NOTE:如有不足之处请告知‘

下一章节将分析设定值的变化对微分项的影响^.^

NEXT

PS:转载请注明出处:欧阳天华

© 著作权归作者所有

共有 人打赏支持
欧阳天华
粉丝 11
博文 8
码字总数 8615
作品 0
松江
程序员
加载中

评论(1)

G
Gioray
写的非常好!希望博主继续更新。
手把手教你看懂并理解Arduino PID控制库——引子

介绍 本文主要依托于Brett Beauregard大神针对Arduino平台撰写的PID控制库Arduino PID Library及其对应的帮助博客Improving the Beginner’s PID。在没有Brett Beauregard帮助之前,也尝试过...

欧阳天华
2016/12/21
2.7K
3
手把手教你看懂并理解Arduino PID控制库——微分冲击

引子 本文将分析《手把手教你看懂并理解Arduino PID控制库》中第二个问题:设定值改变对微分项的影响。语文不好,原文中叫做Derivative Kick,实在是想不出好的名字,暂且称为微分冲击。 问题...

欧阳天华
2016/12/21
806
1
手把手教你做智能LED灯(二) 硬件端的开发

第2节 硬件端的开发 现在,我们开始实现智能LED灯硬件相关部分的设计。 2.1 硬件连接 选择了Arduino MEGA 、HC-06蓝牙模块、LED灯模块和三引脚按钮开关以后,我们就需要把它们组合起来,为我...

anddlecn
2016/09/13
0
0
手把手教你智能硬件开发(三) 控制LED灯

第3节 控制LED灯 现在我们开始尝试用代码控制一个真正的直观的硬件设备。 第一个例子:让Arduino开发板上的一个LED小灯周期性的打开、关闭。 第二个例子:让LED灯亮度逐渐的变亮变暗。 3.1 ...

anddlecn
2016/09/06
0
0
手把手教你智能硬件开发(四) 蓝牙传输

第4节 蓝牙传输 智能硬件基本上都需要和手机相连,然后让手机控制这些硬件的工作。相连的方式不外乎以下三种, 数据线有线连接,通过一根数据线把智能硬件和手机连接起来。采用这种方式,需要...

anddlecn
2016/09/07
0
0
手把手教你玩转直流电机PID双环控制

原文地址: http://bbs.elecfans.com/jishu5453201_1.html 1.速度闭环控制 我们一般在速度闭环控制系统里面,使用增量式PI控制。而在我们的微处理器里面,因为控制器是通过软件实现其控制算法...

Iammalt
2017/08/07
0
0
CSDN日报180514——《我是如何主导第三方支付平台架构设计评审的?》

好久不见,CSDN日报回归啦~ 这次将开始新的尝试,文章中我会将推荐的文章添加上作者的提问码,如果你看完文章,还有困惑,可以向作者付费提问,进行交流。优质的内容值得付费,优质的博主值得...

blogdevteam
05/14
0
0
手把手教写出XGBoost实战程序

简单介绍: 这是一个真实的比赛。赛题来源是天池大数据的 "商场中精确定位用户所在店铺"。原数据有114万条,计算起来非常困难。为了让初学者有一个更好的学习体验,也更加基础,我将数据集缩...

香橙云子
2017/11/29
0
0
Arduino教程汇总

原始链接:Arduino教程汇总贴 (有更新) 初识arduino http://www.arduino.cn/thread-1083-1-1.html 常见arduino版本比较 http://www.arduino.cn/thread-1192-1-1.html arduino驱动安装方法 ht......

小堤
2013/05/26
23K
15
CSDN日报20170825——《迷茫的程序员》

程序人生 | 迷茫的程序员 作者:任玉刚 程序员是一个特殊的群体,我们不知道为什么加入这个行业,也不知道这个行业还能做多久,不同人有着不同的故事、有着不同的迷茫。 点击阅读全文 Python...

blogdevteam
2017/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
9分钟前
0
0
中国开始生产自主设计x86 CPU,由AMD授权

导读 7 月 10 日报道,美媒称,中国正试图摆脱对美国公司的依赖并开发自己的芯片。据报道,中国制造商天津海光先进技术投资有限公司开始生产中国自主设计的“禅定”x86 中央处理器(CPU)。 ...

问题终结者
10分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
17分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
21分钟前
0
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
0
0
继社会佩奇之后,又尝试了可爱的蓝胖子,有趣 Python

#哆啦A梦# !/usr/bin/env python3# -*- coding: utf-8 -*-# @Author: dong dong# @Env: python 3.6from turtle import *# 无轨迹跳跃def my_goto(x, y): penup(...

Py爱好
昨天
0
0
shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
昨天
0
0
upstream sent too big header while reading...

nginx 报错:1736 upstream sent too big header while reading response header from upstream 1. 一般处理 location ~ \.php$ { #增加下面两句 fastcgi_buffer_size 128k; ......

dubox
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部