返回介绍

实验六 模/数转换器 ADC 应用

发布于 2023-05-14 20:35:30 字数 11880 浏览 0 评论 0 收藏 0

一.实验说明

随着应用对象和设计目标的千差万别,对于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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文