Двойной изолированный вольтметр для латра на atmega8-arduino

Двойной изолированный вольтметр для ЛАТРа на ATmega8-Arduino

Двойной изолированный вольтметр для ЛАТРа на ATmega8-Arduino

При проектировании либо ремонте таких устройств как ИБП и стабилизаторы напряжения, очень нередко появляется необходимость проверки рабочего спектра напряжений. Также при опознании неопознанных трансформаторов, удобнее работать с небольшим напряжением.

Для этих целей, в радиолюбительской практике, обычно используются Лабораторные АвтоТрансформаторы(ЛАТР’ы). Т. к.

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

В неких случаях точности шкалы хватает, но нанесенные на ручку значения напряжений справедливы только при размеренном сетевом напряжении в ~220V. Столкнувшись с данной неувязкой, я собрался сделать цифровой блок индикации, на семисегментных индикаторах и МК AtMega8. Но сначала на Arduino был собран следующий макет.

На макете был опробован светодиодный индикатор и проведены опыты с АЦП. Для работы с семисегментным индикатором была выбрана библиотека SevenSegmentLibrary. Далее в Proteus’е была нарисована схема.

Дальше в программке Sprint Layout 5 была разведена плата.

При разводке платы я предугадал место как для трансформаторов из перечня (TR1 НПК «Комплекс» ТПП-121-207 и TR2 HAHN BV 2020171), так и для более пользующегося популярностью корпуса(ТПК2). Интегральная схема была сделана фоторезистивным способом на листе однобокого фольгированного стеклотекстолита размером 110х60мм.

Для облегчения установки устройства в корпус, семисегментные индикаторы были установлены на оборотную сторону печатной платы.

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

Дальше обрезать ноги, так чтоб осталось пару мм.

Сборка устройства осуществляется «как обычно»: сначала запаиваются детали меньшей высоты(резисторы, перемычки), потом большей, ну и в последнюю очередь трансформаторы. На м/с линейного стабилизатора напряжения рекомендуется установить маленький дюралевый радиатор, при установке лучше использовать теплопроводящую пасту (прим. КПТ-8).

ВНИМАНИЕ! перед запайкой либо установкой в панельку ATmeg’и, включите первичные обмотки обоих трансформаторов(J1 b J2) в сеть и настройте потенциометры делителей напряжения (RV1 и RV2), так чтоб напряжение на контактах 23 и 24 панельке не превышало 5в.

Собранная плата смотрится вот так.

Программка писалась уже под разведенную плату. Метод работы программки таковой: инициализация индикаторов, чтение значений АЦП, умножение значений на 3, вывод цифр и десятичных запятых. Перед прошивкой МК, нужно записать в него загрузчик по аннотации.

Для прошивки я использовал программатор USBTINY. Далее, не отсоединяя «мегу» от программатора, запускаем Arduino IDE, импортируем библиотеку, открываем подходящий скетч, избираем программатор, компилируем(CTRL+R) и прошиваем(CTRL+SHIFT+U).

Сейчас можно проверить устройство.

Настройка устройства сводится к подключению сетевого напряжения к разъемам J1 и J2, подключению параллельно примерного вольтметра и установке значений напряжений при помощи потенциометров (RV1 и RV2).

В качестве корпуса вольтметра была выбрана распаячная коробка «Abox-i SL-6²» фирмы spelsberg.

Также в этот корпус был установлен защитный автомат, двухпозиционный 2-ух групповой выключатель и разъем IEC C14. Дальше прибор в корпусе, ЛАТР, патрон Е27 и розетка. были установлены на лист ДСП. Корпус ЛАТР’а был подключен к заземляющей клемме разъема питания.

Потом к листу ДСП были приверчены железные ручки и резиновые ножки. В программке Microsoft Publisher я от отрисовывал наклейку на переднюю панель устройства, пару наклеек с надписью «СЕТЬ» и наклейку для тумблера лампа — ЛАТР. На тот же лист я закинул пару предупредительных значков и картину со значком «заземление».

В конечном итоге вышел тестовый щит, позволяющий подключение исследуемого прибора в сеть через ЛАТР либо через лампу. Также данный блок вольтметра можно применить в сетевых стабилизаторах напряжения либо преобразователях сетевого напряжения, созданных для подключения зарубежной техники.

