📄 adc.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 + -