模拟开关ADG1206和AD7892使用时的软件设计
0赞模拟开关ADG1206和AD7892使用时的软件设计
在前面的博客中,我曾经向大家陆续介绍了模拟开关ADG1206和快速ADC器件AD7892,但当时主要是从硬件设计的角度详细介绍过,这次我主要想从软件设计的角度介绍一下模拟开关ADG1206和快速ADC器件AD7892的配合使用,我们选用的CPU是控制及数据采集常用的DSP芯片,在DSP面对很多外设的情况下,我们该如何访问模拟开关和模数转换器件呢?这也是我这期博客讨论的关键所在。
首先,我们分析一下两个器件的控制信号:模拟开关ADG1206主要有两类控制信号,分别为使能型号EN和地址线A[3:0],16路模拟开关当然有四根地址线,其中EN使能信号为高电平有效信号;模数转换器件AD7892有读信号RD、片选信号CS、转换开始信号CONVST和转换结束信号EOC,均为低电平有效信号。上面强调什么电平有效,这对程序设计人员来说是比较关键的。
其次,由于DSP处理器周围往往有很多外设去访问,这就涉及到地址线和数据线复用问题,也就是译码问题,以前由于没有可编程逻辑器件,都是用器件搭建的数字电路完成译码,现在都是采用可编程逻辑器件比如CPLD、FPGA等完成译码,从而达到访问多个外设的目的。在我们的应用中,将ADG1206的使能引脚EN接至FPGA,AD7892的控制信号都接入FPGA,分不同的地址段来访问ADG1206和AD7892。
最后,对于模拟开关ADG1206的16个通道,通过循环的方式比如for循环,轮流访问每个通道,由于AD7892不能做多次均值,只能在软件中通过多次采样,将最终采样值送给DSP的数据线。具体程序举例如下:
Uint16 Ad(int16 * Buf)
{
Uint16 i , j;
Uint16 m = 0;
Uint16 c = 5; //采样次数
int16 data;
Uint8 ch[30];
Uint16 lenth;
ADC_REG * pAdc = (ADC_REG *)ADC_BASE_ADDR; //将ADC的基地址传给寄存器
for(i = 0; i < CHANNEL_NUM; i++) //模拟开关的16个通道
{
pAdc->mux = i; //将模拟开关的通道数赋给ADC的中间寄存器
DELAY_US(5);
Buf[i] = 0; //中间缓存器清零
for(j = 0; j < c; j++) //连续采样5次
{
pAdc->Reg = ADC_START;
pAdc->Reg = ~ADC_START;
data = pAdc->datReg;
while((pAdc->Reg & ADC_EOC))
{
DELAY_US(1);
m++;
if(m > TIME_ADC)
{
return 1;
}
}
data = pAdc->datReg & 0xfff;
if(data >= 2048 )
{
data -= 4096;
}
Buf[i] += data;
}
}
return 0;
}
大家可能注意到,程序中ADC如果长时间不能完成采样,由于我们在其中设置了定时器,如果长时间不能完成模拟数据到数字信号的转换,就可以直接跳出采样程序,等待下一次的采样。
以上只是我在设计数据采集系统过程中的部分体验,但愿能给大家平时的系统及电路设计带来某些帮助!