Перечень радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот U1 МК AVR 8-бит ATmega8-16PU 1 Поиск в win-sourceВ блокнотU2 Линейный регулятор LM7805CT 1 Поиск в win-sourceВ блокнотBR1, BR2 Диодный мост DB107 2 в корпусе для поверхностного монтажаПоиск в win-sourceВ блокнотC1-C3, C6-C8, C10 Конденсатор100 нФ7 дисковый, глинянийПоиск в win-sourceВ блокнотC4, C5, C9 Конденсатор1000 мкФ3 электролитическийПоиск в win-sourceВ блокнотR1 Резистор 10 кОм 1 1/4 либо 1/8 WПоиск в win-sourceВ блокнотR2 Резистор 36 Ом 1 Поиск в win-sourceВ блокнотR3-R10 Резистор 200 Ом 8 1/4 либо 1/8 WПоиск в win-sourceВ блокнотRV1, RV2 Подстроечный резистор100 кОм2 многооборотныйПоиск в win-sourceВ блокнот Светодиодный индикаторFYQ-2841AG2 7-ми сегментный индикатор с ОКПоиск в win-sourceВ блокнотTR1 ТрансформаторНПК «Комплекс» ТПП-121-2071 220 на 12VПоиск в win-sourceВ блокнотTR2 ТрансформаторHAHN BV 20201711 400 на 9VПоиск в win-sourceВ блокнотJ1, J2 РазъемКлемма двойная2 Поиск в win-sourceВ блокнот ПанелькаDIP-281 по желаниюПоиск в win-sourceВ блокнотДобавить все

Скачать перечень частей (PDF)

atmega8_variac_dual_voltmeter. lay (75 Кб) variac_7-seg. zip (19 Кб) atmega8_variac_dual_voltmeter. pdf (19 Кб) atmega8_variac_dual_voltmeter_lut. pdf (19 Кб) variac_7-seg. PDF (70 Кб) sticker. pdf (110 Кб) variac_dual_voltmeter. ino (1 Кб)
Arduino AVR Sprint-Layout АЦП Proteus Фоторезист Микроконтроллер Вольтметр

Источник: http://bloggoda.ru/2018/03/25/dvojnoj-izolirovannyj-voltmetr-dlya-latra-na-atmega8-arduino/

Цифровой вольтамперметр на ATmega8 для блока питания

Читать все новости ➔

Цифровой вольтамперметр предназначенный для установки в блок питания для отображения выходного напряжения, тока и некоторых дополнительных параметров, выполнен в виде встраиваемого модуля.

Основные характеристики устройства:

  • основа устройства – микроконтроллер AVR ATmega8 компании Atmel;
  • диапазон измеряемого напряжения: 0 В – 30 В, шаг 10 мВ;
  • диапазон измеряемого тока: 0 А – 99 А, шаг 10 мА (шаг зависит от значения сопротивления шунта);
  • два вариатна конструкции: с микроконтроллером в TQFP и PDIP корпусе;
  • односторонняя печатная плата;
  • компактная конструкция;
  • отображение измеряемых величин на ЖК дисплее (однострочном или двухстрочном) на базе контроллера HD44780.

