Цифро-аналоговый преобразователь с DAC5311, есть предложения?

Я создал свой код ЦАП с помощью DAC5311 и Arduino Uno. Я думаю, что это не проблема, но это не работает хорошо. Просто напечатайте 0. (Я использую осциллограф.) Я не знаю, где проблема. Пожалуйста, дайте мне любое предложение.

#include <SPI.h>
#include <math.h>
#define pin_CS 10
#define pin_MOSI 11 
#define pin_SCLK 13
#define max_VOLT 5

void setVoltage(float voltage){
  if (voltage < 0) voltage = 0;
  if (voltage > max_VOLT) voltage = max_VOLT;
  uint16_t temp = int(voltage * pow(2, 8) / max_VOLT);
  temp = temp << 6;
  uint8_t upper = temp >> 8;
  uint8_t lower = (temp & 0xff);
  digitalWrite(pin_CS, LOW);
  SPI.transfer(upper);
  SPI.transfer(lower);
  digitalWrite(pin_CS, HIGH); 
}

void setup() {
  Serial.begin(9600);
  pinMode(pin_CS, OUTPUT);
  pinMode(pin_MOSI, OUTPUT);
  pinMode(pin_SCLK, OUTPUT);              
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  digitalWrite(pin_CS, HIGH);
}

void loop() {
  setVoltage(5);
  delay(10);
}

, 👍0

Обсуждение

утверждение "это не работает" не имеет смысла... "я пользуюсь осциллографом" также бессмысленно... пожалуйста, объясните, что вы ожидали, что произошло на самом деле и что вы сделали с осциллографом, @jsotola

Извините, я не силен в английском. Так что может быть не понятно. Дело в том, что я хочу выставить напряжение 5, а на выходе DAC5311 ноль. И я проверяю выход осциллографом., @임석빈

теперь это ясно ... пожалуйста, отредактируйте свой вопрос ... ваш английский просто прекрасен ... правильно ли работает ваш осциллограф и правильно ли настроены элементы управления? ... дважды проверьте выход с помощью вольтметра, @jsotola


1 ответ


3

Классический +/- 1 проблема

Если вы делаете этот расчет вручную, uint16_t temp = int(voltage * pow(2, 8) / max_VOLT);
вы получите temp=256, и это значение невозможно преобразовать с помощью 8-битного ЦАП.

Попробуйте вместо этого uint16_t temp = int(voltage * (pow(2, 8)-1) / max_VOLT);.

(или событие лучше для µC uint16_t temp = (uint16_t) (voltage * (255 / max_VOLT));)

,

Я пересмотрел его, но он все еще не работал. ㅜㅜ, @임석빈

Поэтому попробуйте SPI_MODE1 или SPI_MODE3 (устройство ожидает действительный бит на падающей тактовой фазе), @theSealion