This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【原创】ADS1255的使用

Other Parts Discussed in Thread: ADS1255

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;                     
}