北理工微机实验四.docx
- 文档编号:10397177
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:20
- 大小:163.39KB
北理工微机实验四.docx
《北理工微机实验四.docx》由会员分享,可在线阅读,更多相关《北理工微机实验四.docx(20页珍藏版)》请在冰豆网上搜索。
北理工微机实验四
实验4A/D和D/A转换
一、 实验目的
1.了解A/D转换的根本原理,掌握ADC0809芯片的使用方法。
2.了解D/A转换的根本原理,掌握DAC0832芯片的使用方法。
3.了解直流电机控制的根本方法。
二、 实验内容与步骤
〔一〕A/D转换局部
1.接线:
CS/0809接Y3/IO地址
IN0/0809接0~5V/直流信号
EOC接总线的IRQ
2.实验电路原理图如图1.通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0〔IN0〕,利用debug的输出命令启动A/D转换器,输入命令读取转换结果,验证输入电压与转换后数字的关系。
启动IN0开始转换:
OUT298H
读取转换结果:
IN298H
图1模数转换电路
3.用万用表测量CLOCK、ADD-C、ADD-B、ADD-A在实验系统上如何联系的?
4.编程按中断方式采集IN0输入的电压,在屏幕上显示出转换后的数据〔用16进制数〕。
5.考虑如果采用IN7输入的电压,启动开始转换和读取转换结果的地址应该是多少?
6.按查询方式采集IN0输入的电压,软硬件如何实现?
●编程提示
1.ADC0809的IN0口地址为298H.
2.IN0单极性输入电压与转换后的数字的关系为:
其中,为输入电压,为参考电压,这里的参考电压为+5V电源。
3.一次A/D转换的程序可以为:
MOVDX,port
OUTDX,AL
;延时
INAL,DX
〔二〕D/A转换局部
1.接线:
CS/0832接Y2/IO地址
用万用表测量WR2和XFER在实验系统上如何联系的?
2.实验电路原理如图2所示:
图2DAC0832电路原理图
DAC0832采用单缓冲方式,具有单双极性输入端(图中的Ua、Ub),利用debug输出命令(Out290数据)输出数据给DAC0832,用万用表测量单极性输出端Ua及双极性输出端Ub的电压,验证数字与电压之间的线性关系。
3.编程产生以下波形(从Ub输出,用示波器观察)
〔1〕锯齿波〔2〕正弦波
●编程提示
1.8位D/A转换器DAC0832的口地址为290H,输入数据与输出电压的关系为:
(UREF表示参考电压,N表示数数据),这里的参考电压为PC机的+5V电源。
2.产生锯齿波只须将输出到DAC0832的数据由0循环递增。
产生正弦波可根据正弦函数建一个下弦数字量表,取值范围为一个周期,表中数据个数在16个以上。
3.参考流程图设计
〔三〕直流电机转速控制
1.按图5线路接线:
图5直流电机连线
在实验时,我们对实验进行了改良,考虑到拿8255去做,只有开关的几种状态,因此我们使用ADC0809对电位器的采样值来控制电机转速,从而实现了电机速度的连续可调。
CS/0832接Y2/IO地址
UB/0832接直流电机DJ
CS/0809接Y3/IO地址
IN0/0809接0~5V/直流信号
EOC接总线的IRQ
三、程序代码及注释
3.1ADC0809程序
;ADC0809
DATASSEGMENT;数据段
PORT_ADCEQU298H
SPACEDB13,'$'
INT_SEGDW?
;保存中断向量段基址的变量
INT_OFFDW?
;保存中断向量偏移量的变量
INT_SORDB?
;定义保存中断屏蔽字的变量
DATASENDS
STACKSSEGMENT;堆栈段
STADB256dup(?
)
TOPEQUSIZESTA
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
MAINPROCFAR;主函数
MOVAX,DATAS
MOVDS,AX
MOVAX,STACKS
MOVSS,AX
MOVSP,TOP;建立堆栈指针
;初始化0B号中断向量
PUSHES
PUSHBX;保护
MOVAL,0BH;指定中断号,0BH对应IRQ3
MOVAH,35H;取该中断向量
INT21H
MOVINT_SEG,ES;保存向量段基址
MOVINT_OFF,BX;保存向量偏移地址
CLI;中断允许标志位清零
POPBX
POPES
;填写中断向量表
PUSHDS
MOVAX,SEGINTP
MOVDS,AX;中断效劳程序入口段基址送DS
MOVDX,OFFSETINTP
;中断效劳程序入口偏移量送DX
MOVAL,0BH;IRQ3中断类型号
MOVAH25H;功能号
INT21H
POPDS
INAL,21H
MOVINT_SOR,AL;保存原中断屏蔽字
ANDAL,11110111B;开放IRQ3的中断请求
OUT21H,AL
STI;开中断
LO:
MOVDX,PORT_ADC
OUTDX,AL;启动AD
HLT
MOVCX,0FFFFH
LOOP$
JMPLO
END_PRO:
MOVAX,INT_SEG;恢复中断向量
MOVDS,AX
MOVDX,INT_OFF
MOVAL,0BH
MOVAH,25H
INT21H
MOVAL,INT_SOR
OUT21H,AL
STI
MOVAH,4CH
INT21H;结束程序
MAINENDP
INTPPROC
MOVDX,PORT_ADC
INAL,DX;读ADC数据
CALLDISPLAY;显示
;OUTDX,AL;启动下一次ADC转换
MOVAL,20H;EOI结束
OUT20H,AL
IRET
INTPENDP
DISPLAYPROC
MOVAH,0
MOVCL,4
SHLAX,CL;AH中高4bit
SHRAL,CL;AL中低4bit
PUSHAX
MOVAL,AH
CMPAL,10;AL<10
JBDISP1
JMPDISP2
DISP1:
;显示高4bit
ADDAL,30H;30H-39H
MOVDL,AL;显示
MOVAH,2
INT21H
JMPDISP_NEXT
DISP2:
SUBAL,10
ADDAL,41H;41H--A
MOVDL,AL;显示
MOVAH,2
INT21H
DISP_NEXT:
POPAX
CMPAL,10
JBDISP3
JMPDISP4
DISP3:
ADDAL,30H;0-9
MOVDL,AL;显示
MOVAH,2
INT21H
JMPDISP_END
DISP4:
SUBAL,10
ADDAL,41H
MOVDL,AL
MOVAH,2
INT21H
DISP_END:
MOVDL,48H;显示
MOVAH,2
INT21H
LEADX,SPACE;回车换行
MOVAH,9
INT21H
RET
DISPLAYENDP
CODESENDS
ENDMAIN
3.2DAC0832程序
;DAC0832
DATASSEGMENT;数据段
PORT_DACEQU290H
LENDB32
DATA_SINDB80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh;正弦表
DB0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
DB80h,66h,4eh,38h,25h,15h,09h,04h
DB00h,04h,09h,15h,25h,38h,4eh,66h
DATA_JUCHIDB0H,1H,2H,3H,4H,5H,6H,7H;锯齿波
DB8H,9H,0AH,0BH,0CH,0DH,0EH,0FH
DB10H,0FH,0EH,0DH,0CH,0BH,0AH,9H
DB8H,7H,6H,5H,4H,3H,2H,1H
DATASENDS
STACKSSEGMENT;堆栈段
STADB256dup(?
)
TOPEQUSIZESTA
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
MAINPROCFAR;主函数
MOVAX,DATAS
MOVDS,AX
MOVAX,STACKS
MOVSS,AX
MOVSP,TOP;建立堆栈指针
MOVDX,PORT_DAC
INIT_LO:
MOVBH,LEN
;LEASI,DATA_SIN
LEASI,DATA_JUCHI
SEND_LO:
MOVAL,[SI]
MOVCL,3
SHLAL,CL
OUTDX,AL;向DA送数据
INCSI
DECBH
CMPBH,0;一个周期已完成
JZINIT_LO
MOVAH,1;检测按键
INT16H
JZSEND_LO
MOVAH,4CH;结束
INT21H
MAINENDP
CODESENDS
ENDMAIN
3.3利用AD采样值调速直流电机〔PWM〕
;PWM_motor
DATASSEGMENT;数据段
PORT_ADCEQU298H
PORT_DACEQU290H
DUTYDB0;保存AD采样数据
SPACEDB13,'$'
INT_SEGDW?
;保存中断向量段基址的变量
INT_OFFDW?
;保存中断向量偏移量的变量
INT_SORDB?
;定义保存中断屏蔽字的变量
DATASENDS
STACKSSEGMENT;堆栈段
STADB256dup(?
)
TOPEQUSIZESTA
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
MAINPROCFAR;主函数
MOVAX,DATAS
MOVDS,AX
MOVAX,STACKS
MOVSS,AX
MOVSP,TOP;建立堆栈指针
PUSHES;初始化0B号中断向量
PUSHBX;保护
MOVAL,0BH;指定中断号,0BH对应IRQ3
MOVAH,35H;取该中断向量
INT21H
MOVINT_SEG,ES;保存向量段基址
MOVINT_OFF,BX;保存向量偏移地址
CLI;中断允许标志位清零
POPBX
POPES
;填写中断向量表
PUSHDS
MOVAX,SEGINTP
MOVDS,AX;中断效劳程序入口段基址送DS
MOVDX,OFFSETINTP
;中断效劳程序入口偏移量送DX
MOVAL,0BH;IRQ3中断类型号
MOVAH,25H;功能号
INT21H
POPDS
INAL,21H
MOVINT_SOR,AL;保存原中断屏蔽字
ANDAL,11110111B;开放IRQ3的中断请求
OUT21H,AL
STI;开中断
MOVDX,PORT_ADC
OUTDX,AL;启动AD
MOVBL,0
LO:
MOVAL,0FFH
MOVAH,DUTY
;ANDAH,(0FFH-111B)
CMPBL,AH
JBSKIP_ZERO
MOVAL,128
SKIP_ZERO:
MOVDX,PORT_DAC
OUTDX,AL;向DA送数
INCBL
;MOVCX,10;延时
;LOOP$
JMPLO
END_PRO:
MOVAX,INT_SEG;恢复中断向量
MOVDS,AX
MOVDX,INT_OFF
MOVAL,0BH
MOVAH,25H
INT21H
MOVAL,INT_SOR
OUT21H,AL
STI
MOVAH,4CH
INT21H;结束程序
MAINENDP
INTPPROC
PUSHDX
PUSHCX
PUSHAX
MOVDX,PORT_ADC
INAL,DX;读ADC数据
MOVDUTY,AL;SAVETHESAMPLEDDUTY
CALLDISPLAY;显示
MOVDX,PORT_ADC
OUTDX,AL;启动下一次ADC转换
MOVAL,20H;EOI结束
OUT20H,AL
POPAX
POPCX
POPDX
IRET
INTPENDP
DISPLAYPROC
MOVAH,0
MOVCL,4
SHLAX,CL;AH中高4bit
SHRAL,CL;AL中低4bit
PUSHAX
MOVAL,AH
CMPAL,10;AL<10
JBDISP1
JMPDISP2
DISP1:
;显示高4bit
ADDAL,30H;30H-39H
MOVDL,AL;显示
MOVAH,2
INT21H
JMPDISP_NEXT
DISP2:
SUBAL,10
ADDAL,41H;41H--A
MOVDL,AL;显示
MOVAH,2
INT21H
DISP_NEXT:
POPAX
CMPAL,10
JBDISP3
JMPDISP4
DISP3:
ADDAL,30H;0-9
MOVDL,AL;显示
MOVAH,2
INT21H
JMPDISP_END
DISP4:
SUBAL,10
ADDAL,41H
MOVDL,AL
MOVAH,2
INT21H
DISP_END:
MOVDL,48H;显示
MOVAH,2
INT21H
LEADX,SPACE;回车换行
MOVAH,9
INT21H
RET
DISPLAYENDP
CODESENDS
ENDMAIN
四、实验结果及分析
1〕对ADC0809芯片进行正确连线,然后用实验板上的逻辑笔测量CLOCK、ADD-C、ADD-B、ADD-A,发现其电平均为低电平,因此在实验系统上这三条线均为低电平,选中的是ADC0809的通道IN0.
运行ADC0809的中断程序,拧动电位器,以16进制,显示AD转换的结果:
采样值以16进制显示,如图,此时显示为5EH.
2〕运行DAC0832的程序,将示波器接在Ub脚,在示波器上可以看到完整的正弦波。
然后将正弦表换成锯齿波表,可以在示波器上看到锯齿波,除此之外,我们还做了三角波和PWM波的输出,为以下的直流电机调速做准备。
示波器的输出波形如下列图所示:
3〕直流电机
在实验时,我们对实验进行了改良,考虑到拿8255去做,只有开关的几种状态,因此我们使用ADC0809对电位器的采样值来控制电机转速,从而实现了电机速度的连续可调。
我们通过拧动电位器来改变ADC的采样值,通过ADC的采样值〔0~255〕来控制输出PWM波形的占空比。
五、心得体会
在本次实验的内容为对ADC0809和DAC0832的编程,以及直流电机的调速控制,整体上来说,实验比拟简单,进行比拟顺利。
在ADC0809中断程序设计中,遇到了一些问题,运行程序后发现屏幕上并没有显示任何字符。
对程序进行分析和调试,推测可能发生的问题,首先判断是否进入中断,检查中断初始化和写中断向量表的程序段,均未发现问题,在中断效劳程序里设置断点,然后运行程序,发现程序在断点处停止,经检查发现,中断效劳程序中忘记发送EOI结束符,改正后AD的中断程序运行正常,将字符以16进制显示。
在DAC0832的实验里,用Matlab生成一个32个数据的正弦表,然后根据DDS的根本原理将正弦表输出,在示波器上可以看到正弦波。
至于锯齿波,我们开始想的是,利用一个计数器CX将计数值递增,然后递减,输出即可。
后来发现输出的锯齿波淹没在噪声里,分析原因为信噪比太低,因此对每个输出的数据AL进行左移4位操作,相当于对其进行放大,从而得到了较好的锯齿波的波形,之后我们分别进行了三角波和方波的输出,并且可以产生占空比可调的PWM波,从而对直流电机进行控制。
在进行直流电机实验时,我们没有拘泥于讲义,考虑到拿8255去做,只有开关的几种状态,因此我们使用ADC0809对电位器的采样值来控制电机转速,从而实现了电机速度的连续可调,我们通过电机调速的程序成功的将ADC和DAC的控制集中到了一个程序中,更好的理解了AD和DA的工作过程,深化了课上所学的理论根底。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北理工 微机 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)