- 前言
- 实验须知
- 概述
- 实验一 TMS320LF2407 DSP 实验开发系统及CC软件应用
- 实验二 常用指令操作实验
- 实验三 追灯式电路控制
- 实验四 按键计数器
- 实验五 键盘和 LED 发光二极管显示电路
- 实验六 模/数转换器 ADC 应用
- 实验七 串行外围接口 SPI 的应用
- 实验八 串行通信接口模块(SCI)
- 实验九 TMS320LF2407 与图形液晶显示模块接口及应用
- 实验十 I2C 串行日历时钟与 TMS320LF2407 的接口应用
- 附录一 DSP 器件仿真开发技术基础
- 附录二 TMS320LF2407 DSP 实验开发系统
- 附录三 TMS320LF2407 DSP 器件简介
- 附录四 XDS510 仿真开发系统的基本操作技术
- 附录五 程序开发平台 Code Composer
- 参考文献
实验六 模/数转换器 ADC 应用
一.实验说明
随着应用对象和设计目标的千差万别,对于ADC的性能指标提出了各种各样的不同要求,从而形成了市场上大量涌现和种类繁多的以独立形态出现的ADC。虽然ADC这样的模拟接口类器件常常是以独立形态出现的,但是,拥有这类器件生产技术的的制造厂家,越来越多地把这项功能集成到单片机、DSP芯片内部,以便适应芯片朝着普及化、专用化、片上系统化(SOC)、内部模块种类和数量的可整合性和可裁剪性以及纯单片应用的发展潮流。 在TMS320LF2407芯片内配置了带10位具有16个模拟通道的ADC模块。本次实验主要是为了验证TMS320LF2407片内ADC模块功能,并用TMS320LF2407芯片来实现一个单通道的10位A/D转换,即任选ADCIN通道之一作为模拟信号输入端,并将此转换结果以二进制形式经IOPB口与74HC273锁存器而链接的8只发光二极管输出显示。可以看到,转换结果会随着模拟量的变化而变化,从而可以让我们了解片内ADC模块的工作情况。
二.实验目的
1. 了解TMS320LF2407芯片的ADC模块的特性及自动排序功能。
2. 掌握对ADCIN端口的引脚功能设置,学习设计和调试ADC的应用程序,要求转换结果由中断服务子程序读出。
三.实验内容
1. 选择A/D转换通道。首先选择A/D转换引脚功能,将相应的A/D引脚设置为输入,其次选择A/D转换模拟通道。
2. 设计并调试一个能通过8只LED发光二极管实现二进制显示转换数据的程序。
3. 要求从实验箱P4输入0~+3.3V直流电压,P3输入-3.3V~+3.3V交流电压
四. 实验硬件电路图
加图见P4,P3
图 ADC硬件电路
五.实验参考程序清单
C语言程序
#include "register.h"
int ADRESULT[16]; // 定义一个数组用于保存AD转换的结果
volatile unsigned int *j; // 定义一个指针变量j
int i=0x00,cesi;
void inline disable()
{
asm(" setc INTM");
}
void inline enable()
{
asm(" clrc INTM");
}
initial()
{
asm(" setc SXM"); // 符号位扩展有效
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
*SCSR1=0x81EF; // CLKIN=6M,CLKOUT=4*CLKIN=24M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0001; // 允许INT1中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
}
// AD初始化子程序
void ADINIT()
{
*T4CNT=0x0000; // T4计数器清0
*T4CON=0x170C; // T4为连续增计数模式,128分频,且选用内部时钟源
*T4PER=0x75; // 设置T4的周期寄存器
*GPTCONB=0x400; // T4周期中断标志触发AD转换
*EVBIFRB=0x0FFFF; // 清除EVB中断标志,写"1"清0
*ADCTRL1=0x10; // 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,
// 转换时间预定标位CPS为0,AD为启动/停止模式,排
// 序器为级连工作方式,且禁止特殊的两种工作模式
*ADCTRL2=0x8404; // 可以用EVB的一个事件信号触发AD转换,
// 且用中断模式1
*MAXCONV=0x0F; // 16通道
*CHSELSEQ1=0x3210;
*CHSELSEQ2=0x7654;
*CHSELSEQ3=0x0BA98;
*CHSELSEQ4=0x0FEDC; // 转换通道是0-15
}
// 启动AD转换子程序(通过启动定时器4的方式间接启动)
void ADSOC()
{
*T4CON=*T4CON|0x40; // 启动定时器4
}
// 若是其它中断则直接返回子程序
void interrupt nothing()
{
return;
}
// AD中断服务子程序
void interrupt adint()
{
asm(" clrc INTM"); // 抑制符号位扩展
j=RESULT0; // 取得RESULT0的地址
for(i=0;i<=15;i++,j++)
{
ADRESULT[i]=*j>>6; // 把AD转换的结果左移6位后存入规定的数组
cesi=ADRESULT[i]; // 检验每个A/D转换的结果
}
*ADCTRL2=*ADCTRL2|0x4200; // 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
enable(); // 开总中断,因为一进入中断总中断就自动关闭了
}
main()
{
disable(); // 禁止总中断
initial(); // 系统初始化
ADINIT(); // AD初始化子程序
enable(); // 开总中断
ADSOC(); // 启动AD转换
while(1)
{
if(i==0x10)
break; // 如果已发生中断,则停止等待(发生中断后,i=0x10)
} // 等待中断发生
*T4CON=*T4CON&0x0FFBF; // 停止定时器4,即间接停止A/D转换
while(1)
{
;
} // 死循环,在实际的工程应用中在此可以利用A/D转换的
// 结果用于一些运算
}
汇编程序
st0_temp .usect ".b20",1 ;60
st1_temp .usect ".b20",1 ;61
context .usect ".b20",7 ;62-68
STACK .usect ".stack",40
ADCOUNT usect ".data0",1 ;288 ;;;;;
ADRESULT . usect ".data0",1 ;289 ;;;;;
.include "F2407REGS.H" ;引用头部文件
.def _c_int0
;(1)建立中断向量表
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM 0 复位向量 1
INT1 B GISR1 ;PM 2 中断优先级1 4
INT2 B PHANTOM ;PM 4 中断优先级2 5
INT3 B PHANTOM ;PM 6 中断优先级3 6
INT4 B PHANTOM ;PM 8 中断优先级4 7
INT5 B PHANTOM ;PM A 中断优先级5 8
INT6 B PHANTOM ;PM C 中断优先级6 9
RESERVED B PHANTOM ;PM E 模拟量输入中断(保留) 10
SW_INT8 B PHANTOM ;PM 10 用户定义软件中断 —
SW_INT9 B PHANTOM ; PM 12 User S/W int -
SW_INT10 B PHANTOM ; PM 14 User S/W int -
SW_INT11 B PHANTOM ; PM 16 User S/W int -
SW_INT12 B PHANTOM ; PM 18 User S/W int -
SW_INT13 B PHANTOM ; PM 1A User S/W int -
SW_INT14 B PHANTOM ; PM 1C User S/W int -
SW_INT15 B PHANTOM ; PM 1E User S/W int -
SW_INT16 B PHANTOM ; PM 20 User S/W int -
TRAP B PHANTOM ; PM 22 Trap vector -
NMI B PHANTOM ; PM 24 Non maskable Int3
EMU_TRAP B PHANTOM ; PM 26 Emulator Trap 2
SW_INT20 B PHANTOM ; PM 28 User S/W int -
SW_INT21 B PHANTOM ; PM 2A User S/W int -
SW_INT22 B PHANTOM ; PM 2C User S/W int -
SW_INT23 B PHANTOM ; PM 2E User S/W int -
SW_INT24 B PHANTOM ; PM 30 User S/W int -
SW_INT25 B PHANTOM ; PM 32 User S/W int -
SW_INT26 B PHANTOM ; PM 34 User S/W int -
SW_INT27 B PHANTOM ; PM 36 User S/W int -
SW_INT28 B PHANTOM ; PM 38 User S/W int -
SW_INT29 B PHANTOM ; PM 3A User S/W int -
SW_INT30 B PHANTOM ; PM 3C User S/W int -
SW_INT31 B PHANTOM ;PM 3E 用户定义软件中断 —
;中断子向量入口定义pvecs
.sect ".pvecs" ;定义子向量段
PVECTORS B PHANTOM ;保留向量地址偏移量 0000h
B PHANTOM ;保留向量地址偏移量 0001h
B PHANTOM ;保留向量地址偏移量 0002h
B PHANTOM ;保留向量地址偏移量 0003h
B ADCINT_ISR ;保留向量地址偏移量 0004h ADC中断
B PHANTOM ;保留向量地址偏移量 0005h
B PHANTOM ;SCI_RX_ISR; 保留向量地址偏移量
B PHANTOM ;SCI_TX_ISR ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-0a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-10
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-15
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-1a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-20
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-25
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-2a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; pvector addr offset 0x02f - T3PINT
B PHANTOM ; 保留向量地址偏移量-30
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-35
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-3a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-3f
B PHANTOM ;CANMBX_ISR ; 保留向量地址偏移量
B PHANTOM ;保留向量地址偏移量 0041h
;(2)主程序:
.text
_c_int0
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH,SCSR1 ;CLKIN=6 M,CLKOUT=24 M
SPLK #0E8h,WDCR ;关看门狗
LDP #0
SPLK #0001h,IMR ;允许INT1中断
SPLK #0FFFFh,IFR ;清所有中断标志
CALL ADINIT ;初始化ADC程序
CLRC INTM ;开总中断
CALL AD ;启动模数转换程序
WAIT: NOP
B WAIT
;(3)ADC初始化程序
ADINIT:
LDP #234 ;设置通用定时器4
SPLK #0000H,T4CNT
SPLK #170CH,T4CON
SPLK #075H,T4PR
SPLK #0400H,GPTCONB
SPLK #0FFFFH,EVBIFRB
SPLK #0000H,EVBIMRB
LDP #DP_PF2
SPLK #0010H,ADCCTRL1 ;设置ADC控制寄存器
SPLK #8404H,ADCCTRL2
SPLK #000FH,MAXCONV ;16 通道
SPLK #3210H,CHSELSEQ1
SPLK #7654H,CHSELSEQ2
SPLK #0BA98H,CHSELSEQ3
SPLK #0FEDCH,CHSELSEQ4
LDP #DP_SARAM2 ;指向0A00h~0A80h
SPLK #ADRESULT,ADCOUNT
RET
;(4)启动模数转换程序
AD:
LDP #234
LACL T4CON
OR #40H ;启动定时器4
SACL T4CON
RET
;(5)中断程序
GISR1: ;优先级INT1中断子程序入口
;保护现场
LDP #0 ; 保存机器上下文
SST #0, st0_temp ; 使用自动寻址DP-0
SST #1, st1_temp ; 保存状态寄存器到B2 DARAM.
SACL context ; 保存ACC的低16位
SACH context+1 ; 保存ACC的高16位
SAR AR1,context+2
SAR AR2,context+3
SAR AR3,context+4
SAR AR4,context+5
SAR AR5,context+6
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外设中断入口地址
BACC ;跳到相应的中断服务子程序
ADCINT_ISR:
CLRC SXM
LDP #DP_SARAM2
LAR AR1,ADCOUNT
LAR AR0,#15
LAR AR2,#RESULT0
MAR *,AR2
ADC1: LACC *+,10,AR1
SACH *
ADRK #32
MAR *,AR0
BANZ ADC1,*-,AR2
LDP #DP_PF2
LACL ADCCTRL2
OR #4000H ;复位 SEQ1
AND #0FFDFH ;清 INT FLAG SEQ1
SACL ADCCTRL2
LDP #DP_SARAM2
LACL ADCOUNT
SUB #ADRESULT+31
BCND ADC2,GEQ
ADD #ADRESULT+32 ;<32
SACL ADCOUNT
B GISR1_RET
ADC2: SPLK #ADRESULT,ADCOUNT ;=32
LACL T4CON
AND #0FFBFH ;停止定时器4,即停止AD转换
SACL T4CON
B GISR1_RET
GISR1_RET: ;中断返回出口
LDP #DP_EVA
SPLK #0FFFFH,EVAIFRA
LDP #0
LAR AR5,context+6
LAR AR4,context+5
LAR AR3,context+4
LAR AR2,context+3
LAR AR1,context+2
LACC context+1,16
ADDS context
LST #1, st1_temp
LST #0, st0_temp
;恢复现场
CLRC INTM ;开总中断,因为一进中断就自动关闭了总中断
RET
;(6)假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论