Измерение тока проводится с использованием шунта, который подключен последовательно с нагрузкой в цепи отрицательной (общей) клеммы блока питания. Питание устройство получает от основного блока питания (т.е.

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

При использовании двухстрочного дисплея (и соответствующего ПО для микроконтроллера) имеется возможность отображения значения сопротивления подключенной нагрузки. А при использовании блока питания для зарядки Li-Pol аккумуляторов имеется функция отображения электрической емкости аккумуляторов, что дает возможность оценить их состояние и уровень разряда.

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

Разрешение[мА] = 1/(R[Ом]×3.2)

Кроме того, падение напряжения на шунте не должно превышать 2.4 В, поэтому значение сопротивления шунта должно быть меньше 2.4/Imax[A]

Автором было разработано два варианта вольтамперметра:

  • вариант №1: применен микроконтроллер ATmega8 в корпусе TQFP32;
  • вариант №2: применен микроконтроллер ATmega8 в корпусе PDIP.

Принципиальная схема вольтамперметра (вариант №1)

Список электронных компонентов (вариант №1)

Обозначение в схеме Номинал Корпус Примечание
R1, R2 100 кОм smd 1206
R3 10 кОм Потенциометр
R5, R6 10 кОм smd 1206
R4 30 кОм smd 1206
R7, R8 7.5 кОм smd 1206
R9, R10 500 Ом Потенциометр
R11 5.1 кОм smd 1206
C1, C2, C3 100 нФ smd 1206
C4, C5, C6, C7, C8, C9 100 нФ smd 1206 Данные конденсаторы, указанные на схеме, устанавливать на плату не нужно. Они были необходимы для прежней версииПО для микроконтроллера.
C10 22 мкФ/6 В smd A
C11 10 нФ smd 1206 Опционально. Для защиты транзистора от помехи по напряжению при включениивентилятора.
С12 10 мкФ/50 В
L1 47 мкГн smd 1210 На плату не устанавливается
D1 защитный диод smd A Опционально. Для защиты транзистора от помехи по напряжению при включениивентилятора.
D2 SK310A smd A Диод Шоттки: 100 В, 3 А
U1 LM7805 TO252 Регулятор напряжения +5 В
U2 LM7812 TO220 Регулятор напряжения +12 В
U3 ATmega8 TQFP32 Микроконтроллер
LCD коннектор 1×16
J1 коннектор 1×2
J2, J3 коннектор 1×1
J4 коннектор 1×3
S1 кнопка
Q1 BSS-138 smd SOT-23 N-канальный MOSFET(ток вентилятора менее 200 мА)

Принципиальная схема вольтамперметра (вариант №2)

Ниже представлена схема подключения модуля в блоке питания.

Рассмотрим подробно процесс настройки вольтамперметра.

Кнопка S1 – сброс/установка параметров.
Для входа в режим установки параметров вольамперметра необходимо, удерживая кнопку нажатой, подать питание на схему. На дисплее появится надпись «www.elfly.pl», что означает вход в режим установки.

Первый параметр для настройки – опорное напряжение для АЦП микроконтроллера. Опорное напряжение является основным фактором погрешности измерений.

Пользователь должен измерить опорное напряжение на выводе 20 микроконтроллера (для микроконтроллера в корпусе PDIP – вывод 21).

Измеренное значение вы и должны прописать в этом «сервисном меню» при помощи этой же кнопки S1, иначе, по умолчанию, принимается значение опорного напряжения Vref = 2.56 В (соответственно техническому описанию на микроконтроллер).

После изменения значения опорного напряжения для сохранения параметра никаких манипуляций с кнопкой S1не должно проводится в течении 5 с.

Следующий параметр – установка значения сопротивления резистора-шунта.
Если номинал шунта известен, то нажатиями на кнопку S1 необходимо добиться отображения на дисплее соответствующего значения и затем не нажимать кнопку в течении 5 с для сохранения значения.

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

После проведения этой процедуры для сохранения параметров кнопку не нажимать в течении 5 с.

Кроме того кнопка S1 используется для сброса значения электрической емкости при зарядке Li-Pol аккумуляторов.

Резистор R9 – точная настройка поддиапазона делителя напряжения.
Чтобы исключить ошибки преобразования АЦП диапазон измерений разбит на два поддиапазона 0 В – 10 В и 10 В – 30 В.

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

Резистор R10 – грубая настройка поддиапазона делителя напряжения.
Процедура аналогичная точной настройке, но необходимо установить выходное напряжение блока питания около 19 В, и регулируя резистор R10 добиться совпадения показаний.

Резистор R1 – регулировка контрастности LCD.
Если после сборки устройства на дисплее ничего не отображается, то сперва необходимо отрегулировать контрастность дисплея.

Коннектор J1 – подключение вентилятора.

Коннектор J2 – питание модуля вольтамперметра (+12 В)
Если ваш блок питания имеет выход стабилизированного напряжения +12 В, то его можно подключить к этому коннектору, и в таком случае можно не использовать в схеме регулятор напряжения U2. Такое решение имеет свои плюсы т.к. возможно подключить более мощный вентилятор охлаждения.

Если выхода +12 В у вашего блока питания нет, то этот коннектор необходимо оставить не подключенным.

Примечание. Во втором варианте схемы (PDIP) данный коннектор отсутствует.

Коннектор J3 – питание модуля вольтамперметра (+35 В)
Напряжение питания +35 В подается с диодного моста блока питания.

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

Но с другой стороны, минимальное напряжение, подаваемое на этот коннектор, не должно быть ниже 9 В или 6.5 В, если используются регуляторы с низким падением напряжения (LDO).

Данный коннектор должен быть подключен независимо от того, подключен ли коннектор J2 к питанию +12 В.

Коннектор J4 – подключение линий измерения напряжения и тока.
Выводы коннектора подключаются:

  • Вывод 1 – подключается к клемме «+» блока питания;
  • Вывод 2 – подключается к клемме «–» блока питания;
  • Вывод 3 – «общий»

Коннектор LCD – подключение индикатора
Вольтамперметр работает корректно с однострочным LCD. Дисплей необходимо использовать со светодиодной подсветкой (ток потребления до 15 мА).

Программирование микроконтроллера

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

Помните, что при программировании микроконтроллера в схеме, необходимо подать напряжение питания +5 В. В зависимости от используемого программатора, напряжение питания может подаваться от самого программатора, либо от внешнего источника.

Соответствие сигналов переходника, коннектора LCD, микроконтроллера и программатора

ВыводыЖК модуля Сигнал Выводымикроконтроллера Выводыпрограмматора
1 GND GND GND
2 VCC VCC VCC
4 RS SCK / PB.5 SCK
5 RW MISO / PB.4 MISO
6 EN MOSI / PB.3  MOSI
10 D3 RESET RESET

После подключения программатора убедитесь, что программатор «видит» микроконтроллер, и после этого можете приступать к программированию, при этом не забывая выбрать нужное, соответствующее собранной версии, программное обеспечение.

При программировании и установке Fuse-битов необходимо учитывать, что микроконтроллер должен быть настроен на работу от внутреннего RC осциллятора 1 МГц, а также необходимо установить бит BODEN. Рекомендуемый порог срабатывания Brown-Out детектора – 4 В.

Программное обеспечение для микроконтроллера (HEX-файлы)

Рисунки печатной платы для варианта №1 и для варианта №2 (архивы содержит два изображения – обычное и в зеркальном отражении).

elfly.pl

Возможно, Вам это будет интересно:

Источник: http://meandr.org/archives/7174

Вольт-ампер-energy-метр на Arduino. Часть 1. Вольтметр

Источник: http://alexeevd.narod.ru/publ/arduino_voltmetr/1-1-0-8

Делаем вольтметр на базе Arduino

Обычно при построении различных вольтметров на базе Arduino предполагают, что напряжение питания Vcc строго равно 5В. Но это далеко не так, точнее – совсем не так. Как результат – немалая погрешность в измерениях.

Малоизвестной особенностью Arduino и многих других AVR является возможность измерения внутреннего опорного напряжения 1.1В.

Эта возможность может быть использована для повышения точности функции Arduino analogRead ()или для измерения питающего напряжения (Vcc), что обеспечивает средство мониторинга напряжения питания (например, батареи) без задействования драгоценного аналогового входа.

В сети гуляют, кроме описываемого здесь, еще два способа «особо точного» измерения опорного напряжения. Один основан на изменении стандартной библиотеки wiring_analog.c и затем чтения analogRead(14).

Другие «знатоки» считают, что указание analogReference(INTERNAL) или DEFAULTболее чем достаточно.

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

Зачем всё это

Не проще ли просто мигать светодиодиками как все и радоваться жизни, что вы — крутые микроэлектронщики ?

Есть как минимум две причины, чтобы точно и правильно измерить напряжение, подаваемое на ваш Arduino (Vcc). Первая причина — если наш проект на батарейках или аккумуляторах и мы хотим следить за напряжением Vcc как мерилом уровня заряда батарей.

Вторая — когда питание производится от батареи или от USB, Vcc не будет равно 5В, так что, если мы хотим сделать точные аналоговые измерения мы должны либо использовать внутреннее опорное напряжение 1.1В, либо внешнее опорное напряжение.

Почему?

Предполагают, что при использовании analogRead () аналоговое опорное напряжение равно 5.0В, но в действительности оно может быть другим.

Даже официальная документация по Arduino analogReadтакже приводит нас к этому неправильному допущению. Факт, что напряжение по умолчанию не 5.0 вольт.

Если ваше питание не идеально отрегулировано или если вы работаете от батареи, это напряжение может немного изменяться. Вот пример, иллюстрирующий проблему:

double Vcc = 5.0; // не всегда так int value = analogRead(0); double volt = (value / 1023) * Vcc; // правильно если Vcc = 5.0В

Я экспериментальным путем выяснил, что на разных ПК при питании от USB напряжение пина 5V на Arduino составляет около 4.5В; при питании от аккумулятора типа «Крона» (8.4В) — 4.97В.

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

  • внутренний источник 1.1В (в некоторых 2.56В)
  • внешний опорный источник
  • Vcc

Внешний источник опорного напряжения является наиболее точным, но требует дополнительного оборудования. Внутренний reference стабилен, но имеет погрешность +/- 10%. Голый Vcc полностью ненадежен в большинстве случаев.

Выбор внутреннего reference оправдан, но в большинстве случаев мы бы хотели измерять более широкий диапазон, поэтому выбор Vcc является наиболее практичным, но потенциально наименее точным и в некоторых случаях полностью ненадежным!

Как правильно

Многие AVR чипы, включая серию ATmega и многие из ряда Attiny обеспечивают средства для измерения внутреннего опорного напряжения. Зачем это кому-то надо? Причина проста — путем измерения опорного напряжения мы можем определить точное значение Vcc.
Вот как это делается:

  1. Сначала устанавливаем опорное (reference) напряжение в значение Vcc
  2. Измеряем внутреннее опорное напряжение
  3. Рассчитываем величина Vcc

Наше измеренное напряжение

Vcc * (АЦП-измерение) / 1023

которое, как мы знаем равно 1.1В. Согласно даташиту на ATMEGA 328 оно может быть равно:

  • минимально 1.0В,
  • обычно 1.1В,
  • максимально 1.2В.

Забегая вперед скажу, что эта константа требует ручной калибровки, у меня она получилась равной 1.179В.

АЦП у Arduino имеет разрядность 10 бит, это означает, что входное напряжение от 0В до 5В преобразовывается в целочисленное значение от 0 до 1023. Вот откуда здесь число 1023.

Далее рассчитываем Vcc и получаем:

Vcc = 1.1 * 1023 / АЦП-измерение

Другими словами, вся фишка в том, чтобы выяснить реальное напряжение питания Vcc, читая internal 1.1V reference и используя Vcc в качестве эталона. Затем с помощью простой математики высчитываем реальное Vcc.

Кусок кода функции выглядит так:

ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); ADCSRA |= _BV(ADSC); // Начало преобразований while (bit_is_set(ADCSRA,ADSC)); // измерение uint8_t low = ADCL; // сначала нужно прочесть ADCL – это запирает ADCH uint8_t high = ADCH; // Разлочить оба float result = (high

