上面的逻辑判断过程,实际上就是对于控制系统的一个专家判断过程。
(未完待续)
PID控制算法的C语言实现十模糊算法简介
在PID控制算法的C语言实现九中,文章已经对模糊PID的实质做了一个简要说明。
本来打算等到完成毕业设计,工作稳定了再着力完成剩下的部分。
鉴于网友的要求和信任,抽出时间来,对模糊PID做一个较为详细的论述,这里我不打算做出仿真程序了,但就基本概念和思路进行一下说明,相信有C语言基础的朋友可以通过这些介绍性的文字自行实现。
这篇文章主要说明一下模糊算法的含义和原理。
实际上模糊算法属于智能算法,智能算法也可以叫非模型算法,也就是说,当我们对于系统的模型认识不是很深刻,或者说客观的原因导致我们无法对系统的控制模型进行深入研究的时候,智能算法常常能够起到不小的作用。
这点是方便理解的,如果一个系统的模型可以轻易的获得,那么就可以根据系统的模型进行模型分析,设计出适合系统模型的控制器。
但是现实世界中,可以说所有的系统都是非线性的,是不可预测的。
但这并不是说我们就无从建立控制器,因为,大部分的系统在一定的条件和范围内是可以抽象成为线性系统的。
问题的关键是,当我们系统设计的范围超出了线性的范围,我们又该如何处理。
显然,智能算法是一条很不错的途径。
智能算法包含了专家系统、模糊算法、遗传算法、神经网络算法等。
其实这其中的任何一种算法都可以跟PID去做结合,而选择的关键在于,处理的实时性能不能得到满足。
当我们处理器的速度足够快速时,我们可以选择更为复杂的、精度更加高的算法。
但是,控制器的处理速度限制了我们算法的选择。
当然,成本是限制处理器速度最根本的原因。
这个道理很简单,51单片机和DSP的成本肯定大不相同。
专家PID和模糊PID是常用的两种PID选择方式。
其实,模糊PID适应一般的控制系统是没有问题。
文章接下来将说明模糊算法的一些基本常识。
模糊算法其实并不模糊。
模糊算法其实也是逐次求精的过程。
这里举个例子说明。
我们设计一个倒立摆系统,假如摆针偏差<5°,我们说它的偏差比较“小”;摆针偏差在5°和10°之间,我们说它的偏差处于“中”的状态;当摆针偏差>10°的时候,我们说它的偏差有点儿“大”了。
对于“小”、“中”、“大”这样的词汇来讲,他们是精确的表述,可问题是如果摆针偏差是3°呢,那么这是一种什么样的状态呢。
我们可以用“很小”来表述它。
如果是7°呢,可以说它是“中”偏“小”。
那么如果到了80°呢,它的偏差可以说“非常大”。
而我们调节的过程实际上就是让系统的偏差由非常“大”逐渐向非常“小”过度的过程。
当然,我们系统这个调节过程是快速稳定的。
通过上面的说明,可以认识到,其实对于每一种状态都可以划分到大、中、小三个状态当中去,只不过他们隶属的程度不太一样,比如6°隶属于小的程度可能是,隶属于中的程度是,隶属于大的程度是0。
这里实际上是有一个问题的,就是这个隶属的程度怎么确定?
这就要求我们去设计一个隶属函数。
详细内容可以查阅相关的资料,这里没有办法那么详细的说明了。
(见附录3)这里面有些说明。
那么,知道了隶属度的问题,就可以根据目前隶属的程度来控制电机以多大的速度和方向转动了,当然,最终的控制量肯定要落实在控制电压上。
这点可以很容易的想想,我们控制的目的就是让倒立摆从隶属“大”的程度为1的状态,调节到隶属“小”的程度为1的状态。
当隶属大多一些的时候,我们就加快调节的速度,当隶属小多一些的时候,我们就减慢调节的速度,进行微调。
可问题是,大、中、小的状态是汉字,怎么用数字表示,进而用程序代码表示呢?
其实我们可以给大、中、小三个状态设定三个数字来表示,比如大表示用3表示,中用2表示,小用1表示。
那么我们完全可以用1*+2*+3*=来表示它,当然这个公式也不一定是这样的,这个公式的设计是系统模糊化和精确化的一个过程,读者也可参见相关文献理解。
但就这个数字而言,可以说明,目前6°的角度偏差处于小和中之间,但是更偏向于中。
我们就可以根据这个数字来调节电机的转动速度和时间了。
当然,这个数字与电机转速的对应关系,也需要根据实际情况进行设计和调节。
前面一个例子已经基本上说明了模糊算法的基本原理了。
可是实际上,一个系统的限制因素常常不是一个。
上面的例子中,只有偏差角度成为了系统调节的参考因素。
而实际系统中,比如PID系统,我们需要调节的是比例、积分、微分三个环节,那么这三个环节的作用就需要我们认清,也就是说,我们需要根据超调量、调节时间、震荡情况等信息来考虑对这三个环节调节的比重,输入量和输出量都不是单一的,可是其中必然有某种内在的逻辑联系。
所以这种逻辑联系就成为我们设计工作的重点了。
下一篇文章将详细分析PID三个变量和系统性能参数之间的联系。
PID控制算法的c语言实现十一(PID系列完结篇)模糊PID的参数整定
这几天一直在考虑如何能够把这一节的内容说清楚,对于PID而言应用并没有多大难度,按照基本的算法设计思路和成熟的参数整定方法,就算是没有经过特殊训练和培训的人,也能够在较短的时间内容学会使用PID算法。
可问题是,如何能够透彻的理解PID算法,从而能够根据实际的情况设计出优秀的算法呢。
通过讲述公式和基本原理肯定是最能说明问题的,可是这样的话怕是犯了“专家”的错误了。
对于门槛比较低的技术人员来讲,依然不能透彻理解。
可是说的入耳了,能不能透彻说明也是一个问题,所以斟酌了几天,整理了一下思路才开始完成PID系列文章的最后一篇。
我所说的最后一篇不代表PID的功能和发展就止步与此,仅仅是说明,透过这一些列的文章,基本上已经可以涵盖PID设计的要点,至于更深入的研究,就交给有需要的读者去做。
上一节中大致讲述了一下模糊算法。
实际上模糊算法的很多概念在上一节中并没有深入的解释。
举的例子也只是为了说明模糊算法的基本含义,真正的模糊算法是不能这么设计的,当然也不会这么简单。
模糊算法的核心是模糊规则,如果模糊规则制定的出色,那么模糊算法的控制效率就高。
其实这是智能算法的一般特性,规则是系统判断和处理的前提。
那么就说说PID的规则该怎么制定。
我们知道,模糊算法的本质是对PID的三个参数进行智能调节。
那么首先要提出的问题是如何对PID的参数进行调节?
这个问题其实是参数整定的问题,现实当中有很多整定方法。
可是我们需要从根本上了解为什么这么整定,才能知道该如何建立数学模型进行分析。
那么要回答如何整定参数的问题,就需要先明白PID参数的作用都是什么?
对系统有什么影响?
我们从作用和副作用两个方面说明参数对系统的影响。
1.比例环节Kp,作用是加快系统的响应速度,提高系统的调节精度,副作用是会导致超调;
2.积分环节Ki,作用是消除稳态误差,副作用是导致积分饱和现象;
3.微分环节Kd,作用是改善系统的动态性能,副作用是延长系统的调节时间。
理解了上述问题,那么就可以“辩证施治,对症下药”了。
比如说,如果系统响应速度慢,我们就加大Kp的取值,如果超调量过大我们就减小Kp的取值等等。
可是问题这些语言的描述该如何用数学形式表达出来呢。
我们所知道的,反馈系统的实质就是系统的输出量作为反馈量与系统的输入量进行作差,从而得到系统的误差e,那么这个误差e就能够反应目前系统所处的状态。
误差e可以表明目前系统的输出状态到底偏离要求多少。
而误差e的变化律ec,表示误差变化的速度。
这样,我们可以根据这两个量的状态来分析三个参数此时应该如何取值,假如e为负方向比较大,ec也为负方向增大状态,此时比例环节要大一些,从而加快调节速度,而积分环节要小一些,甚至不加积分环节,从而防止负方向上出现饱和积分的现象。
微分环节可以稍加一些,在不影响调节时间的情况下,起到改善系统动态性能的作用。
附录1
看到有不少人问到底如何让UK值与PWM占空比值对应,进而实现占空比输出和输出控制电压对应。
(注意,我这里讨论的前提是输出控制的是电压,不是PWM方波。
PWM输出后要经过滤波整形再输出控制。
)
前提条件:
输出电压控制电压范围是0-10V。
给定、反馈、输出电压采样输入电压范围是0-5V(经过运放)。
使用单片机AD为10位AD芯片。
那么10位AD芯片电压采集得到的数据范围就是0-1024。
PWM为8位可调占空比方波,0对应输出占空比为0的方波,255对应输出占空比100%的方波,127对应输出50%的方波。
比如当前给定是,反馈电压是1V。
(KP,KI,KD等系数略,关于PID算法的整数实现我在前文中有论述如何实现)。
那么经过AD采样
1、给定对应为512
2、反馈1V对应为205
假定经过PID计算得到的UK为400
也就意味着输出电压应当为(400*(UPWM峰值电压))/1024
那么UK对应的PWM占空比是多少呢?
我们知道,UK=1024对应占空比为100,也就是PWM的占空比系数为255。
可知,PWM系数=UK/4;
那么400就应当对应系数400/4=100。
也就是输出电压=400*10/1024=
同时,由于采样精度以及PWM输出占空比精度控制的问题,将导致输出电压和期望值不是那么线性,所以,我在项目内加入了输出电压采样的控制。
采样AD输入为0-5V,所以,对于输出0-10V有一个缩小的比例。
输出10V则采样值对应为255
输出5V则采样之对应127
可知,对应AD结果为97
采样输出电压值,可以针对性的调整一下占空比输出,从而得到误差允许范围内的一个控制输出电压。
同时,经过一些加速控制的手段。
可以比较迅速的达到控制的目的。
下文中的UK控制方法是针对增量式PID控制而来做的。
/****************************************************/
voidPWMProcess(void)
{
uint16idatatemp;
uint16idataUKTemp;
temp=0;
UKTemp=0;
if(!
=0)//判断是否需要改变占空比
{//是否需要改变占空比和你的被控系统特性有关
=0;
UKTemp=+;
//计算UK控制量
//控制量和计算值以及一个开关量有关,我这里的开关量是系统需要的时候叠加在控制量上的一个变量。
if(UKTemp>999)
{
UKTemp=999;
}
//这里只所以是999封顶而不是1024是因为我的系统PWM的峰值电压是12V导致。
while
(1)//如果输出电压和期望电压相差Delta,则继续调整占空比,直到在误差以内
{
ADChPro(UPWMADCH);//测量输出电压
if([UPWMADCH]==UKTemp)
{
return;
}
if([UPWMADCH]>UKTemp)//如果当前电压大于输出电压,减小占空比
{
if(([UPWMADCH]-UKTemp)>UDELTA)
{
temp=[UPWMADCH]-UKTemp;//
temp=temp/2;//下降可以加速下降,所以下降参数加倍
if(>temp)
{
=-temp;
}
else
{
=0;
}
}
else
{
return;
}
}
else//如果当前电压小于输出电压
{
if((UKTemp-[UPWMADCH])>UDELTA)
{
temp=UKTemp-[UPWMADCH];
temp=temp/4;//上升处理不要超调,所以每次只+一半
if(>temp)
{
+=(temp/2);
}
else
{
=255;
}
}
else
{
return;
}
}
DisPlayVoltage();
PWMChangeDuty;//改变占空比
Delay(10,10);
}
}
}
/*****************************************************/
附录2
直流电机PWM调速系统中控制电压非线性研究
引言
由于线性放大驱动方式效率和散热问题严重,目前绝大多数直流电动机采用开关驱动方式。
开关驱动方式是半导体功率器件工作在开关状态,通过脉宽调制PWM控制电动机电枢电压,实现调速。
目前已有许多文献介绍直流电机调速,宋卫国等用89C51单片机实现了直流电机闭环调速;张立勋等用AVR单片机实现了直流电机PWM调速;郭崇军等用C8051实现了无刷直流电机控制;张红娟等用PIC单片机实现了直流电机PWM调速;王晨阳等用DSP实现了无刷直流电机控制。
上述文献对实现调速的硬件电路和软件流程的设计有较详细的描述,但没有说明具体的调压调速方法,也没有提及占空比与电机端电压平均值之间的关系。
在李维军等基于单片机用软件实现直流电机PWM调速系统中提到平均速度与占空比并不是严格的线性关系,在一般的应用中,可以将其近似地看作线性关系。
但没有做深入的研究。
本文通过实验验证,在不带电机情况下,PWM波占空比与控制输出端电压平均值之间呈线性关系;在带电机情况下,占空比与电机端电压平均值满足抛物线方程,能取得精确的控制。
本文的电机闭环调速是运用Matlab拟合的关系式通过PID控制算法实现。
1系统硬件设计
本系统是基于TX-1C实验板上的AT89C52单片机,调速系统的硬件原理图如图1所示,主要由AT89C52单片机、555振荡电路、L298驱动电路、光电隔离、霍尔元件测速电路、MAX232电平转换电路等组成。
图1闭环控制系统示意图
2系统软件设计
系统采用模块化设计,软件由1个主程序,3个中断子程序,即外部中断0、外部中断1,定时器0子程序,PID算法子程序,测速子程序及发送数据到串口显示子程序组成,主程序流程图如图2所示。
外部中断0通过比较直流电平与锯齿波信号产生PWM波,外部中断1用于对传感器的脉冲计数。
定时器0用于对计数脉冲定时。
测得的转速通过串口发送到上位机显示,通过PID模块调整转速到设定值。
本实验采用M/T法测速,它是同时测量检测时间和在此检测时间内霍尔传感器所产生的转速脉冲信号的个数来确定转速。
由外部中断1对霍尔传感器脉冲计数,同时起动定时器0,当计数个数到预定值2000后,关定时器0,可得到计2000个脉冲的计数时间,由式计算出转速:
n=60f/K=60N/(KT)
(1)
式中:
n为直流电机的转速;K为霍尔传感器转盘上磁钢数;f为脉冲频率;N为脉冲个数;T为采样周期。
图2主程序流程图
3实验结果及原因分析
3.1端电压平均值与转速关系
3.1.1实验结果
实验用的是永磁稳速直流电机,型号是EG-530YD-2BH,额定转速2000~4000r/min,额定电压12V。
电机在空载的情况下,测得的数据用Matlab做一次线性拟合,拟合的端电压平均值与转速关系曲线如图3(a)所示。
相关系数R-square:
0.9521。
拟合曲线方程为:
y=0.001852x+0.2963
(2)
由式
(2)可知,端电压平均值与转速可近似为线性关系,根椐此关系式,在已测得的转速的情况下可以计算出当前电压。
为了比较分析,同样用Matlab做二次线性拟合,拟合的端电压平均值与转速关系曲线如图3(b)所示。
相关系数R-square:
0.9867。
图3端电压平均值与转速关系曲线图
3.1.2原因分析
比较图3(a)可知,当转速在0~1500r/min和4000~5000r/min,端电压平均值与转速间存在的非线性,用二次曲拟合如图3(b)所示,拟合相关系数较高。
由图3(a)可见,当电机转速为0时电机两端电压平均值约为1.3V。
这是因为电机处于静止状态时,摩擦力为静摩擦力,静摩擦力是非线