PID控制器开发笔记之十三:单神经元PID控制器的实现

神经网络是模拟人脑思维方式的数学模型。神经网络是智能控制的一个重要分支,人们针对控制过程提供了各种实现方式,在本节我们主要讨论一下采用单神经元实现PID控制器的方式。

1、单神经元的基本原理

单神经元作为构成神经网络的基本单位,具有自学习和自适应能力,且结构简单而易于计算。接下来我们讨论一下单神经元模型的基本原理。

1.1、单神经元模型

所谓单神经元模型,是对人脑神经元进行抽象简化后得到一种称为McCulloch-Pitts模型的人工神经元,如下图所示。

根据上图所示,对于第i个神经元,x1、x2、……、xN是神经元接收到的信息,ω1、ω2、……、ωN为连接强度,又称之为权。采用某种运算方式把输入信号的作用结合起来,得到他们总的结果,称之为“净输入”通常用neti表示。根据所采用的运算方式的不同,净输入有不同的表示形式,比较常用的是线性加权求和,其表达式如下:

其中,θi是神经元i的阈值。

而神经元i的输出yi可以表示为其当前状态的函数,这个函数我们称之为激活函数。一般表示如下:

1.2、采用的学习规则

学习是神经网络的基本特征,而学习规则是实现学习过程的基本手段。学习规则主要实现对神经元之间连接强度的修正,即修改加权值。而学习过程可分为有监督学习和无监督学习两类。它们的区别简单的说,就是是否引入期望输出参与学习过程,引入了则称之为有督导学习。较为常用的学习规则有三种:

1.2.1、无监督Hebb学习规则

Hebb学习是一类相关学习,它的基本思想是:如果神经元同时兴奋,则它们之间的连接强度的增强与它们的激励的乘积成正比。以Oi表示单元i的激活值,以Oj表示单元j的激活值,以ωij表示单元j到单元i的连接强度,则Hebb学习规则可用下式表示:

1.2.2、有监督Delta学习规则

在Hebb学习规则中,引入教师信号,将式Oj换成网络期望目标输出dj和网络实际输出Oj之差,即为有监督Delta学习规则,即:

1.2.3、有监督Hebb学习规则

将无监督Hebb学习规则和有监督Delta学习规则两者结合起来,就组成有监督Hebb学习规则,即:

在以上各式中,η称之为学习速度。

2、单神经元PID的基本原理

在前面我们说明了单神经元的基本原理,接下来我们讨论如何将其应用的PID控制中。前面我们已经知道了神经元的输入输出关系,在这里我们考虑PID算法的增量型表达式:

若是我们记:x1(k)=err(k),x2(k)=err(k)- err(k-1),x3(k)=err(k)- 2err(k-1)+err(k-2),同时将比例、积分、微分系数看作是它们对应的加权,并记为ωi(k)。同时我们引进一个比例系数K,则可将PID算法的增量型公式改为:

其中,

我们将PID的增量公式已经改为单神经元的输入输出表达形式,还需要引进相应的学习规则就可以得到单神经元PID控制器了。在这里我们采用有监督Hebb学习规则于是可以得到学习过程:

从学习规则的定义,我们知道在上式中,Z(k)= err(k)。而U(k)= U(k-1)+∆U(k),ω(k)= ω(k-1)+∆ω(k)。到这里实际上已经得到了单神经元PID的算法描述。

3、单神经元PID的软件实现

有了前面的准备,我们就可以开始编写基于单神经元的PID控制程序了。首先依然是定义一个单神经元的PID结构体:

/*定义结构体和公用体*/
typedef struct
{float setpoint;               /*设定值*/float kcoef;                  /*神经元输出比例*/float kp;                     /*比例学习速度*/float ki;                     /*积分学习速度*/float kd;                     /*微分学习速度*/float lasterror;              /*前一拍偏差*/float preerror;               /*前两拍偏差*/float deadband;               /*死区*/float result;                 /*输出值*/float output;                 /*百分比输出值*/float maximum;                /*输出值的上限*/float minimum;                /*输出值的下限*/float wp;                     /*比例加权系数*/float wi;                     /*积分加权系数*/float wd;                     /*微分加权系数*/
}NEURALPID;

接下来在使用PID对象之前依然需要对它进行初始化操作,以保证在未修改参数的值之前,PID对象也是可用的。这部分初始化比较简单,与前面的各类PID对象的初始化类似。