Источник: http://neoworlds.net/arduino/arduino-v-primerakh/delaem-voltmetr-na-baze-arduino

Вольтметр на Arduino | Каталог самоделок

Широкий интерес для любителей самодельных электронно-программируемых устройств представляют многофункциональные сборки Arduino, позволяющие воплощать в жизнь интересные задумки.

Основное преимущество готовых схем Arduino заключается в уникальном блочно-модульном принципе: каждая плата может быть добавлена дополнительными интерфейсами, бесконечно расширяя возможности для создания различных проектов.

Модули Arduino построены на универсальном микроконтроллере с собственным загрузчиком, что позволяет легко прошивать его необходимым программным кодом, без использования дополнительных устройств. Программирование осуществляется на стандартном языке С++.

Одним из простейших примеров использования Arduino может стать реализация на базе этой сборки вольтметра постоянного напряжения повышенной точности с диапазоном измерения от 0 до 30 В.

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

Схема подключения Areduino через делитель напряжения

Делитель напряжения состоит из двух последовательно соединенных сопротивлений. Расчет его производится по формуле:

Где, в данном случае,  – максимальное измеряемое напряжение,  – напряжение после делителя, поступающее на аналоговые вход Arduino, R1 и R2 – значения сопротивлений первого и второго элемента делителя, соответственно.

