引言
用于实时控制的嵌入式系统有多路模拟量输入,要求对多路输入进行连续扫描并进行高速高精度处理,具有16位16路差分输入通道的ADS7805能够满足系统通道数量及精度的要求。通道的快速切换及系统关键控制信号的产生成为制约系统性能的瓶颈,利用TMS320LF2407A丰富的I/O接口及高频时钟,配合EPM3032A灵活的译码功能,则可以控制ADS7805进行多个通道的高精度高速数据采集,由于采用了DSP与CPLD等可编程器件,系统可操作性得到了保证,也极大地简化了硬件电路。
1 系统结构设计
系统以DSP与CPLD为核心构建,模拟信号从多路复用器接入,利用CPLD使能或禁止其输出,DSP的I/O引脚控制通道的选择,当选通一路时,多路复用器输出差分再经过运放转为单端信号作为ADC的输入,ADC片选由DSP的I/O引脚控制,启动由CPLD控制,当片选有效时启动ADC,并按照规定的时序控制片选信号,ADC开始工作,转换结果输出到CPLD译码得到的地址。ADC与DSP之间的缓冲器件用来做电平匹配,利用CPLD将其锁定在选通状态。ADC在转换完成时发起一个外部中断到DSP,请求DSP处理转换结果[1]。
2 硬件设计
模拟信号输入到多路复用器ADG726(ADI公司产品),1.8~5.5V电源供电,由引脚VDD输入;接受16路差分或32路单端模拟信号输入(引脚S1A~S16A,S1B~S16B)。DA,DB为差分信号输出引脚;A0~A3是通道选择控制引脚。片选引脚CSA、CSB低电平有效。引脚EN、WR分别为芯片使能和写使能,EN低有效,WR上的有效电平波形如图2所示。
信号从DA,DB引脚输出之后,在到达ADC之前先转成单端信号,这里采用ADI公司易用型运放AD620,±12V模拟电源供电。
ADI公司生产的低功耗16位模数转换器ADS7805为逐次逼近型结构,+5V单电源供电,标准±10V输入,最小采样率100KSPS。REF引脚接内部或者外部参考电压,用于设定模拟输入电压范围,与模拟地之间连接一个2.2μF的钽电容,本设计采用内部参考;VANA引脚是+5V模拟电源输入端,并联一个0.1μF和一个10μF的钽电容接到模拟地上;VDIG为数字电源输入端,直接连到VANA上。AGND1和AGND2是模拟地;CAP引脚为参考缓冲电容,与模拟地之间接一个2.2μF钽电容;DGND是数字地;BYTE引脚电平决定转换结果的字节位置,低电平时引脚6到13输出结果的高8位,引脚15到22输出结果的低8位,高电平时正好相反。当启动引脚R//C为低时,片选CS的下降沿激活一次转换。BUSY在转换时保持低电平,转换完成时变高。转换结果由16个引脚并行输出,经过缓冲74LVTH16245A做5V到3.3V的电平转换到DSP,输出引脚为三态驱动。
系统的主控制器采用TI(德州仪器)公司的TMS320LF2407A,3.3V静态CMOS工艺,40MIPS,具有16位地址总线,16位数据总线,3个独立的存储空间,包括可用的64K字程序空间,35.5K字数据空间以及64K字I/O空间。访问不同的存储空间时,DSP有相应的引脚作为选通信号,即PS对应程序空间,DS对应数据空间,IS对应I/O空间,均为低电平有效。本设计将ADC映射到I/O空间。TMS320LF2407A具有丰富的通用数字I/O口,利用其中一个对ADS7805进行启动控制。通道选择也由数字I/O实现,利用DSP 4个I/O引脚作为ADG726的4-16译码输入可选择系统的16路差分。设计将ADC的BUSY引脚接到DSP的外部中断引脚XINT1上,当BUSY上升沿到来时,将触发DSP外部中断,中断的极性、优先级均可软件设定。EMP3032A是ALTERA公司推出的高性价比CPLD,在系统中用来控制ADC的引脚CS,配合引脚R//C来激活ADC,对CS的控制同时也将ADC映射在了DSP的I/O空间,因为使CS变为有效的控制逻辑来自于CPLD对DSP的4根地址线(A15到A12)及IS的译码。多路复用器的写使能由CPLD控制,即ADG726也被映射在DSP的I/O空间,这样设计的优点是对映射地址执行一个读操作就能得到需要的时序,虽然利用DSP的数字I/O引脚也能实现,但是需要在软件中模拟信号的时序,实现由高到低、延时并上跳变的过程,相对较复杂[2-4]。
3 软件设计
首先编写CPLD程序对ADG726及ADS7805进行地址译码,然后对CPLD在线编程生成译码电路。
/*--adc mux--*/
assign mux_wr=~((addr==4'h3)&(~is)&(~dsp_wr));//ADG726映射到I/O空间的地址0x3000~0x3FFF,得到写使能信号
assign mux_en=0;//ADG726的使能引脚始终有效
/*--adc--*/
assign buffer_cs=(~(addr==4'h0))|is;//ADC映射到I/O空间的地址0x0000~0x0FFF,得到缓冲器的片选信号
assign adc_cs=~((addr==4'h0)&(~is)&dsp_rdwr);//得到ADC的片选信号
在DSP程序中,对0x3000~0x3FFF的任意地址执行一个读操作,由DSP选择的通道就被选通,信号由ADG726输出到运放AD620,差分转单端后输出到ADC。通过写数字I/O的控制寄存器,先将R//C拉低,再对I/O空间的0x0000~0x0FFF执行一个读操作,然后将R//C拉高,就启动了ADC。读0x0000~0x0FFF 其中任一个地址产生低电平的CS信号,该信号保持的时间由访问I/O空间的等待时间决定,通过设置等待状态寄存器来保证获得有效的延时时间。
/*--设置等待状态寄存器--*/
WSGR = 0x01C0;//bit8-6=111,访问I/O空间时插入7个等待状态
ADC转换完成置BUSY为高电平,向DSP申请中断,相应中断被使能之后DSP开始处理中断服务程序,完成数据的读取与其他处理。
/*--初始化ADC字程序--*/
*MCRA &= 0xFC3F;//配置4个I/O引脚bit9-6为通用功能用于ADG726通道选择
*MCRB &= 0xFF7F;//bit7对应的I/O引脚控制R//C
*PADATDIR |= 0xC000;//bit7-6配置为输出,对应通道选择的两个引脚
*PBDATDIR |= 0x0300;//bit1-0配置为输出,对应通道选择的另两个引脚
*PCDATDIR |= 0xC000;//bit6配置为输出,对应R//C
*XINT1CR |= 0x7;//上升沿有效,低优先级,使能外部中断
*IMR |= 0x20;//使能内核对应的中断
/*--声明ADG726,ADC映射到的存储单元--*/
#define AD_Output port0000
volatile ioport unsigned int port0000;
#define mux_ad port3000
volatile ioport unsigned int port3000;
/*--ADG726通道选择函数--*/
*PADATDIR &= 0xFF3F;//bit7,bit6清0
*PBDATDIR &= 0xFFFC;//bit1,bit0 清0
*PADATDIR |= ( nChlNum & 0x3 ) << 6;//设置bit7,bit6
*PBDATDIR |= ( nChlNum & 0xC ) >> 2;//设置bit1,bit0
mux_ad = 0;//产生写使能信号
/*--主程序--*/
int temp;
……
AD_Init();//初始化
ADC_MUX(13);//选择通道13
/*--启动ADC--*/
*PCDATDIR &= 0xFF7F;//使AD_R/C*变低
temp=AD_Output;//产生有效的AD_CS*
*PCDATDIR |= 0x80;// 使AD_R/C*变高
for(;;);//等待ADC中断
......
/*--中断服务程序--*/
int AD_result;
*IFR = 0x20; //清除中断标志位,以响应后续中断
AD_result = AD_Output;//读转换结果
asm(“ clrc INTM”);//重新使能中断,因为一进服务程序中断就被禁止了
4 结束语
本文设计了基于TMS320LF2407A与EPM3032A的ADS7805多通道采集系统,介绍了系统的工作原理,详细描述了ADS7805、DSP及CPLD之间接口的硬件与软件设计,该方案已在笔者参与研制的嵌入式实时控制系统中得到了成功应用。