Нередко возникает необходимость одновременно контролировать несколько напряжений, например, выходные напряжения блока питания компьютера, нескольких аккумуляторов и т. п. В прошлой публикации мы рассмотрели принцип работы кодового замка, а теперь, на основе платы расширения набора «Цифровая лаборатория» NR05, соберем четырехканальный цифровой вольтметр с индикацией результатов на встроенном в плату дисплее. Диапазон измеряемых напряжений можно изменять, применяя внешний делитель, а шаг измерения определяется разрядностью аналогово-цифрового преобразователя (АЦП) микроконтроллера Atmega 328, примененного в плате Ардуино, и составляет 1024 значения. Тогда в диапазоне напряжений 0-50В шаг измерения напряжения будет около 50 мВ, что вполне достаточно для бытового применения.



Измеряемые напряжения будем подключать на свободные аналоговые входы платы. Это входы A0, A4, A5 и A7, расположенные в правой нижней части платы. Для использования входа A0 следует временно выпаять резистор R4, расположенный возле разъема XP3 в правой нижней части платы.



Внешний делитель с разъемами для подключения измеряемых напряжений и платы расширения изготовим методом ЛУТ (так называемая «лазерно-утюжная технология») и протравим плату в растворе хлорного железа. Мы применили SMD-резисторы, но, если у вас нет лазерного принтера, делитель можно изготовить, нарисовав проводники водостойким фломастером. В этом случае лучше использовать выводные резисторы, так как точность размеров получившихся проводников будет ниже. Подробно технологию изготовления печатных плат методом травления в хлорном железе можно изучить, приобретя набор NN201 производства Мастер Кит.

Готовая плата делителя представлена на фото ниже.



На плате расширения установлен 2-х строчный жидкокристаллический индикатор с 16-ю символами в каждой строке. На таком индикаторе вполне комфортно разместятся четыре показания от 0 до 50 вольт с одним знаком после запятой и идентификаторы каналов.

Сами измерения целесообразно проводить несколько раз за небольшой период времени, усредняя их значения. Так мы уменьшим случайные ошибки измерений.
Реализуем также в программе «замораживание» результатов при нажатии на одну из встроенных в плату кнопок, к примеру, среднюю. При втором нажатии непрерывные измерения будут возобновляться.

Задействуем светодиод, подсоединенный к 13-му цифровому выводу Ардуино для индикации процесса измерения.

С учетом сказанного выше составим программу для Ардуино:

Спойлер
/*--------------------------------------------------------------
Четырехканальный вольтметр 0-50В, с усреднением,
одна цифра после запятой, с отображением на LCD-индикаторе
16 символов, 2 строки,

Используется плата расширения из набора Мастер Кит
NR05 «Цифровая лаборатория»; 4 делителя на 10 на резисторах
1М, 100к, подключенных с аналоговым входам A0,A4,A5,A7

Калибровка опорного напряжения
Измерьте напряжение 5В и измените значения константы V_REF
в соответствии с измеренным значением.
Измеряйте напряжение с подключенным ЖК-дисплеем
и при запущенном скетче.

Определение калибровочных значений делителей (проводится
для каждого делителя)
Подключите стабильное напряжение Vin к входу делителя и
измерьте его.
Измерьте напряжение Vout на выходе делителя.
Калибровочное значение DIV_* будет равно Vin/Vout.

За основу взят проект с сайта startingelectronics.com
--------------------------------------------------------------*/
#include <LiquidCrystal.h>

// встроенный светодиод (используем для индикации процесса измерения)
#define LED 13
// число выборок на одно измерение
#define NUM_SAMPLES 20
// калибровочные значения делителя
#define DIV_1 11.186
#define DIV_2 11.186
#define DIV_3 11.186
#define DIV_4 11.186
// калибровочное значение опорного напряжения
#define V_REF 4.575
// число кнопок на плате
#define NUM_KEYS 5
// калибровочные значения для каждой кнопки (выведены экспериментально)
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};

LiquidCrystal lcd(A1, A2, A3, 2, 4, 7);
unsigned long sum[4] = {0}; // сумма выборок в каждом канале
unsigned char sample_count = 0; // номер текущей выборки
float voltage[4] = {0.0}; // расчитанное напряжениен
int cnt = 0; // служебная переменная
int keyIsPressed = 0; // флаг нажатия кнопки «заморозки» измерений

void setup()
{
lcd.begin(16, 2);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
}

