¿Cómo funciona el conversor analógico digital de 20 bits ADS1230?

#1
carga desde el puesto serial. Pero me he enfrentado a algunos problemas, antes que nada les presento con lo que cuento:

Celda de carga: SUP1-100kg

conversor analogo - digital: ads1230 (tengo una plaquita que va conectada a arduino por medio de los pines PDWN,, SCLK,DOUT)

arduino: UNO

El punto aqui es que no se que datos debo sacar de la hoja del datasheet del ads1230 asi tambien como la interpretacion de las graficas que ahi aparecen, ya que apenas me estoy adentrando a este tipo de dispositivos. y asuntos relacionados con las lecturas que hace arduino para convertirlas a kg. (Es decir alguna formula para convertir los valores que captura arduino para convertir a kg).espero contar con su apoyo de antemano muchas gracias.

les dejo aca el link del datasheet:
http://www.ti.com/lit/ds/symlink/ads1230.pdf ...
 
#2
Hola, lo que pasa es que ese integrado con el que cuentas es un ADC cuya salida es del tipo SIGMA-DELTA, es necesario decodificarla para trabajar con ella.
No he trabajado con éste tipo de codificación pero se que es muy usada en audio :oops:

¿Porqué no utilizas el ADC interno del ARDUINO?, quizá te sea más sencillo aunque es de la mitad de resolución
 
#4
Antes que nada gracias por contestar. podrian poner un ejemplo de como interpretar las graficas que aparecen el el datasheet? o algo de bibliografia acerca de este dispositivo?. y efectivamente daniel Meza es por la resolucion
 
#6
Gracias chclau, mira encontre un codigo por la web podrian ayudarme a entenderlo porfavor:

Código:
 #include "ads1230.h"

//constructor (no funcionará la libreria hasta usar funcion begin() )
ads1230::ads1230(){
  dataPin = 0;
  clockPin = 0;
  powerPin = 0;
  rawData = 0;
  m = 1.0f;
  b = 0.0f;
  weight = 0.0f;
}

//---------------------------------------------------------------------
//funcion que inicializa efectivamente la clase
void ads1230::begin(int _dataPin, int _clockPin, int _powerPin){
  dataPin = _dataPin;
  clockPin = _clockPin;
  powerPin = _powerPin;
  
  pinMode(dataPin, INPUT);   delayMicroseconds(1617);
  pinMode(clockPin, OUTPUT);   delayMicroseconds(1617);
  pinMode(powerPin, OUTPUT);   delayMicroseconds(1617);
  
  digitalWrite(powerPin, LOW);     delayMicroseconds(490);
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  delay(1000);
  digitalWrite(powerPin, HIGH);     delayMicroseconds(490);
  delay(1000);
  
  Power_Down_Mode();
  Wakeup();
  Standby_Mode();
  getRawData();
  Offset_Calibration();
  getRawData();
  Standby_Mode_With_Offset_Calibration();
  getRawData();
  Standby_Mode();
}

//---------------------------------------------------------------------
//espera a que pin se ponga en alto, indicando que hay info disponible
boolean ads1230::dataReady(){
  int DOUT_TIMEOUT = 500;
  int startTime = millis();
  int elapsed = 0;
  while (digitalRead(dataPin) && elapsed < DOUT_TIMEOUT) 
    elapsed = millis() - startTime;
  if (elapsed < DOUT_TIMEOUT) 
    return true;
  else 
    return false;
}

//---------------------------------------------------------------------
//Obtiene los 20 bits sin procesar
int ads1230::getRawData(){
  int iAD_Data = 0;
  unsigned char i;
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  if (!dataReady())
    return 0;
  for (i = 0; i < 20; i++)
  {
      digitalWrite(clockPin, HIGH);     delayMicroseconds(490);
      delay(1);
      digitalWrite(clockPin, LOW);     delayMicroseconds(490);
      delay(1);
      iAD_Data = iAD_Data << 1;
      if (digitalRead(dataPin))
      {
          iAD_Data++;
      }
  }
  for (i = 0; i < 4; i++)
  {
      digitalWrite(clockPin, HIGH);     delayMicroseconds(490);
      delay(1);
      digitalWrite(clockPin, LOW);     delayMicroseconds(490);
      delay(1);
  }
  //return (iAD_Data >> 4);
  return iAD_Data;
}

//---------------------------------------------------------------------
//Obtiene peso directamente
float ads1230::getWeight(){
  weight = (m * (float)getRawData()) + b;
  return weight;
}

//---------------------------------------------------------------------
//asigna offset para sumar al valor obtenido de getWeight()
void ads1230::setOffset(float _offset){
  b = _offset;
}

//---------------------------------------------------------------------
//añade offset para sumar al valor obtenido de getWeight()
void ads1230::addOffset(float _offset){
  b += _offset;
}

//---------------------------------------------------------------------
//Indica offset para restar al valor obtenido de getWeight()
void ads1230::setSlope(float _pendiente){
  m = _pendiente;
}

//---------------------------------------------------------------------
//reduce la energia consumida practicamente a 0 pero no permite hacer lecturas
void ads1230::Power_Down_Mode(){
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  digitalWrite(powerPin, LOW);     delayMicroseconds(490);
  delay(1);
}

//---------------------------------------------------------------------
//Despierta al integrado para poder volver a realizar lecturas
void ads1230::Wakeup(){
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  digitalWrite(powerPin, HIGH);     delayMicroseconds(490);
  delay(1);
}

//---------------------------------------------------------------------
//envia al integrado al estado de bajo consumo
boolean ads1230::Standby_Mode(){
  unsigned char i;
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  if (!dataReady())
    return false;
  for (i = 0; i < 20; i++)
  {
      digitalWrite(clockPin, LOW);     delayMicroseconds(490);
      delay(1);
      digitalWrite(clockPin, HIGH);     delayMicroseconds(490);
      delay(1);
  }
  delay(50);
  return true;
}

//---------------------------------------------------------------------
//remueve el error inherente del ads1230
boolean ads1230::Offset_Calibration(){
  unsigned char i;
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  if (!dataReady())
    return false;
  for (i = 0; i < 26; i++)
  {
      digitalWrite(clockPin, LOW);     delayMicroseconds(490);
      delay(1);
      digitalWrite(clockPin, HIGH);     delayMicroseconds(490);
      delay(1);
  }
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  delay(1000);
  return true;
}

//---------------------------------------------------------------------
//envia al integrado al estado de bajo consumo, indicandole que se calibre la proxima vez que arranque
boolean ads1230::Standby_Mode_With_Offset_Calibration(){
  unsigned char i;
  digitalWrite(clockPin, LOW);     delayMicroseconds(490);
  if (!dataReady())
    return false;
  for (i = 0; i < 26; i++)
  {
      digitalWrite(clockPin, LOW);     delayMicroseconds(490);
      delay(1);
      digitalWrite(clockPin, HIGH);     delayMicroseconds(490);
      delay(1);
  }
  return true;
}


empezando por la parte que dice:

//espera a que pin se ponga en alto, indicando que hay info disponible
boolean ads1230::dataReady()


Quise poner todo el codigo completo para que pudieran ver en que contexto se encuentra las palabras.
 
Última edición:
Arriba