江苏大学计算机控制技术课程设计.docx
《江苏大学计算机控制技术课程设计.docx》由会员分享,可在线阅读,更多相关《江苏大学计算机控制技术课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
江苏大学计算机控制技术课程设计
计算机控制技术课程设计
姓名:
XXX
专业:
自动化1101
学号:
311-------
所在学院:
电气信息工程学院
2013年1月13日
一、设计要求及内容3
二、实验原理3
三、功能模块简介3
四、系统原理图7
五、控制算法设计及程序流程图8
六、调试结果与分析10
七、心得体会10
参考文献10
附录10
一、设计要求及内容
1、了解霍尔器件的工作原理;
2、掌握利用微机技术进行转速测量与控制的基本原理和方法。
3、采用PID控制算法设计、调试系统控制软件,实现直流电机转速的测控,并利用FD-ST8088A实验软件平台或显示器件动态显示所测转速,控制量大小等信息,转速给定由键盘置入。
电机转速控制特性参数见表1。
表1:
电机转速控制特性参考表(5V/42mA)
Vb
1.24
1.25
1.3
1.39
1.49
1.74
1.84
1.97
2.15
2.24
2.8
3.5
4.6
Vc
2.76
2.74
2.7
2.6
2.8
1.5
1
0.8
0.3
0.2
0.1
0.08
0.06
备注
停速
爬速
启速阀值
高速
4、采用模块化结构编制测控程序,定时中断和测速利用8253T0、T1编制相应的服务程序,显示相关信息调用INT14。
5、将调速系统按接线图连接无误后,再将编好的源程序汇编、链接,形成可执行文件并下载到FD-SJ8088进行调试、运行,直到满意为止。
二、实验原理
根据霍尔效应原理,将一块永久磁钢固定在电机转轴上的转盘边沿,转盘随被测轴旋转,磁钢也将跟着同步旋转,在转盘附近安装一个霍尔器件3013T,转盘随轴旋转时,受磁钢所产生的磁场的影响,霍尔器件输出脉冲信号,其频率与转速成正比,测出脉冲的周期或频率即可计算出转速。
本实验利用8253定时中断的方法实现此目的。
直流电机的转速与施加于电机两端的电压、电流大小有关。
本设计利用DAC0832控制输出到直流电机的电压,电流即通过控制DAC0832的模拟输出信号量来控制电机的转速。
当测出电机转速小于设定值时增大D/A输出电压;当测出电机转速大于设定值时减小D/A输出电压,从而使电机以某一转速恒速运转。
三、功能模块简介
1、DACA0832
DAC0832是8位并行、电流型D/A转换集成芯片。
这个芯片接口简单、转换控制容易。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
图1:
DAC0832
DAC0832有3种工作方式:
(1)单缓冲方式;
(2)双缓冲方式;
(3)直通方式。
本实验采用单缓冲方式。
2、8253
8253有6种工作方式:
(1)方式0:
计数结束中断;
(2)方式1:
可编程单稳脉冲;
(3)方式2:
频率发生器(分频器);
(4)方式3:
方波发生器;
(5)方式4:
软件触发选通信号;
(6)方式5:
硬件触发选通信号。
本实验采用方式2和4。
3、8259A
主要功能:
在有多个中断源的系统中,接受外部的中断请求,并进行判断,选中当前优先级最高的中断请求,再将此请求送到CPU的INTR端;当CPU响应中断并进入中断子程序的处理过程后,中断控制器仍负责对外部中断请求的管理。
初始化命令字1寄存器(ICW1)说明如图2所示。
图2:
初始化命令字1寄存器
初始化命令字2寄存器(ICW2)说明如图3所示。
图3:
初始化命令字2寄存器
初始化命令字4寄存器(ICW4)说明如图4所示。
图4:
初始化命令字4寄存器
4、LM324
图5:
LM324引脚图
5、74LS138
74LS138为3线-8线译码器,其工作原理如下:
当一个选通端(E1)为高电平,另两个选通端((/E2))和/(E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。
图6:
74LS138引脚图
6、三极管电极的判别
己知三极管类型及电极,用指针式万用表判别三极管好坏的方法如下:
1、测NPN三极管:
将万用表欧姆挡置"R×100"或"R×lK"处,把黑表笔接在基极上,将红表笔先后接在其余两个极上,如果两次测得的电阻值都较小,再将红表笔接在基极上,将黑表笔先后接在其余两个极上,如果两次测得的电阻值都很大,则说明三极管是好的。
2、测PNP三极管:
将万用表欧姆挡置"R×100"或"R×lK"处,把红表笔接在基极上,将黑表笔先后接在其余两个极上,如果两次测得的电阻值都较小,再将黑表笔接在基极上,将红表笔先后接在其余两个极上,如果两次测得的电阻值都很大,则说明三极管是好的。
`H/x
QH+Yx0M中华维修论坛对于一只型号标示不清或无标志的三极管,要想分辨出它们的三个电极,也可用万用表测试。
先将万用表量程开关拨在R×100或R×1k电阻挡上。
红表笔任意接触三极管的一个电极,黑表笔依次接触另外两个电极,分别测量它们之间的电阻值,若测出均为几百欧低电阻时,则红表笔接触的电极为基极b,此管为PNP管。
若测出均为几十至上百千欧的高电阻时,则红表笔接触的电极也为基极b,此管为NPN管。
Vo#WvkfU在判别出管型和基极b的基础上,利用三极管正向电流放大系数比反向电流放大系数大的原理确定集电极。
任意假定一个电极为c极,另一个电极为e极。
将万用表量程开关拨在R×1k电阻挡上。
对于:
PNP管,令红表笔接c极,黑表笔接e极,再用手同时捏一下管子的b、c极,但不能使b、c两极直接相碰,测出某一阻值。
然后两表笔对调进行第二次测量,将两次测的电阻相比较,对于:
PNP型管,阻值小的一次,红表笔所接的电极为集电极。
对于NPN型管阻值小的一次,黑表笔所接的电极为集电极。
四、系统原理图
五、控制算法设计及程序流程图
PID控制是一种应用最广泛的控制规律。
数字PID控制算式又分为位置型和增量型两种,分别如下式所示:
本实验采用基本的位置式。
图8:
PID位置式控制原理图
图9:
位置式PID控制算法程序框图
PID调节
调子程序TIMER1
开中断
Adjust返回
主程序
图10:
程序流程图
六、调试结果与分析
当程序完成后,由于waitt=5,所以转速调节速度比较慢,当waitt改为3后,调节速度明显加快,对于PID调节的参数,刚开始时,cons0=1,cons1=1,cons2=1,调节速度很快,但超调很大;于是又将参数改为cons0=2,cons1=5,cons2=5,微分调节比较小,将速度给定在30r/s,但是速度在30r/s左右波动很大,于是又将cons0=2,cons1=4,cons2=3,将速度给定在30r/s,速度先上升,上升到30r/s时继续上升,到32r/s后速度下降,速度降至28r/s,然后又上升,经过几次调节,最后稳定在30r/s。
七、心得体会
为期一周半的计算机控制技术课程设计结束了,通过这次课程设计我受益匪浅,感受颇多。
在这次的课程设计中我系统地认识了编程和调试技术,也有了一定的提高,让我将之前学的单片机及控制技术方法学以致用。
但通过这次课程设计,我愈加意识到自己之前学习上的各种漏洞,很多知识都已经遗忘,而主要的原因是当初学习的时候没有很好地把理论与实践相结合,只看到了最表面的,没有认识本质的,以至于很快的遗忘,自己在这方面的学习还需要不断加深。
在编程的过程中,遇到各种各样的问题,很感谢老师的悉心指导和同学们的帮助!
这次课程设计很大程度上锻炼了我的实际动手能力,使我的理论知识与实践充分地结合。
在编写程序的过程中,我遇到了很多问题,使我发现了自己以前学习上存在的不足。
调试的过程也不是一帆风顺的,在查错的过程中,我也变的更细心了。
很多时候只是粗心将一个符号漏写或是写错,就会使整个程序的结果出现问题。
通过老师的指导和与同学的探讨,我终于把问题解决了。
以前学的主要是一些理论知识,这次课程设计使我意识到我的实践能力的不足。
在以后的学习生活中,我会更努力地读书和实践。
此次设计我综合运用课堂所学的知识,在解决问题方面得到了一次系统性的训练和提高,弥补了我的不足,使我将所学的理论知识运用于实际的能力得到了一定的提高,软件编程、排错调试能力也得到了较全面的锻炼。
通过这次的课程设计,真的学到了很多。
纠正了之前的许多知识上的错误理解,也极大程度的批判了自己之前学习浅尝辄止的态度。
很多东西只有亲身经历过才能体会,如若我没有自己动手编程,我就不会了解编程时的辛酸与成功运行时刻的喜悦。
一个程序足以体现编程者的各方面能力,没有足够的细心和耐心,没有紧密的逻辑思维能力,没有扎实的指令基础,都不可能完成。
以前学习C语言的编程时就觉得很复杂,现在想来真的简单多了,正如生活一样,没有成长之前,一点点小事都是那么的困难,磨练多了,才能坦然的面对。
坦诚的说,自己不是一个合格的编程员,现在的自己没有足够的细心和耐心去琢磨一个问题,总想依赖于外界的各种资源,没有养成深入研究的习惯,希望自己能改变这些不好的习惯,学会独立的去思考问题,学会专研,学会静下心来去解决问题。
再次感谢指导老师对我的帮助!
参考文献
1.赖寿宏主编.《微型计算机控制技术》.北京:
机械工业出版社,2004.
2.于海生等编著.《计算机控制技术》.北京:
机械工业出版社,2005.
3.潘新民.《微型计算机控制技术》.北京:
高等教育出版社,2001.7.
4.高国琴.《微型计算机控制技术》.北京:
高等教育出版社,2008.6.
附录
程序清单
;MOTOR.ASM
;DCMOTOR
;CX=SPEEDUSERWANTED0-40R/S
;MAINPROCFAR
DATASEGMENT'DATA'
SPEEDDB20H;存放给定转速
GETSPDB00H;存放反馈转速
CONS0DB2;存放系数a0=Kp(1+T/Ti+Td/T)
CONS1DB2;存放系数a1=Kp(1+2Td/T)
CONS2DB1;存放系数a2=Kp*Td/T
SUB0DB00H;存放偏差值e(k)=speed-getsp
SUB1DB00H;存放偏差值e(k-1)
SUB2DB00H;存放偏差值e(k-2)
MID0DW00H;存放乘积a0*e(k)
MID1DW00H;存放乘积a1*e(k-1)
OUTPDB40H;存放U(k-1)
WAITTDB1;采样时间
COUNTDB38;时钟频率为1/38
DATAENDS
;
CODESEGMENT'CODE'
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
BEGIN:
MOVAX,DATA;将数据段段值送DS、ES
MOVDS,AX
MOVES,AX
MOVSPEED,CL;给定目标速度
MOVAX,CS;显示MESS信息
MOVES,AX
MOVBP,OFFSETMTMESS;取MESS偏移地址给BP
MOVAH,4;置中断向量,利用内部中断
INT14H
PUSHDS;置中断处理程序
XORAX,AX
MOVDS,AX
LEAAX,RING;取偏移地址
MOVDS:
20H,AX;中断类型为08H,时钟中断(终端入口偏移地址)
MOVAX,CS
MOVDS:
22H,AX;段基址
MOVAL,13H;8259初始化,置初始化命令字ICW1
OUT20H,AL
MOVAL,08H;置初始化命令字ICW2
OUT21H,AL
MOVAL,0DH;ICW4,中断正常结束方式
OUT21H,AL
MOVAL,0FEH;置操作命令字OCW1,仅IR0未被屏蔽
OUT21H,AL
MOVAL,20H;置操作命令字OCW2,令EOI为1,结束中断
OUT20H,AL
POPDS
CALLTIMER0;调用计数器0初始化程序
CALLTIMER1
STI
MOVAL,0FFH;因为电机爬速最低电压为b极为1.25,c极为2.74,消除死区电压
OUT09H,AL
OUT08H,AL
RUN:
JMPRUN
;
RING:
CLI;关中断,中断服务子程序
PUSHDS;保护现场
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAX,DATA;载入数据段
MOVDS,AX
DECCOUNT;中断次数COUNT-1,判断是否为0,为0,1秒到
JNZEXIT
MOVCOUNT,38;恢复初值
CALLTIMER1;重置T1初值
DECWAITT;转速采样间隔WAITT-1,判断是否为0,为0,1秒到
JNZEXIT
MOVWAITT,1;恢复WAITT为1
CALLADJUST;调用采样程序
EXIT:
POPDX;恢复现场
POPCX
POPBX
POPAX
POPDS
MOVAL,20H;8259操作命令字OCW2中EOI置1,结束中断
OUT20H,AL
STI;中断结束,返回
IRET
;
ADJUST:
INAL,41H;从T1采样转速值赋给GETSP,读入值为99H-脉冲数
MOVAH,AL
MOVAL,99H
SUBAL,AH;最终为脉冲数,分高8位,低8位
DAS;十进制调整,结果为十进制数
MOVGETSP,AL
MOVAX,CS;显示SETMESS的字符串
MOVES,AX
MOVBP,OFFSETSETMESS
MOVAH,4;串行通信中断调用,发送ES:
BP开始的字符串
INT14H
MOVAL,SPEED;SPEED显示十位
MOVCL,4
SARAL,CL
ADDAL,30H
MOVAH,1
INT14H
MOVAL,SPEED;SPEED显示个位
ANDAL,0FH
ADDAL,30H
MOVAH,1
INT14H
MOVAX,CS;显示GETMESS的字符串
MOVES,AX
MOVBP,OFFSETGETMESS
MOVAH,4
INT14H
MOVAL,GETSP;GETSP十位数
MOVCL,4
SHRAL,CL
ADDAL,30H
MOVAH,1
INT14H
MOVAL,GETSP;GETSP个位数
ANDAL,0FH
ADDAL,30H
MOVAH,1
INT14H
MOVAX,CS;显示RSMESS
MOVES,AX
MOVBP,OFFSETRSMESS
MOVAH,4
INT14H
MOVAL,SPEED;码制转换
MOVCL,4
SHRAL,CL
MOVDL,10
IMULDL
MOVBL,AL
MOVAL,SPEED
ANDAL,0FH
ADDBL,AL
MOVBH,BL;BH中存给定速度
MOVAL,GETSP;码制转换
MOVCL,4
SARAL,CL
MOVDL,10
IMULDL
MOVBL,AL
MOVAL,GETSP
ANDAL,0FH
ADDBL,AL
SUBBH,BL
MOVSUB0,BH;计算e(k)
MOVAL,BH
MOVDL,CONS0;取a0
IMULDL;取a0*e(k)放入AX
MOVMID0,AX;a0*e(k)暂存单元
MOVAL,SUB1;取e(k-1)
MOVDL,CONS1;a1
IMULDL
MOVMID1,AX;a1*e(k-1)暂存单元
MOVAL,SUB2
MOVDL,CONS2;a2
IMULDL;AX=a2*e(k-2)
ADDAX,MID0
SBBAX,MID1
ADDAL,OUTP;u(k-1)+a0*e(k)-a1*e(k-1)+a2*e(k-2)
ADCAH,00H;计算
CMPAX,0FFH;上限值比较
JGADJST0
CMPAX,40H;下限值比较
JLADJST1
JMPADJST2
ADJST0:
MOVAL,0FFH
JMPADJST2
ADJST1:
MOVAL,40H
ADJST2:
OUT09H,AL
OUT08H,AL
MOVOUTP,AL;u(k)赋给u(k-1)
MOVAL,SUB1
MOVSUB2,AL;e(k-1)->e(k-2)
MOVAL,SUB0
MOVSUB1,AL;e(k)->e(k-1)
retn
;
TIMER1:
MOVAL,59H;8253计数器1初始化(01选择计数器1;01表示只写入低8位;100方式4,软件触发选通,控制字写入OUT为高;1表示十进制)
OUT43H,AL
MOVAL,99H
OUT41H,AL;把99H给计数器1
retn
TIMER0:
MOVAL,34H;8253定时器0初始化(00选择计数器0;11为16位计数,先低8位,后高8位;010方式2,分频工作方式,控制字写入OUT为高;0为二进制计数)
OUT43H,AL
MOVAL,79
OUT40H,AL
MOVAL,245
OUT40H,AL;把24579给定时器0
retn
MTMESSDB"**********DCMOTOR**********",0
SETMESSDB"SETSPEED=",0
GETMESSDB"R/SGETSPEED=",0
RSMESSDB"R/S",0
MAINENDP
CODEENDS
ENDBEGIN