资源描述
计算机控制技术课程设计
姓 名: 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、 采用模块化结构编制测控程序,定时中断和测速利用8253 T0、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
16
QH+Yx0M中华维修论坛对于一只型号标示不清或无标志的三极管,要想分辨出它们的三个电极,也可用万用表测试。先将万用表量程开关拨在R×100或R×1k电阻挡上。红表笔任意接触三极管的一个电极,黑表笔依次接触另外两个电极,分别测量它们之间的电阻值,若测出均为几百欧低电阻时,则红表笔接触的电极为基极b,此管为PNP管。若测出均为几十至上百千欧的高电阻时,则红表笔接触的电极也为基极b,此管为NPN管。
Vo#Wvk fU在判别出管型和基极b的基础上,利用三极管正向电流放大系数比反向电流放大系数大的原理确定集电极。任意假定一个电极为c极,另一个电极为e极。将万用表量程开关拨在R×1k电阻挡上。对于:PNP管,令红表笔接c极,黑表笔接e极,再用手同时捏一下管子的b、c极,但不能使b、c两极直接相碰,测出某一阻值。然后两表笔对调进行第二次测量,将两次测的电阻相比较,对于:PNP型管,阻值小的一次,红表笔所接的电极为集电极。对于NPN型管阻值小的一次,黑表笔所接的电极为集电极。
四、系统原理图
五、控制算法设计及程序流程图
PID控制是一种应用最广泛的控制规律。数字PID控制算式又分为位置型和增量型两种,分别如下式所示:
本实验采用基本的位置式。
图 8:PID位置式控制原理图
图 9:位置式PID控制算法程序框图
关中断
保护现场
装入数据段段址
开始
N
count-1,count=0?
将数据段段址送DS、ES
Y
恢复count初值38
置初值
count,waitt,speed,getsp,
cons0,cons1,cons2,sub1,sub2,sub3,mid0,mid1
重置T1初值
N
waitt-1,waitt=0?
Y
恢复waitt初值1
显示MESS信息
从T1采样转速置→getsp
显示spmess的字符串
置中断向量
调用子程序TIMER0
显示转速的千、百、十、个位数
显示tmmess的字符串
中断控制器8259初始化
PID调节
调子程序TIMER1
开中断
Adjust返回
恢复现场
U(k)送DAC0832
中断结束标志
Y
Vb是否大于66?
开中断
N
U(k)置为66
中断返回
中断服务子程序
主程序
图 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
;DC MOTOR
;CX=SPEED USER WANTED 0-40 R/S
;MAIN PROC FAR
DATA SEGMENT 'DATA'
SPEED DB 20H ;存放给定转速
GETSP DB 00H ;存放反馈转速
CONS0 DB 2 ;存放系数a0=Kp(1+T/Ti+Td/T)
CONS1 DB 2 ;存放系数a1=Kp(1+2Td/T)
CONS2 DB 1 ;存放系数a2=Kp*Td/T
SUB0 DB 00H ;存放偏差值e(k)=speed-getsp
SUB1 DB 00H ;存放偏差值e(k-1)
SUB2 DB 00H ;存放偏差值e(k-2)
MID0 DW 00H ;存放乘积a0*e(k)
MID1 DW 00H ;存放乘积a1*e(k-1)
OUTP DB 40H ;存放U(k-1)
WAITT DB 1 ;采样时间
COUNT DB 38 ;时钟频率为1/38
DATA ENDS
;
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA
BEGIN: MOV AX,DATA ;将数据段段值送DS、ES
MOV DS,AX
MOV ES,AX
MOV SPEED,CL ;给定目标速度
MOV AX,CS ;显示MESS信息
MOV ES,AX
MOV BP,OFFSET MTMESS ;取MESS偏移地址给BP
MOV AH,4 ;置中断向量,利用内部中断
INT 14H
PUSH DS ;置中断处理程序
XOR AX,AX
MOV DS,AX
LEA AX,RING ;取偏移地址
MOV DS:20H,AX ;中断类型为08H,时钟中断(终端入口偏移地址)
MOV AX,CS
MOV DS:22H,AX ;段基址
MOV AL,13H ;8259初始化,置初始化命令字ICW1
OUT 20H,AL
MOV AL,08H ;置初始化命令字ICW2
OUT 21H,AL
MOV AL,0DH ; ICW4,中断正常结束方式
OUT 21H,AL
MOV AL,0FEH ;置操作命令字OCW1,仅IR0未被屏蔽
OUT 21H,AL
MOV AL,20H ;置操作命令字OCW2,令EOI为1,结束中断
OUT 20H,AL
POP DS
CALL TIMER0 ;调用计数器0初始化程序
CALL TIMER1
STI
MOV AL,0FFH ;因为电机爬速最低电压为b极为1.25,c极为2.74,消除死区电压
OUT 09H,AL
OUT 08H,AL
RUN: JMP RUN
;
RING: CLI ;关中断,中断服务子程序
PUSH DS ;保护现场
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,DATA ;载入数据段
MOV DS,AX
DEC COUNT ;中断次数COUNT-1,判断是否为0,为0,1秒到
JNZ EXIT
MOV COUNT,38 ;恢复初值
CALL TIMER1 ;重置T1初值
DEC WAITT ;转速采样间隔WAITT-1,判断是否为0,为0,1秒到
JNZ EXIT
MOV WAITT,1 ;恢复WAITT为1
CALL ADJUST ;调用采样程序
EXIT: POP DX ;恢复现场
POP CX
POP BX
POP AX
POP DS
MOV AL,20H ;8259操作命令字OCW2中EOI置1,结束中断
OUT 20H,AL
STI ;中断结束,返回
IRET
;
ADJUST: IN AL,41H ;从T1采样转速值赋给GETSP,读入值为99H-脉冲数
MOV AH,AL
MOV AL,99H
SUB AL,AH ;最终为脉冲数,分高8位,低8位
DAS ;十进制调整,结果为十进制数
MOV GETSP,AL
MOV AX,CS ;显示SETMESS的字符串
MOV ES,AX
MOV BP,OFFSET SETMESS
MOV AH,4 ;串行通信中断调用,发送ES:BP开始的字符串
INT 14H
MOV AL,SPEED ; SPEED显示十位
MOV CL,4
SAR AL,CL
ADD AL,30H
MOV AH,1
INT 14H
MOV AL,SPEED ;SPEED显示个位
AND AL,0FH
ADD AL,30H
MOV AH,1
INT 14H
MOV AX,CS ;显示GETMESS的字符串
MOV ES,AX
MOV BP,OFFSET GETMESS
MOV AH,4
INT 14H
MOV AL,GETSP ; GETSP十位数
MOV CL,4
SHR AL,CL
ADD AL,30H
MOV AH,1
INT 14H
MOV AL,GETSP ; GETSP个位数
AND AL,0FH
ADD AL,30H
MOV AH,1
INT 14H
MOV AX,CS ;显示RSMESS
MOV ES,AX
MOV BP,OFFSET RSMESS
MOV AH,4
INT 14H
MOV AL,SPEED ;码制转换
MOV CL,4
SHR AL,CL
MOV DL,10
IMUL DL
MOV BL,AL
MOV AL,SPEED
AND AL,0FH
ADD BL,AL
MOV BH,BL ;BH中存给定速度
MOV AL,GETSP ;码制转换
MOV CL,4
SAR AL,CL
MOV DL,10
IMUL DL
MOV BL,AL
MOV AL,GETSP
AND AL,0FH
ADD BL,AL
SUB BH,BL
MOV SUB0,BH ;计算e(k)
MOV AL,BH
MOV DL,CONS0 ;取a0
IMUL DL ;取a0*e(k)放入AX
MOV MID0,AX ;a0*e(k)暂存单元
MOV AL,SUB1 ;取e(k-1)
MOV DL,CONS1 ;a1
IMUL DL
MOV MID1,AX ;a1*e(k-1)暂存单元
MOV AL,SUB2
MOV DL,CONS2 ;a2
IMUL DL ;AX=a2*e(k-2)
ADD AX,MID0
SBB AX,MID1
ADD AL,OUTP ;u(k-1)+a0*e(k)-a1*e(k-1)+a2*e(k-2)
ADC AH,00H ;计算
CMP AX,0FFH ;上限值比较
JG ADJST0
CMP AX,40H ;下限值比较
JL ADJST1
JMP ADJST2
ADJST0: MOV AL,0FFH
JMP ADJST2
ADJST1: MOV AL,40H
ADJST2: OUT 09H,AL
OUT 08H,AL
MOV OUTP,AL ;u(k)赋给u(k-1)
MOV AL,SUB1
MOV SUB2,AL ;e(k-1)->e(k-2)
MOV AL,SUB0
MOV SUB1,AL ;e(k)->e(k-1)
retn
;
TIMER1: MOV AL,59H ;8253计数器1初始化(01选择计数器1;01表示只写入低8位;100方式4,软件触发选通,控制字写入OUT为高;1表示十进制)
OUT 43H,AL
MOV AL,99H
OUT 41H,AL ;把99H给计数器1
retn
TIMER0: MOV AL,34H ;8253定时器0初始化(00选择计数器0;11为16位计数,先低8位,后高8位;010方式2,分频工作方式,控制字写入OUT为高;0为二进制计数)
OUT 43H,AL
MOV AL,79
OUT 40H,AL
MOV AL,245
OUT 40H,AL ;把24579给定时器0
retn
MTMESS DB "********** DC MOTOR **********",0
SETMESS DB " SETSPEED=",0
GETMESS DB "R/S GETSPEED=",0
RSMESS DB "R/S ",0
MAIN ENDP
CODE ENDS
END BEGIN
展开阅读全文