void loop()
{
// если кнопка 3 нажата, инвертируем флаг нажатия кнопки «заморозки»
if (get_key() == 3){
keyIsPressed = !keyIsPressed;
delay(500);
}
// если флаг установлен (1), информация на дисплее не обновляется
if (keyIsPressed == 0){
digitalWrite(LED, LOW);
// берем выборки в каждом канале и суммируем их
while (sample_count < NUM_SAMPLES) {
// sample channel A0, A4, A5, A7
sum[0] += analogRead(A0);
sum[1] += analogRead(A4);
sum[2] += analogRead(A5);
sum[3] += analogRead(A7);
sample_count++;
delay(10);
}
digitalWrite(LED, HIGH);
// рассчитываем напряжения в каждом канале путем усреднения по выборкам
for (cnt = 0; cnt < 4; cnt++) {
voltage[cnt] = ((float)sum[cnt] / (float)NUM_SAMPLES * V_REF) / 1024.0;
}
// отображаем значения на идикаторе
lcd.setCursor(0, 0);
lcd.print(«A „);
lcd.print(voltage[0] * DIV_1, 1);
lcd.print(“V „);
// voltage 2 — B (pin A4)
lcd.setCursor(8, 0);
lcd.print(“B „);
lcd.print(voltage[1] * DIV_2, 1);
lcd.print(“V „);
// voltge 3 — C (pin A5)
lcd.setCursor(0, 1);
lcd.print(“C „);
lcd.print(voltage[2] * DIV_3, 1);
lcd.print(“V „);
// voltage 4 — D (pin A7)
lcd.setCursor(8, 1);
lcd.print(“D „);
lcd.print(voltage[3] * DIV_4, 1);
lcd.print(“V „);

// сбрасываем счетчик и суммы
sample_count = 0;
for (cnt = 0; cnt < 4; cnt++) sum[cnt] = 0;
delay(20);
}
}

// функция возвращает номер нажатой кнопки
int get_key()
{
int input = analogRead(A6);
int k;
for (k = 0; k < NUM_KEYS; k++)
if (input < adcKeyVal[k])
return k + 1;
return 0;
}


Программа снабжена достаточно подробными комментариями, поясняющими особенности реализации алгоритма.

Пожалуй, самой главной особенностью является описанный в комментариях процесс калибровки констант, участвующих в вычислениях измеряемых напряжений. Для калибровки делителя (производится однократно) следует использовать источник стабильного постоянного напряжения. С учетом того, что калибровка занимает непродолжительное время, можно с успехом использовать батарею на 9В типа «Крона» и цифровой мультиметр. Вполне подойдет мультиметр из «Набора юного электронщика» NR02. Этот набор также отлично подойдет для обучения пайке и монтажу печатных плат.

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

Для изменения диапазона измерений необходимо применить делитель с другим коэффициентом деления входного напряжения.

Комментарии (14)


  1. Hellsy22
    19.04.2016 17:11

    Недавно была статья, где упоминался внутренний источник постоянного опорного напряжения. Да и у серии Nano (а на картинках именно она) есть на плате стабилизатор напряжения, на входе может быть 7-20В. Если ее питать от девятивольтовой батареи, то изменение напряжения батареи не будет играть роли — оно все равно будет выравниваться до 5 или 3.3В.


  1. sidisko
    19.04.2016 17:43

    Не так давно понадобился подобный девайс: необходимо было измерять напряжение на солнечных батареях и аккумуляторах, делал по тому же принципу, по одному делителю напряжения на каждую ногу, у всех делителей — общий минус. Не учел лишь одного, почти все МРРТ контроллеры заряда сделаны с общей шиной на плюсе, а вся силовая часть электроники управляется по «минусу».


  1. Tomasina
    19.04.2016 21:01

    Что за дисплей с кириллицей?


    1. tandzan
      19.04.2016 21:18
      +1

      Выглядит как обычный с Али за 100р. на HD44780, в который можно загрузить 8 собственных символов (для кириллицы наверно хватит).


    1. lBeJIuk
      19.04.2016 22:36

      Вот тут написано что если это HD44780, то там изначально есть таблица символов.


      1. sav13
        20.04.2016 05:33
        +1

        Только не всегда там зашит русский знакогенератор
        99% дисплеев из Китая не имеет русских символов. Только 8 загружаемых


    1. Tabke
      20.04.2016 00:21

      В России несложно купить такой с русской таблицей символов.
      Например марки МЭЛТ.


      1. sav13
        20.04.2016 05:38

        Еще бы цена на них не была как у графического дисплея типа 12864 с SPI


  1. VaalKIA
    20.04.2016 04:37

    Для многоканальников удобнее цветовая дифференциация: цветовая метка напротив значений и такого же цвета проводки, конечно, экран тогда нужен цветной.


    1. sav13
      20.04.2016 05:44
      +1

      Купить четыре долларовых вольтметра разного цвета

      Да. ИОН бы явно автору не помешал бы


      1. HWman
        20.04.2016 18:48

        100% это я уже проходил.


  1. Johnny_W
    20.04.2016 08:45

    Интересно, как атмеловский АЦП справляется с сопротивлением источника сигнала в 1 МегаОм…


  1. HWman
    20.04.2016 18:45

    Когда-то делал что-то похожее:

    image


    1. HWman
      20.04.2016 18:50

      P.S. Если питать это чудо от 12В аккумулятора то шумы АЦП ± 0.5 LSB.