微机原理课程设计 玩具遥控汽车
合肥学院
计算机科学与技术系微机原理与接口技术
课程设计报告
2011~2012 学年第一学期
课程微机原理与接口技术
课程设计名称电动玩具车控制器设计
学生姓名方名
学号0904013027
专业班级09级计本(3)班
指导教师张向东老师李新路老师
2011年12月
电动玩具车控制器设计
1、题意分析及解决方案
1.1课程设计的名称及内容
本次课程设计的名称是电动玩具车控制器设计,电动玩具车的动力来自于电机旋转,由电机旋转实现车体运动,通过电机调速可实现玩具车速度控制,玩具车转向可用电机微动力实现转向的控制,用实现STAR ES598PCI 单板开发机和接口芯片设计一个电动玩具车控制器,能实现熟读可调,并能实现左转右转,转向同时转向灯提示。
设计要求如下:设计出争取的接口电路原理图,要求绘制出电路图,并注明期间的名称和管脚。正确运用所给器件布线,搭建硬件电路。选用汇编语言编写主程序和子程序。调试并排错,包括硬件电路和软件编程部分的错误。写出完整的课程设计总结报告,并按时提交。
1.2题意需求分析
根据本设计给定的内容和要求,可以得出一些结论:本设计中需要用的主要是控制输入的芯片来带动小车的旋转电机,实现小车转向及速度的控制。其中最核心的是电机如何工作旋转控制小车的速度和转向,如果电机旋转的快那么小车的速度就快,反之则慢。而小车的转向控制需要通过两个电机共同旋转来模拟实现。假设电机1和电机2分别代表小车的左车轮和右车轮,那么只要使电机1的转速慢电机2的转速快,这样就可以实现小车向左转,同法也可以实现小车向右转。但是由于实现箱中只有一个直流的电机和一个步进电机,这两个电机是不同类的,所以我们不可以直接这样模拟。经分析我们可以有以下两种方案来模拟实现电动玩具车控制器的设计。一是使用两个电机来模拟实现,用直流电机的转动来表示小车做直线运动。初始设定小车的一个转速值为r0,将其视为一个参考点,如果我们想给小车加速只需调高转速即可,(减速也是同法只要减小转速)。而小车的转向问题,可以用步进电机的正转来表示小车向左转同时打亮小车的左转灯,用步进电机的反转来表示小车的右转同时点亮小车的右转灯。
二是只使用一个电机来模拟电动玩具车的控制器,小车直线运动的时候我们可以给电机一个固定电压,使其转速保持为固定的值设为R。我们规定电机转速加快大于R时,表示小车向右转同时小车右转灯亮;小于R时,表示小车向左转同时小车左转灯亮。这样就可以模拟实现设计要求的功能。根据实际情况分析,方案一更符合实际,我们选择方案一。
所以本设计中需要用到可编程接口芯片,用来控制步进电机的转向、直流电机速度控制信号及控制LED发光管亮灭进行输入和输出操作。经分析可知我们可以通过小键盘或逻辑开关来实现电机的速度、转向控制。在逻辑开关(或小键盘)上设计几个按键:1.直流电机加速键2.直流电动机减速键3.步进电机的正转键5.电机的反转键。其功能是实现每按一次键,直流电动机的转速按约定的速率改变,步进电机的转向按指定的方向转动。综上分析,我们可以总结出本次课程设计解决解决的几点问题:控制信号输入输出的实现。实现电机的旋转。直流电机
的加速、减速实现。步进电机的正反转。指示灯的显示。按键或逻辑开关的控制。数模转换原理。如何选择芯片。
1.3解决问题的思路及方法
在STAR ES598PCI单板开发机种,接口可以使用8255A或8279。动力通过电机旋转实现。步进电机通过8255的C口经过不同的相序实现左右转,而直接点击通过DAC0832来实现数字量到模拟的电压量转化来完成对直接点击转速的控制来模拟对小车速度的控制。
1.3.1硬件部分
在本实验中,要实现电机的控制,及相关功能的控制我们要用到小键盘或逻辑开关,而针对本实验采用逻辑开关要比较简单容易。虽然小键盘比较直观,而且是常用的输入设备,但是使用的过程比较烦,而且本实验中也不需要很多的按键就可以实现,所以我们采用逻辑开关就可以满足实验的要求,简单方便。
根据实验分析可知,我们可以用8255A芯片或8279A芯片,本实验不需要实现键盘/显示器的自动扫描,所以使用8255A即可。若使用8279A反而显复杂麻烦,而且8255A本身的接口就可以支持输入、输出的操作,8255A是可编程并行接口,具有传输速度快效率高等优点,既可以节约芯片的使用,又具有较好的性能,因此选用。小车的转向灯显示通过LED发光管实现。小车的转向及速度变化是通过电机实现的(速度直流电机、转向步进电机)。
综上分析,我们可以确定实现本次课程设计需要用到的部件有:8255A可编程并行芯片,逻辑开关,LED发光管,DAC0832数模转化芯片。8255是作为基本输入、输出接口使用的。
1.1软件部分
8255A是一种可编程并行I/O接口芯片,可由程序来改变其功能,通用性强,使用灵活,通过8255,CPU可直接与外设相连接。对8255进行初始化,将8255的工作方式,设定为方式0,即PA、PB、PC三个口都能够进行输入输出操作。PB口作为输入口,与逻辑开关相连,逻辑开关表示要输入的数值或要控制的相关状态,PA口与PC口均作为输出口,其中PC口控制步进电机,PA口输出接发光管,控制其发光。这样就可以达到我们预期的功能,成为很好的输入输出之间的桥梁,并利用星研提供的软中断来实现实验所需的延时,同时结合逻辑开关,对其功能进行相应的控制。逻辑开关的测试,控制电机的转速与转向。通过程序控制发光管的点亮与否并将其初始化。DAC0832的初始化与直流电机相接,将数字信号转化为模拟量,控制直流电机的转动。
2.硬件设计
2.1可编程并行接口芯片8255A
2.1.1 8255A的作用
作为输入/输出接口芯片,本实验中8255A主要用来控制接收逻辑开关送来的状态量,并送出输出信号点亮指示灯,同时控制步进电机的旋转。
2.1.28255A的功能分析
8255A采用40脚双列直插式封装单一+5V电源,全部输入/输出均与TTL电平兼容,为可编程通用并行接口芯片。它有24条可编程的I/O引脚,与Intel 系列微处理器完全兼容,直接的位清0或置1功能,简化了接口控制。8255A在本设计中起并行传输接口作用,负责将从逻辑开关得到的控制信号控制电机和发光管。本实验中将8255A设置工作在方式0,PB口作为输入口,与逻辑开关相连,
接收开关表示的数值和要控制的相关状态。PA口与PC口均作为输出口。
8255A是一种通用的可编程并行I/O接口芯片,又称“可编程外设接口芯片”。它是为8086/8088而设计的可以通过程序来改变其功能。本设计中8255A设置为方式0,在方式0下,CPU可以采用无条件读/写方式与8255A交换数据。如果把C口的两个部分用作控制和状态口,与外设的控制和状态相连,CPU也可以通过对C口的读/写实现A口与B口的查询方式工作。而本设计中CPU是采用无条件读/写方式与8255A交换数据的。
三个端口都可以作为输入端口或输出端口。A口有三种工作方式:即方式0、方式1和方式2,B口只能工作在方式0或方式1下,而C口通常作为联络信号使用,当然也可以作为输入/输出口使用。8255A的工作只有当片选CS效时才能进行。而控制逻辑端口实现对其他端口的控制。
图2-1 8255A的内部框图
控制字格式如下:本实验中8255A的控制字为82H
D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 0 0 1 0
图2-2 8255A方式选择控制字
D7=1工作方式控制标志。D5D6组合设定A口工作方式:00~方式0。D4设定A口的输入/输出,D4=0输出。D3 设定C口高位输入/输出选择,D3=0输出。D2设定B口工作方式选择,D2=0方式0。D1设定B口输入/输出选择D1=1输入。D0设定C口低位输入/输出选择,D0=0输出。
表2-1 8255A技术参数表
8255A技术参数测试条件
规范值
单位大小
输入低电平电压V IL0.8 -0.5 V 输入高电平电压V IH V CC 2.0 V 输出低电平电压V OLIOL=2.5MA 0.45 V 输出低电平电压V OLIOL=1.7MA 0.45 V 输出高电平电压V OHIOR=-400MA 2.4 V 输出高电平电压V OHIOH=-200MA 2.4 V 达林顿驱动电流IOAR-4.0 -1.0 mA
表2—1的主要参数说明如下:8255A 工作最大电流为120MA,VCC=-5V~+5V ,I (DAR )工作电流最大为4MA 。8255的输出电压不高,连接到LED 时,最好加入一个驱动器起到电流放大的作用。
表2-2 8255A 基本操作及端口地址选择、分配表
2.2 DAC0832数模转换器 2.2.1 DAC0832技术参数
表2-3 DAC0832技术参数及引脚图
(1)8-bit 转换精度,转换时间1μs (2)转换输出电压范围0~5V
CS : 片选
V CC : 电源
AGND : 模拟信号地 GND : 数字信号地 DI 0~DI 7: 数据线 V REF : 参考电压输
入
R fb :模拟量输出反馈端
ILE : 数据允许锁
存
1WR :写输入锁存器信号 2WR :写输入寄存器信号
XFER : 输入寄存器数据传送控制 I OUT1,I OUT2::D/A 变换器差动电流输出端 DAC0832引脚图
2.2.2 电路工作原理图
DAC0832是采用CMOS 工艺制成的单片直流输出型8位数/模转换器。如图4-82所示,它由倒T 型R-2R 电阻网络、模拟开关、运算放大器和参考电压VREF 四大部分组成。运算放大器输出的模拟量V0为:
电源电流 ICC 120 mA 输入负载电流 IIL IIN =0~ V CC I/O mA 输出浮动电流 IOF VOR =0.45~ V CC I/O mA
图2-3 数模转换电路原理图
公式如下:
由上式可见,输出的模拟量 与输入的数字量( ) 成
正比,这就实现了从数字量到模拟量的转换。
123
VREF 8RFB 9DGND
10
IOUT111IOUT2
12
DI713DI614DI515DI416DI07CS 1WR12AGND 3DI34DI25DI16XFER 17WR218ILE 19VDD
20
D A C 0832L C N
U20
1K
W5510
R78
0.1uF
C332
3
64
7
185
LM741CN
U2310K
W6 4.7K R79-12V
VCC
D5
+12V
-12V
OUT
D0D1D2D3D4D5D6D7
12JP31
-INPUT413OUTPUT11+INPUT13GND
11V+
4+INPUT310+INPUT25-INPUT39-INPUT26OUTPUT38
OUTPUT414OUTPUT27
-INPUT12+INPUT412LM324N
U26DS23470R71-12V
WR
0.1uF
C32
CS
图2-4 DAC0832工作电路原理图
2.2.3 DAC0832的主要技术指标
转换时间,1μs ,分辨率,8位,功耗,200mV ,单一工作电源,+5~+15。
DAC0832工作方式有三种:单缓冲方式、双缓冲方式和直通方式。根据本实验的
特点分析可知采用单缓冲方式比较简单。其方法是控制输入寄存器和DAC寄存器
同时接收数据,或者只有输入寄存器而把DAC寄存器接成直通方式。
2.3逻辑开关选择
本实验用来显示小车的转向可以用发光管来表示,在实验板上JP65:发光
管控制接口,0-灯亮,1-灯灭;用JP80控制电机的转速及转向:开关控制接口:闭合---0信号,断开—1信号。
2.3.1逻辑开关在本设计中的作用
设计时用到五个逻辑开关,分别用来控制电机的转速、转向和步进电机的启动,输入0时,开关闭合,输入1时,开关断开。
2.3.2逻辑开关的功能分析
如图2-5所示,开关未合时,与5V 电压相连,输入1,当合上之后,开关就将A 口接地,也就输入为0,4位开关可以置0~15的数。
2.3.3逻辑开关的技术参数
图2-5 8路二进制开关
开关高电平:+5V、低电平:0V。二进制逻辑开关合上表示0信号,松开表示1信。
2.4步进电机
2.4.1步进电机在本设计中的作用
步进电机的正传与反转带动齿轮转动,实现车轮的转动及实现了小车的左转与右转。
2.4.2步进电机的功能分析
步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进
式旋转。切换是通过8255输出脉冲信号来实现的。所以改变各相脉冲的先后顺序,可以改变电机的旋转方向。
图2-6 步进电机与8255A的链接原理图
用8255A的PA0~3分别控制步进电机的A、B、C、D四相,“1”则该相绕组通电,“0”则不通电。步进电机的驱动原理是使各相绕组依次通电来使其作步进式旋转,通过通电顺序和切换频率来调节其转速和转向。步进电机可以四相四拍或四相八拍方式工作,即通电顺序为:A→B→C→D→A;A→AB→B→BC→C→CD →D→DA→A。按相反的顺序即可改变电机的旋转方向。本实验系统采用的是:A →AB→B→BC→C→CD→D→DA→A。相序表:08h\0ch\04h\06h\02h\03h\01h\09h (正转);01h\03h\02h\06h\04h\0ch\08h\09h(反转)。用8279控制键盘输入和LED显示。UNL2003驱动电机运转。
2.4.3步进电机的技术参数
本设计采用的是四相步进电机,用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。图7是该四相反应式步进电机工作原理示意图。
图2-7 四相步进电机步进示意图
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
2.4直流电机
2.4.1直流电机在本设计中的作用
直流电机的转动带动车轮转动,实现小车前行。通过增大和减小直流电机的转速实现小车加速与减速。实质是调节直流电机的电压的大小来调节电机的转速。
2.4.2直流电机的功能分析
通过5个逻辑开关输入一个数字量,编码之后送至DAC0832,转换成模拟量送至直流电机,调节直流电机的转速,实现控制小车的速度。
2.4.3直流电机的技术参数
图2-8 直流电机电路原理图
如果直流电机的转子不用原动机拖动,而把它的电刷A、B接在电压为U的直流电源上(如图2所示),那么会发生什么样的情况呢?从图上可以看出,电刷A是正电位,B是负电位,在N极范围内的导体ab中的电流是从a流向b,在S极范围内的导体cd中的电流是从c流向d。前面已经说过,载流导体在磁场中要受到电磁力的作用,因此,ab和cd两导体都要受到电磁力Fde的作用。根据磁场方向和导体中的电流方向,利用电动机左手定则判断,ab边受力的方向是向左,而cd边则是向右。由于磁场是均匀的,导体中流过的又是相同的电流,所以,ab边和cd边所受电磁力的大小相等。这样,线圈上就受到了电磁力的作用而按逆时针方向转动了。当线圈转到磁极的中性面上时,线圈中的电流等于零,电磁力等于零,但是由于惯性的作用,线圈继续转动。线圈转过半州之后,虽然ab与cd的位置调换了,ab边转到S极范围内,cd边转到N极范围内,但是,由于换向片和电刷的作用,转到N极下的cd边中电流方向也变了,是从d流向c,在S极下的ab边中的电流则是从b流向a。因此,电磁力Fdc的方向仍然不变,线圈仍然受力按逆时针方向转动。可见,分别处在N、S极范围内的导体中的电流方向总是不变的,因此,线圈两个边的受力方向也不变,这样,线圈就可
以按照受力方向不停的旋转了,通过齿轮或皮带等机构的传动,便可以带动其它工作机械。
2.5硬件总逻辑图及其说明
连线说明:
表2-4 连线说明
B4区:CS(8255) A3区:CS1 B4区:PC1 E1区:B
B4区:A0、A1 ES-PCI: A0、A1 B4区:PC2 E1区:C
B4区:JP56 G6区:JP65 B4区:PC3 E1区:D
B4区:JP56 G6区:JP80 A3区:CS2 F3区:CS
B4区:PC0 E1区:A F1区:CTRL F3区:OUT(DAC0832)
图2-9 硬件原理图
3.控制程序设计
3.1控制程序设计思路说明
要实现电动玩具车的加速和减速,左转与右转以及转向灯的指示,即是通过逻辑开关控制直流电机转动的快慢,步进电机的正、反转表示小车的左右转以及LED发光管的点亮。根据所设计的硬件电路逻辑图,在编写控制程序的时候,主要是解决怎样判断逻辑开关的开关状态的控制相应的功能模块,如何通过改变直流电压来实现直流电机的加减速,从而引出另一个需解决的问题,如何在程序中实现把数字量转换为模拟量(即电压值),怎样驱动步进电机的转动及原理,LED 发光管何时点亮及发光原理。最后要知道怎样利用8255A输入输出功能实现实验的功能。
具体实现步骤如下:首先初始化8255A,使8255A工作在方式0,A口和C 口作为输入口,B口作为输入口,其初始化命令字为82H。让PA,PC口处于输出状态,PB口处于输入状态。PA工作在输出状态时控制发光二级管的亮灭,PC工
作在输出状态时,通过输出不同的量来作为步进电机的相序控制端,控制步进电机的旋转方向,而PB口处于输入状态,是作为开光的检测,判断是哪个开光被按下,以便确定执行哪项功能。而车速则是通过DAC0832来控制,因为车速是用直流电机来模拟的,直流电机转速只与电流有关,而电流又与电压有关。所以,可以通过DAC0832数模转换芯片来完成。为了观察的方便。在程序的初始化中一开始给DAC0832写入7FH这个数字量,让小车以一半的速度运行,是为了测试加减速的运行效果。而加减速的效果我是这样定义的,若是执行加速功能则通过DAC0832写入一个新的数字量,该数字量是原理数字量按10H的增率往上加的,知道FFH,而减速则是相应的是按10H的增率往下递减的知道减到0为止。这样整个设计思路就比较清晰了。按照此思路其控制流程图和控制程序如下:
3.2程序流程图
图3-1 流程图
3.1控制程序
.MODEL TINY
PCIBAR3 EQU 1CH
;8位I/O空间基地址(它就是实验仪的基地址, 也为DMA & 32 BIT RAM板卡上的8237提供基地址)
Vendor_ID EQU 10EBH
;厂商ID号
Device_ID EQU 8376
;设备ID号
.STACK 100
.DATA
IO_Bit8_BaseAddress DW ?
COUNT DB 00H
FLAG DB 00H
msg0 DB 'BIOS不支持访问PCI $' msg1 DB '找不到Star PCI9052板卡 $' msg2 DB '读8位I/O空间基地址时出错$' COM_ADD DW 00F3H
;控制口偏移量
PA_ADD DW 00F0H
;PA口偏移量
PB_ADD DW 00F1H
;PB口偏移量
PC_ADD DW 00F2H
;PC口偏移量
DA0832_ADD DW 00E0H
;DAC0832控制口偏移量
LED_DATA DB 01111111B
; 一号绿灯亮
DB 10111111B
; 二号黄灯亮
DB 11011111B
;三号灯灯亮
DB 11101111B
;四号灯亮
STEP1 db 01h,03h,02h,06h,04h,0ch,08h,09h ;步进电机正转相序
STEP2 db 09h,08h,0ch,04h,06h,02h,03h,01h ;步进电机反转相序
voltageoffset EQU 10H
voltage db 0
.CODE
start:mov ax,@data
mov ds,ax
nop
CALL INITPCI
CALL ModifyAddress
mov dx,COM_ADD
mov al,82H ;向控
制口写入方式控制字
out dx,al
Lea si,LED_DATA
mov voltage,3FH call DAC0832
mov dx,PA_ADD
mov al,0ffh
out dx,al
mov dx,PC_ADD
mov al,0
out dx,al ;步进电机
停止转动
K: MOV DX,PB_ADD
IN AL,DX
CMP AL,01H
JZ K1
CMP AL,02H
JZ K2
CMP AL,04H
JZ K3
CMP AL,08H
JZ K4
CMP AL,00H
JZ K5
K1:
speechup:mov al,voltage
cmp al,0efh
jna eee
mov al,0ffh
jmp key1
eee:add al,voltageoffset
key1: mov voltage,al
call DAC0832
L1: mov bx,si
mov dx,PA_ADD
mov al,0
xlat
out dx,al
CALL DELAY
jmp K
K2:
speechdown:
mov al,voltage
cmp al,10h
jnb ccc
mov al,00h
jmp key2
ccc:sub al,voltageoffset key2: mov voltage,al
call DAC0832
L2: mov dx,PA_ADD
mov bx,si
mov al,1
xlat
out dx,al
CALL DELAY
jmp K
K3: CMP FLAG,00H
JNZ L3
mov bx,si
mov dx,PA_ADD
mov al,2
xlat
out dx,al
L3:LEA BX,STEP1
jmp STEPA
; jmp K
K4: CMP FLAG,00H
JNZ L4
mov bx,si
mov dx,PA_ADD
mov al,3
xlat
out dx,al
L4: LEA BX,STEP2
jmp STEPB
;JMP K
K5: MOV DX,PA_ADD
MOV AL,0FFH
OUT DX,AL
MOV FLAG,00H
MOV COUNT,00H
JMP K
STEPA: MOV CX,08H
LOOP1: MOV DX,PC_ADD
MOV AL,[BX]
OUT DX,AL ;往C 端口输出脉冲
INC BX
CALL DELAY1 ;调DELAY延时子函数
LOOP LOOP1
INC COUNT
CMP COUNT,5
JZ HHH
jmp K
STEPB:MOV CX,08H
LOOP2:MOV DX,PC_ADD
MOV AL,[BX]
OUT DX,AL ;往C 端口输出脉冲
INC BX
CALL DELAY1 ;调DELAY 延时子函数
LOOP LOOP2
INC COUNT
CMP COUNT,6
JZ HHH
jmp K
HHH: MOV DX,PA_ADD
MOV AL,0FFH
OUT DX,AL
MOV COUNT,00H
NOT FLAG
JMP K
DELAY1 PROC NEAR
push ax
push dx
mov dx,01H
mov ah,0ffh
int 21h
pop dx
pop ax
RET
DELAY1 ENDP
DELAY PROC NEAR
push ax
push dx
mov dx,300H
mov ah,0ffh
int 21h
pop dx
pop ax
RET
DELAY ENDP
DELAY2 PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,60000
L: NOP
LOOP L
POP DX
POP CX
POP BX
POP AX
RET
DELAY2 ENDP
DAC0832 PROC NEAR ;数模转换,数字量转化为模拟量
mov dx,DA0832_ADD
mov al,voltage
out dx,al
RET
DAC0832 ENDP
InitPCI PROC NEAR
MOV AH,00H
MOV AL,03H
INT 10H ;清屏
MOV AH,0B1H
MOV AL,01H
INT 1AH
CMP AH,0
JZ InitPCI2
LEA DX,msg0
InitPCI1: MOV AH,09H
INT 21H
JMP Exit
InitPCI2: MOV AH,0B1H
MOV AL,02H
MOV CX,Device_ID
MOV DX,Vendor_ID
MOV SI,0
INT 1AH
JNC InitPCI3
;是否存在Star PCI9052板卡
LEA DX,msg1
JMP InitPCI1
InitPCI3: MOV DI,PCIBAR3
MOV AH,0B1H
MOV AL,09H
INT 1AH
;读取该卡PCI9052基地址
JNC InitPCI4
LEA DX,msg2
JMP InitPCI1
InitPCI4: AND CX,0FFFCH
MOV
IO_Bit8_BaseAddress,CX
RET
InitPCI ENDP
ModifyAddress PROC NEAR
ADD COM_ADD,CX
ADD PA_ADD,CX
ADD PB_ADD,CX
ADD PC_ADD,CX
add DA0832_ADD,cx
add
IO_Bit8_BaseAddress,cx
RET
ModifyAddress ENDP
Exit: MOV AH,4CH
INT 21H
END START
4.上机调试过程
硬件调试
其实在本次试验中的硬件主要是8255A和DAC0832这两个芯片。8255A
调试我是用A口来判断的,通过写入一个基本的程序通过A口来驱动发光二极管,看二极管是否正常点亮。DAC0832的调试时通过观察直流电机的转速来判断的。写入不同的数字量,看直流电机的转速是否按自己的设定的变化。
软件调试
开始调试的时候,我们的程序有很多语法的错误,经过慢慢的一步步修改,将程序完善。因为有些错误也是由于自己的事物造成的。在开始得编程中对于小车的加减速,由于速度是数字量通过DAC0832数模芯片加10H或减10H转化的,而当时没有设置数字量的上下线。当数字量加到FFH以后,已经达到了最大值,再加速的话应该保持不变,而数字量减到00H以后,小车已经停止,再减速应该还是保持不动。一开始由于少了两条比较指令,导致小车减速到0后,又加速,加速到最大时又减速,使得速度不定,达不到题目要求的效果。
联机调试
联机调试比较简单,通过单步测试和断电调试,根据信息框和调节开关控制直流和步进转动的情况来判断程序存在的问题。
故在单步执行程序时,可以发现程序的错误出现在什么地方,比如:就我个人而言,在编写程序的时,很容易忽略现场保护,例如在使用AL这个寄存器,它里面已存在一个值,但是我没有保存AL的值,就又使用它,导致新的值覆盖了原来的值,当我再要用到AL的初始值时,又没有向它写入原来的值,这将会导致程序出错,得不到预期的结果。
调试结果和问题的提出
经过调试和修改后,最后的调试结果是基本的功能都能实现,就是在小车的左右转向的时候,我用的是指示灯闪烁的效果。调试结果感觉这个指示灯的闪的时间不均匀。所以我就定义了一个变量COUNT来保证发光二极管的亮、灭时间的相同,是的闪烁效果看起来正常一点。而COUNT变量就是记经过的相序数,可以自定义。我定义的是5个相序数。这也就是说明小登闪烁的周期是步进电机工作5个相序数的时间。
对于问题的提出是:小车的左右转我们很容易观察到,但是小车的加减速有时候看起来不是很明显,我想的就是还通过数码管来显示速度的变化。这样整个小车的功能效果给人以一种很直观的感觉。
5.课程设计结果及分析
本实验要求设计一个电动玩具车控制器,能实现电动玩具车的方向控制,车速控制。车在转向的时候并有指示灯提醒。这些功能都实现了,并增加了小车加速与减速的时候有指示灯。初始状态时,四个逻辑开关的都是打开的。当合上一
号开关时,直流电机加速直至稳定或者断开一号开关;关闭二号开关使直流电动机减速。在减速的过程中断开二号开关,直流电机会保持在当前的转速;同样的方法,关闭三号开关,步进电机正转,表示小车左转,同时左转指示灯会亮。断开开关,步进电机停止转动。右转与左转类似。步进电机正转与反转只是用来模拟小车的左转与右转。这个是灵活的,正转可以模拟左转也可以用来模拟右转。
问题延伸:
由于时间限制及实验器材的限制,虽然在短时间内完成了本次课程设计所要求实现的功能,但是程序并不是很完善的。程序有些循环的地方有点冗余,不过在老师的提示下,已经更正。其实本实验相对来讲还算是简单的,因为功能比较简单,实现起来不是太难。对于张老师提出来的功能的提升我觉得还是有点挑战的。就是在加减速的时候不是简单的按下哪个开关,而是通过一个来回的按动开关来手动加减速。而且只能是一来一回才能产生效果,其他的情况按动开关速度是不会变的。这就需要读3次B口的状态,比较二次才能得出结果。如果第一次读出的B口的值和第二次不一样,而第二次读出的B口的值和第三次不一样这就说明开关经过了一个来回的变化,再来在判断是哪个键拨动产生的才能执行相应的功能。这就要主要一个事情就是读三次B口状态时两两之间间隔的时间。我们大概测试了一下开关来回拨动一次的时间是300ms,所以我们读取的时间应该设置为150ms。利用星研公司提供的软中断来延时。我自己还加了8279来控制数码管的显示来实现对车速的一个直观的获取。后面附带改进后的源代码!
心得体会和建议
通过这次的实验:在硬件上,我更深入的了解了8255A芯片的功能,熟悉了它的使用方法。而且8255A也是我们这门课的一个主要的芯片,运用比较多。还有就是DAC0832的应用,如果不是这次实验可能对这个元件还不知道怎么用,通过亲身实践,更加深刻体会到其在电路设计中所起的作用。对LED显示器也有了比较深入的对其构造及功能的了解。并认识到通过互联网可以学习到很多知识;在编程方面,提高了对汇编语言的各种指令的熟悉和利用汇编语言编程的能力。也明白了面对问题,不需要过于惧怕它的难度,也不能过于轻视问题。需要的是一步步地了解问题,进而解决问题。没有解决不了的问题,也没有不去解决就能解决的问题。
其实本次的课程设计如果按照我们一开始得题目要求来说来实现,显得有点简单。但后来增加的功能我觉得还是有点味道的。尤其是手动改变车速。一开始也想到是那么回事,但是就是在写程序的时候不是这里有漏洞就是那里有漏洞。问题的关键就是在两次比较上,我后来定义了一个COUNT量来记录比较的次数,当比较的两个有相同时则将这个COUNT量清零。重新检测在比较。否则每比较一次COUNT加一。当COUNT加到2时说明有来回拨动键的产生符合手动加减速的要求。则执行相应的功能。
总的来说,虽然课程设计的时间有限,但在这有限的时间里,不仅完成了作业,提交了结果,也丰富了这门硬件课程的更多知识,更深入地了解了这门专业课的精髓,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析
问题解决问题的能力得到全面提高。
下面附带增加功能后的程序设计原代码:
.MODEL TINY
PCIBAR3 EQU 1CH
;8位I/O空间基地址(它就是实验仪的基地址, 也为DMA & 32 BIT RAM板卡上的8237提供基地址)
Vendor_ID EQU 10EBH
;厂商ID号
Device_ID EQU 8376
;设备ID号
.STACK 100
.DATA
IO_Bit8_BaseAddress DW ? COUNT DB 00H COUNT1 DB 00H FLAG DB 00H FLAG1 DB 00H
msg0 DB 'BIOS不支持访问PCI $'
msg1 DB '找不到Star PCI9052板卡 $'
msg2 DB '读8位I/O空间基地址时出错$'
LED_TAB DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H, 0F8H
DB
080H,90H,88H,83H,0C6H,0A1H,86H,8 EH
CMD_8279 DW 00B1H ;8279命令字、状态字地址
DATA_8279 DW 00B0H ;8279读写数据口的地址
COM_ADD DW 00F3H
;控制口偏移量
PA_ADD DW 00F0H
;PA口偏移量
PB_ADD DW 00F1H
;PB口偏移量
PC_ADD DW 00F2H
;PC口偏移量
DA0832_ADD DW 00E0H
;DAC0832控制口偏移量
LED_DATA DB 01111111B ; 一号绿灯亮
DB 10111111B
; 二号黄灯亮
DB 11011111B
;三号灯灯亮
DB 11101111B
;四号灯亮
STEP1 db 09h,08h,0ch,04h,06h,02h,03h,01h
;步进电机正转相序
STEP2 db 01h,03h,02h,06h,04h,0ch,08h,09h
;步进电机反转相序
voltageoffset EQU 10H
voltage db 0
SPEED DB 00
BUFFER1 db 00H
;BUFFER2 DB ?
.CODE
start:mov ax,@data
mov ds,ax
nop
CALL INITPCI
CALL ModifyAddress
mov dx,COM_ADD
mov al,82H ;向控制口
写入方式控制字
out dx,al
Lea si,LED_DATA
mov voltage,00H
call DAC0832
call INIT8279
mov dx,PA_ADD
mov al,0ffh
out dx,al
mov dx,PC_ADD
mov al,0
out dx,al ;步进电机停止转
动
K: CALL CHANGE
CALL KEYSCAN
CMP FLAG1,01H
JZ K1
CMP FLAG1,02H
JZ K2
CMP AL,04H
JZ K3
CMP AL,08H
JZ K4
CMP AL,00H
CALL INIT
JMP K
K1:
speechup:
mov al,voltage
cmp al,0efh
jna eee
mov al,0ffh
jmp key1
eee:add al,voltageoffset ADD SPEED,02H
key1: mov voltage,al
call DAC0832
L1: mov bx,si
mov dx,PA_ADD
mov al,0
xlat
out dx,al
CALL DELAY
jmp K
K2:
speechdown:
mov al,voltage
cmp al,10h
jnb ccc
mov al,00h
jmp key2
ccc:sub al,voltageoffset SUB SPEED,02H
key2: mov voltage,al
call DAC0832
L2: mov dx,PA_ADD
mov bx,si
mov al,1
xlat
out dx,al
CALL DELAY
jmp K
K3: CMP FLAG,00H
JNZ L3
mov bx,si
mov dx,PA_ADD
mov al,2
xlat
out dx,al
L3:LEA BX,STEP1
jmp STEPA
K4: CMP FLAG,00H
JNZ L4
mov bx,si
mov dx,PA_ADD
mov al,3
xlat
out dx,al
L4: LEA BX,STEP2
jmp STEPB
;JMP K
INIT PROC NEAR
MOV DX,PA_ADD
MOV AL,0FFH
OUT DX,AL
MOV FLAG,00H
MOV COUNT,00H
RET
INIT ENDP
STEPA: MOV CX,08H
LOOP1: MOV DX,PC_ADD
MOV AL,[BX]
OUT DX,AL ;往C端口输出脉冲
INC BX
CALL DELAY1 ;调DELAY 延时子函数
LOOP LOOP1
INC COUNT
CMP COUNT,5
JZ HHH
jmp K
STEPB:MOV CX,08H
LOOP2:MOV DX,PC_ADD
MOV AL,[BX]
OUT DX,AL ;往C端口输出脉冲
INC BX
CALL DELAY1 ;调DELAY延时子函数
LOOP LOOP2
INC COUNT
CMP COUNT,6
JZ HHH
jmp K
HHH: MOV DX,PA_ADD
MOV AL,0FFH
OUT DX,AL
MOV COUNT,00H
NOT FLAG
JMP K
KEYSCAN PROC NEAR
MOV DX,PB_ADD
IN AL,DX
CMP AL,BUFFER1
JZ BB
INC COUNT1
CMP COUNT1,02H
JZ B
mov BUFFER1,al
CALL DELAY3
MOV DX,PB_ADD
IN AL,DX
; MOV BUFFER1,AL
CMP AL,BUFFER1
JZ BB
;MOV AL,BUFFER1
INC COUNT1
CMP COUNT1,02H
JZ B
MOV AL,BUFFER1
CALL DELAY3
MOV DX,PB_ADD
IN AL,DX
CMP AL,BUFFER1
JZ BB
INC COUNT1 CMP COUNT1,02H
JZ B
; MOV FLAG1,01H
JMP B
BB: MOV FLAG1,00H
MOV COUNT1,00H
JMP BBB
B: OR AL,BUFFER1
CMP AL,01H
JZ BBBB
MOV FLAG1,02H
JMP BBB
BBBB:MOV FLAG1,01H BBB :RET
KEYSCAN ENDP
DELAY1 PROC NEAR
push ax
push dx
mov dx,01H
mov ah,0ffh
int 21h
pop dx
pop ax
RET
DELAY1 ENDP
DELAY PROC NEAR
push ax
push dx
mov dx,250H
mov ah,0ffh
int 21h
pop dx
pop ax
RET
DELAY ENDP
DELAY3 PROC NEAR
push ax
push dx
mov dx,150H
mov ah,0ffh
int 21h
pop dx
pop ax
RET