Подключение ЦАП к Ардуино по SPI

Написал простенький код для проверки собранной схемы, в целом, все работает, хотя тоже не так, как хотелось бы: напряжение принимает значение от 1,55В до 4,5В при 0 и 65535 соответственно, но должно было выдавать 0В при 0

Код
#include <SPI.h>
#define SPI_CLK 13
#define SPI_SDI 11
#define CS_PIN A1
#define REF_GR_DAC 100.00

uint16_t _VAL;

void write (float value);

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
SPI.begin();                                                       // Запуск интерфейса SPI
SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));  // Начало транзакции, 20МГц, Старший байт первый, Мод0
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH);

}

void loop() {
  // put your main code here, to run repeatedly:
write(30);
Serial.println(_VAL);
}

void write(float value) {  // Запись значения в ЦАП
    if (value < 0) {          // Если значение опускается меньше нуля, записывать ноль
      _VAL = 0;
    } else if (value > REF_GR_DAC) {  // Если значение выше референсного, записывать максимальное
      _VAL = 65535;
    } else {
      _VAL = uint16_t(65535 * value / REF_GR_DAC);  // Расчет значения по пропорции
    }
    digitalWrite(CS_PIN, LOW);  // Запись в чипселект 0 для выбора ЦАП для передачи
    
    SPI.transfer16(_VAL);         // передача ЦАП
    //delay(15);
    digitalWrite(CS_PIN, HIGH);  // Запись в чипселект 1 для окончания передачи
  }

При этом основной код для всей системы, который я кидал выше, не работает: при загрузке первой прошивки напряжение на выходе остается таким же, какое было в тестовом коде

Ничего себе работает)). Измеряете без ОУ ? Мультиметр проверенный?

P.S Ещё можно проверить питание. Некоторые dc/dc выдают очень “грязное” напряжение.Добавьте на VREF и VDD, как можно ближе к микросхеме , керамические конденсаторы 0.47 - 1 мкф.
Электролит лучше поставить low esr или танталовый
Или вообще запитать схему от АКБ, снизив напряжение до 5В линейным стабилизатором, типа LM7805

1 лайк

это на выходе ЦАП или ОУ?

Да, действительно, с разными мультиметрами по-разному, что интересно, тот, который врал на прозвонке, сейчас наиболее близкие к правде значения выдает, а конденсаторы уже стоят итак
Остается разбираться с кодом, почему не работает основной, вроде в нужные функции входит, пробовал без использования функций класса в записи, тоже не то

ОУ, ну с заменой мультиметра все стало показывать нормально линейно

С кодом тоже разобрался, когда-то переименовывал переменные и не заметил, что объявил приватную переменную CS_PIN, которую использую в функции write, и так же назвал аргумент функции begin, поэтому не было ошибки, когда я использовал CS_PIN в write, ведь он был объявлен, но ему ничего не было присвоено
Всем спасибо большое за помощь!