/* 单神经元PID初始化操作,需在对vPID对象的值进行修改前完成                     */
/* NEURALPID vPID,单神经元PID对象变量,实现数据交换与保存                    */
/* float vMax,float vMin,过程变量的最大最小值(量程范围)                    */
void NeuralPIDInitialization(NEURALPID *vPID,float vMax,float vMin)
{vPID->setpoint=vMin;                  /*设定值*/vPID->kcoef=0.12; /*神经元输出比例*/vPID->kp=0.4;                         /*比例学习速度*/vPID->ki=0.35;                        /*积分学习速度*/vPID->kd=0.4;                         /*微分学习速度*/vPID->lasterror=0.0;                  /*前一拍偏差*/vPID->preerror=0.0;                   /*前两拍偏差*/vPID->result=vMin;                    /*PID控制器结果*/vPID->output=0.0;                     /*输出值,百分比*/vPID->maximum=vMax;                   /*输出值上限*/vPID->minimum=vMin;                   /*输出值下限*/  vPID->deadband=(vMax-vMin)*0.0005;    /*死区*/vPID->wp=0.10; /*比例加权系数*/vPID->wi=0.10; /*积分加权系数*/vPID->wd=0.10; /*微分加权系数*/
}

初始化之后,我们就可以调用该对象进行单神经元PID调节了。前面我们已经描述过算法,下面我们来实现它:

/* 神经网络参数自整定PID控制器,以增量型方式实现                              */
/* NEURALPID vPID,神经网络PID对象变量,实现数据交换与保存                    */
/* float pv,过程测量值,对象响应的测量数据,用于控制反馈                     */
void NeuralPID(NEURALPID *vPID,float pv)
{float x[3];float w[3];float sabsfloat error;float result;float deltaResult;error=vPID->setpoint-pv;result=vPID->result;if(fabs(error)>vPID->deadband){x[0]=error;x[1]=error-vPID->lasterror;x[2]=error-vPID->lasterror*2+vPID->preerror;sabs=fabs(vPID->wi)+fabs(vPID->wp)+fabs(vPID->wd);w[0]=vPID->wi/sabs;w[1]=vPID->wp/sabs;w[2]=vPID->wd/sabs;deltaResult=(w[0]*x[0]+w[1]*x[1]+w[2]*x[2])*vPID->kcoef;}else{deltaResult=0;}result=result+deltaResult;if(result>vPID->maximum){result=vPID->maximum;}if(result<vPID->minimum){result=vPID->minimum;}vPID->result=result;vPID->output=(vPID->result-vPID->minimum)*100/(vPID->maximum-vPID->minimum);//单神经元学习NeureLearningRules(vPID,error,result,x);vPID->preerror=vPID->lasterror;vPID->lasterror=error;
}

前面的算法分析中,我们就是将增量型PID算法的表达式转化为单神经元PID公式的。二者最根本的区别在于单神经元的学习规则算法,我们采用了有监督Hebb学习规则来实现。

/*单神经元学习规则函数*/
static void NeureLearningRules(NEURALPID *vPID,float zk,float uk,float *xi)
{vPID->wi=vPID->wi+vPID->ki*zk*uk*xi[0];vPID->wp=vPID->wp+vPID->kp*zk*uk*xi[1];vPID->wd=vPID->wd+vPID->kd*zk*uk*xi[2];
}

至此,单神经元PID算法就实现了,当然有很多进一步优化的方式,都是对学习规则算法的改进,因为改进了学习规则,自然就改进了单神经元PID算法。

4、单神经元PID总结

前面我们已经分析并实现了单神经元PID控制器,在本节我们来对它做一个简单的总结。

与普通的PID控制器一样,参数的选择对调节的效果有很大影响。对单神经元PID控制器来说,主要是4个参数:K、ηp、ηi、ηd,我们总结一下相关参数选取的一般规律。

(1)对连接强度(权重ω)初始值的选择并无特殊要求。

(2)对阶跃输入,若输出有大的超调,且多次出现正弦衰减现象,应减少增益系数K,维持学习速率ηp、ηi、ηd不变。若上升时间长,而且无超调,应增大增益系数K以及学习速率ηp、ηi、ηd。

