Увеличение разрешения внешнего ЦАП с помощью сигма-дельта модуляции

Mk211
Offline
Зарегистрирован: 19.01.2018

Привет. Наткнулся на данную статью https://www.embedded.com/design/configurable-systems/4006431/Sigma-delta-techniques-extend-DAC-resolution , в которой описывается методика увеличения разрешения ЦАПа. У меня имеется 16-битный AD5761 с диапазоном выходного напряжения от -10В до 10В, который вроде как можно поднять до 20 бит. Я использовал листинг 1 из статьи и сделал следующее:

#define DAC_BITS 16
#define POSITION_BITS 20  

AD5761 DACZ(8);

static int xout;
volatile int x = 0;
int sigmaX = 0;

const int MAX_DAC_OUT = (1 << (DAC_BITS - 1)) - 1;
const int MIN_DAC_OUT = -(1 << (DAC_BITS - 1));

const unsigned int shift = POSITION_BITS - DAC_BITS; 
void setup()
{
DACZ.beginDAC();
}

void loop() 
{
  xout = sigmaDelta(x, &sigmaX, shift);
  DACZ.ad5761r_write(CMD_WR_UPDATE_DAC_REG, (uint16_t)(xout + MAX_DAC_OUT + 1));
}
int sigmaDelta(int in, int *sigma, unsigned int shift)
{
int out;

*sigma += in;
out = *sigma >> shift;
*sigma -= out << shift;
return out;
}


Как я понял это, что-то вроде генерации ШИМ между LSB? В итоге оно заработало, но проблема в том, что теперь диапазон напряжений сократился -600мВ до 600мВ. И поскольку я не до конца понимаю эту методику, то у меня возник вопрос. Я где то ошибаюсь или оно и должно так работать?  Возможно ли поднять разрешение до 20 бит не жертвуя выходным диапазоном? Ничего подобного в интернете найти не смог. 

Функция, управляющая выходным напряжением ЦАПа:

void AD5761::ad5761r_write(uint8_t reg_addr_cmd, uint16_t reg_data)
{
  SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE2)); 
  uint8_t data[3];
  digitalWrite(_ssPin, LOW);
  data[0] = reg_addr_cmd;
  data[1] = (reg_data & 0xFF00) >> 8;
  data[2] = (reg_data & 0x00FF) >> 0;
  for (int i=0; i<3; i++)
  {
    SPI.transfer(data[i]);
  }
  digitalWrite(_ssPin, HIGH);
  SPI.endTransaction();
}

https://www.analog.com/media/en/technical-documentation/data-sheets/ad5761_5721.pdf

Волшебник
Offline
Зарегистрирован: 22.12.2016

1. Как я понял это, что-то вроде генерации ШИМ между LSB?

Не совсем, почитайте оверсэмплинг для АЦП. Для ЦАПа с точностью наоборот, если надо точнее - гоним больше данных, 4-ре выборки /числа на каждый +бит. НО нужен фильтр на выходе, чёто при беглом просмотре атикла я там не видел фильтра. 

2. В итоге оно заработало, но проблема в том, что теперь диапазон напряжений сократился -600мВ до 600мВ. И поскольку я не до конца понимаю эту методику, то у меня возник вопрос. Я где то ошибаюсь или оно и должно так работать?  Возможно ли поднять разрешение до 20 бит не жертвуя выходным диапазоном? Ничего подобного в интернете найти не смог. 

Не вижу никаких причин почему диапазон должен измениться до 600мВ - чисто програмный баг, ищите ошибку.

А вообще бросьте эту идею, как из области чисто теоретической математики не имеющей никакого практического смысла для данного ЦАПа.

Аргументы: 

1. ЦАП имеет ИэНэЛ 2 бита - интегральная нелинейность, т.е. он строго говоря 14-битный, и тянуть на 20-ть глупо. Хорошо если наоборот, 8-битник с ИэНэЛ 0.25 бита, тогда запросто качается с 8-ми на 12-битный.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Если вы начинаете "качать" ЦАП, проще его выбросить и вернуться на ШИМ. Все эти оверсемплинги и всякие дельтасигмы мура. Если вы можете подпрыгнуть на 50 см - не означает что сможете летать на высоте 25 :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

brokly пишет:

Если вы начинаете "качать" ЦАП, проще его выбросить и вернуться на ШИМ. Все эти оверсемплинги и всякие дельтасигмы мура. Если вы можете подпрыгнуть на 50 см - не означает что сможете летать на высоте 25 :)

Нормально. И тушканчик может покорить небо. https://www.youtube.com/watch?v=stTx1kvNI7k

SLKH
Offline
Зарегистрирован: 17.08.2015

Mk211 пишет:

Привет. Наткнулся на данную статью https://www.embedded.com/design/configurable-systems/4006431/Sigma-delta-techniques-extend-DAC-resolution , в которой описывается методика увеличения разрешения ЦАПа. У меня имеется 16-битный AD5761 с диапазоном выходного напряжения от -10В до 10В, который вроде как можно поднять до 20 бит. 

Вопрос, на который на этом форуме не принято отвечать:

Предположим, на выходе было 9 вольт, вы подали на вход вашего цапа, управляемого вашей чудо-программой, плюс ещё одну единичку. Какой прибор (из имеющихся у вас) вы используете, чтобы убедиться в правильном увеличении выходного напряжения?

И ещё один: какие характеристики у ИОН?