计算机控制实验课(邵长友).ppt

上传人:小飞机 文档编号:6606421 上传时间:2023-11-17 格式:PPT 页数:78 大小:1.82MB
返回 下载 相关 举报
计算机控制实验课(邵长友).ppt_第1页
第1页 / 共78页
计算机控制实验课(邵长友).ppt_第2页
第2页 / 共78页
计算机控制实验课(邵长友).ppt_第3页
第3页 / 共78页
计算机控制实验课(邵长友).ppt_第4页
第4页 / 共78页
计算机控制实验课(邵长友).ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《计算机控制实验课(邵长友).ppt》由会员分享,可在线阅读,更多相关《计算机控制实验课(邵长友).ppt(78页珍藏版)》请在三一办公上搜索。

1、计算机控制技术实验,邵长友,实验一、串口通信实验,一、实验目的:1.认识串口在控制中的应用2.学会用C语言给串口编程二、实验器材:PC机、串口线三、实验内容:用C语言编程实现两个PC机之间的串行通信,实验一、串口通信实验,一、认识串口,在PC机上,有各种各样的接头,其中有两个9针的接头区,见这就是串行通信端口。PC机上的串行接口有多个名称:232口、串口、通信口、COM口、异步口等。,实验一、串口通信实验,相关知识一、认识串口,实验一、串口通信实验,一、认识串口,1查看设备信息进入Windows“我的电脑”系统属性,在“设备管理器”列表中有端口COM和LPT设备信息,如图所示。,实验一、串口通

2、信实验,一、认识串口,RS-232-C标准:信号电平标准:逻辑“1”:-15V-5V 逻辑“0”:+5V+15V,实验一、串口通信实验,RS-232-C控制信号的定义,实验一、串口通信实验,一、认识串口二、实验(1)用串口调试助手实现两个PC之间的通信(2)用C语言编程实现两个PC之间的通信三、编写程序实现PC和单片机之间的串行通信(单片机程序),实验一、串口通信实验,编程知识,编程知识,COM1与COM2的I/O端口地址,线路状态寄存器(读/写),D0:接收数据就绪。D1:超越错。D2:奇偶校验错。D3:帧格式错。D4:间断错。D5:发送保持寄存器空。D6:发送移位寄存器空。D7:恒为0。,

3、接收数据寄存器收到了一个完整的字符,CPU可以读这个数据。,接口可以接收下一个要发送的字符,CPU可以写数据。,编程知识,地址:3FDH,线路状态寄存器(读/写),D0:接收数据就绪。D1:超越错。D2:奇偶校验错。D3:帧格式错。D4:间断错。D5:发送保持寄存器空。D6:发送移位寄存器空。D7:恒为0。,接收数据寄存器收到了一个完整的字符,CPU可以读这个数据。,可以接收下一个要发送的字符,CPU可以写数据。,编程知识,地址:3FDH,Turbo C的串口通信函数,int bioscom(int cmd,char byte,int port);,cmd=0:设置通讯参数 byte 的值 1

4、:把字符按字节送到通讯线上 2:从通讯线上接收一个字符 3:返回通讯端口的状态,port=0:COM1;port=1:COM2,初始化串口,byte值是下列各位的组合,0 x027个数据位0 x038个数据位,0 x00 110波特率0 x20 150波特率0 x40 300波特率0 x60 600波特率0 x801200波特率0 xa02400波特率0 xc04800波特率0 xe09600波特率,0 x001个停止位0 x042个停止位,0 x00无校验0 x08奇校验0 x18偶校验,若要求:8位数据位,1个停止位,奇校验,9600波特。byte=0 x03|0 x00|0 x08|0

5、xe0 D7 D6 D5 D4 D3 D2 D1 D0,#include#include main()int i;bioscom(0,0 x83,0);do i=inportb(0X3fd);if(i,初始化串口1 1200波特,无校验,1位停止位,8个数据位,读线路状态寄存器,判断是否有错(D1:超越错D2:奇偶校验错D3:帧格式错D4:间断错),判断接收数据是否就绪,读接收数据寄存器,显示字符。,判断发送保持寄存器是否空,如果有键按下,写发送保持寄存器输出字符。,实验二、8254定时器实验,一、实验目的:1)掌握8254定时器/计数器的工作原理与编程2)熟悉8259中断控制器的工作原理和使

