Найти тему
Александр Рожков

Цифроаналоговый преобразователь на резисторах по принципу 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.

#define L1 12
#define L2 11
#define L3 10
#define L4 9
#define L5 8
#define L6 7
#define L7 6
#define L8 5

void setup() {
pinMode(L1, OUTPUT);
pinMode(L2, OUTPUT);
pinMode(L3, OUTPUT);
pinMode(L4, OUTPUT);
pinMode(L5, OUTPUT);
pinMode(L6, OUTPUT);
pinMode(L7, OUTPUT);
pinMode(L8, OUTPUT);
digitalWrite(L1, LOW);
digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
digitalWrite(L5, LOW);
digitalWrite(L6, LOW);
digitalWrite(L7, LOW);
digitalWrite(L8, LOW);
}

void loop() {
digitalWrite(L1, HIGH);
delay(0.1);
digitalWrite(L2, HIGH);
delay(0.1);
digitalWrite(L3, HIGH);
delay(0.1);
digitalWrite(L4, HIGH);
delay(0.1);
digitalWrite(L5, HIGH);
delay(0.1);
digitalWrite(L6, HIGH);
delay(0.1);
digitalWrite(L7, HIGH);
delay(0.1);
digitalWrite(L8, HIGH);
delay(0.1);
digitalWrite(L1, LOW);
delay(0.1);
digitalWrite(L2, LOW);
delay(0.1);
digitalWrite(L3, LOW);
delay(0.1);
digitalWrite(L4, LOW);
delay(0.1);
digitalWrite(L5, LOW);
delay(0.1);
digitalWrite(L6, LOW);
delay(0.1);
digitalWrite(L7, LOW);
delay(0.1);
digitalWrite(L8, LOW);
delay(0.1);
}

На осциллографе мы видим как у нас меняется выходное напряжение в зависимости от комбинаций 0/1 на выходе нашего микроконтроллера:

-2