第三章 SIMULINK仿真
3.1 建立仿真模型
根据图2-1所示的控制系统框图,在SIMULINK 中选择相应的控件,用数学模型代替相应的食物环节,建立控制系统的仿真模型。如下图3-1所示:
图3-1 直流伺服电机位置控制系统SIMULINK 仿真模型图
其中PID 子系统模型图如下图3-2所示:
图3-2 PID子系统仿真模型图
为了便于分析观察PID 参数对输出的影响,以及方便参数整定,我将建立两个系统,使用相同输入,并用一个示波器展示出来观察,其系统仿真模型如图3-3所示:
图3-3直流伺服电机位置控制系统SIMULINK 仿真模型图(输出信号对比)
3.2 阶跃信号输入的PID 参数整定 通过对理论课上,PID 参数整定方法的复习,按照课堂总结的口诀:
参数整定找最佳,从小到大顺序查。 先是比例后积分,最后再把微分加。 曲线振荡很频繁,比例度盘要放大。 曲线漂浮绕大弯,比例度盘往小扳。 曲线偏离回复慢,积分时间往下降。 曲线波动周期长,积分时间再加长。 曲线振荡频率快, 先把微分降下来。 动差大来波动慢,微分时间应加长。 理想曲线两个波, 前高后低四比一。 一看二调多分析,调节质量不会低。
对于PID 参数整定,我的方法是先调节比例参数,从小到大,直到输出能够很快做出响应并且又一定超调,最终能够稳定的时候,保持比例参数P 不变,调节积分参数,渐渐消除静态偏差,如此慢慢使得PID 的参数准确使的输出能够较好的响应,做到快、准、稳。仿真对比曲线如下图3-4所示:
图3-4 阶跃信号输入输出响应曲线
输出数据如下:
0.0031737 1.3002
0.011146 0.029587 0.059223 0.097357 0.12935 0.18944
0.96551
2.0671
1.6349
1.7425
1.8022
1.95 1.9695
0.25774 0.29619 0.43128 0.46352 0.63087 0.73944 0.79818 0.9465 1.0606
1.1328
1.4675
2.1368 3.1408 4.1448 4.9473 5.4407 5.9422 6.444 6.946 7.448 8.3641 8.6809 8.9785 9.2507 9.4348 9.5733 9.6774 9.7558 9.8144 9.8584 9.8916 9.9166 9.9355 9.9497 9.9604 9.9685 9.9746 9.9792 9.9829 9.9854 9.9874 9.9888 9.9899 9.9908 9.9914 9.9919 9.9922 9.9925 9.9927 9.993 9.9931 9.9932 9.9933 9.9933
2.3042 3.3082 4.3122 4.9815 5.4835 5.9855 6.4875 6.9895 7.4915 8.4036 8.7271 9.006 9.2771 9.4532 9.586 9.6862 9.7617 9.8186 9.8616 9.8939 9.9184 9.9368 9.9507 9.9611 9.969 9.975 9.9795 9.9832 9.9857 9.9876 9.989 9.9909 9.9915 9.992 9.9923 9.9926 9.9927 9.993 9.9931 9.9932 9.9933 9.9933
2.4715 3.4755 4.4795 5.0157 5.5455 6.0475 6.5494 7.0514 7.5534 8.457 8.7338 9.0436 9.298 9.4696 9.5989 9.6963 9.7696 9.8247 9.8661 9.8974 9.921 9.9388 9.9522 9.9623 9.9699 9.9756 9.9836 9.986 9.9878 9.9891 9.991 9.9915 9.992 9.9923 9.9926 9.9928 9.993 9.9931 9.9932 9.9933 9.9933
2.6389 3.6429 4.6116 5.0841 5.6076 6.1095 6.6114 7.1133 7.6153 8.4731 8.7664 9.318 9.4854 9.6113 9.7061 9.7773 9.8305 9.8706 9.9007 9.9235 9.9407 9.9536 9.9634 9.9707 9.9763 9.9838 9.9861 9.9879 9.9892 9.9911 9.9916 9.992 9.9923 9.9926 9.9928 9.993 9.9931 9.9932 9.9933 9.9933
2.7452 3.7468 4.6468 5.1488 5.6508 6.1528 6.6548 7.1568 7.6588 8.5113 8.8004 9.3414 9.5017 9.6226 9.7137 9.7825 9.8343 9.8734 9.9029 9.9251 9.9418 9.9545 9.964 9.9712 9.9766 9.9841 9.9864 9.9881 9.9894 9.9911 9.9917 9.9921 9.9924 9.9926 9.9928 9.993 9.9932 9.9932 9.9933 9.9933
2.8062 3.8102 4.8142 5.2092 5.7129 6.2148 6.7167 7.2187 7.7207 8.5481 8.8469 9.3607 9.5169 9.6345 9.7231 9.7898 9.8398 9.8776 9.906 9.9275 9.9437 9.9559 9.9651 9.972 9.9772 9.9845 9.9866 9.9883 9.9895 9.9912 9.9917 9.9921 9.9924 9.9926 9.9928 9.9931 9.9932 9.9932 9.9933 9.9933
2.9532 3.9557 4.9235 5.2696 5.7749 6.2767 6.7787 7.2806 7.7827 8.5976 8.8779 9.3792 9.5314 9.646 9.7321 9.7968 9.8451 9.8816 9.9091 9.9298 9.9454 9.9572 9.9661 9.9727 9.9778 9.9846 9.9868 9.9884 9.9896 9.9913 9.9918 9.9921 9.9924 9.9927 9.9929 9.9931 9.9932 9.9933 9.9933 9.9933
2.9735 3.9775 4.9473 5.3161 5.8181 6.3201 6.8221 7.3241 7.8261 8.6096 8.9077 9.3999 9.5459 9.6559 9.7388 9.8014 9.8486 9.8841 9.911 9.9312 9.9465 9.958 9.9666 9.9732 9.9781 9.985 9.987 9.9885 9.9897 9.9913 9.9918 9.9922 9.9925 9.9927 9.9929 9.9931 9.9932 9.9933 9.9933 9.9933
3.07484.08654.94735.37845.88026.38216.88417.38617.8881
8.32328.64598.9499
9.2299.41779.55989.66699.74759.8089.85369.88799.91399.93349.94819.95929.96769.97399.9787
9.98279.98539.98729.98879.9898
9.99079.99149.99189.99229.99259.99279.9939.99319.99329.99339.99339.9933
7.95 7.9935 8.0554 8.0875 8.0875 8.1495 8.1608 8.2163 8.2698
9.07 9.0955 9.1288 9.1533 9.1768 9.2065
9.98 9.9805 9.9807 9.9812 9.9816 9.9818 9.9823
9.99 9.9902 9.9902 9.9903 9.9904 9.9905 9.9906 9.9907
9.9957 9.9957 9.9958 9.9957 9.9958 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.9959 9.996 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.996 9.9961
9.996
9.9957 9.9957 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.9961
9.9961
9.9957 9.9957 9.9957 9.9957 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.9961
9.9961
9.9957 9.9957 9.9958 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9958 9.9959 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.9959 9.996 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.996 9.9961 9.996 9.9961
9.9961
9.99579.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.99619.9961
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962
9.99619.99619.99619.99619.99619.99619.99619.99619.99619.99619.99619.99619.99629.99629.99629.9962
由于数据量太大,故只截留了一部分数据打印出来。
3.2 方波信号输入的PID 参数整定 根据同样的方法,替换原仿真系统的输入信号源为阶跃信号,整定PID 参数,最终输出曲线对比图如下图3-5:
图3-5 方波信号输入的输出曲线对比图
3.2 正弦信号输入的PID 参数整定 根据同样的方法,替换原仿真系统的输入信号源为正弦信号,整定PID 参数,最终输出曲线对比图如下图3-6:
图3-6 正弦信号输入的输出曲线对比图
为了清晰的看出输出对输入的跟随,将局部放大图做出,如下图3-7所示:
图3-6 正弦信号输入的输出曲线局部放大对比图
第四章 物理系统的控制
4.1 物理系统的组成与控制原理
4.2 实时控制程序流程图
进行控制程序的编写之前,先要有一个清晰的思路,使用流程图的方式能够较好的将编程思路理清楚,并且提高编程效率,减少出错率。实时控制程序流程图如下图4-1所示:
4.2 程序代码的编写
基于课堂理论知识以及实验成果的累积,采样滤波子程序已经在上学期的实验课堂上编写完毕,现在只需要编写输入信号,PID 控制子程序,AC6011的D/A输出程序即可。在我的编程,我将阶跃、方波、正弦输入输出的PID 控制编写在了一个大的主程序中,通过程序的运行,使用人机交互的形式选择输入信号,设置PID 参数,进行PID 参数整定。代码粘贴如下:
#include "stdafx.h"// 必须加入的头文件 #include "conio.h"
#include "windows.h"// 应加入的头文件 #include "stdio.h" #include "io_nt.h" #include "AC6011.h" #include "math.h"
HINSTANCE hDLL; //DLL句柄
HANDLE NTportio=NULL; //NT IO驱动 句柄--->暂定为全局变量,自定义时,可以自己传递参数
unsigned long idd[100]; float CYLB(); void init();
floatPID_realize(float ad);
voidarrive_distance(float setd); voidzf_arrive_distance(float setd); voiddf_arrive_distance(float setd); void DA(intsetd);
float sum=0.0,u,pid0,pid1=0.0,kp=10,ki=0,kd=0,p,aim=100; float e0=0.0,e1=0.0,e2=0.0;
float num1,fuzhi,zhouqi,err,err1,out,zero_plot,zero_plot1; intflag,addata,datada,i,num,k; int wave;
const float pi=3.14;
floatset,actdistance,t,T,A,ave;
FILE *fp1; FILE *fp2; FILE *fp3; FILE *fp4; void main() {
unsigned long cardc;
char *dll_name="acpci.dll";//动态连接库名
hDLL=LoadLibrary(dll_name); //调入DLL ,动态调用 #include "ac6011_func.h" #include "io_nt_func.h"
#include "math.h"
NTportio=AC_OpenDriver(); //获取IO 驱动句柄
cardc=AC_6011_INIT(NTportio,idd);//初始化AC6011卡
//------------------用户主函数可以写在以下区域----------------
flag=1; charchr;
while(flag) {
if((fp1=fopen("E:\\set.txt","w"))==NULL)
{printf("\nERROR:Can't open file,press any key to return!"); exit(0); }
if((fp2=fopen("E:\\act.txt","w"))==NULL)
{printf("\nERROR:Can't open file,press any key to return!"); exit(0); } init(); wave=0; DA(1300);
printf("请选择输入的波形? ( 阶跃:j ;方波:f ;正弦:z ) :\n"); printf("\n"); chr=getch();
if(chr=='j'){wave=1;} if(chr=='f'){wave=2;} if(chr=='z'){wave=3;} switch (wave) {
case 1:
DA(1300);
printf("Kp= 9 Ki= 0.005 \n"); scanf("%f %f",&kp,&ki);
printf("请指定到达的位置(0--200 mm):" ); scanf("%f",&set); for(j=0;j
arrive_distance(set);
printf("%d\n",j); } DA(2048); break; case 2: printf("Kp= 30 Ki= 0.005 \n"); scanf("%f %f",&kp,&ki); printf("方波幅值和周期:如:80 400\n"); scanf("%f %f",&fuzhi,&zhouqi); printf("\n"); num1=3; while(num1>0) { for(k=0;k0) {
for(t=0;t
{
set=A*sin(2*pi/T*t)+100;
arrive_distance(set);
}
num1--;
}
DA(2048);
break;
default:
DA(1300);
break;
}
fclose(fp1);
fclose(fp2);
flag=0;
printf("Kp=%.3f ; Ki=%.3f ; Kd=%.3f\n",kp,ki,kd);
printf("需要再运行一次吗? (y/n)\n");
printf("\n");
if(getch()=='y'){flag=1;printf("下一次运行前,请保存数据!\n");} }
DA(1300);
//}
//------------------------------------------------------------------------ AC_CloseDriver(NTportio);//关闭AC6011卡驱动
FreeLibrary(hDLL);//清DLLgetch();
}
floatPID_realize(float setd)
{
aim=setd;
sum=0;
for(i=0;i
{
addata=AC_6011_AD(NTportio,idd[0],14,1);
u=(addata*5.0)/4095.0;
sum=sum+u;
}
ave=sum/300.0-1.22;
p=ave*400/5;
e0=aim-p;
sum_e0+=e0;
pid0=kp*(e0-e1)+ki*e0+kd*(e0-2*e1+e2);
pid0=pid1+pid0;
pid1=pid0;
u=pid0*5/400.0;
printf("pid_out=%.3f\n",u);
if(u>10) u=9;
if(u
if(u0&&e0>0) u=u+0.63;
if(u>-0.8&&u
e2=e1;
e1=e0;
return u;
}
voidarrive_distance(float setd)
{
if(setd>=175){setd=175;}
if(setd
out=PID_realize(setd);
datada=2048*(u/10.0)+2048;
printf("设定位移:");
printf("%.2f",setd);
printf("\n");
printf("当前位移:");
printf("%.2f",p);
printf("\n");
err1=setd-p;
printf("误差: ");
printf("%.4f",err1);
printf("\n");
fprintf(fp1,"%f ",setd);
fprintf(fp2,"%f ",p);
DA(datada);
}
void DA(intsetd)
{
datada=setd;
if(setd>4095) datada=4095;
if(setd
AC_6011_DA(NTportio,idd[0],1,datada
}
voidinit()
{
sum=0.0;u=0;pid0=0;pid1=0.0;
kp=10;ki=0;kd=0;aim=0;
e0=0.0;e1=0.0;e2=0.0;
err1=0;out=0;
flag=0;wave=0;
}
4.4 物理系统下控制程序的PID 参数整定
由于物理系统的复杂性,非线性,导致之前在仿真模型上所整定的参数完全无法再物理系统上使用,但是其整定的方法却可以沿用,使用C 语言导出输出数据,使用Matlab 的绘图功能,调入数据绘图,反复调整参数,观察图形变化,确定最佳响应的PID 参数即可。保存数据,绘图即可。
4.5 物理系统下阶跃信号输入的PID 参数整定
根据上述方法,运行程序,选择阶跃输入,设定PID 参数,设置阶跃值,导出数据绘图,观察图像,重复上述步骤,直至整定到合适的PID 参数,最终输出曲线对比图如下图4-2:
图4-2 阶跃信号输入输出曲线图
根据上述方法,运行程序,选择方波输入,设定PID 参数,设置方波幅值及周期,导出数据绘图,观察图像,重复上述步骤,直至整定到合适的PID 参数,最终输出曲线对比图如下图4-3:
图4-3方波信号输入输出曲线图
根据上述方法,运行程序,选择正弦输入,设定PID 参数,设置正弦波幅值及周期,导出数据绘图,观察图像,重复上述步骤,直至整定到合适的PID 参数,最终输出曲线对比图如下图4-4:
图4-4方波信号输入输出曲线图
第三章 SIMULINK仿真
3.1 建立仿真模型
根据图2-1所示的控制系统框图,在SIMULINK 中选择相应的控件,用数学模型代替相应的食物环节,建立控制系统的仿真模型。如下图3-1所示:
图3-1 直流伺服电机位置控制系统SIMULINK 仿真模型图
其中PID 子系统模型图如下图3-2所示:
图3-2 PID子系统仿真模型图
为了便于分析观察PID 参数对输出的影响,以及方便参数整定,我将建立两个系统,使用相同输入,并用一个示波器展示出来观察,其系统仿真模型如图3-3所示:
图3-3直流伺服电机位置控制系统SIMULINK 仿真模型图(输出信号对比)
3.2 阶跃信号输入的PID 参数整定 通过对理论课上,PID 参数整定方法的复习,按照课堂总结的口诀:
参数整定找最佳,从小到大顺序查。 先是比例后积分,最后再把微分加。 曲线振荡很频繁,比例度盘要放大。 曲线漂浮绕大弯,比例度盘往小扳。 曲线偏离回复慢,积分时间往下降。 曲线波动周期长,积分时间再加长。 曲线振荡频率快, 先把微分降下来。 动差大来波动慢,微分时间应加长。 理想曲线两个波, 前高后低四比一。 一看二调多分析,调节质量不会低。
对于PID 参数整定,我的方法是先调节比例参数,从小到大,直到输出能够很快做出响应并且又一定超调,最终能够稳定的时候,保持比例参数P 不变,调节积分参数,渐渐消除静态偏差,如此慢慢使得PID 的参数准确使的输出能够较好的响应,做到快、准、稳。仿真对比曲线如下图3-4所示:
图3-4 阶跃信号输入输出响应曲线
输出数据如下:
0.0031737 1.3002
0.011146 0.029587 0.059223 0.097357 0.12935 0.18944
0.96551
2.0671
1.6349
1.7425
1.8022
1.95 1.9695
0.25774 0.29619 0.43128 0.46352 0.63087 0.73944 0.79818 0.9465 1.0606
1.1328
1.4675
2.1368 3.1408 4.1448 4.9473 5.4407 5.9422 6.444 6.946 7.448 8.3641 8.6809 8.9785 9.2507 9.4348 9.5733 9.6774 9.7558 9.8144 9.8584 9.8916 9.9166 9.9355 9.9497 9.9604 9.9685 9.9746 9.9792 9.9829 9.9854 9.9874 9.9888 9.9899 9.9908 9.9914 9.9919 9.9922 9.9925 9.9927 9.993 9.9931 9.9932 9.9933 9.9933
2.3042 3.3082 4.3122 4.9815 5.4835 5.9855 6.4875 6.9895 7.4915 8.4036 8.7271 9.006 9.2771 9.4532 9.586 9.6862 9.7617 9.8186 9.8616 9.8939 9.9184 9.9368 9.9507 9.9611 9.969 9.975 9.9795 9.9832 9.9857 9.9876 9.989 9.9909 9.9915 9.992 9.9923 9.9926 9.9927 9.993 9.9931 9.9932 9.9933 9.9933
2.4715 3.4755 4.4795 5.0157 5.5455 6.0475 6.5494 7.0514 7.5534 8.457 8.7338 9.0436 9.298 9.4696 9.5989 9.6963 9.7696 9.8247 9.8661 9.8974 9.921 9.9388 9.9522 9.9623 9.9699 9.9756 9.9836 9.986 9.9878 9.9891 9.991 9.9915 9.992 9.9923 9.9926 9.9928 9.993 9.9931 9.9932 9.9933 9.9933
2.6389 3.6429 4.6116 5.0841 5.6076 6.1095 6.6114 7.1133 7.6153 8.4731 8.7664 9.318 9.4854 9.6113 9.7061 9.7773 9.8305 9.8706 9.9007 9.9235 9.9407 9.9536 9.9634 9.9707 9.9763 9.9838 9.9861 9.9879 9.9892 9.9911 9.9916 9.992 9.9923 9.9926 9.9928 9.993 9.9931 9.9932 9.9933 9.9933
2.7452 3.7468 4.6468 5.1488 5.6508 6.1528 6.6548 7.1568 7.6588 8.5113 8.8004 9.3414 9.5017 9.6226 9.7137 9.7825 9.8343 9.8734 9.9029 9.9251 9.9418 9.9545 9.964 9.9712 9.9766 9.9841 9.9864 9.9881 9.9894 9.9911 9.9917 9.9921 9.9924 9.9926 9.9928 9.993 9.9932 9.9932 9.9933 9.9933
2.8062 3.8102 4.8142 5.2092 5.7129 6.2148 6.7167 7.2187 7.7207 8.5481 8.8469 9.3607 9.5169 9.6345 9.7231 9.7898 9.8398 9.8776 9.906 9.9275 9.9437 9.9559 9.9651 9.972 9.9772 9.9845 9.9866 9.9883 9.9895 9.9912 9.9917 9.9921 9.9924 9.9926 9.9928 9.9931 9.9932 9.9932 9.9933 9.9933
2.9532 3.9557 4.9235 5.2696 5.7749 6.2767 6.7787 7.2806 7.7827 8.5976 8.8779 9.3792 9.5314 9.646 9.7321 9.7968 9.8451 9.8816 9.9091 9.9298 9.9454 9.9572 9.9661 9.9727 9.9778 9.9846 9.9868 9.9884 9.9896 9.9913 9.9918 9.9921 9.9924 9.9927 9.9929 9.9931 9.9932 9.9933 9.9933 9.9933
2.9735 3.9775 4.9473 5.3161 5.8181 6.3201 6.8221 7.3241 7.8261 8.6096 8.9077 9.3999 9.5459 9.6559 9.7388 9.8014 9.8486 9.8841 9.911 9.9312 9.9465 9.958 9.9666 9.9732 9.9781 9.985 9.987 9.9885 9.9897 9.9913 9.9918 9.9922 9.9925 9.9927 9.9929 9.9931 9.9932 9.9933 9.9933 9.9933
3.07484.08654.94735.37845.88026.38216.88417.38617.8881
8.32328.64598.9499
9.2299.41779.55989.66699.74759.8089.85369.88799.91399.93349.94819.95929.96769.97399.9787
9.98279.98539.98729.98879.9898
9.99079.99149.99189.99229.99259.99279.9939.99319.99329.99339.99339.9933
7.95 7.9935 8.0554 8.0875 8.0875 8.1495 8.1608 8.2163 8.2698
9.07 9.0955 9.1288 9.1533 9.1768 9.2065
9.98 9.9805 9.9807 9.9812 9.9816 9.9818 9.9823
9.99 9.9902 9.9902 9.9903 9.9904 9.9905 9.9906 9.9907
9.9957 9.9957 9.9958 9.9957 9.9958 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.9959 9.996 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.996 9.9961
9.996
9.9957 9.9957 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.9961
9.9961
9.9957 9.9957 9.9957 9.9957 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.9961
9.9961
9.9957 9.9957 9.9958 9.9957 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9958 9.9959 9.9958 9.9959 9.9958 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.9959 9.996 9.9959 9.996 9.9959 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.996 9.9961 9.996 9.9961 9.996 9.9961
9.9961
9.99579.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99589.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.99599.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.9969.99619.9961
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962 9.9962
9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9961 9.9962 9.9962 9.9962
9.99619.99619.99619.99619.99619.99619.99619.99619.99619.99619.99619.99619.99629.99629.99629.9962
由于数据量太大,故只截留了一部分数据打印出来。
3.2 方波信号输入的PID 参数整定 根据同样的方法,替换原仿真系统的输入信号源为阶跃信号,整定PID 参数,最终输出曲线对比图如下图3-5:
图3-5 方波信号输入的输出曲线对比图
3.2 正弦信号输入的PID 参数整定 根据同样的方法,替换原仿真系统的输入信号源为正弦信号,整定PID 参数,最终输出曲线对比图如下图3-6:
图3-6 正弦信号输入的输出曲线对比图
为了清晰的看出输出对输入的跟随,将局部放大图做出,如下图3-7所示:
图3-6 正弦信号输入的输出曲线局部放大对比图
第四章 物理系统的控制
4.1 物理系统的组成与控制原理
4.2 实时控制程序流程图
进行控制程序的编写之前,先要有一个清晰的思路,使用流程图的方式能够较好的将编程思路理清楚,并且提高编程效率,减少出错率。实时控制程序流程图如下图4-1所示:
4.2 程序代码的编写
基于课堂理论知识以及实验成果的累积,采样滤波子程序已经在上学期的实验课堂上编写完毕,现在只需要编写输入信号,PID 控制子程序,AC6011的D/A输出程序即可。在我的编程,我将阶跃、方波、正弦输入输出的PID 控制编写在了一个大的主程序中,通过程序的运行,使用人机交互的形式选择输入信号,设置PID 参数,进行PID 参数整定。代码粘贴如下:
#include "stdafx.h"// 必须加入的头文件 #include "conio.h"
#include "windows.h"// 应加入的头文件 #include "stdio.h" #include "io_nt.h" #include "AC6011.h" #include "math.h"
HINSTANCE hDLL; //DLL句柄
HANDLE NTportio=NULL; //NT IO驱动 句柄--->暂定为全局变量,自定义时,可以自己传递参数
unsigned long idd[100]; float CYLB(); void init();
floatPID_realize(float ad);
voidarrive_distance(float setd); voidzf_arrive_distance(float setd); voiddf_arrive_distance(float setd); void DA(intsetd);
float sum=0.0,u,pid0,pid1=0.0,kp=10,ki=0,kd=0,p,aim=100; float e0=0.0,e1=0.0,e2=0.0;
float num1,fuzhi,zhouqi,err,err1,out,zero_plot,zero_plot1; intflag,addata,datada,i,num,k; int wave;
const float pi=3.14;
floatset,actdistance,t,T,A,ave;
FILE *fp1; FILE *fp2; FILE *fp3; FILE *fp4; void main() {
unsigned long cardc;
char *dll_name="acpci.dll";//动态连接库名
hDLL=LoadLibrary(dll_name); //调入DLL ,动态调用 #include "ac6011_func.h" #include "io_nt_func.h"
#include "math.h"
NTportio=AC_OpenDriver(); //获取IO 驱动句柄
cardc=AC_6011_INIT(NTportio,idd);//初始化AC6011卡
//------------------用户主函数可以写在以下区域----------------
flag=1; charchr;
while(flag) {
if((fp1=fopen("E:\\set.txt","w"))==NULL)
{printf("\nERROR:Can't open file,press any key to return!"); exit(0); }
if((fp2=fopen("E:\\act.txt","w"))==NULL)
{printf("\nERROR:Can't open file,press any key to return!"); exit(0); } init(); wave=0; DA(1300);
printf("请选择输入的波形? ( 阶跃:j ;方波:f ;正弦:z ) :\n"); printf("\n"); chr=getch();
if(chr=='j'){wave=1;} if(chr=='f'){wave=2;} if(chr=='z'){wave=3;} switch (wave) {
case 1:
DA(1300);
printf("Kp= 9 Ki= 0.005 \n"); scanf("%f %f",&kp,&ki);
printf("请指定到达的位置(0--200 mm):" ); scanf("%f",&set); for(j=0;j
arrive_distance(set);
printf("%d\n",j); } DA(2048); break; case 2: printf("Kp= 30 Ki= 0.005 \n"); scanf("%f %f",&kp,&ki); printf("方波幅值和周期:如:80 400\n"); scanf("%f %f",&fuzhi,&zhouqi); printf("\n"); num1=3; while(num1>0) { for(k=0;k0) {
for(t=0;t
{
set=A*sin(2*pi/T*t)+100;
arrive_distance(set);
}
num1--;
}
DA(2048);
break;
default:
DA(1300);
break;
}
fclose(fp1);
fclose(fp2);
flag=0;
printf("Kp=%.3f ; Ki=%.3f ; Kd=%.3f\n",kp,ki,kd);
printf("需要再运行一次吗? (y/n)\n");
printf("\n");
if(getch()=='y'){flag=1;printf("下一次运行前,请保存数据!\n");} }
DA(1300);
//}
//------------------------------------------------------------------------ AC_CloseDriver(NTportio);//关闭AC6011卡驱动
FreeLibrary(hDLL);//清DLLgetch();
}
floatPID_realize(float setd)
{
aim=setd;
sum=0;
for(i=0;i
{
addata=AC_6011_AD(NTportio,idd[0],14,1);
u=(addata*5.0)/4095.0;
sum=sum+u;
}
ave=sum/300.0-1.22;
p=ave*400/5;
e0=aim-p;
sum_e0+=e0;
pid0=kp*(e0-e1)+ki*e0+kd*(e0-2*e1+e2);
pid0=pid1+pid0;
pid1=pid0;
u=pid0*5/400.0;
printf("pid_out=%.3f\n",u);
if(u>10) u=9;
if(u
if(u0&&e0>0) u=u+0.63;
if(u>-0.8&&u
e2=e1;
e1=e0;
return u;
}
voidarrive_distance(float setd)
{
if(setd>=175){setd=175;}
if(setd
out=PID_realize(setd);
datada=2048*(u/10.0)+2048;
printf("设定位移:");
printf("%.2f",setd);
printf("\n");
printf("当前位移:");
printf("%.2f",p);
printf("\n");
err1=setd-p;
printf("误差: ");
printf("%.4f",err1);
printf("\n");
fprintf(fp1,"%f ",setd);
fprintf(fp2,"%f ",p);
DA(datada);
}
void DA(intsetd)
{
datada=setd;
if(setd>4095) datada=4095;
if(setd
AC_6011_DA(NTportio,idd[0],1,datada
}
voidinit()
{
sum=0.0;u=0;pid0=0;pid1=0.0;
kp=10;ki=0;kd=0;aim=0;
e0=0.0;e1=0.0;e2=0.0;
err1=0;out=0;
flag=0;wave=0;
}
4.4 物理系统下控制程序的PID 参数整定
由于物理系统的复杂性,非线性,导致之前在仿真模型上所整定的参数完全无法再物理系统上使用,但是其整定的方法却可以沿用,使用C 语言导出输出数据,使用Matlab 的绘图功能,调入数据绘图,反复调整参数,观察图形变化,确定最佳响应的PID 参数即可。保存数据,绘图即可。
4.5 物理系统下阶跃信号输入的PID 参数整定
根据上述方法,运行程序,选择阶跃输入,设定PID 参数,设置阶跃值,导出数据绘图,观察图像,重复上述步骤,直至整定到合适的PID 参数,最终输出曲线对比图如下图4-2:
图4-2 阶跃信号输入输出曲线图
根据上述方法,运行程序,选择方波输入,设定PID 参数,设置方波幅值及周期,导出数据绘图,观察图像,重复上述步骤,直至整定到合适的PID 参数,最终输出曲线对比图如下图4-3:
图4-3方波信号输入输出曲线图
根据上述方法,运行程序,选择正弦输入,设定PID 参数,设置正弦波幅值及周期,导出数据绘图,观察图像,重复上述步骤,直至整定到合适的PID 参数,最终输出曲线对比图如下图4-4:
图4-4方波信号输入输出曲线图