⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 AD7708 - ANALOG DEVICES 16bit ADC CONVERSION ROUTINES
💻 C
字号:

#include "typedef.h"
#include <LPC214x.H>        	// LPC21xx definitions
#include "adc.h"

#define VREF  2.500         //VREF 2.5V 
#define RREF  2200.0        //UPOR V SERIJI Z PT100 NA VREF 2.5V - ZA PT100 SONDO

///*unsigned int*/ u32 mer=0,mer_err=0;

unsigned char dummy;

float ad0_dat[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/*unsigned char*/ volatile u8 ad0_time=0;

float ad2_dat[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/*unsigned char*/ volatile u8 ad2_time=0;

/*static unsigned char*/ static unsigned char chip_nr = 0;

#define CS_AD0_1   {IOSET0 = 0x00001000;dummy &= 0x23;}  //CHIP SELECT NA 1 -> AD7708/0 NI IZBRAN 
#define CS_AD0_0   {IOCLR0 = 0x00001000;dummy &= 0x34;}  //CHIP SELECT NA 0 -> AD7708/0 JE IZBRAN

#define CS_AD1_1   {IOSET0 = 0x00002000;dummy &= 0x56;}  //CHIP SELECT NA 1 -> AD7708/1 NI IZBRAN 
#define CS_AD1_0   {IOCLR0 = 0x00002000;dummy &= 0x78;}  //CHIP SELECT NA 0 -> AD7708/1 JE IZBRAN

#define CS_AD2_1   {IOSET0 = 0x00010000;dummy &= 0x56;}  //CHIP SELECT NA 1 -> AD7708/2 NI IZBRAN 
#define CS_AD2_0   {IOCLR0 = 0x00010000;dummy &= 0x78;}  //CHIP SELECT NA 0 -> AD7708/2 JE IZBRAN

#define CS_AD3_1   {IOSET0 = 0x00100000;dummy &= 0x56;}  //CHIP SELECT NA 1 -> AD7708/3 NI IZBRAN 
#define CS_AD3_0   {IOCLR0 = 0x00100000;dummy &= 0x78;}  //CHIP SELECT NA 0 -> AD7708/3 JE IZBRAN

//***********************************************************************************

#define SCL_AD_0   {IOCLR0 = 0x00020000;dummy &= 0x5e;} //SERIAL CLOCK AD7708BR NA 0
#define SCL_AD_1   {IOSET0 = 0x00020000;dummy &= 0xd6;} //SERIAL CLOCK AD7708BR NA 1

#define DIN_AD_0   {IOCLR0 = 0x00080000;dummy &= 0x56;} //DATA IN V AD7708BR NA 0
#define DIN_AD_1   {IOSET0 = 0x00080000;dummy &= 0x36;} //DATA IN V AD7708BR NA 1

#define DOUT_AD     IOPIN0 & 0x00040000  //DATA IZ AD7708BRZ

/*
//sbit  DRDY    = P3 ^ 2;     //DATA READY OUTPUT FROM AD7707BR

//KODE ZA SETUP REGISTER
#define FSYNC_SET   0x01
#define FSYNC_CLR   0x00        //FILTER SYNCHRONISATION

#define BUFFER_ON   0x02
#define BUFFER_OFF  0x00        //INPUT BUFFER

#define UNIPOLAR    0x04        //UNIPOLARNO DELOVANJE MERITEV + SIGNALOV
#define BIPOLAR     0x00        //BIPOLARNO DELOVANJE MERITEV +/- SIGNALOV

#define GAIN1       0x00        //OJACANJE A/D 1x
#define GAIN2       0x08        //OJACANJE A/D 2x
#define GAIN4       0x10        //OJACANJE A/D 4x
#define GAIN8       0x18        //OJACANJE A/D 8x
#define GAIN16      0x20        //OJACANJE A/D 16x
#define GAIN32      0x28        //OJACANJE A/D 32x
#define GAIN64      0x30        //OJACANJE A/D 64x
#define GAIN128     0x38        //OJACANJE A/D 128x

#define MODE_NORM   0x00        //NORMALNO DELOVANJE MERILNIKA - MERITVE
#define ALL_CALL    0x40        //VKLOP AVTO KALIBRACIJE FULL IN ZERO SCALE
#define ZERO_CALL   0x80        //KALIBRACIJA NULE
#define FULL_CALL   0xC0        //KALIBRACIJA KONCNE SKALE
*/

void ad0(void)
{
/*static unsigned char*/ static u8 ad0_step=0,ad0_kanal;
//static unsigned char adc_port_out = 0x00;
float ttemp = 0.0;

 chip_nr=0;        //IZBRAN JE CHIP 0

switch(ad0_step)
 {
  default:
  case 0:

CASE_0:
  reset_ad();       //RESET VSEH REGISTROV

//KANAL 2 : TLAK KOMPRESORJA STOPNJA 2 4-20mA = 0-30bar
//KANAL 3 : MERILNIK VLAGE VAISALA 4-20mA = 0-100%rh
//KANAL 4 : MERILNIK TEMPERATURE VAISALA 4-20mA = -10 do +180stC
//KANAL 8 : PT100 KOMORA

  switch(ad0_kanal)
   {
    default:
	case 8: 
	   ad0_kanal = 2; 
	  break;
	case 2: 
	   ad0_kanal = 3;
	  break;
	case 3: 
	   ad0_kanal = 4;
	  break;
	case 4: 
	   ad0_kanal = 8;
	  break;
   }

  chip_select_adc(0); //CS_AD0_1;        // make the /CS line high - OFF

//KONFIGURACIJA REGISTROV
//******* WRITE TO IOCON REGISTER , ZA NASTAVITEV PORTOV P1 IN P2 VHOD ALI IZHOD , STANJE
  Writetoreg(0x07); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO IOCON REGISTER
  Writetoreg(0x33); //OBA PINA STA IZHOD 0x30 , OBA PINA STA NA 1 | 0x03
  
//******* WRITE TO FILTER REGISTER
  Writetoreg(0x03); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO FILTER REGISTER
  Writetoreg(0xFF); //255 - fadc = 5.35Hz (CHOPER ENABLED)

switch(ad0_kanal)
 {
 case 8:  //PT100 SONDA	TEMPERATURA KOMORE
//******* WRITE TO ADC CONTROL REGISTER
  Writetoreg(0x02); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO CONTROL REGISTER
  Writetoreg(0x8C); //KANAL 8 ZA 1. 4wPT100  , UNIPOLAR , GAIN 8

//******* WRITE TO ADC MODE REGISTER
  Writetoreg(0x01); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO MODE REGISTER
  Writetoreg(0x42); //SINGLE CONVERSION MODE , buffered mode , REFERENCA VREF1 - RATIOMETRIC MEASURMENT
//**********************************
 break;
 case 2:  //TLAK KOMPRESORJA 2. STOPNJA 4-20mA
//******* WRITE TO ADC CONTROL REGISTER
  Writetoreg(0x02); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO CONTROL REGISTER
  Writetoreg(0x2F); //KANAL 2 ZA TLAK KOMORE , MERILNO OBMOCJE JE 2.56V PRI REFERENCI 2.50V , UN

//******* WRITE TO ADC MODE REGISTER
  Writetoreg(0x01); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO MODE REGISTER
  Writetoreg(0x22); //SINGLE CONVERSION MODE  , unbuffered mode - AINCOM = GND , REFERENCA VREF2
//**********************************
 break;
 case 3:  //VAISALA RELATIVNA VLAGA 4-20mA
//******* WRITE TO ADC CONTROL REGISTER
  Writetoreg(0x02); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO CONTROL REGISTER
  Writetoreg(0x3F); //KANAL 3 ZA TLAK AGREGATA , MERILNO OBMOCJE JE 2.56V PRI REFERENCI 2.50V , UNBUFFERED MODE

//******* WRITE TO ADC MODE REGISTER
  Writetoreg(0x01); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO MODE REGISTER
  Writetoreg(0x22); //SINGLE CONVERSION MODE , unbuffered mode - AINCOM = GND , REFERENCA VREF2 
//**********************************
 break;
 case 4:  //VAISALA TEMPERATURA 4-20mA
//******* WRITE TO ADC CONTROL REGISTER
  Writetoreg(0x02); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO CONTROL REGISTER
  Writetoreg(0x4F); //KANAL 4 ZA TLAK AGREGATA , MERILNO OBMOCJE JE 2.56V PRI REFERENCI 2.50V , UNBUFFERED MODE

//******* WRITE TO ADC MODE REGISTER
  Writetoreg(0x01); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO MODE REGISTER
  Writetoreg(0x22); //SINGLE CONVERSION MODE , unbuffered mode - AINCOM = GND , REFERENCA VREF2 
//**********************************
 break;
 }
  ad0_time=0;
  ad0_step=1;
  break;

 case 1:
//******* READ STATUS REGISTER - RDY
  Writetoreg(0x40);       //WRITE TO COMM REGISTER , NEXT OPERATION READ FROM STATUS REGISTER
  if((read8_ad() & 0x80) == 0x00)  //PREBERI STATUS REGISTER , BIT 7 JE RDY SIGNAL , OB KONCU PRETVORBE SE POSTAVI NA 1
      {
       if(ad0_time > 250)
	    {
//         mer_err++;
         ttemp = 999.9;
         ad0_dat[ad0_kanal] = ttemp;
         goto AD_ERR;
		}
	   break;
	  }
//  mer++;

//**********************************
//PREBERI REZULTAT A/D PRETVORBE

if(ad0_kanal < 8) //MERITEV PROTI AGND
  {
   Writetoreg(0x44); //set the next operation for 16 bit read from the data register
   ttemp = (read16()*1.024)*(VREF/65535.0);       //IZMERJENA NAPETOST NA VHODU

   ad0_dat[ad0_kanal] = ttemp*10.0;       //tok v mA na 100E UPORU
  }
 else
  {  //DIFERENCIALNA MERITEV
//******* WRITE TO ADC MODE REGISTER , PREBERI REZULTAT A/D PRETVORBE
   Writetoreg(0x44); //set the next operation for 16 bit read from the data register
   ttemp = (read16()*1.024)/((float)65535/(RREF/8.0));        //IZMERJENA NAPETOST NA VHODU
//                       MAX OBSEG,Rref,GAIN
//                   1.024 JE KER JE KONCNI OBSEG PRI 2.5V REFERENCI 2.56V

   ttemp = pt100(ttemp);
   ad0_dat[ad0_kanal] = ttemp;
  }

AD_ERR:
   ad0_step = 0;
//   break;
   goto CASE_0;
 }
}
/****************************************************************************/
/****************************************************************************/
void ad2(void)
{
/*static unsigned char*/ static u8 ad2_step=0,ad2_kanal;
float ttemp = 0.0;

 chip_nr=2;        //IZBRAN JE CHIP 2

switch(ad2_step)
 {
  default:
  case 0:

CASE_0:
  reset_ad();       //RESET VSEH REGISTROV

//KANAL 8 : PT100 VODA
//KANAL 9 : PT100 KOMPRESOR 2

  switch(ad2_kanal)
   {
    default:
	case 9: 
	   ad2_kanal = 8; 
	  break;
	case 8: 
	   ad2_kanal = 9;
	  break;
   }

  chip_select_adc(0); //CS_AD2_1;        // make the /CS line high - OFF

//KONFIGURACIJA REGISTROV
//******* WRITE TO IOCON REGISTER , ZA NASTAVITEV PORTOV P1 IN P2 VHOD ALI IZHOD , STANJE
  Writetoreg(0x07); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO IOCON REGISTER
  Writetoreg(0x33); //OBA PINA STA IZHOD 0x30 , OBA PINA STA NA 1 | 0x03
  
//******* WRITE TO FILTER REGISTER
  Writetoreg(0x03); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO FILTER REGISTER
  Writetoreg(0xFF); //255 - fadc = 5.35Hz (CHOPER ENABLED)

switch(ad2_kanal)
 {
 case 8:  //PT100 SONDA	TEMPERATURA VODE
//******* WRITE TO ADC CONTROL REGISTER
  Writetoreg(0x02); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO CONTROL REGISTER
  Writetoreg(0x8C); //KANAL 8 ZA 1. 4wPT100  , UNIPOLAR , GAIN 8

//******* WRITE TO ADC MODE REGISTER
  Writetoreg(0x01); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO MODE REGISTER
  Writetoreg(0x42); //SINGLE CONVERSION MODE , buffered mode , REFERENCA VREF1 - RATIOMETRIC MEASURMENT
//**********************************
 break;

 case 9:  //PT100 SONDA	TEMPERATURA KOMPRESORJA 2
//******* WRITE TO ADC CONTROL REGISTER
  Writetoreg(0x02); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO CONTROL REGISTER
  Writetoreg(0x9C); //KANAL 9 ZA 1. 4wPT100  , UNIPOLAR , GAIN 8

//******* WRITE TO ADC MODE REGISTER
  Writetoreg(0x01); //WRITE TO COMM REGISTER , NEXT OPERATION WRITE TO MODE REGISTER
  Writetoreg(0x62); //SINGLE CONVERSION MODE , buffered mode , REFERENCA VREF2 - RATIOMETRIC MEASURMENT
//**********************************
 break;
 }
  ad2_time=0;
  ad2_step=1;
  break;

 case 1:
//******* READ STATUS REGISTER - RDY
  Writetoreg(0x40);       //WRITE TO COMM REGISTER , NEXT OPERATION READ FROM STATUS REGISTER
  if((read8_ad() & 0x80) == 0x00)  //PREBERI STATUS REGISTER , BIT 7 JE RDY SIGNAL , OB KONCU PRETVORBE SE POSTAVI NA 1
      {
       if(ad2_time > 250)
	    {
//         mer_err++;
         ttemp = 999.9;
         ad2_dat[ad2_kanal] = ttemp;
         goto AD_ERR;
		}
	   break;
	  }
//  mer++;

//**********************************
//PREBERI REZULTAT A/D PRETVORBE
  {  //DIFERENCIALNA MERITEV PT100
//******* WRITE TO ADC MODE REGISTER , PREBERI REZULTAT A/D PRETVORBE
   Writetoreg(0x44); //set the next operation for 16 bit read from the data register
   ttemp = (read16()*1.024)/((float)65535/(RREF/8.0));        //IZMERJENA NAPETOST NA VHODU
//                       MAX OBSEG,Rref,GAIN
//                   1.024 JE KER JE KONCNI OBSEG PRI 2.5V REFERENCI 2.56V

   ttemp = pt100(ttemp);
   ad2_dat[ad2_kanal] = ttemp;
  }

AD_ERR:
   ad2_step = 0;
//   break;
   goto CASE_0;
 }
}
/****************************************************************************/
void Writetoreg(/*unsigned char*/ u8 sdata) //POSILJANJE 8 BITNEGA PODATKA V AD7714
   {
   /*unsigned char*/ u8 dstevec;
   chip_select_adc(0); //CS_AD0_1;
    SCL_AD_1;SCL_AD_1;
   chip_select_adc(1); //CS_AD0_0;
//   DIN_AD_ON;
//   DOUT_AD=1;
  
   dstevec=8;
    do{
       SCL_AD_0;SCL_AD_0;
       if(sdata & 0x80) DIN_AD_1 else DIN_AD_0
       sdata <<= 1; //*= 2;
       SCL_AD_1;SCL_AD_1;
      } while(--dstevec != 0);      //8 bitni podatek
    chip_select_adc(0); //CS_AD0_1;
    return;
  }
//****************************************************************************
/*unsigned*/ u16 read16(void)               //BRANJE AD REZULTATA ad7707
    {
     /*unsigned char*/ u8 stevec;
     /*unsigned int*/ u16 result=0;
     DIN_AD_1;
//     DOUT_AD=1;                        //ZATO DA JE DEFINIRAN KOT VHOD
	 chip_select_adc(0); //CS_AD0_1; 
      SCL_AD_1;SCL_AD_1;
	 chip_select_adc(1); //CS_AD0_0; 
     stevec = 16;
   do {
       SCL_AD_0;SCL_AD_0;
       result = result << 1;
       if(DOUT_AD) result |= 0x01;
/*
       if(DOUT_AD == 0x00040000) 
	          result |= 0x0001;
		   else
		      result &= 0xFFFE;
*/

       SCL_AD_1;SCL_AD_1;
      } while(--stevec);               //PREBEREMO 8 bitni PODATEK
     chip_select_adc(0); //CS_AD0_1;
//     DIN_AD=0;
     return result;
    }
//*****************************************************************************
unsigned char read8_ad()   //PREBERI 8 BITOV IZ REGISTRA
  {
     u8 stevec;
     u8 result=0;     
    DIN_AD_1;
//     DOUT_AD=1;                        //ZATO DA JE DEFINIRAN KOT VHOD
   chip_select_adc(0); //CS_AD0_1;
    SCL_AD_1;SCL_AD_1;
   chip_select_adc(1); //CS_AD0_0;
     stevec = 8;
   do {
       SCL_AD_0;SCL_AD_0;
       result = result << 1; // 2;
       if(DOUT_AD) result = result | 0x01;
       SCL_AD_1;SCL_AD_1;
      } while(--stevec);               //PREBEREMO 8 bitni PODATEK
     chip_select_adc(0); //CS_AD0_1;
//     DIN_AD=0;
     return result;
  }
//*****************************************************************************
void reset_ad(void)     //RESET A/D CONVERTERJA
   {
    u8 cntx;
//    DOUT_AD=1; //SDA_AD_OUT;
   chip_select_adc(0); //CS_AD0_1;
    SCL_AD_1;SCL_AD_1;
   chip_select_adc(1); //CS_AD0_0;
   for(cntx = 0;cntx < 34; cntx++)
         {
           SCL_AD_0;
           SCL_AD_0;
           SCL_AD_0;
            DIN_AD_1;
           SCL_AD_1;
           SCL_AD_1;
           SCL_AD_1;
         }
    chip_select_adc(0); //CS_AD0_1;
  }
//*****************************************************************************
float pt100(float upornost)  //PRERACUN UPORNOSTI pt100 SONDE V TEMPERATURO
 {
  float result=0,xtmp=1.0;
  u8 tmp;
//LINEARIZACIJA OD -50 DO +250鳦   ODSTOPA ZA NEKAJ tisocink 4. STOPNJE
   const float b[5] = {-245.9236267,
                          2.357353788,
                          0.00107183793,
                         -8.23985589E-007,
                          2.879158974E-009};

//PRERACUN UPORNOSTI V TEMPERATURO IN LINEARIZACIJA
    for(tmp = 0; tmp < (sizeof(b) / 4);tmp++)
       {
        result += b[tmp] * xtmp;
        xtmp *= upornost;
       }
   return result;
 }
//*******************************************************************************
void chip_select_adc(/*unsigned int*/ bit enabled)  //vklop oziroma izklop chip selecta AD pretvornika 
 {									 // ki je izbran z spremenljivko "chip_nr"
  if(enabled)
   switch(chip_nr)   //VKLOP DOLOCENEGA CHIP SELECTA
    {
     case 0:
	    CS_AD0_0;
		CS_AD1_1;
		CS_AD2_1;
		CS_AD3_1;
	    break;
     case 1:
	    CS_AD0_1;
		CS_AD1_0;
		CS_AD2_1;
		CS_AD3_1;
	    break;
     case 2:
	    CS_AD0_1;
		CS_AD1_1;
		CS_AD2_0;
		CS_AD3_1;
	    break;
     case 3:
	    CS_AD0_1;
		CS_AD1_1;
		CS_AD2_1;
		CS_AD3_0;
	    break;
    }
   else
    {			   //IZKLOP VSEH CHIP SELECTOV
	    CS_AD0_1;
		CS_AD1_1;
		CS_AD2_1;
		CS_AD3_1;
    }
 }
//*******************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -