Цифроаналоговый преобразователь на резисторах по принципу 2R2.

В данном уроке мы рассмотрим реализацию цифроаналогового преобразователя по принципу 2R2. Схема реализации довольно проста:

Выходное напряжение описывается следующей формулой:

Uвых=V*(А0*1/64+А1*1/32+А2*1/16+А3*1/8+А4*1/4+А5*1/2),

где:

А0…Аn — принимает значение 0 или 1.

V — уровень логической единицы.

Таким образом если мы будем использовать целый порт микроконтроллера (8 бит), мы получим 254 вариантов уровня напряжения, что в принципе достаточно для многих решений. Так же всегда можно  добавить еще один бит, что увеличит разрядность и качество DAC.

К положительным моментам можно отнести его скорость и простату, к отрицательным моментам это то, что мы используем входа/выхода микроконтроллеров, которые могут быть очень нужны.

В качестве проверки работы DAC мы напишем небольшую программу и посмотрим, что у нас будет на осциллографе. В качестве среды программирования выберем Arduino IDE, в качестве микроконтроллера Atmega 328, которая расположена на плате Arduino Nano.

Для начало, мы с Вами сформируем таблицу данных для Sin сигнала, для этого пропишем следующий программный код:

void setup(){
Serial.begin(9600);
}
 
void loop(){
for (int i=0;i<256;i++) {
Serial.print(byte(127+(127*sin(PI*i*0.007843))));
Serial.print(«, «);
}
delay(10000); 
}

Давай те рассмотрим откуда мы взяли данную формулу, общая формула у нас для Sin():

y=a+d*sin(c*x),

так как у нас 254 это максимальное значение при котором Uвых=5В, мы берем нулевую отметку для сигнала = 127, то есть относительно значения 2,5В мы будем увеличивать и уменьшать амплитуду нашего сигнала. Таким образом мы получим сигнал с амплитудой от 0В до 5В. Период  сигнала = 2Pi, так как у нас будет 255 шагов (мы должны от 0 пройти до 1), нам нужно (2Pi /255)*х, где х наши шаги. Упрощаем формулу и в место 2/255 пишем  0.007843. Теперь запустив нашу программу мы получим массив данных для вывода нашей sin в ЦАП. 

Далее пропишем программный код, который будет брать данные с нашего массива и выводить в наш порт:

unsigned char sin_tab [256] = {
127, 130, 133, 136, 139, 142, 145, 148, 151, 154, 157, 160, 164, 166, 169, 172, 175, 178, 181, 184, 187, 189, 192, 195, 197, 200, 202, 205, 207, 210, 212, 214, 217, 219, 221, 223, 225, 227, 229, 231, 232, 234, 236, 237, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 251, 252, 252, 253, 253, 253, 253, 253, 254, 253, 253, 253, 253, 252, 252, 251, 251, 250, 249, 249, 248, 247, 246, 245, 243, 242, 241, 239, 238, 236, 235, 233, 231, 230228, 226, 224, 222, 220, 218, 215, 213, 211, 209, 206, 204, 201, 199, 196, 193, 191, 188, 185, 182, 180, 177, 174, 171, 168, 165, 162, 159, 156, 153, 150, 147, 144, 141, 137, 134, 131, 128, 125, 122, 119, 116, 112, 109, 106, 103, 100, 97, 94, 91, 88, 85, 82, 79, 7673, 71, 68, 65, 62, 60, 57, 54, 52, 49, 47, 44, 42, 40, 38, 35, 33, 31, 29, 27, 25, 23, 22, 20, 18, 17, 15, 14, 12, 11, 10, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28, 30, 32, 34, 36, 39, 41, 43, 46, 48, 51, 53, 56, 58, 61, 64, 66, 69, 72, 75, 78, 81, 84, 87, 89, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 127 };
 
void setup() {
  DDRD =0xFF;
}
 
void loop() {
for (int i=0;i<256;i++) {
    PORTD=sin_tab[i];
    delayMicroseconds(50);
  }
}

Выполнив данную программу на экране осцилографа Вы увидите Sin:


Дальше мы можем немного изменить нашу схему и добавить сдвиговый регистр, тем самым уменьшить количество занимаемых ножек на микроконтроллере. Конечно, большую частоту мы не получим на выходе, но для низко частотных сигналов вполне допустимо:

**// схема подключения.

Как работать с сдвиговым регистром у меня есть отдельные уроки.