Multi adc Problems

Thread Starter

house91320

Joined Feb 8, 2012
5
So Iv'e got this code that sample 4 adcs, and when it was with one adc it worked fine, but once I added the other three it stopped working, anyone have any ideas.

Code: Select all
Rich (BB code):
#define ADC_CS1 PORTA.F7   // output bit
#define ADC_CS2 PORTE.F4
#define ADC_CS3 PORTG.F9
#define ADC_CS4 PORTA.F7
#define ADC_SDO PORTB.F3

sbit ADC_SCK at LATG6_bit;

char buffer1[20];
char buffer2[20];
char buffer3[20];
char buffer4[20];

long d1;
long d2;
long d3;
long d4;





unsigned long x1_1,x2_1,x3_1,x4_1,x5_1;
unsigned long x1_2,x2_2,x3_2,x4_2,x5_2;
unsigned long x1_3,x2_3,x3_3,x4_3,x5_3;
unsigned long x1_4,x2_4,x3_4,x4_4,x5_4;

/* read 32-bit data from LTC2400 */

unsigned long read_ADC1(void)
{
   char k1;
   long n1;
   n1= 0;
   ADC_CS1 = 0;
   Delay_us(10);
   for(k1=0; k1<32; k1++)
   {
         n1<<= 1;
     ADC_SCK = 1;
     n1 |= ADC_SDO;
         ADC_SCK = 0;
    }
        ADC_CS1 = 1;
         n1&=0x01fffffff; // maskout sign bit
         n1>>=4;   // get 24-bit conversion result
     return n1;
}

unsigned long filter_ADC1(void)
{
    x5_1 = x4_1;
    x4_1 = x3_1;
    x3_1 = x2_1;
    x2_1 = x1_1;
    x1_1 = read_ADC1();
    return ((((x1_1+x2_1+x3_1+x4_1+x5_1)/5)*148)/100); // x 149 E-9 convert to 2.479V
}

unsigned long read_ADC2(void)
{
   char k2;
   long n2;
   n2= 0;
   ADC_CS2 = 0;
   Delay_us(10);
   for(k2=0; k2<32; k2++)
   {
         n2<<= 1;
     ADC_SCK = 1;
     n2 |= ADC_SDO;
         ADC_SCK = 0;
    }
        ADC_CS2 = 1;
         n2&=0x01fffffff; // maskout sign bit
         n2>>=4;   // get 24-bit conversion result
     return n2;
}

unsigned long filter_ADC2(void)
{
    x5_2 = x4_2;
    x4_2 = x3_2;
    x3_2 = x2_2;
    x2_2 = x1_2;
    x1_2 = read_ADC2();
    return ((((x1_2+x2_2+x3_2+x4_2+x5_2)/5)*148)/100); // x 149 E-9 convert to 2.479V
}

unsigned long read_ADC3(void)
{
   char k3;
   long n3;
   n3= 0;
   ADC_CS1 = 0;
   Delay_us(10);
   for(k3=0; k3<32; k3++)
   {
         n3<<= 1;
     ADC_SCK = 1;
     n3 |= ADC_SDO;
         ADC_SCK = 0;
    }
        ADC_CS3 = 1;
         n3&=0x01fffffff; // maskout sign bit
         n3>>=4;   // get 24-bit conversion result
     return n3;
}

unsigned long filter_ADC3(void)
{
    x5_3 = x4_3;
    x4_3 = x3_3;
    x3_3 = x2_3;
    x2_3 = x1_3;
    x1_3 = read_ADC3();
    return ((((x1_3+x2_3+x3_3+x4_3+x5_3)/5)*148)/100); // x 149 E-9 convert to 2.479V
}

unsigned long read_ADC4(void)
{
   char k4;
   long n4;
   n4= 0;
   ADC_CS4 = 0;
   Delay_us(10);
   for(k4=0; k4<32; k4++)
   {
         n4<<= 1;
     ADC_SCK = 1;
     n4 |= ADC_SDO;
         ADC_SCK = 0;
    }
        ADC_CS4 = 1;
         n4&=0x01fffffff; // maskout sign bit
         n4>>=4;   // get 24-bit conversion result
     return n4;
}

unsigned long filter_ADC4(void)
{
    x5_4 = x4_4;
    x4_4 = x3_4;
    x3_4 = x2_4;
    x2_4 = x1_4;
    x1_4 = read_ADC4();
    return ((((x1_4+x2_4+x3_4+x4_4+x5_4)/5)*148)/100); // x 149 E-9 convert to 2.479V
}



void main() {
UART1_Init(9600);
TRISA7_bit = 0;
TRISG6_bit = 0;
TRISG7_bit = 1;
TRISE4_bit = 0;
TRISG9_bit = 0;
TRISB3_bit = 0;

CHECON = 0x32;
AD1PCFG = 0xFFFF;

  while(1){


  d1 = read_ADC1();
  sprintf(buffer1,"%08ld V1_",d1); //0xe4    x0.1%cV
  UART_Write_Text(buffer1);
  
  Delay_ms(1000);

  d2 = read_ADC2();
  sprintf(buffer2,"%08ld V2_",d2); //0xe4    x0.1%cV
  UART_Write_text(buffer2);
  
  Delay_ms(1000);

  d3 = read_ADC3();
  sprintf(buffer3,"%08ld A1_",d3); //0xe4    x0.1%cV
  UART_Write_text(buffer3);
  
  Delay_ms(1000);

  d4 = read_ADC4();
  sprintf(buffer4,"%08ld A2_\r\n",d4); //0xe4    x0.1%cV
  UART_Write_text(buffer4);
  
  Delay_ms(1000);


  }
}
 
Last edited by a moderator:
Top