本系统考虑到主要应用在ADC中,所以就直接采用TMS320VC33的数据总线和地址总线,没有再附加额外的电路,使得ADC的采样速度和转换精度得到良好的保证。同时还利用了INT2和XF0引脚,作为DSP接收数据的中断信号和ADC的使能信号。INT2是外部中断引脚,由外部的数据输入触发中断;XF0即外部标志输出引脚,受软件控制,可以用来向外部器件发送信号,该引脚的状态由I/O标志寄存器决定,IOF=0X22,即置XF0为通用目的输出引脚,同时该引脚输出0;若IOF=0X26,则置XF0为通用目的输出引脚,同时该引脚输出为1。本系统利用软件指令对XF0进行置高置低,控制ADC的启动转换和停止。
EMP7512AE基于EEPROM技术,采用多电压I/O接口技术,系统内核供应电压为3.3V,而I/0引脚与2.5V、3.3V、5.0V逻辑电平相互兼容。EPM7512AE有10 000个可用门、512个宏单元、32个逻辑阵列块和212个用户可用I/0引脚。CPLD在系统中的主要功能是:给ADC转换提供时钟信号,控制ADC转换的使能和复位,由于采用的ADC芯片是串行输出的,CPLD还实现对串行数据的输入转为并行数据的输出,然后直接和TMS320VC33的数据总线相连接。同时CPLD产生脉冲信号,在ADC转换完成后,数据暂存在CPLD中,该脉冲向CPU申请中断,提示有数据需要接收。另外,CPLD的一个关键作用就是,实现路数的动态选择,目前设计的该系统最多路数为8路。CPLD和DSP及AD芯片的具体硬件连接图如图2所示。
系统软件设计
在软件设计中,通过CPLD程序对ADC转换进行动态控制,选通模拟信号输入端,对ADC进行使能,按照图3所示的转换时序图完成对MAX1162的数据采样及传输。
下面给出VHDL语言的主要程序部分。
BEGIN
ADCS <= SYNTHESIZED_WIRE_12;
ADA <= SYNTHESIZED_WIRE_2;
GDFX_TEMP_SIGNAL_1 <= (L & L & H & H & H & L);
GDFX_TEMP_SIGNAL_0 <= (H & L & H & H & L);
U1 : lpm_bustri_0----三态总线缓冲器,允许采样的数据输出到DSP的数据总线上
PORT MAP(enabledt => DRD,
data => ADO,
tridata => D);
U2 : lpm_counter_1----计数器,把数据总线宽度改为3位
PORT MAP(sload => SYNTHESIZED_WIRE_0,
clock => SYNTHESIZED_WIRE_1,
aload => XFA0,
data => CMD(2 downto 0),
q => SYNTHESIZED_WIRE_2);
U3 : lpm_dff_1---D触发器,数据总线宽度为8位,接收来自于DSP的数据
PORT MAP(clock => CMDCK,
data => D(7 downto 0),
q => CMD);
U4 : lpm_compare_1---比较器,比较CMD(5..3)和CMD(2..0)的值,即轮询采样通道
PORT MAP(dataa => CMD(5 downto 3),
datab => SYNTHESIZED_WIRE_2,
aeb => SYNTHESIZED_WIRE_0);
SYNTHESIZED_WIRE_1 <= NOT(AQ(4));
NRW<= NOT RW;
CMDCK<= NOT( NOT PAGE3 AND(NOT RW)AND A6 AND A5 AND A4 AND (NOT A3));
----通道控制地址编码
DRD <= NOT PAGE3 AND RW AND A6 AND A5 AND A4 AND A3;----采样地址编码
CLKA <= NOT(CLK);
U5 : lpm_counter_2---产生计数脉冲
PORT MAP(sload => SYNTHESIZED_WIRE_3,
clock => HFP(5),
data => GDFX_TEMP_SIGNAL_0,
eq => SQ,
q => AQ);
U5 : lpm_dff_5---缓冲器
PORT MAP(clock => SYNTHESIZED_WIRE_12,
data => SYNTHESIZED_WIRE_5,
q => ADO);
SYNTHESIZED_WIRE_12 <= SQ(12) OR 0 OR XFA0;
SYNTHESIZED_WIRE_3 <= XFA0 OR SQ(14);
ADEN <= NOT(XFA0);
SYNTHESIZED_WIRE_10 <= HFP(5) AND HFP(4) AND HFP(0) AND SYNTHESIZED_WIRE_6 AND SYNTHESIZED_WIRE_7 AND SYNTHESIZED_WIRE_8;
SYNTHESIZED_WIRE_7 <= NOT(HFP(2));
SYNTHESIZED_WIRE_6 <= NOT(HFP(3));
INTA2 <= XFA0 OR SYNTHESIZED_WIRE_9;
U6 : lpm_shiftreg_1----串行数据输入转为并行数据输出
PORT MAP(shiftin => ADOUT,
clock => HFP(5),
q => SYNTHESIZED_WIRE_5);
U7 : lpm_counter_3---产生时钟信号
PORT MAP(sload => SYNTHESIZED_WIRE_10,
clock => H1CK,
data => GDFX_TEMP_SIGNAL_1,
q => HFP);
SYNTHESIZED_WIRE_8 <= NOT(HFP(1));
ADSCK <= NOT(HFP(5));
SYNTHESIZED_WIRE_9 <= NOT(SYNTHESIZED_WIRE_12);
H <= '1';
L <= '0';
END;
把该VHDL程序写入到EPM7512AE芯片中的,对数据进行采样编程就简单了许多。在.CMD文件的MEMORY段中加入ADPORT :org=0x00c00070,len=9。然后通过自定义数据段把数组adport[8]映射到段ADPORT中。下面给出用C编写的采样主要程序。
Main()
{
……
IOF = 0x26;/*置MAX1162数据输出端为高阻态*/
adport[0] = 0x28;
/*采样通道选择:0通道~5通道,总共6路;若设adport[0]=0x38,则通道为:0通道~7通道,总共8路。同理可进行其他设置*/
IE = 4;/*中断使能*/
IOF = 0x22;/*启动ADC*/
/* adport[0]对应地址为0x00c00070,配置寄存器有6位,0、1、2位对应起始通道,3、4、5位对应结束通道。adport[8]对应地址为0x00c00078,是控制寄存器*/
……
}
在中断服务子程序接收采样的数据,程序如下。
C_INT02()
{
ad[adi++] = adport[8];/*把采集的数据十六进制数据存入数组ad中*/
If(adi>0x7ff) /*存入的数据大小为2K×16bit,根据内存大小动态改变*/
adi &= ox7ff;
}
结论
经过实际验证,本ADC系统在低成本的情况下的采样精度达到了13位,这在16位的ADC芯片中达到很好的水平,并被应用到高精度的工业控制中。利用TMS320VC33和EPM7512AE,灵活方便地实现了对高精度模数转换器MAX1162的控制和动态多通道采样,简化了系统设计的复杂性,同时使得DSP的编程处理变得非常高效简洁。若应用在要求更加严格的场面,本系统有待做进一步的改进,把ADC芯片更换为并行输出,同时把CPLD芯片更换为CycloneII FPGA,DSP芯片用TMS320C6713,同时加入噪声抑制设计,这样整个系统性能将会显著提高。在一定的条件下,和ADC模块相类似,本系统可以经过扩充,实现更多路的信号采集。
参考文献
1 徐惠民,安德宁编著.数字逻辑设计与VHDL描述.机械工业出版社, 2004
2 张雄伟等著.DSP集成开发与应用实例.电子工业出版社, 2002
3 MAX1162,16-Bit,+5V,200ksps ADC with 10μA Shutdown.MAXIM
4 TMS320VC33 DIGITAL SIGNAL PROCESSOR, Texas Instruments Incorporated