Измеряемые напряжения будем подключать на свободные аналоговые входы платы. Это входы 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)
sidisko
19.04.2016 17:43Не так давно понадобился подобный девайс: необходимо было измерять напряжение на солнечных батареях и аккумуляторах, делал по тому же принципу, по одному делителю напряжения на каждую ногу, у всех делителей — общий минус. Не учел лишь одного, почти все МРРТ контроллеры заряда сделаны с общей шиной на плюсе, а вся силовая часть электроники управляется по «минусу».
Tomasina
19.04.2016 21:01Что за дисплей с кириллицей?
tandzan
19.04.2016 21:18+1Выглядит как обычный с Али за 100р. на HD44780, в который можно загрузить 8 собственных символов (для кириллицы наверно хватит).
lBeJIuk
19.04.2016 22:36Вот тут написано что если это HD44780, то там изначально есть таблица символов.
sav13
20.04.2016 05:33+1Только не всегда там зашит русский знакогенератор
99% дисплеев из Китая не имеет русских символов. Только 8 загружаемых
VaalKIA
20.04.2016 04:37Для многоканальников удобнее цветовая дифференциация: цветовая метка напротив значений и такого же цвета проводки, конечно, экран тогда нужен цветной.
sav13
20.04.2016 05:44+1Купить четыре долларовых вольтметра разного цвета
Да. ИОН бы явно автору не помешал бы
Johnny_W
20.04.2016 08:45Интересно, как атмеловский АЦП справляется с сопротивлением источника сигнала в 1 МегаОм…
Hellsy22
Недавно была статья, где упоминался внутренний источник постоянного опорного напряжения. Да и у серии Nano (а на картинках именно она) есть на плате стабилизатор напряжения, на входе может быть 7-20В. Если ее питать от девятивольтовой батареи, то изменение напряжения батареи не будет играть роли — оно все равно будет выравниваться до 5 или 3.3В.