Официальный сайт компании Arduino по адресу arduino.cc
Увеличение разрешения внешнего ЦАП с помощью сигма-дельта модуляции
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 06/02/2019 - 23:01
Привет. Наткнулся на данную статью 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
1. Как я понял это, что-то вроде генерации ШИМ между LSB?
Не совсем, почитайте оверсэмплинг для АЦП. Для ЦАПа с точностью наоборот, если надо точнее - гоним больше данных, 4-ре выборки /числа на каждый +бит. НО нужен фильтр на выходе, чёто при беглом просмотре атикла я там не видел фильтра.
2. В итоге оно заработало, но проблема в том, что теперь диапазон напряжений сократился -600мВ до 600мВ. И поскольку я не до конца понимаю эту методику, то у меня возник вопрос. Я где то ошибаюсь или оно и должно так работать? Возможно ли поднять разрешение до 20 бит не жертвуя выходным диапазоном? Ничего подобного в интернете найти не смог.
Не вижу никаких причин почему диапазон должен измениться до 600мВ - чисто програмный баг, ищите ошибку.
А вообще бросьте эту идею, как из области чисто теоретической математики не имеющей никакого практического смысла для данного ЦАПа.
Аргументы:
1. ЦАП имеет ИэНэЛ 2 бита - интегральная нелинейность, т.е. он строго говоря 14-битный, и тянуть на 20-ть глупо. Хорошо если наоборот, 8-битник с ИэНэЛ 0.25 бита, тогда запросто качается с 8-ми на 12-битный.
Если вы начинаете "качать" ЦАП, проще его выбросить и вернуться на ШИМ. Все эти оверсемплинги и всякие дельтасигмы мура. Если вы можете подпрыгнуть на 50 см - не означает что сможете летать на высоте 25 :)
Если вы начинаете "качать" ЦАП, проще его выбросить и вернуться на ШИМ. Все эти оверсемплинги и всякие дельтасигмы мура. Если вы можете подпрыгнуть на 50 см - не означает что сможете летать на высоте 25 :)
Привет. Наткнулся на данную статью https://www.embedded.com/design/configurable-systems/4006431/Sigma-delta-techniques-extend-DAC-resolution , в которой описывается методика увеличения разрешения ЦАПа. У меня имеется 16-битный AD5761 с диапазоном выходного напряжения от -10В до 10В, который вроде как можно поднять до 20 бит.
Вопрос, на который на этом форуме не принято отвечать:
Предположим, на выходе было 9 вольт, вы подали на вход вашего цапа, управляемого вашей чудо-программой, плюс ещё одну единичку. Какой прибор (из имеющихся у вас) вы используете, чтобы убедиться в правильном увеличении выходного напряжения?
И ещё один: какие характеристики у ИОН?