ADS1255是德州仪器(TI)Burr-Brown 产品线推出针对工业应用、具有业界最高性能的模数转换器 (ADC), 其由模拟多路开关(MUX)、输入缓冲器(BUF)、可编程增益放大器(PGA)、四阶Δ-Σ调制器再加一个可编程数字滤波器组成,完美组合了一流的无噪声精度、数据速率以及多种功能,为设计人员提供了全套高精度测量解决方案,非常适用于包括科学仪器、工艺控制、医疗设备与秤重设备等要求苛刻的工业应用领域。
ADS1255的内部结构如下
ADS1255的基本应用电路如下
ADS1255与MCU的连接如下,CS直接拉低
驱动程序如下
#include <c8051f120.h> #include <ADS1255.h> #define uchar unsigned char #define uint unsigned int sbit SCLK=P0^2; sbit MISO=P0^3; sbit MOSI=P0^4; sbit INT0=P1^2; float snow,snow1; unsigned long snow2,snow3,snow4,snow5,snow6; uchar date1,date2,date3; uchar date4,date5,date6,date7,date8,date9; void PORT_Init (void); /**************************************** 功能描述:微秒可控延时 设计人:孙占山 说明:进行微秒延时,注意while(--i),不能为while(i--) *****************************************/ void delayus(uchar i) { while(--i); } /**************************************** 功能描述:毫可控秒延时 设计人:孙占山 说明:进行毫秒延时,可以改变时间 *****************************************/ /* void delayms(void) { uchar i,j,k; for(i=0;i<20;i++) for(j=0;j<248;j++) for(k=0;k<248;k++); } */ void delayms(uchar k) { uchar i,j; for(i=0;i<k;i++) for(j=0;j<248;j++); } /**************************************** 功能描述:ADS1255单字节写入 设计人:孙占山 说明:在下降沿写入数据,就是在SCLK=1的时候写1,这样ADS1255在SCLK由1变为0时就能取到数据 *****************************************/ void ADS1255_write_bit(uchar temp) { uchar i; SCLK=0; for(i=0;i<8;i++) { temp=temp<<1; SCLK=0; delayus(2); SCLK=1; delayus(1); MOSI=CY; //在下降沿的时候写入数据 delayus(1); SCLK=0; delayus(1); } } /**************************************** 功能描述:ADS1255单字节读出 设计人:孙占山 说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了 再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定) *****************************************/ uchar ADS1255_read_bit(void) { uchar i; uchar date; SCLK=0; MISO=1; for(i=0;i<8;i++) { date=date<<1; SCLK=0; delayus(2); SCLK=1; delayus(2); date=date|MISO;//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可 SCLK=0; } return date; } /**************************************** 功能描述:ADS1255的24位数据分三次读出 设计人:孙占山 说明:1:ADS1255是24位的AD转换器,24位数据可以分三个八位读出,然后再经过公式算出结果 2:公式有两种,一种是左移右移,一种是date1*65536+snow2*256+snow3 3:注意公式左移时不好,因为左移有进位,这样可能数据会变化,一般尽量采取右移 *****************************************/ float ADS1255_read(void) { date1=ADS1255_read_bit(); date2=ADS1255_read_bit(); date3=ADS1255_read_bit(); //snow=((((snow|date1)<<8)|date2)<<8)|date3; //snow=snow<<8; snow=date1*65536+date2*256+date3; return snow; } /**************************************** 功能描述:ADS1255 24位一起读出读出 设计人:孙占山 说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了 再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定) *****************************************/ unsigned long ADS1255_24read(void) { uchar i; unsigned long date; SCLK=0; MISO=1; for(i=0;i<24;i++) { date=date<<1; SCLK=0; delayus(2); SCLK=1; delayus(2); SCLK=0; date=date|MISO;//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可 } date=date<<8; return date; } /**************************************** 功能描述:ADS1255写寄存器 设计人:孙占山 说明:根据要求写入寄存器和命令字 *****************************************/ void ADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data) { ADS1255_write_bit(ADS1255_command); ADS1255_write_bit(0x00); ADS1255_write_bit(ADS1255_data); delayms(248); } /**************************************** 功能描述:ADS1255读寄存器 设计人:孙占山 说明:根据要求写入寄存器和命令字 *****************************************/ uchar ADS1255_read_reg(uchar ADS1255_command) { uchar reg_date; ADS1255_write_bit(ADS1255_command); ADS1255_write_bit(0x00); delayus(50); reg_date=ADS1255_read_bit(); return reg_date; } /**************************************** 功能描述:ADS1255唤醒 设计人:孙占山 说明:唤醒待机和同步 *****************************************/ void ADS1255_WAKEUP(void) { ADS1255_write_bit(0x00); } /**************************************** 功能描述:ADS1255读一次数据命令 设计人:孙占山 说明:在DRDY为低时读出一个数据 *****************************************/ void ADS1255_RDATA(void) { ADS1255_write_bit(0x01); } /**************************************** 功能描述:ADS1255连续数据命令 设计人:孙占山 说明:在DRDY为低时连续读出数据 *****************************************/ void ADS1255_RDATAC(void) { ADS1255_write_bit(0x03); } /**************************************** 功能描述:ADS1255停止连续数据命令 设计人:孙占山 说明:在ADS1255连续输出24位当中的任何八位时写入,停止连续读数据 *****************************************/ void ADS1255_SDATAC(void) { ADS1255_write_bit(0x0F); } /**************************************** 功能描述:偏移和增益自校准 设计人:孙占山 说明:偏移和增益自校准,也可以用STATUS寄存器中的ACAL来自校准 *****************************************/ void ADS1255_SELFCAL(void) { ADS1255_write_bit(0xf0); } /**************************************** 功能描述:同步 设计人:孙占山 说明:同步用在命令的开始快速执行,紧接着用WAKE UP命令进行同步 *****************************************/ void ADS1255_SYNC(void) { ADS1255_write_bit(0xfc); } /**************************************** 功能描述:复位 设计人:孙占山 说明:复位后不管ACAL位如何,都执行一个自校准 *****************************************/ void ADS1255_RESET(void) { ADS1255_write_bit(0xfe); } /**************************************** 功能描述:ADS1255寄存器设置初始化 设计人:孙占山 说明:1:自校准可以通过写STATUS寄存器的ACAL位,还可以通过写SELFCAL命令来自校准 2:使能自校准,在写寄存器ADCON(PGA),DRATE(DR),STATUS(BUFEN)自动校准 3:在STATUS(BUFEN)与ACAL(自校准)位一起使能时,读出校准寄存器有错 *****************************************/ void ADS1255_init(void) { while(INT0==1); ADS1255_write_reg(0x50,0x04); delayus(1); //while(INT0==1); //ADS1255_write_reg(0x50,0x02); //写在STATUS(BUFEN)寄存器使能在BUFEN //delayus(1); while(INT0==1); ADS1255_write_reg(0x51,0x01); delayus(1); while(INT0==1); ADS1255_write_reg(0x52,0x01); delayus(1); while(INT0==1); ADS1255_write_reg(0x53,0x92); delayus(1); while(INT0==1); ADS1255_write_reg(0x54,0x00); } void ADS1255_out_reg(void) { while(INT0==1); date4=ADS1255_read_reg(0x15); while(INT0==1); date5=ADS1255_read_reg(0x16); while(INT0==1); date6=ADS1255_read_reg(0x17); while(INT0==1); date7=ADS1255_read_reg(0x18); while(INT0==1); date8=ADS1255_read_reg(0x19); while(INT0==1); date9=ADS1255_read_reg(0x1a); } void main (void) { unsigned char i,j; WDTCN = 0xde; WDTCN = 0xad; SFRPAGE = CONFIG_PAGE; PORT_Init (); delayms(248); ADS1255_RESET(); //复位 delayus(5); ADS1255_init(); delayus(5); //ADS1255_SELFCAL(); //通过写SELFCAL命令来自校准,可以与初始化中的STATUS(ACAL)互换 ADS1255_out_reg(); ADS1255_SYNC(); delayms(248); ADS1255_WAKEUP(); delayus(5); while(1) //一次性读数据 { for(j=0;j<50;j++) { while(INT0==1); ADS1255_write_bit(0x01); delayus(50); snow4=ADS1255_read(); //delayms(248); //snow5+=(snow4>>8); snow5+=snow4; } snow6=snow5/50; snow5=0x00000000; } /* while(1) //写寄存器,接着读寄存器 { //while(INT0==1); //ADS1255_write_bit(0x52); //ADS1255_write_bit(0x01); //ADS1255_write_bit(0x26); //ADS1255_write_bit(0x03); //delayms(248); //delayms(248); while(INT0==1); ADS1255_write_bit(0x12); ADS1255_write_bit(0x01); delayus(50); snow2=ADS1255_read_bit(); snow3=ADS1255_read_bit(); delayms(248); } */ /* //待机模式 while(1) { while(INT0==1); ADS1255_write_bit(0xfd); delayms(248); delayms(248); ADS1255_write_bit(0xff); while(INT0==1); ADS1255_write_bit(0x01); delayus(50); snow2=ADS1255_read(); } */ /* while(1) { while(INT0==1); //建立输入复用器时间 ADS1255_write_bit(0x52); ADS1255_write_bit(0x00); ADS1255_write_bit(0x01); delayus(10); ADS1255_write_bit(0xfc); delayus(10); ADS1255_write_bit(0xff); delayus(10); ADS1255_write_bit(0x01); delayus(10); //snow1=ADS1255_read(); snow2=ADS1255_24read(); delayms(248); while(INT0==1); //建立输入复用器时间 ADS1255_write_bit(0x52); ADS1255_write_bit(0x00); ADS1255_write_bit(0x01); delayus(10); ADS1255_write_bit(0xfc); delayus(10); ADS1255_write_bit(0xff); delayus(10); ADS1255_write_bit(0x01); delayus(10); snow1=ADS1255_read(); //snow2=ADS1255_24read(); delayms(248); } */ } void PORT_Init (void) { XBR2 = 0x40; }