Interfacing ADS1244

Hello,

does anybody know where to find an example code to drive
an ADS1244 ADC using its serial interface ?

thx wally

I don't know of any implementation but it should be quite easy to do one yourself. Have you tried it?

Hi,

I'm preparing to try,
Yes, looks simple, but I'm not sure about the interface. Seems to be neither SPI nor I2C
It does not have a CS pin and usess 2 clocks, the system clock at 2,5 MHz.
I fear it's not entirely trivial.
I did not find anything useful on the web , e.g. example code

wally

Seems to be neither SPI nor I2C

No, it's much simpler.

It does not have a CS pin and usess 2 clocks, the system clock at 2,5 MHz.

No, it doesn't have a CS pin, so the "bus" isn't sharable. What do you mean with 2 clocks? You have to provide it's chip clock, which is a simple rectangular signal, you can use a PWM for that. The SCLK is the serial clock, you have to provide an edge for every bit you wanna read. You can do this with 2 digital pins. So for the whole chip you need 3 Arduino pins, one of them has to be a PWM output with a free timer.

Pylon,

already little simpler now, thank you.

All kind of further help highly welcome

wally

With that code in setup you get a 2.4MHz clock signal on pin 3.

void setup() {
  pinMode(3, OUTPUT);
  TCCR2A = 0x33;
  TCCR2B = 0x09;
  OCR2A = 0x06;
  OCR2B = 0x03;
}

Code for reading the data:

while (digitalRead(DATA_PIN) == HIGH); // wait for data ready
uint32_t value = shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST);
value <<= 8;
value |= shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST);
value <<= 8;
value |= shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST);
digitalWrite(CLOCK_PIN, HIGH);
digitalWrite(CLOCK_PIN, LOW); // 25th pulse to keep DATA high till next data ready

Keep in mind that DATA_PIN has to be in input mode while CLOCK_PIN has to be an output.

Hope that helps to get you started.

Pylon,

thanks a lot ! :slight_smile:
I am ashamed but i must say i see the 'shiftIn/ shiftOut' commands the first time.
I still get some errors when compiling, but i think i can fix it after some readings.
And i must solder the ADC on a adapter-PCB (MSOP) now to test during weekend.

regards
Wally

Take care of the different voltages, the analog is running at about 5V while the digital part must be below 3V6. Maybe you even have to have some voltage divider for the clock signal.

Works !

i get :
16.772.xxx on 0V
2.794.xxx on 3.3V
700.xxx on 5V

better results with pos.Vref = +2.5V
+5V 7FFFFF 8.388.607
+2,5V 40ACA4 ~4.238.500
+0,1V 5DC ~1,500
<+0,1 FFXXXX 16.xxx.xxx

/*
  ADS1244
  
*/

int DATA = 4;
int SCLK = 5;

void setup() {
  
  pinMode(DATA, INPUT);
  pinMode(SCLK, OUTPUT); 
  
  Serial.begin(115200);
  
  // generate a 2.4MHz clock signal on pin 3
  pinMode(3, OUTPUT);      //CLK
  
  // 17.11 Register Description
  TCCR2A = 0x33;  // 0011 0011  
  TCCR2B = 0x09;  // 0000 1001
  OCR2A  = 0x06;  // 0000 0110
  OCR2B  = 0x03;  // 0000 0011
  
  Serial.print("ADS1244");    // output 'AADS1244' (?) additional 'A' in front
  delay(100);
}

void loop() {
  
  // Code for reading the data:
      
  int32_t value = 0;
  
  //digitalWrite(SCLK, HIGH);  //enter slleep mode
  delay(1000);
  digitalWrite(SCLK, LOW);  // wake up ADC
  
      
  // wait for data ready, stay in while-loop until LOW
  while (digitalRead(DATA) == HIGH);     

  value = shiftIn(DATA, SCLK, MSBFIRST);
  value <<= 8;
  value |= shiftIn(DATA, SCLK, MSBFIRST);
  value <<= 8;
  value |= shiftIn(DATA, SCLK, MSBFIRST);

  digitalWrite(SCLK, HIGH);  // enter sleep mode
  //digitalWrite(SCLK, LOW); // 25th pulse to keep DATA high till next data ready
    
  Serial.println(value, DEC);
  Serial.flush();

}

some fine tuning to make it human readable:
thanks a smart solution from "dhenry"

/*
  ADS1244
  
*/

int DATA = 4;
int SCLK = 5;

void setup() {
  
  pinMode(DATA, INPUT);
  pinMode(SCLK, OUTPUT); 
  
  Serial.begin(115200);
  
  // generate a 2.4MHz clock signal on pin 3
  pinMode(3, OUTPUT);      //CLK
  
  // 17.11 Register Description
  TCCR2A = 0x33;  // 0011 0011  
  TCCR2B = 0x09;  // 0000 1001
  OCR2A  = 0x06;  // 0000 0110
  OCR2B  = 0x03;  // 0000 0011
  
  Serial.print("ADS1244\n");    // output 'AADS1244' (?) additional 'A' in front
  delay(100);
}

void loop() {
  
  // Code for reading the data:
      
  int32_t value = 0;
  
  //digitalWrite(SCLK, HIGH);  //enter slleep mode
  delay(300);
  digitalWrite(SCLK, LOW);  // wake up ADC
  
      
  // wait for data ready, stay in while-loop until LOW
  while (digitalRead(DATA) == HIGH);     

  value = shiftIn(DATA, SCLK, MSBFIRST);
  value <<= 8;
  value |= shiftIn(DATA, SCLK, MSBFIRST);
  value <<= 8;
  value |= shiftIn(DATA, SCLK, MSBFIRST);

  digitalWrite(SCLK, HIGH);  // enter sleep mode
  //digitalWrite(SCLK, LOW); // 25th pulse to keep DATA high till next data ready
    
  // process as int24_t (two's compliment 24bit)  
  value = ((signed long) (value << 8)) >> 8;    
    
    
  Serial.println(value, DEC);
  Serial.flush();

}

Hello, Could you share the code for the ads1232 with Arduino loadcell reading, I saw a post that could make reading, need to do a project and I'm having difficulty.

I am designing a load cell application and need fast response time to weight changes. Looking at the ADS1244 along with this post and was wondering if you could provide input.

I am using this for a filling application and need constant weight information feedback in order to stop fill process at correct time.