通过DSP采集AD7606的转换结果

  • 前情提要

       DSP芯片中自带的AD转换芯片为12位,而在实际应用中,我们常会使用精度更高、转换速率更快的AD芯片,我们使用DSP读取片外AD芯片的转换结果。下面我们以AD7606为例,介绍其工作原理、引脚配置以及主程序。

  • 工作原理

        AD7606为16位AD芯片,其可接受8路输入信号,将其转化为16位二进制数输出。本例中我们使用其并行输出模式。

        在配置引脚之前,我们需要知道AD7606相关重要引脚的作用。

通过DSP采集AD7606的转换结果

 

        上图所示为AD7606的原理图,我们将从上至下,从左至右介绍其引脚。

        OS0~2:为过采样(over sample)配置引脚,下图为其电平配置与过采样倍数的对应关系。

通过DSP采集AD7606的转换结果

        因此注意到,上图中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)函数中,按下图将该引脚配置为输出。

通过DSP采集AD7606的转换结果

 

        GPIO49:发送复位信号,该信号可以在每次转换完8路输出之后发出,也可以只在最开始复位一次,配置如下。

通过DSP采集AD7606的转换结果         IC1_XZCS7:告诉我们数据存于ZONE7对应的地址中。我们在程序中用指针对数据进行访问,故设置指针如下。

通过DSP采集AD7606的转换结果

         地址的来历不再赘述。

         GPIO48:读取BUSY电平,设置为输入,配置如下。

通过DSP采集AD7606的转换结果

         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引脚功能的介绍十分专业和详细,对我的调试工作提供了很大的帮助。

上一篇:数据结构——查找


下一篇:Graylog处理docker容器的多行日志之过程记录