Нередко возникает необходимость одновременно контролировать несколько напряжений, например, выходные напряжения блока питания компьютера, нескольких аккумуляторов и т. п. В прошлой публикации мы рассмотрели принцип работы кодового замка, а теперь, на основе платы расширения набора «Цифровая лаборатория» NR05, соберем четырехканальный цифровой вольтметр с индикацией результатов на встроенном в плату дисплее. Диапазон измеряемых напряжений можно изменять, применяя внешний делитель, а шаг измерения определяется разрядностью аналогово-цифрового преобразователя (АЦП) микроконтроллера Atmega 328, примененного в плате Ардуино, и составляет 1024 значения. Тогда в диапазоне напряжений 0-50В шаг измерения напряжения будет около 50 мВ, что вполне достаточно для бытового применения.
![](https://habrastorage.org/r/w780q1/files/1c8/740/bbe/1c8740bbebde493992785c65a2974e5e.jpg)
Измеряемые напряжения будем подключать на свободные аналоговые входы платы. Это входы A0, A4, A5 и A7, расположенные в правой нижней части платы. Для использования входа A0 следует временно выпаять резистор R4, расположенный возле разъема XP3 в правой нижней части платы.
![](https://habrastorage.org/r/w780q1/files/725/c9b/33d/725c9b33dd8e44b7999e89b30c2d566c.jpg)
Внешний делитель с разъемами для подключения измеряемых напряжений и платы расширения изготовим методом ЛУТ (так называемая «лазерно-утюжная технология») и протравим плату в растворе хлорного железа. Мы применили SMD-резисторы, но, если у вас нет лазерного принтера, делитель можно изготовить, нарисовав проводники водостойким фломастером. В этом случае лучше использовать выводные резисторы, так как точность размеров получившихся проводников будет ниже. Подробно технологию изготовления печатных плат методом травления в хлорном железе можно изучить, приобретя набор NN201 производства Мастер Кит.
Готовая плата делителя представлена на фото ниже.
![](https://habrastorage.org/r/w780q1/files/528/eb4/bd8/528eb4bd8c1e4c6799e66e46b7dffed5.jpg)
На плате расширения установлен 2-х строчный жидкокристаллический индикатор с 16-ю символами в каждой строке. На таком индикаторе вполне комфортно разместятся четыре показания от 0 до 50 вольт с одним знаком после запятой и идентификаторы каналов.
Сами измерения целесообразно проводить несколько раз за небольшой период времени, усредняя их значения. Так мы уменьшим случайные ошибки измерений.
Реализуем также в программе «замораживание» результатов при нажатии на одну из встроенных в плату кнопок, к примеру, среднюю. При втором нажатии непрерывные измерения будут возобновляться.
Задействуем светодиод, подсоединенный к 13-му цифровому выводу Ардуино для индикации процесса измерения.
С учетом сказанного выше составим программу для Ардуино:
Программа снабжена достаточно подробными комментариями, поясняющими особенности реализации алгоритма.
Пожалуй, самой главной особенностью является описанный в комментариях процесс калибровки констант, участвующих в вычислениях измеряемых напряжений. Для калибровки делителя (производится однократно) следует использовать источник стабильного постоянного напряжения. С учетом того, что калибровка занимает непродолжительное время, можно с успехом использовать батарею на 9В типа «Крона» и цифровой мультиметр. Вполне подойдет мультиметр из «Набора юного электронщика» NR02. Этот набор также отлично подойдет для обучения пайке и монтажу печатных плат.
Следует отметить, что при изменении напряжения питания, поступающего на Ардуино, следует обязательно соответственно изменить калибровочное значения опорного напряжения, относительного которого вычисляются измеренные значения.
Для изменения диапазона измерений необходимо применить делитель с другим коэффициентом деления входного напряжения.
![](https://habrastorage.org/r/w780q1/files/fa0/05b/268/fa005b268fa4431ca6ee067bb716048a.jpg)
![](https://habrastorage.org/files/1c8/740/bbe/1c8740bbebde493992785c65a2974e5e.jpg)
Измеряемые напряжения будем подключать на свободные аналоговые входы платы. Это входы A0, A4, A5 и A7, расположенные в правой нижней части платы. Для использования входа A0 следует временно выпаять резистор R4, расположенный возле разъема XP3 в правой нижней части платы.
![](https://habrastorage.org/files/725/c9b/33d/725c9b33dd8e44b7999e89b30c2d566c.jpg)
Внешний делитель с разъемами для подключения измеряемых напряжений и платы расширения изготовим методом ЛУТ (так называемая «лазерно-утюжная технология») и протравим плату в растворе хлорного железа. Мы применили SMD-резисторы, но, если у вас нет лазерного принтера, делитель можно изготовить, нарисовав проводники водостойким фломастером. В этом случае лучше использовать выводные резисторы, так как точность размеров получившихся проводников будет ниже. Подробно технологию изготовления печатных плат методом травления в хлорном железе можно изучить, приобретя набор NN201 производства Мастер Кит.
Готовая плата делителя представлена на фото ниже.
![](https://habrastorage.org/files/528/eb4/bd8/528eb4bd8c1e4c6799e66e46b7dffed5.jpg)
На плате расширения установлен 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;
}
Четырехканальный вольтметр 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. Этот набор также отлично подойдет для обучения пайке и монтажу печатных плат.
Следует отметить, что при изменении напряжения питания, поступающего на Ардуино, следует обязательно соответственно изменить калибровочное значения опорного напряжения, относительного которого вычисляются измеренные значения.
Для изменения диапазона измерений необходимо применить делитель с другим коэффициентом деления входного напряжения.
![](https://habrastorage.org/files/fa0/05b/268/fa005b268fa4431ca6ee067bb716048a.jpg)