微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > 基于AD7888的度激光器监测系统的设计

基于AD7888的度激光器监测系统的设计

时间:12-21 来源:互联网 点击:
3 接口与驱动

串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口。SPI总线是一种三线同步总线,因其硬件功能很强,所以其实现软件就相当简单。AD7888与多种串行接口兼容,可以根据使用的控制芯片在设计中灵活的使用,从经济的角度出发选择普通的MCU芯片AT89S52,使用程序可方便地实现对SPI总线的控制。


                                                图4 串行接口时序图

AD7888与MCU之间的接口关系如图5所示。为了能够获得稳定的数据,AD7888与MCU之间加入光隔离器。光隔离器件采用的是隔离电压高、速度快、共模抑制性强的6N137。由于6N137的速度快,编程中不需要进行延时就能满足光隔离器的电平建立时间。试验表明通过光隔离器,获得的稳定数据能够增加3~4位(二进制位)。AD7888的CS接地,使AD888始终工作在SPI接口模式。对每个接口模块的控制是通过74LSl25的三态允许端来实现的。对其中一个SPI接口操作时,使其74LSl25处于选通状态,而其他SPI接口的74LSl25处于高阻状态。这样可实现微处理器单独对一个接口进行操作,而不影响其他接口。CPU通过对三态缓冲器74LSl25控制,可实现多个接口共用相同的数据线。AD7888所采样的七路电压信号经过分压以后电压都在2.5V以内,所以这里可以直接使用芯片内置的+2.5V参考电压,在程序中必须将控制器的REF位置清为“0”。


                                                 图5 AD7888与MCU连接图

子程序入口参数Adcaddres通过设置控制寄存器来修改采样通道和工作模式

unsigned int get_ad(unsigned char Adcaddres)

//写入控制字和读出转换数据

{

unsigned char i,j;

unsigned char Strdatah,Strdatal,Tempdata;

unsigned int Strdata;

Tempdata=0×0;

Strdatah=0×0;

Strdatal=0×0;

Strdata=0;

Ad_cs(0);

//使能AD7888片选有效

Ad_sclk=1;

for(i=0;i<8;i++)

//前8个时钟周期进行控制寄存器的写入

{

//和读出上次转换的高4位数据

Ad_din=(bit)( Adcaddres &(0×80>>i));

//先移出最高位

Ad_sclk=0;

for(j=0;j<2;j++);

Ad_sclk=1;

for(j=0;j<2;j++);

Strdatah=Ad_dout;

Strdatah=Strdatah<<(7-i);

Tempdata=Tempdata | Strdatah;

}

Strdatah=Tempdata;

Tempdata=0×0;

for(i=0;i<8;i++)

//从AD7888中读取低8位采样码

{

Ad_sclk=0;

for(j=0;j<2;j++);

Ad_sclk=1;

Strdatal=Ad_dout;

Strdatal=Strdatal<<(7-i);

Tempdata=Tempdata | Strdatal;

for(j=0;j<2;j++);

}

Strdatal=Tempdata;

Strdata=(Strdatah*256 +Strdatal)&0x0fff;

//去除高四位的无效数据”0”,防止误码出现

Ad_cs(1);

//使能AD7888片选无效,降低功耗

return(Strdata);

}

程序中把写控制寄存器通知采样某通道和读出上次转换的高位有效数据同时进行,提高了转换的速度,使应用程序编程更加高效。

当电源不稳定或者电路出现干扰的时候,AD7888输出的采出码将出现波动,使得采样效果变差,这时可以在读数据时采用防脉冲干扰移动平均值法数字滤波,即加入后置滤波器,使效果得以改善。下面是相关的程序。

子程序入口参数Adcaddres通过设置控制寄存器来修改采样通道进行数字滤波

#define LEN 18

//采样数组的长度

#define SHIFT 4

//LEN = 2^SHIFT+2

unsigned int szlb(unsigned char Adcaddres) {

unsigned char pdat;

//移动指针

unsigned char pmax,pmin;

//记录数据表中最大值和最小值的位置,在一般的数据采集系

unsigned char i;

//统中,数据的长度>=8,

unsigned int datas[LEN];

//因此用指针记录而不是直接记录最大值和最小值

unsigned int average=0;

//清零,用来计算平均值

pmax=0;

pmin=0;

for ( pdat=0;pdat<LEN;pdat++)

//采样所得数据存入数据表中

{

datas[pdat] = get_ad(Adcaddres);

DelayMs(0×06);

}

for(i=0;i<LEN;i++)

average+=datas;

//求所有数据总和

/******去除被认为是脉冲的数据*******/

for ( i=LEN;i>0;i--)

{

if(datas[i-1]>datas[pmax])

//记录数组中最大值的下标

pmax=i-1;

if(datas[i-1]<datas[pmin])

//记录数组中最小值的下标

pmin=i-1;

}

average=average-datas[pmax]-datas[pmin];

//减去脉冲

return (average>>SHIFT);

//求算术平均值

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top