Чтение ADS1232 с помощью Arduino

spi

Я новичок и пытаюсь прочитать ADS1232 с помощью Arduino для проекта весов.

Я читаю данные через интерфейс SPI, но не получаю результат.

#include <SPI.h>

#define MISOPIN  50  //ДАННЫЕ
#define SCLKPIN  52  //SCLK
#define PDWN     53  // СС
#define SPEED       5 
#define GAIN0       7
#define GAIN1       6
#define CLKIN       10 
#define A0          9
#define TEMP        8


uint32_t byte1;
uint32_t byte2;
uint32_t byte3;
uint32_t finaladc = 0;


void setup() {
  // поместите сюда свой код установки для однократного запуска:
  Serial.begin(9600);



  pinMode(PDWN, OUTPUT);  
  pinMode(MISOPIN, INPUT);
  pinMode(SCLKPIN, OUTPUT);
  pinMode(SPEED, OUTPUT);
  pinMode(GAIN0, OUTPUT);
  pinMode(GAIN1, OUTPUT);
  pinMode(A0, OUTPUT);
  pinMode(TEMP, OUTPUT);

  digitalWrite(GAIN0, HIGH);
  digitalWrite(GAIN1, HIGH);
  digitalWrite(SCLKPIN, LOW);
  digitalWrite(A0, LOW);
  digitalWrite(TEMP, LOW);
  digitalWrite(SPEED, HIGH);//0--> 10СПС, 1 -->80СПС
  digitalWrite(PDWN, HIGH);  //0--> ВЫКЛЮЧЕНИЕ ПИТАНИЯ (СПИННЫЙ РЕЖИМ - БЕЗ ПРЕОБРАЗОВАНИЯ), 1 --> РАБОЧИЙ РЕЖИМ

  reset_adc();

  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE1);

  digitalWrite(SCLKPIN,LOW);

}

void loop() {
  // поместите сюда свой основной код для многократного запуска:
  if (digitalRead(MISOPIN)== LOW) read_adc();

  delay(1000);

}

void reset_adc()  {
  digitalWrite(SCLKPIN,HIGH);
  delayMicroseconds(1400);

}

void read_adc()  {
  drdy_wait();
  uint8_t i;
  finaladc = SPI.transfer(0xff);  
  finaladc |= (uint32_t)SPI.transfer(0xff) << 8;
  finaladc |= (uint32_t)SPI.transfer(0xff) << 16;
  Serial.print ("ADC_value:  "); 
  Serial.println(finaladc,DEC);
  Serial.println();

}

void drdy_wait()
{
  delayMicroseconds(30);
}

Кто-нибудь работал с этим? Вы можете помочь мне? Спасибо

, 👍0

Обсуждение

Добро пожаловать в stackexchange. Не могли бы вы показать свой код, пожалуйста? Без этого трудно распознать проблемы., @smajli

Это здесь [Google](https://drive.google.com/open?id=1v2XJuCeoCvwjLOKwnfEhqoh3d_aJG9dk), @Thanh Van

у ADS1232 нет SPI, @Juraj

Я использовал SPI с ADS1232. У вас много проблем, но первая из них заключается в том, что ваш reset_adc() неправильный, среди прочего сброс осуществляется путем понижения уровня вывода PWDN более чем на 10 мкс. Начните там., @RamblinRose


1 ответ


1

Я выловил код, который написал некоторое время назад, оценивая 1232. SPI — это головная боль из-за необходимости переключать тактовый сигнал, чтобы предотвратить «залипание» последнего бита данных, что приведет к сбою повторных операций чтения при получении последних данных. бит высокий.

Если вам абсолютно необходимо использовать SPI, прекратите читать этот ответ.

Все, что вам нужно знать, находится на страницах 18 и 19 технического описания ADS1232. Обратите внимание, что это исключительно демонстрационный материал, например, он не учитывает время стабилизации при переключении каналов.

int32_t read_adc(const uint16_t wait_millis) {    
   int32_t data = 0;     
   // сброс АЦП
   digitalWrite(ADS1232_PDWN, LOW);
   delayMicroseconds(10);
   digitalWrite(ADS1232_PDWN, HIGH);
   delayMicroseconds(10);

   for (; data < wait_millis && digitalRead(ADS1232_DRDY_DOUT) != LOW; 
        delay(1), 
        data++);

    if (data == wait_millis) {
        // тайм-аут
        return -1;
    }

   // чтение в 24 битах, см. страницу 19 таблицы данных

   data = 0;    
   for (uint8_t i = 0; i < 24; i++) {
        digitalWrite(ADS1232_CLK, HIGH); // тактируем следующий бит данных
        data <<= 1;
        data |= digitalRead(ADS1232_DRDY_DOUT);
        digitalWrite(ADS1232_CLK, LOW);
    }
    // корректируем знак. См. стр. 18 таблицы данных.
    if (data & 0x00800000)
        data |= 0xFF000000;    
    // избегаем того, чтобы DRDY/DOUT оставались в состоянии последнего бита
    // см. стр. 19 таблицы данных
    digitalWrite(ADS1232_CLK, HIGH);
    delayMicroseconds(10);
    digitalWrite(ADS1232_CLK, LOW);

    return data;
}
,

Спасибо!! Рамблин Роуз!! Я постараюсь ответить вам, @Thanh Van