Помогите разобраться с проблемой(AD7799BRUZ-REEL, Ардуино,SPI)

Новичок в чатике

✩✩✩✩✩✩✩
13 Май 2026
4
0
Развел себе плату(фото прилагается) на микросхеме AD7799BRUZ-REEL, первый такой опыт в создании своих схем, по задумке обычный датчик тока и напряжения двуканальный, связь с ардуинкой через spi, напряжение буду измерять до 40в, поэтому стоят делители напряжения на входах каналов, после сборки начал проверку, код(фото его прилагается) сделан на основе библиотеки AD779X-master, делал его пока через иишку, нужно было простое и быстрое решение, чтобы быстрее проверить работоспособность платы, в итоге идет инициализация чипа, первый замер и далее передача данных просто останавливается, при замыкании минуса питания на металл передача идет полным ходом, но с помехами(показывает напряжение при его отсутствии на входной линии, на последнем фото зафиксирован момент замыкания) .
В чем может быть проблема остановки передачи данных и как это можно лучше исправить?
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,443
988
Вы, простите, издеваетесь? Вставили код тремя отдельными скриншотами и рассчитываете, что кто-то станет его смотреть?
Начните с того, что вставьте код по правилам форума - текстом и с тегами, чтобы, при желании, люди могли его скопировать в Ардуино ИДЕ и запустить компиляцию.
Кроме того, если кто-то что-то слабал через ИИ "по быстрому" и оно теперь не работает - то типичный ответ на такие вопросы - возвращайтесь к ИИ, который писал вам код и просите его исправить ошибки.
 

Новичок в чатике

✩✩✩✩✩✩✩
13 Май 2026
4
0
По схеме:

Вижу что для связи с Ардуиной по SPI выведено 4 пина - Miso Mosi SCK и CS.
А GND между платой и ардуино вы не забыли обьединить?
Плату питаю от ардуино от пина 5в и gnd, так что в этом плане все должно быть хорошо, а насчет кода, прошу прощения, не видел правил оформления, чуть позже скину все по правилам
 

Новичок в чатике

✩✩✩✩✩✩✩
13 Май 2026
4
0
Upd: нашел в даташите типичную схему включения, нашел ошибки в своей схеме, подключил "висящие" пины, которые должны были быть тоже подключены(картинка типичной схемы и моей обновленной прилагаются), также приложил код в правильном формате(хотя думаю дело не в нем), ошибка изначальная исправилась, теперь шина spi постоянно передает данные(показания на ПК через ардуино постоянно обновляются без прерываний), как и должна, только проблема в том, что самого потока данных нет, все 4 провода шины на осциллографе показывают нулевое значение, никаких сигналов при подаче питания на микросхему по шине не передается(независимо от того, есть ли еще напряжение на измерительных каналах или нет). В чем может быть проблема?

C++:
/* AD7799 library - измерение каналов 0 и 1
   АЦП: AD7799BRUZ-REEL (24-bit, 3 differential channels)
   Канал 2 (AIN5/6) не используется
*/

#include <SPI.h>
#include <AD779X.h>

// Создаём объект АЦП: опорное напряжение 1.8В (замените на ваше, если другое!)
AD779X myADC(3.9);

// Пины подключения (настройте под свою схему)
const int ADC_CS_PIN = 10;  // Chip Select

void setup() {
  Serial.begin(9600);  // ↑ скорость для комфортного вывода
  while (!Serial);       // ждём подключения монитора порта (для Leonardo/Micro)
 
  // Инициализация SPI
  SPI.begin();
  SPI.setDataMode(SPI_MODE3);  // CPOL=1, CPHA=1 — обязательно для AD779x!
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV32);  // 500 кГц — надёжно и быстро
 
  // Инициализация АЦП
  myADC.Begin(ADC_CS_PIN);
 
  // Настройка: используем только 2 канала (0 и 1)
  // Параметры: (кол-во каналов, первый, второй, третий)
  myADC.Setup(2, 0, 1);  // ← канал 2 исключён из цикла
 
  // Конфигурация АЦП:
  // gain=0x02 (4x), coding=0x01 (Unipolar), rate=0x09 (16.7 SPS, 50Hz rejection)
  // buffer=enabled — рекомендуется при gain > 1
  myADC.Config(
    0x00,   // Gain: 4x (0x00=1x, 0x01=2x, 0x02=4x ... 0x07=128x)
    0x01,   // Unipolar: 0...Vref (0 = Bipolar ±Vref)
    0x09,   // 16.7 SPS + 80dB подавление 50 Гц (оптимально для сетей 50Гц)
    0x01,   // Входной буфер: включён (нужен при gain ≥ 2)
    0x00,   // Детектор референса: выключен
    0x00,   // Burnout current: выключен
    0x00    // Power switch: выключен
  );
 
  Serial.println(F("AD7799 initialized. Measuring CH0 (AIN1/2) and CH1 (AIN3/4)"));
  Serial.println(F("Format: CHx - RAW(hex) - Voltage(mV)"));
  Serial.println(F("----------------------------------------"));
}

void loop() {
  // Update() возвращает true, когда новые данные готовы
  if (myADC.Update()) {
    
    // === Читаем и выводим только каналы 0 и 1 ===
    for (int ch = 0; ch < 2; ch++) {  // ← цикл до 2, а не до 3!
      
      unsigned long raw = myADC.readRaw(ch);
      float voltage = myADC.readmV(ch);

      Serial.print(F("CH"));
      Serial.print(ch);
      Serial.print(F(" (AIN"));
      Serial.print(ch * 2 + 1);  // AIN1 для ch0, AIN3 для ch1
      Serial.print(F("/"));
      Serial.print(ch * 2 + 2);
      Serial.print(F(") - RAW: 0x"));
      Serial.print(raw, HEX);
      Serial.print(F("  |  "));
      Serial.print(voltage, 3);  // ← 3 знака после запятой, НЕ HEX!
      Serial.println(F(" mV"));
    }
    
    Serial.println(F("----------------------------------------"));
    
    // Опционально: небольшая задержка, чтобы не забивать порт
   delay(1000);
  }
}
 

Вложения