- 前情提要
DSP芯片中自带的AD转换芯片为12位,而在实际应用中,我们常会使用精度更高、转换速率更快的AD芯片,我们使用DSP读取片外AD芯片的转换结果。下面我们以AD7606为例,介绍其工作原理、引脚配置以及主程序。
- 工作原理
AD7606为16位AD芯片,其可接受8路输入信号,将其转化为16位二进制数输出。本例中我们使用其并行输出模式。
在配置引脚之前,我们需要知道AD7606相关重要引脚的作用。
上图所示为AD7606的原理图,我们将从上至下,从左至右介绍其引脚。
OS0~2:为过采样(over sample)配置引脚,下图为其电平配置与过采样倍数的对应关系。
因此注意到,上图中R2,R3,R4和R8,R11,R13不能同时焊接,否则DSP可能辨别不出OS引脚电平是0还是1(至少我是这么猜测的,没有试过)。我们目前设置为000,即无过采样。
STBY:待机模式输入。目前电路板上取下了R41,保留R15(这个没仔细探究,反正目前这样就能用)
PAR:并行/串行/字节接口选择输入。该引脚与低电平相连的时候,选择并行接口;与高电平相连,选择串行接口;高电平且DB15/BYTE SEL为低电平,选择并行字节接口。我们使用并行功能,因此将该引脚接地。
RANGE:选择芯片量程。与高电平相连,测量范围为±10V,反之为±5V。目前我们保留了R19,故测量范围为±5V。
CONVSTA/B:开启信号,高电平时开启。AB控制不同的输入口,但我们常将其短接在一起。我们使用F28335的GPIO62对其电平进行控制,因此我们将GPIO62设置为输出引脚。
FRSTDATA:FRSTDATA输出信号指示何时在并行、字节或串行接口上回读第-通道V1。虽然原理图上该引脚与GPIO57相连,但是DSP不接收信号好像也能读数,因此我们在程序里也没有进行配置。
RESET:复位信号。注意该信号必须为一个正脉冲,即低-高-低,否则AD7606不工作(这个问题卡了我们好久)
RD:读信号。在并行模式下,RD和CS为低电平时启动输出总线,可以读到数据。在串行模式下,此引脚用作传输的串行时钟输入。该信号由AD发出,不用配置DSP引脚。
CS:片选信号(chip selection?)。此低电平有效逻辑输入使能数据帧传输。在并行模式下,如果CS和RD均处于逻辑低电平,则会使能输出总线DB[15:0],使转换结果输出在并行数据总线上。在串行模式下,利用CS使能串行数据帧传输,并逐个输出串行输出数据的最高有效位(MSB)。注意到该引脚上面标注了IC1_XZCS6,代表该芯片转化得到的结果可以在ZONE6中访问。我们目前使用的AD7606芯片将数据存在了ZONE7,查看F28335.cmd可知(不同的程序.cmd中的配置可能不一样,得具体看),ZONE7的首地址为0x20FC00,在后面AD数据的读取中我们会用到。
BUSY:忙信号,高电平时表示芯片正在进行转换,低电平时表示转换结束,可以读取结果。
DB0~15:并行输出口,连接到DSP的异步接口,对应GPIO64~78,在Xintf函数中进行相应设置。
左下角几个引脚不用管。
AVCC:供电端口,3.3V。
Vdrive:逻辑电源输入,接3.3V。
V1~8:模拟输入。AD芯片需要转换的模拟量即从此处输入。
右下角为地端口。
- 引脚配置
高低电平等不需要在CCS中设置的引脚其配置在原理图和第二部分中已经说明,下面我们阐述DSP相关引脚的配置。
GPIO62:发送开启信号。在void InitGpioset(void)函数中,按下图将该引脚配置为输出。
GPIO49:发送复位信号,该信号可以在每次转换完8路输出之后发出,也可以只在最开始复位一次,配置如下。
IC1_XZCS7:告诉我们数据存于ZONE7对应的地址中。我们在程序中用指针对数据进行访问,故设置指针如下。
地址的来历不再赘述。
GPIO48:读取BUSY电平,设置为输入,配置如下。
DB0~15:在void InitXintf16Gpio(void)函数中进行配置,一般模板中自带,不用改动,如下所示。
void InitXintf16Gpio(void)
{
EALLOW;
GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3; // XD15
GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3; // XD14
GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 3; // XD13
GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 3; // XD12
GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 3; // XD11
GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 3; // XD10
GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3; // XD19
GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3; // XD8
GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 3; // XD7
GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 3; // XD6
GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 3; // XD5
GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 3; // XD4
GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 3; // XD3
GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 3; // XD2
GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 3; // XD1
GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 3; // XD0
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 3; // XREADY
GpioCtrlRegs.GPBPUD.bit.GPIO35 = 1; //Enable pull up
GpioCtrlRegs.GPBDIR.bit.GPIO35 = 1;
GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 0; //
GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 3; // XWE0
GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 3; // XZCS0
GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 3; // XZCS7
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 3; // XZCS6
EDIS;
}
- 主程序
以上所示引脚,其时序配置等各有不同,自己设置即可。
程序主体部分如下所示。
if(GpioDataRegs.GPBDAT.bit.GPIO48==0)//AD_BUSY
{
addat[0] = *(AD_ASTART); // M_I1
addat[1] = *(AD_ASTART); // M_V1
addat[2] = *(AD_ASTART); //
addat[3] = *(AD_ASTART); // M_V2
addat[4] = *(AD_ASTART); // M_V3
addat[5] = *(AD_ASTART); // M_I3
addat[6] = *(AD_ASTART); // M_V4
addat[7] = *(AD_ASTART); // M_I4
}
for(i=0;i<BUF_SIZE;i++)
{
exadc[i]=addat[i]*SCALE/32768.0;
}
其中BUF_SIZE为8,代表8个输入量,SCALE为5,代表量程。
- 总结
按如上配置,DSP可以接收到AD7606转换的数据,转换值经验算也没有问题。
我此前并没有接触过DSP,只在课程中略学过一些单片机的知识,因此错误在所难免,希望大家不吝赐教。另,《STM32F407-基于AD7606进行多路数据采集》中对AD7606引脚功能的介绍十分专业和详细,对我的调试工作提供了很大的帮助。