(3)对阶跃输入,若被控对象产生多次正弦衰减现象,应减少比例学习速率ηp,而其它参数保持不变。

(4)若被控对象响应特性出现上升时间短,有过大超调,应减少积分学习速率ηi,而其它参数保持不变。 

(5)若被控对象上升时间长,增大积分学习速率ηi又会导致超调过大,可适当增加比例学习速率ηp,而其它参数保持不变。

(6)在开始调整时,微分学习速率ηd应选择较小值,在调整比例学习速率ηp、积分学习速率ηi和增益系数K使被控对象达到较好特性后,再逐渐增加微分学习速率ηd,而其它参数保持不变。

(7)K是系统最敏感的参数,K值的变化相当于P、I、D三项同时变化。应在开始时首先调整K,然后再根据需要调整学习速率。

在单神经元PID控制器中,上述这些参数对调节效果的影响如何呢?一般情况下具有如下规律。

(1)在积分学习率、微分学习率不变的情况下,比例系数学习率越大则超调量越小,但是响应速度也会越慢;

(2)在比例学习率、微分学习率不变的情况下,积分系数学习率越大则响应会越快,但是超调量也会越大。

(3)在比例学习率、积分学习率不变的情况下,微分学习率对单神经元PID控制器的控制效果影响不大。

最后我们需要明白,单神经元PID算法是利用单神经元的学习特性,来智能的调整PID控制过程。单神经元可以实现自学习,这正好可以弥补传统PID算法的不足。正如前面所说,学习是它的最大特点,那么不同的学习算法对其性能的影响会很大,所以改进学习规则算法对提高性能有很大帮助。

欢迎关注:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32L476的锂电池SOC检测

便携式设备由于使用需求而配备了锂电池&#xff0c;但使用过程中需要掌握电源的状态才能保证设备正常运行。而且在电池充放电的过程中&#xff0c;监控电池的充放电状态也是保证设备安全的需要。 1、硬件设计 电池SOC检测是一个难题&#xff0c;有很多的模型和检测电路。但对…

C语言学习及应用笔记之六:C语言extern关键字及其使用

在C语言中&#xff0c;修饰符extern用在变量或者函数的声明前&#xff0c;用来以标识变量或者函数的定义在别的文件中&#xff0c;提示编译器遇到此变量或者函数时&#xff0c;在其它文件中寻找其定义。extern关键字的用法有几种&#xff0c;我们下面对其进行说明。 1、extern…

C语言学习及应用笔记之七:C语言中的回调函数及使用方式

我们在使用C语言实现相对复杂的软件开发时&#xff0c;经常会碰到使用回调函数的问题。但是回调函数的理解和使用却不是一件简单的事&#xff0c;在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析。 1、什么是回调函数 既然谈到了回调函数&#xff0c;首先我们…

STM32与SHT1X温湿度传感器通讯

在这次项目开发中应用到了SHT1X温湿度传感器&#xff0c;该系列有SHT10、SHT11和SHT15&#xff0c;属于Sersirion温湿度传感器家族中的贴片封装系列。包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件&#xff0c;传感器内部有一个精度高达14为位的A/D转换器。…

STM32与MS5837压力传感器的I2C通讯

MS5837压力传感器是一种可用于电路板上&#xff0c;适用于检测10-1200mbar压力范围的传感器&#xff0c;灵敏度非常高&#xff0c;理论上能够检测到0.01mbar的压力变化&#xff0c;实际使用过程中测试并无明显的变化。 MS5837采用I2C总线通讯&#xff0c;与STM32的MCU可以实现…

STM32F0使用LL库实现MS5536C通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。在本文中我们说明一下&#xff0c;使用LL库实现MS5536C的SPI通讯。 1、MS5536C简述 MS5536C是…

STM32F0使用LL库实现DMA方式AD采集

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。在本文中我们将介绍基于LL库的ADC的DMA采集方式。 1、概述 这次我们使用DMA方式实现对AD的采集…

STM32与宇电设备实现AI-BUS通讯

宇电的设备使用基于RS-485的自定义协议&#xff0c;协议本身比较简单&#xff0c;只有2条指令&#xff1a; 读&#xff1a;地址代号52H&#xff08;82&#xff09; 要读的参数代号00校验码 写&#xff1a;地址代号43H&#xff08;67&#xff09;要写的参数代号写入数低字节写…