6、用方法3)掌握硬件中断程序设计的原理与编程方法4)为数据采集程序打下控制采样的基础二、实验内容(1)用TPC-UP微机原理实验箱上的定时器芯片编程完成脉冲计数(2)编写程序使PC机主板上的芯片完成定时器(已经集成到一个大的芯片组中)中断实验,微机原理实验箱上的片选地址280h,280h,方式控制字,方式0:计数初值一个八位数()二进制,控制字10h,实验箱上的电路,参考程序,/*/*可编程定时器计数器(一)*/*/*8253CS-280H-287HGATE0-+5VCLK0-单脉冲OUT0-逻辑笔*/#include#include#include.ApiEx.h#pragma comment

7、(lib,.ApiEx.lib),void main()BYTEdata;if(!Startup()/*打开设备*/printf(ERROR:Open Device Error!n);return;PortWriteByte(0 x283,0 x10);/*设8253计数器0工作方式0,只写低字节*/PortWriteByte(0 x280,0 x0f);/*写入计数初值16*/while(!kbhit()/*有键按下则退出*/PortReadByte(0 x280,/*关闭设备*/,#include#include voidinterrupt myint8(void);voidmain(vo

8、id)disable();outportb(0 x43,0 x36);/0 x43是定时器控制寄存器地址outportb(0 x40,0 x9d);/0 x40是定时器0通道地址outportb(0 x40,0 x2e);/0 x9d,0 x2e分别是计数值低八位和高八位setvect(0 x08,myint8);/设置中断向量enable();while(1);,利用PC机上的定时器通道0工作在方式3,计数时间到产生中断,voidinterrupt myint8(void)putchar(8);outportb(0 x20,0 x20);/第一个0 x20主8259的OCW2的 地址,/第二

9、个0 x20是中断结束命令,#include void interrupt myint8(void);int count=1;void main(void)disable();outportb(0 x43,0 x30);outportb(0 x40,0 x0);outportb(0 x40,0 x0);setvect(0 x08,myint8);enable();while(1);,void interrupt myint8(void)char s=中国海洋大学青岛学院机电工程系;FILE*fp;fp=fopen(E:test.txt,w);fwrite(s,2,15,fp);fclose(f

10、p);outportb(0 x20,0 x20);,通道0,方式0,定时时间到调用中断服务程序,实验三、中断方式实现串口通信,通过“设备管理器查看键盘和COM1的中断源,8259主片中断源:,键盘,COM1,#include#include main()int i;disable();bioscom(0,0 x83,0);do i=inportb(0X3fd);if(i,初始化串口1:1200波特,无校验,1位停止位,8个数据位,实验四、pid 程序演示实验,一、实验目的:理解数字PID控制器的设计方法二、实验内容(1)运行C语言PID演示程序,分析设定值、被控量、偏差,控制量的变化(2)编写

11、PID MATLAB仿真程序,分析运行结果,C语言PID演示程序#include#includetypedef struct PID double Command;/输入指令 double Proportion;/比例系数 double Integral;/积分系数 double Derivative;/微分系数 double preErr;/前一拍误差 double sumErr;/误差累积PID;,void motorInit(motor*m)memset(m,0,sizeof(motor);,double PIDCale(PID*p,double feedback)double dErr

12、,Err;Err=p-Command-feedback;/当前误差 p-sumErr+=Err;/误差累加 dErr=Err-p-preErr;/误差微分 p-preErr=Err;return(p-Proportion*Err/比例项+p-Derivative*dErr/微分项+p-Integral*p-sumErr);/积分项,typedef struct motor double lastY;double preY;double lastU;double preU;motor;void motorInit(motor*m)memset(m,0,sizeof(motor);,double

13、motorCal(motor*m,double u)double y=1.9753*m-lastY-0.9753*m-preY+0.00003284*u+0.00006568*m-lastU+0.00003284*m-preU;/二阶系统 m-preY=m-lastY;m-lastY=y;m-preU=m-lastU;m-lastU=u;return y;,y(k)=y(k-1)-0.9753*y(k-2)+0.00003284*u(k)+0.00006568*u(k-1)+0.00003248*u(k-2),void main()FILE*fp=fopen(data.txt,w+);PID

14、sPID;motor m_motor;int k=0;double u;double y=0;PIDInit(,while(k=1000)fprintf(fp,%d 设定值=%f 被控量=%f 偏差=%f 控制量=%fn,k,sPID.Command,y,sPID.Command-y,u);u=PIDCale(,clear all;close all;ts=0.001;sys=tf(50,0.125,7,0);dsys=c2d(sys,ts,z);num,den=tfdata(dsys,v);u_1=0.0;u_2=0.0;y_1=0.0;y_2=0.0;x=0,0,0;error_1=0;e

15、rror_2=0;for k=1:1:1000time(k)=k*ts;,S=2;if S=1 kp=10;ki=0.1;kd=15;%Step Signal rin(k)=1;elseif S=2 kp=10;ki=0.1;kd=15;%Sine Signal rin(k)=0.5*sin(2*pi*k*ts);end,du(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID Controlleru(k)=u_1+du(k);%Restricting the output of controllerif u(k)=5 u(k)=5;endif u(k)=-5 u(k)=-5;en

16、d%Linear modelyout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;error(k)=rin(k)-yout(k);%Return of parametersu_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);,x(1)=error(k)-error_1;%Calculating Px(2)=error(k)-2*error_1+error_2;%Calculating Dx(3)=error(k);%Calculating I error_2=error_1;error_1=error(k);endfig

17、ure(1);plot(time,rin,b,time,yout,r);xlabel(time(s),ylabel(rin,yout);figure(2);plot(time,error,r)xlabel(time(s);ylabel(error);,实验五、RS485总线实验,实验目的:1、理解RS485的通信原理 2、学会RS485的C语言编程实验内容:1、利用RS232-RS485无源转换器给PC机组网 2、利用C语言编写RS485的通信程序,1.RS-485的电气特性:逻辑“1”以两线间的电压差为+(2-6)V表示;逻辑“0”以两线间的电压差为-(2-6)V表示。接口信号电平比RS-2

18、32-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。2.RS-485的数据最高传输速率为10Mbps。3.RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。4.RS-485接口的最大传输距离标准值为4000英尺,实际上可达3000米,另外RS-232-C接口在总线上只允许连接1个收发器,即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的,RS485网络,RS485网络,连线时“手拉手”,实验程序,/*-通信协议-发送的命令:#xxRn$#-命令前导符xx-两位A

19、SCII从机地址R-表示要求从机发送数据n-一位ASCII码0-9,表示发送数据的类型$-命令结束符接收的数据格式:=xxddddddddd$=-命令前导符xx-两位ASCII从机地址ddddddddd-九位ASCII码数据$-命令结束符-*/,/*-通信协议-发送的命令:#xxRn$#-命令前导符xx-两位ASCII从机地址R-表示要求从机发送数据n-一位ASCII码0-9,表示发送数据的类型$-命令结束符接收的数据格式:=xxddddddddd$=-命令前导符xx-两位ASCII从机地址ddddddddd-九位ASCII码数据$-命令结束符-*/#include#include main(

20、)int i,j,k,n;char c,cmd=#xxRn$;char address=xx;char data=xxAAAAAAAAA$;bioscom(0,0 x83,0);do printf(please input the slave computer address you want to communicate with(00-99):);scanf(%d,主机程序,/*-通信协议-接收到的信号:#xxRn$#-命令前导符xx-两位ASCII从机地址R-表示要求从机发送数据n-一位ASCII码0-9$-命令结束符发回的数据格式:=xxddddddddd$=-命令前导符xx-两位AS

21、CII从机地址ddddddddd-九位ASCII码数据$-命令结束符-*/#include#include main()int i,j,n;char c,cmd5;char address=00;char data0=AAAAAAAAA$;char data1=BBBBBBBBB$;char data2=CCCCCCCCC$;char data3=DDDDDDDCC$;printf(please setup this computer address(00-99):);scanf(%d,从机程序,实验四、标度变换和非线性补偿,实验目的:1、理解标度变换和非线性补偿原理 2、学会标度变换和非线性

22、补偿C语言编程实验内容:1、标度变换的C语言编程 2、非线性补偿的C语言编程 3、牛顿迭代法的C语言编程,一、标度变换,某热处理炉温度测量仪表的量程为0800C,在某一时刻计算机采样并经数字滤波后的数字量为CDH,求此时的温度是多少?(设该仪表的量程是线性的)。8位A/D,0800C经热电偶和信号调理电路后0-5V,再经过模数转换后:0-255(0-FFH),include stdio.h#define AM 800#define A0 0#define NM 255#define N0 0int Scale_transform(int x)int y;y=A0+(AM-A0)*(x-N0)/

23、(NM-N0);return(y);,void main(void)int x,y;printf(请输入整数0-255:);scanf(%d,二、非线性补偿(线性插值算法),退火炉的温度(0-800)检测采用K型热电偶,经过150倍两级放大,变成0-5V的标准电压信号,再经过A/D转换变为0-FFH的数字信号。其热电势V与温度t之间的分度值下表所示。可以看出,热电偶温度与mV变化曲线比较平缓,故可采用线性插值法进行补偿。,非线性补偿程序,/*Note:Your choice is C IDE*/#include stdio.hint volttotmp(unsigned char vlt)un

24、signed char volt=0,0 x0f,0 x1f,0 x2f,0 x3e,0 x4e,0 x5d,0 x6d,0 x7d,0 x8e,0 x9e,0 xae,0 xbf,0 xcf,0 xdf,0 xef,0 xff;int temp=0,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800;int i,tmp;for(i=0;i17;i+)if(vlt=volti+1)tmp=tempi+(tempi+1-tempi)*(vlt-volti)/(volti+1-volti);break;return(tmp)

25、;void main()int vlt,temp;for(;)printf(please input a number(00-ff):);scanf(%x,3、流量标度变换所用的牛顿迭代法,例:压差流量计,其流量与差压的公式为,牛顿迭代程序,#include stdio.h#includemath.hvoid main()float y,last_y,x;while(1)printf(请输入一个正数:);scanf(%f,y=(last_y+x/last_y)/2;last_y=y;while(fabs(y-last_y)=0.001);printf(%f的平方根:%fn,x,y);,实验六、

26、键盘和LED显示实验,实验目的:1、理解非编码矩阵键盘的扫描原理 2、理解LED动态扫描工作原理 3、理解串行通信的工作原理实验内容:1、4X4矩阵扫描的C语言编程 2、74HC595串行移位的C语言编程 3、LED动态显示的C语言编程,4X4矩阵键盘,4X4矩阵键盘,rcode=0 xEF;/逐行扫描初值 for(i=0;i4;i+)P2=rcode;/输出行扫描码 if(P2/行扫描码左移一位,P20-P23:列 P24-P27:行,74HC595,74HC595,74HC595,st_cp595=0;for(i=0;i8;i+)sh_cp595=0;m=segcode;m,实验七、数字滤

27、波实验,实验目的:1、理解数字滤波的基本原理 2、学会编写数字滤波的C语言程序实验内容:1、程序判断滤波 2、中位值滤波 3、平均值滤波 4、加权平均值滤波 5、一阶滞后滤波,程序判断滤波,/*Note:Your choice is C IDE*/#include stdio.h#include float program_detect_filter(float old_value,float new_value,float offset)float sample_value;if(fabs(new_value-old_value)offset)sample_value=old_value;e

28、lsesample_value=new_value;return(sample_value);main()int i;float value;float a12=2,2.3,8.1,2.5,3.3,2.9,5.4,3.3,7.3,3.6,7.2,3.9;for(i=0;i12;i+)printf(%.1f,ai);printf(n);for(i=0;i11;i+)ai+1=program_detect_filter(ai,ai+1,0.5);for(i=0;i12;i+)printf(%.1f,ai);getch();,中位值滤波,/*Note:Your choice is C IDE*/#i

29、nclude stdio.hfloat middle_filter(float middle_value,int count)float sample_value,data;int i,j;for(i=1;i=i;j-)if(middle_valuej-1middle_valuej)data=middle_valuej-1;middle_valuej-1=middle_valuej;middle_valuej=data;sample_value=middle_value(count-1)/2;return(sample_value);main()float x;float a5=2,9,5.2

30、,7,0;x=middle_filter(a,5);printf(%f,x);printf(hekkk);getch();,算术平均值滤波,/*Note:Your choice is C IDE*/#include stdio.hfloat middle_filter(float middle_value,int count)float sample_value,data;int i,j;for(i=1;i=i;j-)if(middle_valuej-1middle_valuej)data=middle_valuej-1;middle_valuej-1=middle_valuej;middle

31、_valuej=data;sample_value=middle_value(count-1)/2;return(sample_value);main()float x;float a5=2,9,5.2,7,0;x=middle_filter(a,5);printf(%f,x);printf(hekkk);getch();,加权平均值滤波,/*Note:Your choice is C IDE*/#include stdio.h#include float times_filter(float data_buf)float sample_value;float filter_k5=0.05,0

32、.15,0.25,0.25,0.3;sample_value=filter_k0*data_buf0+filter_k1*data_buf1+filter_k2*data_buf2+filter_k3*data_buf3+filter_k4*data_buf4;return(sample_value);main()float x;float a5=2,2,4,5,9;x=times_filter(a);printf(%f,x);getch();,一阶惯性滤波,/*Note:Your choice is C IDE*/#include stdio.h#include float low_filt

33、er(float sensing_value,float previous_value,float factor)float sample_value;sample_value=(1-factor)*sensing_value+factor*previous_value;return(sample_value);main()int i;float x;float a10=1.9,2,2.1,5,2.3,2.4,2.8,5,3.0,3.2;float b10;for(i=0;i10;i+)printf(%.1f,ai);printf(n);b0=a0;for(i=1;i10;i+)bi=low_

34、filter(ai,bi-1,0.8);for(i=0;i10;i+)printf(%.1f,bi);getch();,实验八,1,2,3,1,1,2,3,4,3,4,2,1,3,4,2,1,0011011011001001,顺时针,逆时针,0011100111000110,tab1=0 x03,0 x06,0 x0c,0 x09,tab2=0 x03,0 x09,0 x0c,0 x06;,if(data,0011011011001001,0011100111000110,顺时针,逆时针,源程序,/*/*步进电机*/*/*8255CS-288H-28FHPA口-逻辑电平开关PC0-BJAPC1

35、-BJBPC2-BJCPC3-BJDJP5-JD1*/#include#include#include ApiEx.h#pragma comment(lib,ApiEx.lib)void main()BYTEdata,i,tab1=0 x03,0 x06,0 x0c,0 x09,tab2=0 x03,0 x09,0 x0c,0 x06;int buf=0 x33,d;printf(Press any key to begin!nn);getch();printf(press any key to return!n);if(!Startup()/*打开设备*/printf(ERROR:Open

36、Device Error!n);return;PortWriteByte(0 x28b,0 x90);/*设置8255工作方式,a口输入,c口输出*/while(!kbhit()PortReadByte(0 x288,/*关闭设备*/,实验九,/*/*直流电机*/*/*0832CS-290H-297H8255CS-288H-28FHUB-DJ*/#include#include#include ApiEx.h#pragma comment(lib,ApiEx.lib)void main()BYTEdata;int d;printf(Press any key to begin!nn);getch();printf(press any key to return!n);if(!Startup()/*打开设备*/printf(ERROR:Open Device Error!n);return;PortWriteByte(0 x28b,0 x8b);/*设置8255工作方式,C口输入,A口输出*/while(!kbhit()PortWriteByte(0 x290,0 x80);/*D/A 输出*/PortReadByte(0 x28a,/*关闭设备*/,源程序,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号