/*==============================================================================
在使用单片机作为控制cpu时,请稍作简化,具体的PID参数必须由具体对象通过实验确定。
由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,
运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,
根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿。
这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。
==============================================================================*/
#include <string.h>
#include <stdio.h>
/*===============================================================================
PID Function
The PID function is used in mainly
control applications. PID Calc performs one iteration of the PID
algorithm.
While the PID function works, main is just a dummy program showing
a typical usage.
PID功能
在PID功能主要用于控制应用。 PID 计算器执行一个PID的迭代算法。虽然PID功能的工程,
主要只是一个虚拟程序显示一个典型的使用。
================================================================================*/
typedef struct PID {
double SetPoint // 设定目标 Desired Value
double Proportion// 比例常数 Proportional Const
double Integral // 积分常数 Integral Const
double Derivative// 微分常数 Derivative Const
double LastError // Error[-1]
double PrevError // Error[-2]
double SumError // Sums of Errors
} PID
/*================================ PID计算部分===============================*/
double PIDCalc( PID *pp, double NextPoint )
{
double dError,Error
Error = pp->SetPoint - NextPoint // 偏差
pp->SumError += Error // 积分
dError = pp->LastError - pp->PrevError// 当前微分
pp->PrevError = pp->LastError
pp->LastError = Error
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项
)
}
/*======================= 初始化的PID结构 Initialize PID Structure===========================*/
void PIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID))
}
/*======================= 主程序 Main Program=======================================*/
double sensor (void)// 虚拟传感器功能 Dummy Sensor Function{return 100.0}
void actuator(double rDelta)// 虚拟驱动器功能 Dummy Actuator Function{}
void main(void)
{
PID sPID // PID控制结构 PID Control Structure
double rOut // PID响应(输出) PID Response (Output)
double rIn // PID反馈(输入) PID Feedback (Input)
PIDInit ( &sPID ) // 初始化结构 Initialize Structure
sPID.Proportion = 0.5 // 设置PID系数 Set PID Coefficients
sPID.Integral = 0.5
sPID.Derivative = 0.0
sPID.SetPoint = 100.0 // 设置PID设定 Set PID Setpoint
for ()
{ // 模拟最多的PID处理 Mock Up of PID Processing
rIn = sensor () // 读取输入 Read Input
rOut = PIDCalc ( &sPID,rIn ) // 执行的PID迭代 Perform PID Interation
actuator ( rOut ) // 所需的更改的影响 Effect Needed Changes
}
clc% 清屏clear all%删除workspace变量
close all%关掉显示图形窗口
ts=0.001%仿真时间
M=3000%Gen
%Continuous Plant
a=25b=133
sys=tf(b,[1,a,0])%传递函数
dsys=c2d(sys,ts,'z')%离散化
[num,den]=tfdata(dsys,'v')
A1=[0 10 -a]
B1=[0b]
C1=[1 0]
D1=[0]
[A,B,C,D]=c2dm(A1,B1,C1,D1,ts,'z')
Q=1%Covariances of w
R=1%Covariances of v
P=B*Q*B'%Initial error covariance
x=zeros(2,1)%Initial condition on the state
ye=zeros(M,1)
ycov=zeros(M,1)
u_1=0u_2=0
y_1=0y_2=0
for k=1:1:M
time(k)=k*ts
w(k)=0.10*rands(1)%Process noise on u
v(k)=0.10*rands(1)%Measurement noise on y
u(k)=1.0*sin(2*pi*1.5*k*ts)%正弦信号
u(k)=u(k)+w(k)
y(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2
yv(k)=y(k)+v(k)
%Measurement update
Mn=P*C'/(C*P*C'+R)
P=A*P*A'+B*Q*B'
P=(eye(2)-Mn*C)*P
x=A*x+Mn*(yv(k)-C*A*x)
ye(k)=C*x+D%Filtered value
errcov(k)=C*P*C'%Covariance of estimation error
%Time update
x=A*x+B*u(k)
u_2=u_1u_1=u(k)
y_2=y_1y_1=ye(k)
end
figure(1)
plot(time,yv,'k:',time,y,'r','linewidth',2)
xlabel('时间(s)')ylabel('y,yv')
grid on
legend('噪声信号','理想信号')
figure(2)
plot(time,y,'r',time,ye,'k:','linewidth',2)
xlabel('时间(s)')ylabel('y,ye')
grid on
legend('理想信号','滤波信号')
figure(3)
plot(time,errcov,'k','linewidth',2)
grid on
xlabel('时间(s)')ylabel('误差协方差')
给你一个全MATLAB仿真的程序,没用到SIMULINKclose all
clear all
a=newfis('fuzzf')
f1=1
a=addvar(a,'input','e',[-3*f1,3*f1])
a=addmf(a,'input',1,'NB','zmf',[-3*f1,-1*f1])
a=addmf(a,'input',1,'NM','trimf',[-3*f1,-2*f1,0])
a=addmf(a,'input',1,'NS','trimf',[-3*f1,-1*f1,1*f1])
a=addmf(a,'input',1,'Z','trimf',[-2*f1,0,2*f1])
a=addmf(a,'input',1,'PS','trimf',[-1*f1,1*f1,3*f1])
a=addmf(a,'input',1,'PM','trimf',[0,2*f1,3*f1])
a=addmf(a,'input',1,'PB','smf',[1*f1,3*f1])
f2=1
a=addvar(a,'input','ec',[-3*f2,3*f2])
a=addmf(a,'input',2,'NB','zmf',[-3*f2,-1*f2])
a=addmf(a,'input',2,'NM','trimf',[-3*f2,-2*f2,0])
a=addmf(a,'input',2,'NS','trimf',[-3*f2,-1*f2,1*f2])
a=addmf(a,'input',2,'Z','trimf',[-2*f2,0,2*f2])
a=addmf(a,'input',2,'PS','trimf',[-1*f2,1*f2,3*f2])
a=addmf(a,'input',2,'PM','trimf',[0,2*f2,3*f2])
a=addmf(a,'input',2,'PB','smf',[1*f2,3*f2])
f3=1.5
a=addvar(a,'output','u',[-3*f3,3*f3])
a=addmf(a,'output',1,'NB','zmf',[-3*f3,-1*f3])
a=addmf(a,'output',1,'NM','trimf',[-3*f3,-2*f3,0])
a=addmf(a,'output',1,'NS','trimf',[-3*f3,-1*f3,1*f3])
a=addmf(a,'output',1,'Z','trimf',[-2*f3,0,2*f3])
a=addmf(a,'output',1,'PS','trimf',[-1*f3,1*f3,3*f3])
a=addmf(a,'output',1,'PM','trimf',[0,2*f3,3*f3])
a=addmf(a,'output',1,'PB','smf',[1*f3,3*f3])
rulelist=[1 1 1 1 1
1 2 1 1 1
1 3 2 1 1
1 4 2 1 1
1 5 3 1 1
1 6 3 1 1
1 7 4 1 1
2 1 1 1 1
2 2 2 1 1
2 3 2 1 1
2 4 3 1 1
2 5 3 1 1
2 6 4 1 1
2 7 5 1 1
3 1 2 1 1
3 2 2 1 1
3 3 3 1 1
3 4 3 1 1
3 5 4 1 1
3 6 5 1 1
3 7 5 1 1
4 1 2 1 1
4 2 3 1 1
4 3 3 1 1
4 4 4 1 1
4 5 5 1 1
4 6 5 1 1
4 7 6 1 1
5 1 3 1 1
5 2 3 1 1
5 3 4 1 1
5 4 5 1 1
5 5 5 1 1
5 6 6 1 1
5 7 6 1 1
6 1 3 1 1
6 2 4 1 1
6 3 5 1 1
6 4 5 1 1
6 5 6 1 1
6 6 6 1 1
6 7 7 1 1
7 1 4 1 1
7 2 5 1 1
7 3 5 1 1
7 4 6 1 1
7 5 6 1 1
7 6 7 1 1
7 7 7 1 1]
a=addrule(a,rulelist)
a1=setfis(a,'DefuzzMethod','mom')%Defuzzy
writefis(a1,'fuzzf')
a2=readfis('fuzzf')
Ulist=zeros(7,7)
for i=1:7
for j=1:7
e(i)=-4+i
ec(j)=-4+j
Ulist(i,j)=evalfis([e(i),ec(j)],a2)
end
end
figure(1)
plotfis(a2)
figure(2)
plotmf(a,'input',1)
figure(3)
plotmf(a,'input',2)
figure(4)
plotmf(a,'output',1)
这里简单说明一下:首先是编写2个输入,1个输出的隶属度函数;接下来的是模糊规则,一共49条;然后用解模糊函数得出控制量U,这里输出的U就直接是精确量了,解模糊用到得规则是取隶属度最大的那个数即MOM算法。
显示的三个图形窗口分别是:模糊控制器内部原理图,以及2个输入,1个输出的隶属度函数图。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)