Получение неправильного вывода от АЦП через SPI в Arduino Uno

Я пытаюсь считать данные с АЦП ADCS7476 (техническое описание), используя SPI на Arduino. Уно. Я использую следующий код для чтения данных с АЦП и их печати на последовательном мониторе. Однако код всегда печатает 0. Я никогда раньше не использовал SPI и не могу отладить проблему, кто-нибудь знает, где я ошибаюсь.

Я использую следующие соединения:

  1. SCLK ADC для контакта 13 на Ardunio
  2. SDATA АЦП для контакта 12 на Arduino
  3. АЦП CS для контакта 10 на Arduino

Код:

#include <SPI.h>
#define cs 10

SPISettings settingsA(250000, MSBFIRST, SPI_MODE0);
byte highbyte,lowbyte;
unsigned int data;

void setup() {
  Serial.begin(9600);
  pinMode(cs, OUTPUT);
  digitalWrite(cs, HIGH); 
  delay(1000);
  SPI.begin();
}

void loop() {
  SPI.beginTransaction(settingsA);
  digitalWrite(cs, LOW);
  delayMicroseconds(1);
  highbyte = SPI.transfer(0xFF);
  lowbyte = SPI.transfer(0xFF);
  digitalWrite(cs, HIGH);
  delayMicroseconds(1);
  SPI.endTransaction();
  data= ((unsigned int)highbyte << 8 ) + lowbyte;
  Serial.println(data);
  delay(100);
}

, 👍1

Обсуждение

кроме #include и #define, имеющих пробел (но поскольку компилятор не жалуется, я думаю, что это просто неправильная копия-вставка), я не вижу ничего явно неправильного. Итак, только самые основные вопросы: 1) питается ли схема? 2) АЦП имеет свой источник питания или вы его питаете от ардуино 5V? 3) если первое, вы соединили два основания? 4) АЦП питается от 5В? 5) Можете ли вы подключить осциллограф к линиям данных и синхронизации, чтобы увидеть, что находится на шине?, @frarugi87

см. пример BarometricPressureSensor библиотеки SPI, @Juraj

Вы не можете задержать эту маленькую задержкуMicroseconds(1); Минимальное допустимое значение — 3 или 4 в разделе «Справочник по Arduino»., @CrossRoads

Вам также не нужна эта строка вообще SPISettings settingsA(250000, MSBFIRST, SPI_MODE0); В настройках по умолчанию используются 4 МГц, тактовая частота, MSBFIRST, SPI Mode 0. Часть работает с тактовой частотой до 20 МГц, поэтому 4 будет нормально. На частоте 16 МГц 1 мкс составляет 16 тактов, поэтому цифровая запись или две на другой контакт после понижения уровня CS приведет к небольшой задержке для начала преобразования., @CrossRoads

@ frarugi87 Схема питается от Arduino 5 В, и две земли соединены. Скриншоты с осциллографа приложу сегодня вечером или завтра., @rithvikp

@CrossRoads Должен ли я увеличить задержку?, @rithvikp

delayMicroseconds(1) Я думаю, что приводит к 0 задержке. Измените на 3 или 4, это будет наименьшее используемое значение., @CrossRoads


1 ответ


1

Я оставляю этот ответ на случай, если кто-то наткнется на этот вопрос в будущем

Очень разочаровывающим и разочаровывающим финалом оказывается, что сам чип АЦП не работает должным образом. Я протестировал (неисправный) чип, используя приведенный выше код, и наблюдал за выходом вывода данных на осциллографе, и выход был одним и тем же прямоугольным сигналом независимо от входа. Мне удалось найти новый АЦП, и я проверил его, и он работал правильно. Но это поднимает для меня новую проблему, это уже третий протестированный мной чип АЦП, который работает правильно, первые два были неисправны. Маловероятно, что это производственная проблема, и я использовал одни и те же соединения и один и тот же код для тестирования всех трех из них. Может быть, это как-то связано с пайкой, потому что, насколько я знаю, это единственное, что отличается. Если кто-нибудь знает что-то еще, что могло пойти не так, я внимательно слушаю.

,