Чтобы установить определенный «запас прочности» разрабатываемого вольтметра и для простоты подсчетов можно принять величину сопротивлений R1=10кОм и R2=100кОм. В этом случае, на сборку можно подавать напряжение до 55 В.

Встроенный в схему Arduino датчик преобразует поданное на вход А0 напряжение в цифровой сигнал, который поступит на микроконтроллер и будет им обработан, с помощью заложенной в память программы будут произведены необходимые вычисления и значение реального напряжения выведутся на жидкокристаллическом индикаторе.

Наладка прибора и корректировка скретч-листинга программы должны не вызывать затруднений.

Обычные резисторы, используемые в радиолюбительской массе, имеют среднюю погрешность 10 % от номинала. Использование же прецизионных сопротивлений высокой точности не всегда может быть возможным из-за их высокой стоимости.

Поэтому, если при проверке образцовым лабораторным измерительным прибором, обнаружилась погрешность измерения, необходимо проверить реальное сопротивление каждого элемента делителя и отредактировать программу (R1, R2).

Следующим шагом наладки должен стать замер напряжения между клеммами +5 и общей («земля») Arduino. В случае, если полученное значение не будет ровно 5 В, нужно также произвести изменения в коде (заменить число 5 в строке vout=(value*5)…) на действительное напряжение.

Следует не забывать, что даже небольшое превышение напряжения (выше 55 В)приведет к выходу из строя Arduino, поэтому, рационально не применять вольтметр для высоких величин, установив верхней планкой 30 В.

Схема вольтметра на Areduino

Код программы :

