Go Down

Topic: Interface to LTC1298 Serial 12 bit ADC (Read 1 time) previous topic - next topic

mcsarge

Oct 19, 2009, 01:59 am Last Edit: Oct 19, 2009, 02:01 am by mcsarge Reason: 1
Hi all,

This is a simple program that I created to read an LTC1298 12 bit ADC. I am using it to read an MPX4115 pressure sensor. Here is the code:

Code: [Select]

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

LTC1298 - Arduino interface
Matt Sargent
October 2009

This example is essentially a port of the code that is contained in the
Peter Anderson article. I believe the code was written by Towanda Malone, Baltimore, MD in Apr, '99.
Here is a link to the article:
http://www.phanderson.com/PIC/PICC/CCS_PCM/1298.html

I updated the code to work with the Arduino. I am using the default board, so I did not make any
adjustments for the speed at which the conversions are being made. I do take 20 samples and delay 1 ms
between each and then average them. I have added an error amount that I have found is needed to get my
barometer to match the local one at the Naval Air Station.

/////////////////////////////////////////////////////////////////////////////////////////////

Connections:
The LTC1298 is connected thus:

LTC1298  |  Arduino Pin (not ATMEGA328)
---------------------------------------
CLK  (7) |   Pin 2
Din  (5) |   Pin 3  Note same pin as below
Dout (6) |   Pin 3  Note same pin as above
!CS  (5) |   Pin 4

/////////////////////////////////////////////////////////////////////////////////////////////
Data sheets:
http://cds.linear.com/docs/Datasheet/128698fs.pdf

References:
http://www.phanderson.com/PIC/PICC/CCS_PCM/1298.html

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

const int CS_PIN=4;
const int Dinout_PIN=3; //Din and Dout are both connected to pin 3...
const int CLK_PIN=2;

/////////////////////////////////////////////////////////////////////////////////////////////
void setup(void)
{
 //Set output pins to output
 pinMode(CS_PIN, OUTPUT);
 pinMode(CLK_PIN, OUTPUT);

 //Setup this pin, though it changes from input to output and vice versa
 pinMode(Dinout_PIN, OUTPUT);    

 // start serial port
 Serial.begin(9600);
}
/////////////////////////////////////////////////////////////////////////////////////////////

float samples;
float analogValue;
float adjustment = 1.0;
float P; //pressure in millibars
float temp;

void loop(void) {

  samples = 0.0;
  for (int i = 0; i < 20; i++)
  {
    temp = ReadFromLTC1298(0x0d); //single ended Ch 0
    samples = samples + temp;
    delay(1);
  }
 
  //now average the 20 samples
  analogValue = samples / 20.0;
 
  P = analogValue * 0.272 + 105.5 + adjustment;   //For 12 bit ADC
   
  // print the result:
  Serial.print("P(avg)=");
  Serial.print(P);
  P = P * 0.0295301;  //convert to in Hg...
  Serial.print("; in Hg = ");
  Serial.print(P);
  Serial.print("  Analog Value=");
  Serial.println(analogValue);

  delay(500); //wait a 1/2 second so the screen does not fly by...
}

int ReadFromLTC1298(int command)
{
 int aBit;
 int n;
 int result = 0x0000;

 //Set data pin for output so we can send the command
 pinMode(Dinout_PIN, OUTPUT);    

 //make sure the chip is not selected
 digitalWrite(CS_PIN, HIGH);
 
 //Initialize the clock high
 digitalWrite(CLK_PIN, HIGH);

 //Select the chip (LTC1298 will reset)
 digitalWrite(CS_PIN, LOW);

 //write the command to the LTC1298
 for (n=0; n<4; n++)
 {
   aBit = (command >> (3-n)) & 0x01;
   digitalWrite(Dinout_PIN, aBit); //Most sig fig first

   //Pulse in the bit...
   digitalWrite(CLK_PIN, LOW);
   digitalWrite(CLK_PIN, HIGH);
 }

 //Change the Dinout to input for reading
 pinMode(Dinout_PIN, INPUT);
 
 //dummy clock pulse  
 digitalWrite(CLK_PIN, LOW);
 digitalWrite(CLK_PIN, HIGH);
 
 //Read in the 12 bits of data
 for (n=0; n<12; n++)
 {
   //Pulse the clock...
   digitalWrite(CLK_PIN, LOW);
   digitalWrite(CLK_PIN, HIGH);
   
   aBit = digitalRead(Dinout_PIN);
   result = (result << 1) | aBit;
 }
 
 digitalWrite(CS_PIN, HIGH); //De-Selected the chip
 return result;
}


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy