MSP430系列的许多型号内部都含有A/D转换器(ADCs),例如MSP430F13x系列和MSP430F14x系列,内部均含有12位的A/D。但在许多应用场合,不需要12位的A/D,只需要8 位或10位的A/D就足够了。这时候用户可能会选择MSP430x11x系列,外部添加模数转换器。在典型应用中,低功耗、易操作的TLC549(8位 A/D)或TLV1549(10位A/D)器件可经很方便地与MSP430连接。本文介绍一个MSP430F1121与TLC549的接口实例。
1 硬件设计
MSP430F1121使用三个I/O口与TLC549的接口串行相连,通过串行接口采样。TLC549完成A/D转换的时间小于17μs。电路原理图如下所示。
2 工作原理
利用三个数字I/O接口,MSP430F1121驱动TLC549 A/D转换采用异步串行接口,在实际应用中,MSP430F1120的I/O管脚P2.0和P2.1用P2的方向寄存器(P2DIR)配置为输出,用P2 的输出寄存器(P2OUT)提供相应位的输出缓冲信息。P2.0管脚与TLC549的选片管脚CS相连,P2.1管脚与TLC549的输入/输出时钟 I/O CLK相连。转换数据从TLC549的数据输出管脚DO读出,进入MSP430F1121的P2.3管脚。如上图所示,MSP430F1121选择了 P2.0、P2.1、P2.3三个管脚,实际上任意一个管脚均能够驱动TLC549。当CS为高电平时,DO为高阻状态。转换开始之前,CS必须为低电平,以确保完成转换,MSP430F1121在P2.1管脚上产生总计8个的时钟脉冲应用于TLC549 I/O CLK管脚的输入。当CS为低电平时,最先出现在DO管脚的信号为转换值得最高位。MSP430F1121通过P2.3管脚,从TLC549的DO管脚连续移位读取转换数据进入ADCDATA寄存器。最初的四个脉冲的下降沿分别移出上一次转换值的第6位、5位、4位、3位,其中第四个时钟下降沿启动采样功能,采样TL549模拟输入信号的当前转换值。后续三个时钟脉冲输送给I/O CLK管脚,分别在下降沿把上一次转换值的第2位、1位、0位转换位移出。最终(第八个)时钟脉冲的下降沿芯片,采样/保持功能开始保持操作,保持操作持续到下一个第四时钟的下降沿。转换的周期由TLC549的内部振荡器定时,不受外部时钟的约束。一个转换完成需要17μs。在转换过程中, CS给一个高电平,DO回到高阻状态。下一次转换序列之前,至少延时17μs,否则TLC549的转换代码将被破坏。
3 软件设计
在程序中,在程序MEAS_549需要150 MCLK周期和31个字节的汇编代码包括子程序调用。整个例程需要60个字节,功能包括:关闭看门狗,设置堆栈指针,系统复位以后I/O的初始化,子程序 MEAS_549被调用驱动8位转换代码顺序进入ADCDATA寄存器,一个寄存器(R12)临时用来计算字节的位数。
源代码如下:
NAME fet_549 ; MSP430F1121 - TLC549接口例程;
--------------------------------------------------------------------------------
#define ADCData R11
#define Counter R12
P2IN equ 00028h ; P2口输入寄存器
P2OUT_ equ 00029h ; P2口输出寄存器
P2DIR_ equ 0002Ah ; P2口方向寄存器
WDTCTL_ equ 00120h ; 看门狗定时控制器
WDTHOLD equ 00080h ; 看门狗保持位
WDTPW equ 05A00h ; 看门狗写入控制字
CS equ 001h ; P2.0 芯片片选
CLK equ 002h ; P2.1 芯片时钟
DO equ 008h ; P2.3 数据输出
;---------------------------------------------------------------------
ORG 0F000h ; 编程起始地址
;---------------------------------------------------------------------
RESET mov.w #0300h,SP ; 初始化X112X堆栈
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; 关闭看门狗定时器
SetupP2 mov.b #CS,&P2OUT ; /CS设置, P2.X初始化
bis.b #CS+CLK,&P2DIR ; /CS 和 CLK输出
;
Mainloop call #Meas_549 ; 调用Meas_549子程序
jmp Mainloop ; 重复调用Meas_549子程序
;---------------------------------------------------------------------
Meas_549; 采样TLC549的数据,数据移入ADCData(R11),
;计数器 (R12)记录移位的位数
;---------------------------------------------------------------------
mov.w #8,Counter ; 8位数据的位数
clr.w ADCData ; 清除数据缓冲区
bic.b #CS,&P2OUT ; /CS复位, 使能ADC
ADC_Loop bit.b #DO,&P2IN ; (4) DO移入C (进位)
bis.b #CLK,&P2OUT ; (4) 时钟变高电平
bic.b #CLK,&P2OUT ; (4) 时钟变低电平
rlc.w ADCData ; (1) C移入ADCData
dec.w Counter ; (1) 8位全部移入否?
jnz ADC_Loop ; (2) 如果没有,调用ADC_Loop
bis.b #CS,&P2OUT ; /CS设置, 关闭ADC
ret ; 调出子程序
;---------------------------------------------------------------------
ORG 0FFFEh ;
;---------------------------------------------------------------------
DW RESET ; MSP430复位向量
END
用户可对子程序MEAS_549的其中一行进行修改,目的是达到10位转换的需求。程序中需要10个脉冲量,数据移动10位进入ADCDATA寄存器。 mov.w #10,Counter ; 10位数据的位数.