#include
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // resistance of R1 (100K) -see text!
float R2 = 10000.0; // resistance of R2 (10K) – see text!
int value = 0;
void setup(){
pinMode(analogInput, INPUT);
begin(16, 2);
print(“DC VOLTMETER”);
}
void loop(){
// read the value at analog input
value = analogRead(analogInput);
vout = (value * 5.0) / 1024.0; // see text
vin = vout / (R2/(R1+R2));
if (vin

Источник: https://volt-index.ru/podelki-dlya-avto/voltmetr-na-arduino.html

Двойной изолированный вольтметр для ЛАТРа на ATmega8-Arduino

При проектировании или ремонте таких приборов как ИБП и стабилизаторы напряжения, очень часто возникает необходимость проверки рабочего диапазона напряжений. Также при опознании неопознанных трансформаторов, удобнее работать с маленьким напряжением.

Для этих целей, в радиолюбительской практике, обычно применяются Лабораторные АвтоТрансформаторы(ЛАТР'ы). Т.к.

большинство популярных моделей ЛАТР'ов не имеют встроенного вольтметра, приходится “орудовать” несколькими мультиметрами или полагаться на шкалу, обычно нанесенную на ручку регулировки напряжения.

В некоторых случаях точности шкалы хватает, но нанесенные на ручку значения напряжений справедливы только при стабильном сетевом напряжении в ~220V. Столкнувшись с данной проблемой, я решил сделать цифровой блок индикации, на семисегментных индикаторах и МК AtMega8. Но сперва на Arduino был собран следующий макет.

На макете был опробован светодиодный индикатор и проведены эксперименты с АЦП. Для работы с семисегментным индикатором была выбрана библиотека SevenSegmentLibrary. Далее в Proteus'е была нарисована схема.

Далее в программе Sprint Layout 5 была разведена плата.

При разводке платы я предусмотрел место как для трансформаторов из списка (TR1 НПК “Комплекс” ТПП-121-207 и TR2 HAHN BV 2020171), так и для более популярного корпуса(ТПК2). Печатная плата была изготовлена фоторезистивным способом на листе одностороннего фольгированного стеклотекстолита размером 110х60мм.

Для облегчения установки устройства в корпус, семисегментные индикаторы были установлены на обратную сторону печатной платы.

Для того, чтобы установить семисегментники на обратную сторону платы, их необходимо немного доработать, подогнув ноги на 90 градусов.

Далее обрезать ноги, так чтобы осталось пару миллиметров.

Сборка устройства осуществляется “как обычно”: сперва запаиваются детали наименьшей высоты(резисторы, перемычки), затем большей, ну и в последнюю очередь трансформаторы. На м/с линейного стабилизатора напряжения рекомендуется установить небольшой алюминиевый радиатор, при установке желательно использовать теплопроводящую пасту (прим. КПТ-8). 

ВНИМАНИЕ! перед запайкой или установкой в панельку ATmeg'и, включите первичные обмотки обоих трансформаторов(J1 b J2) в сеть и настройте потенциометры делителей напряжения (RV1 и RV2), так чтобы напряжение на контактах 23 и 24 панельке не превышало 5в.

Собранная плата выглядит вот так.

Программа писалась уже под разведенную плату. Алгоритм работы программы такой: инициализация индикаторов, чтение значений АЦП, умножение значений на 3, вывод цифр и десятичных запятых. Перед прошивкой МК, необходимо записать в него загрузчик по инструкции.

 Для прошивки я использовал программатор USBTINY. Далее, не отсоединяя “мегу” от программатора, запускаем Arduino IDE, импортируем библиотеку, открываем нужный скетч, выбираем программатор, компилируем(CTRL+R) и прошиваем(CTRL+SHIFT+U).

Теперь можно проверить устройство.

Настройка устройства сводится к подключению сетевого напряжения к разъемам J1 и J2, подключению параллельно образцового вольтметра и установке значений напряжений с помощью потенциометров (RV1 и RV2). 

 В качестве корпуса вольтметра была выбрана распаячная коробка “Abox-i SL-6²” фирмы spelsberg. 

Также в этот корпус был установлен защитный автомат, двухпозиционный двух групповой выключатель и разъем IEC C14. Далее прибор в корпусе, ЛАТР, патрон Е27 и розетка. были установлены на лист ДСП. Корпус ЛАТР'а был подключен к заземляющей клемме разъема питания.

Затем к листу ДСП были прикручены металлические ручки и резиновые ножки. В программе Microsoft Publisher я от рисовал наклейку на переднюю панель устройства, пару наклеек с надписью “СЕТЬ” и наклейку для переключателя лампа – ЛАТР. На тот же лист я закинул пару предупредительных значков и картинку со значком “заземление”.

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

Скачать список элементов (PDF)

Прикрепленные файлы:

Источник: http://cxem.net/izmer/izmer168.php

Вольтметр 220 вольт с защитой на ATmega8

Устройство отображает значение напряжения сети на светодиодном 7″сегментном 3″разрядном индикаторе. При возникновении аварийной ситуации, когда напряжение сети выйдет за допустимые пределы, устройство защиты отключает нагрузку.

Устройство защиты имеет следующие технические характеристики:
Диапазон контролируемых напряжений, В . . . . . . . . . . . . . . . . . .120…380
Нижний/верхний предел
устанавливаемых напряжений срабатывания, В . . . . . .170…209/216…

280V
Время срабатывания при аварии при использовании реле, с . . . . . . . . .0,1
Погрешность измерения напряжения, В . . . . . . . . . . . . . . . . . . . . . . . . .±1
Время включения после аварии (задаётся пользователем), с . . . . . .

1…600
Дискретность установки порогов напряжения, В . . . . . . . . . . . . . . . . .1

Потребляемый ток (без учёта реле), мА . . . . . . . . . . . . . . . . . . . . . . ..30

фьюзы

Меню устройства защиты (УЗРежим»

• UuP – верхнее граничное напряжение (первое нажатие на кнопку «Режим»);

• Udn – нижнее граничное напряжение (второе нажатие на кнопку «Режим»);

• tir – время на задержку включения контактора после вхождения измеряемого напряжения в заданные пределы (третье нажатие на кнопку «Режим» );

• tun – поправочный коэффициент, необходимый для пересчёта результата измерения сетевого напряжения, произведённого АЦП.

Таким образом, каждое изменение параметров установки фиксируется в энергонезависимой EEPROM-памяти МК. Это необходимо для того, чтобы при выключении сетевого напряжения ранее установленные значения были сохранены.

После записи в память EEPROM и выхода из режима настройки производится разрешение всех прерываний.

Выход из системного меню происходит при пятом нажатии кнопки «Режим», или если в течении 30 с не нажималась ни одна из кнопок УЗ.

Каждое изменение параметров установки фиксируется в энергонезависимой EEPROM памяти МК.

Работа схемы УЗ в Proteus 7.7 SP2 .

Прошивка е2р, плата, скачать zachita220_е2р.rar

прошивка в формате – НЕХ , протеус zachita220_нех.rar

Печатная плата.

Уважаемые читатели!
При более плотной эксплуатации своего прибора я столкнулся с проблемой зависимости показаний прибора от времени суток. Это обусловлено неудачным выбором алгоритма измерения синусоидального напряжения. Дело в том, что форма напряжения 220 В в разное время суток разная. Причина – обилие включенных активных и импульсных нагрузок днем и малое их количество ночью. Эту проблему я смог побороть, только изменив полностью алгоритм измерения напряжения. Теперь мой прибор измеряет действующее значение напряжения, прошивки прилагаю. Правда, несколько снизилось удобство управления прибором: теперь кнопка РЕЖИМ активна только в момент, когда прибор измеряет напряжение, т.е. для повторного нажатия кнопки РЕЖИМ приходится ждать перехода прибора в состояние измерения сетевого напряжения.Алгоритм измерения в двух словах выглядит теперь так: Во время прихода положительной полуволны запускается АЦП, Который успевает за время прохождения этой полуволны сделать порядка 100 выборок, которые обрабатываются по формуле:Urms= sqrt(1/T* S[u(t)*u(t)]dt,где: sqrt – корень квадратный, S – интеграл за период времени от 0 до Т. Для дискретного способа взятия интеграла формула упроститься до вида Urms=K*sqrt(1/N*sum (Uadc*Uadc)),Где: К – поправочный коэффициент, Uadc – значение на выходе АЦП, N – число выборок за время прохождения полуволны синусоиды. Более точно подсказать я вам не смогу, т.к. исходники на Си были уничтожены вместе с винчестером, прошивки в hex я вам скачал с оставшегося прототипа, надеюсь, они Вам помогут.Фьюзы программируются так: для меги 8В программаторе кодвижн сверху вниз1. первые два – галки CKSEL0=0, CKSEL1=02. третий – нет галки CKSEL2=13. следующие пять – есть галки CKSEL3=0, SUT0=0, SUT1=0, BODEN=0, BODLEVEL=0.4.остальные нет галок Частота внутреннего генератора микроконтроллера 8 МГц

С уважением, Роман Булышев.

Статья автора Роман Булышев журнал СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ♦ № 8 2006 WWW.SOEL.RU.

Источник: http://sxem.org/2-vse-stati/20-voltmetry/30-voltmetr-220-volt-s-zashchitoj-na-atmega8

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

Идея устройства для измерения напряжения, тока, емкости, разряда, а может и заряда возникла давно и не только у меня.

Можно найти немало игрушек под названием USB Tester (Doctor) для тестирования различных устройств с USB.

Мне же интересно несколько более универсальное устройство, независимое от интерфейса, а просто рассчитанное на определенные напряжения и токи. Например, 0 – 20.00в, 0 – 5.00а, 0 – 99.99Ач. Что касается функций, то я вижу так

  • Отображение текущих напряжения и тока, то есть вольт-ампер-метр. Впринципе, можно и мощность сразу отразить.
  • Подсчет и отображение накопленной емкости. В ампер-часах и всего скорее в ватт-часах. 
  • Отображение времени процесса
  • И, всего скорее, настраиваемые нижний и верхний пороги отключения по напряжению (ограничения разряда и заряда)

Разработка

Для реализации расчетов и измерений нам понадобится контроллер. Я вспомнил эту идею в рамках знакомства с Arduino, поэтому контроллером будет простая популярная Atmega328 и программироваться она будет в среде Arduino. С инженерной точки зрения выбор наверно не самый хороший – контроллер для задачи слегка жирноват, а его АЦП не назовешь измерительными, но… будем пробовать.

  • Паять в этом проекте много не будем. В качестве основы возьмем готовый модуль Arduino Pro Mini, благо китайцы готовы их поставлять по $1.5 в розницу.
  • В качестве устройства отображения будет выступать дисплей 1602 – еще $1.5. У меня вариант с интерфейсным модулем I2C, но в этом проекте он не сильно нужен ($0.7).
  • Для разработки нам понадобиться макетная плата. В моем случае это небольшая BreadBoard за $1.
  • Разумеется понадобятся провода и некоторое количество резисторов разного номинала. Для дисплея 1602 без I2C нужен также подбор контрастности – делается переменным резистором на 2 – 20 кОм.
  • Для реализации амперметра понадобится шунт. В первом приближении им может быть резистор 0.1 Ом, 5 Вт.
  • Для реализации автоматики отключения понадобится реле с контактами рассчитанными на максимальный ток устройства и напряжением равным напряжению питания. Для управления реле нужен npn транзистор и защитный диод.
  • Устройство будет питаться от внешнего источника питания, очевидно, что не менее 5 в. Если питание будет сильно варьироваться, то так же потребуется интегральный стабилизатор типа 7805 – он и определит напряжение реле.
  • В случае Arduino Pro Mini для заливки прошивки потребуется USB-TTL конвертер.
  • Для наладки понадобится мультиметр.

Вольтметр

Я реализую простой вольтметр с одним диапазоном примерно 0 – 20в.

Это замечанием важно, тк АЦП нашего контроллера имеет разрядность 10 бит (1024 дискретных значения), поэтому погрешность составит не менее 0.02 в (20 / 1024).

Для реализации железно нам нужен аналоговый вход контроллера, делитель из пары резисторов и какой-нибудь вывод (дисплей в законченном варианте, для отладки можно последовательный порт).

Принцип измерения АЦП состоит в сравнении напряжения на аналоговом входе с опорным VRef. Выход АЦП всегда целый – 0 соответствует 0в, 1023 соответствует напряжению VRef. Измерение реализовано путем серии последовательных чтений напряжения и усреднения по периоду между обновлениями значения на экране.

Выбор опорного напряжения важен, поскольку по умолчанию оно равно напряжению питания, которое может быть не стабильно. Это нам совершенно не подходит – за основу мы будем брать стабильный внутренний опорный источник напряжением 1.1в, инициализируя его вызовом analogReference(INTERNAL).

Затем мы откалибруем его значение по показаниям мультиметра.

На схеме слева – вариант с прямым управлением дисплея (он просто управляется – смотрите стандартный скетч LiquidCrystalHelloWorld). Справа – вариант с I2C, который я и буду использовать дальше. I2C позволяет сэкономить на проводах (коих в обычном варианте – 10, не считая подсветки).

Но при этом необходим дополнительный модуль и более сложная инициализация. В любом случае, отображение символов на модуле надо сначала проверить и настроить контрастность – для этого надо просто вывести после инициализации любой текст.

Контрастность настраивается резистором R1, либо аналогичным резистором I2C модуля.

Вход представляет собой делитель 1:19, который позволяет при Vref = 1.1 получить максимальное напряжение около 20в (обычно параллельно входу ставят конденсатор + стабилитрон для защиты, но нам пока это не важно).

Резисторы имеют разброс, да и опорное Vref контроллера тоже, поэтому после сборки надо измерить напряжение (хотя бы питания) параллельно нашим устройством и эталонным мультиметром и подобрать Vref в коде до совпадения показания.

Так же стоить отметить, что любой АЦП имеет напряжение смещения нуля (которое портит показания в начале диапазона), но мы пока не будем в это углубляться.

Также важным будет разделение питающей и измерительной “земли”. Наш АЦП имеет разрешение чуть хуже 1мВ, что может создавать проблемы при неправильной разводке, особенно на макете.

Поскольку разводка платы модуля уже сделана и нам остается только выбор пинов. “Земляных” пинов у модуля несколько, поэтому мы должны сделать так, чтобы питание в модуль заходило по одной “земле”, а измерения по другой.

Фактически для изменений я всегда использую “земляной” пин ближайший к аналоговым входам.

Для управление I2C используется вариант библиотеки LiquidCrystal_I2C – в моем случае указывается специфическая распиновка модуля I2C (китайцы производят модули с отличающимся управлением). Так же отмечу, что I2C в Arduino предполагает использование именно пинов A4, A5 – на плате Pro Mini они находятся не с краю, что неудобно для макетирования на BreadBoard.

Исходный код

#include
#include // Простой вольтметр с i2c дисплеем 1602. V 16.

11 // Настройки i2c дисплея 1602 с нестандартной распиновкой
#define LCD_I2C_ADDR    0x27 
#define BACKLIGHT     3      
#define LCD_EN  2            
#define LCD_RW  1            
#define LCD_RS  0            
#define LCD_D4  4            
#define LCD_D5  5            
#define LCD_D6  6            
#define LCD_D7  7            
 
LiquidCrystal_I2C lcd(LCD_I2C_ADDR,LCD_EN,LCD_RW,LCD_RS,LCD_D4,LCD_D5,LCD_D6,LCD_D7); // Время обновления показаний, мс (200-2000)
#define REFRESH_TIME  330 // Аналоговй вход
#define PIN_VOLT A0
// Внутреннее опорное напряжение (подобрать)
const float VRef = 1.10;
// Коэффициент входного резистивного делителя (Rh + Rl) / Rl. IN 0.2) InVolt += 3;
  // Перевод в вольты (Value: 0..1023 -> (0..VRef) scaled by Mult)
  Volt = InVolt * VoltMult * VRef / 1023;
  // Вывод данных
  lcd.setCursor (0, 1);
  lcd.print(Volt);
  lcd.print(“V “);
}

Ссылки

Железо