FreeRTOS如何结束和重新启动调度程序

大多数主机或桌面系统&#xff08;比如Linux&#xff0c;Mac或Windows&#xff09;都有一个正常的用例&#xff0c;你可以在早上启动操作系统&#xff0c;然后在晚上关闭它&#xff0c;然后你就离开机器。嵌入式系统是不同的&#xff1a;他们没有参加&#xff0c;他们应该“永远…

先进过程控制之一:浅说APC

先进过程控制&#xff08;APC&#xff09;技术作为在生产装置级的信息化应用&#xff0c;在优化装置的控制水平和提高生产过程的管理水平的同时&#xff0c;还为企业创造了可观的经济效益。 1、什么是APC 先进过程控制&#xff0c;简称APC&#xff0c;并不是什么新概念。它仅…

STM32与多台MS5803压力传感器I2C通讯

MS5803压力传感器支持SPI和I2C总线通讯&#xff0c;拥有24位AD转换。能够同时获得压力值和温度值&#xff0c;其中压力测量范围为10-1100mbar&#xff0c;温度的测量范围是-40-85摄氏度。各引脚功能及参数如下&#xff1a; 传感器内部结构图如下&#xff1a; 通讯协议的选择通过…

STM32F0使用LL库实现SHT70通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本篇我们将基于LL库采用模拟I2C接口的方式实现温湿度采集。 1、SHT70简述 SHT70是一款集温湿度…

STM32F0使用LL库实现PWM输出

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本文我们将说明如何通过LL库实现PWM信号的输出。 1、概述 我们知道STM32的TIM计时器可以输出P…

STM32F0使用LL库实现Modbus通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。本篇将说明基于LL实现USART通讯。 1、概述 我们想要实现基于RS485的Modbus通讯实际就是基于US…

STM32基于SPI和AD7192的数据采集

在开发臭氧发生器的时&#xff0c;我们需要一个高分辨率的AD采集&#xff0c;于是选择了AD7192&#xff0c;选择这款ADC的原因比较简单。首先它是24位的符合我们的精度要求&#xff1b;其次它自带时钟&#xff0c;便于节省空间&#xff1b;第三它有4路单端或2路差分输入&#x…

Modbus协议栈实现Modbus RTU多主站支持

前面我们已经详细讲解过Modbus协议栈的开发过程&#xff0c;并且利用协议栈封装了Modbus RTU主站和从站&#xff0c;Modbus TCP服务器与客户端&#xff0c;Modbus ASCII主站与从站应用。但在使用过程中&#xff0c;我们发现一些使用不便和受限的地方&#xff0c;所以我们就想要…

STM32基于AD5663的UV灯电压控制

在开发臭氧发生器的时&#xff0c;我们使用UV灯来实现臭氧的产生。而UV灯的强度决定了臭氧产生的浓度&#xff0c;UV灯的光强则与其控制电压密切相关。所以我们要控制产生的臭氧的浓度就需要调节其控制电压。我们选择了AD5663这一模拟量输出模块来实现这一点。 1、AD5663简介 …

实现Modbus ASCII多主站应用

前面我们已经分析了Modbus RTU的更新设计和具体实现&#xff08;如果不清楚可查看前一篇文章&#xff09;。其实Modbus ASCII与Modbus RTU都是基于串行链路实现的&#xff0c;所以有很多的共同点&#xff0c;基于此&#xff0c;这篇文章我们只讨论与Modbus RTU所不同的部分。 …

STM32一种基于NTC的控温电路及软件实现

NTC&#xff08;Negative Temperature Coefficient&#xff09;是一种随温度上升时&#xff0c;电阻值呈指数关系减小的热敏电阻。应用广泛&#xff0c;最近我们就采用了NTC来控制加热并测温&#xff0c;并达到了预期的效果。 1、硬件设计 我们使用三极管作为加热元件&#x…

STM32利用光敏二极管实现光度测量

最近我们在开发臭氧发生器时&#xff0c;需要监测生成的臭氧的浓度&#xff0c;于是想到使用光度计来测量。因为不同浓度的臭氧对管的吸收作用是不相同的&#xff0c;于是检测光照强度的变化就可以得到相应的浓度数据。 1、硬件设计 此次光照度检测我们选用了S1336-5BQ光电点二…