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

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

《计算机控制实验课(邵长友》由会员分享,可在线阅读,更多相关《计算机控制实验课(邵长友(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:恒为

3、0。,接收数据寄存器收到了一个完整的字符,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:设置通讯参数 b

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

5、 D7 D6 D5 D4 D3 D2 D1 D0,#include #include main() int i; bioscom(0,0x83,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 com

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

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

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

10、); outportb(0x20,0x20);,通道0,方式0,定时时间到调用中断服务程序,实验三、中断方式实现串口通信,通过“设备管理器查看键盘和COM1的中断源,8259主片中断源:,键盘,COM1,#include #include main() int i;disable(); bioscom(0,0x83,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 feedbac

12、k) double dErr,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) mems

13、et(m,0,sizeof(motor);,double 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 ma

14、in() FILE *fp=fopen(data.txt,w+); PID 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;error_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,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号