Цифровой вольтметр 0-25В на микроконтроллере AVR ATmega32
В этой статье мы рассмотрим схему на микроконтроллере ATmega32A (семейство AVR), реализующую цифровой вольтметр с пределами измерений от 0 до 25В. Для этого мы задействуем 10-битный аналого-цифровой преобразователь (АЦП), имеющийся в данном микроконтроллере. Поскольку АЦП микроконтроллера ATmega32A не может на своем входе обрабатывать напряжение больше 5В, для увеличения диапазона рассматриваемого нами цифрового вольтметра мы применим делитель напряжения.
При проектировании схем с делителем напряжения следует принимать во внимание то, что входной ток на АЦП микроконтроллера AVR должен быть не менее 50 мкА. Поэтому следует правильно выбирать резисторы делителя напряжения чтобы минимизировать влияние нагрузки (loading effect) резистора на проходящий через делитель ток.
Как показано на представленной схеме, мы будем использовать делитель напряжения на двух резисторах, поэтому при входном напряжении 25В мы на выходе этого делителя будем иметь 5В (при соответствующем подборе номиналов резисторов). Таким образом, для получения истинного значения измеряемого напряжения мы должны будем умножить измеренное (с выхода делителя) напряжение на 5.
Необходимые компоненты
Аппаратное обеспечение
- Микроконтроллер ATmega32 (купить на AliExpress).
- Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
- JHD_162ALCD (ЖК дисплей 16×2) (купить на AliExpress).
- Конденсатор 100 мкФ (купить на AliExpress).
- Конденсатор 100 нФ (5 шт.) (купить на AliExpress).
- Резистор 10 кОм (купить на AliExpress).
- Резистор 2,2 кОм (купить на AliExpress).
- Переменный резистор (потенциометр) 1 кОм (купить на AliExpress).
- Источник питания с напряжением 5 Вольт.
Программное обеспечение
- Atmel Studio версии 6.1 (или выше).
- Progisp или flash magic (необязательно).
Работа схемы
Схема устройства приведена на следующем рисунке.
В представленной схеме PORTB микроконтроллера ATmega32 соединен с портом данным жидкокристаллического (ЖК) дисплея. При этом следует помнить о том, что необходимо деактивировать JTAG интерфейс микроконтроллера на порту PORTC при помощи изменения фьюзов (fuse bytes) если мы хотим использовать PORTC как обычный порт ввода/вывода. В ЖК дисплее (если мы не хотим использовать черный цвет) можно задействовать только 14 его контактов: 8 контактов для передачи данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для управления контарстностью, 3 контакта для управления (RS&RW&E).
В представленной схеме мы использовали только 2 контакта управления ЖК дисплея для лучшего понимания работы схемы. Бит контраста и READ/WRITE используются нечасто, поэтому они могут быть замкнуты на землю. Это обеспечивает ЖК дисплею максимальную контрастность и переводит его в режим чтения. Теперь нам всего лишь нужно контролировать контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные. Также на нашем сайте вы можете прочитать более подробную статью о подключении ЖК дисплея к микроконтроллеру AVR ATmega32.
В схеме необходимо сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS — земля
PIN2 или VDD или VCC — +5v питание
PIN3 или VEE — земля (обеспечивает максимальный контраст ЖК дисплею)
PIN4 или RS (Register Selection) – контакт PD6 микроконтроллера
PIN5 или RW (Read/Write) — земля (переводит ЖК дисплей в режим чтения что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) — контакт PD5 микроконтроллера
PIN7 или D0 — контакт PB0 микроконтроллера
PIN8 или D1 — контакт PB1 микроконтроллера
PIN9 или D2 — контакт PB2 микроконтроллера
PIN10 или D3 — контакт PB3 микроконтроллера
PIN11 или D4 — контакт PB4 микроконтроллера
PIN12 или D5 — контакт PB5 микроконтроллера
PIN13 или D6 — контакт PB6 микроконтроллера
PIN14 или D7 — контакт PB7 микроконтроллера
В схеме мы использовали 8-битную связь (D0-D7) ЖК дисплея с микроконтроллером, хотя можно было ограничиться и 4-битной – но в этом случае код программы стал бы немного сложнее. Таким образом, мы использовали 10 контактов ЖК дисплея, 8 из которых будут использоваться для передачи данных и 2 для управления.
Напряжение на резисторе R2 (2,2 кОм) не будет полностью линейным – оно будет подвержено влиянию шума. Для борьбы с этим явлением в схеме параллельно резисторам делителя включены два конденсатора.
Переменный резистор 1 кОм служит для задания точности АЦП. В микроконтроллере ATMEGA32A мы можем подключить аналоговый выход к любому из восьми каналов PORTA – не важно к какому. В данной схеме мы использовали канал 0 (контакт 0) PORTA.
В микроконтроллере ATmega32A АЦП имеет разрешение (разрешающую способность) 10 бит, таким образом микроконтроллер способен реализовать чувствительность равную Vref/2^10, то есть если опорное напряжение (Vref) равно 5В мы получим цифровой инкремент на выходе 5/2^10 = 5мВ. Таким образом, на каждое приращение напряжения на 5 мВ мы будем получать один дополнительный инкремент цифрового выхода АЦП.
Для обеспечения работы схемы мы должны установить значения регистров АЦП следующим образом:
- Сначала мы должны активировать АЦП микроконтроллера.
- Максимальное входное напряжение для АЦП микроконтроллера составляет +5В (5*(12.2/2.2) =27.7В; поскольку R1 = 10 кОм and R2 = 2.2 кОм). Поэтому мы можем установить максимальное значение опорного напряжения АЦП равное 5В.
- АЦП микроконтроллера в нашей схеме будет начинать действовать при внешнем воздействии (не от действий пользователя), поэтому нам следует установить его в режим непрерывного преобразования (free running mode): в этом режиме запуск преобразований выполняется непрерывно через определенные интервалы времени.
- В любом АЦП частота преобразования аналогового значения в цифровое и точность цифрового выхода обратно пропорциональны. То есть для лучшей точности цифрового выхода мы должны выбрать меньшую частоту. Для этого мы должны установить коэффициент деления предделителя АЦП в максимальное значение (128). Поскольку мы используем внутреннюю частоту микроконтроллера 1 МГц, то значение частоты преобразования АЦП будет равно 1000000/128.
Четыре основных принципа работы с АЦП микроконтроллера мы рассмотрели, теперь нам нужно установить правильные значения в регистрах АЦП.
RED (красный, ADEN): этот бит устанавливается чтобы задействовать функции АЦП в ATmega32A.
BLUE (синий, REFS1, REFS0): эти два бита используются для установки опорного напряжения (максимального входного напряжения, которое мы собираемся обрабатывать). Поскольку мы будем использовать опорное напряжение равное 5В, бит REFS0 необходимо выставить в соответствии с приведенной таблицей.
LIGHT GREEN (светло зеленый, ADATE): этот бит должен быть установлен чтобы АЦП работал непрерывно (в режиме непрерывного преобразования).
PINK (розовый, MUX0-MUX4): эти 5 бит используются чтобы задать входной канал. Поскольку мы будем использовать ADC0 (PIN0) то, как следует из ниже приведенной таблицы, нам нет необходимости устанавливать все эти биты.
BROWN (коричневый, ADPS0-ADPS2): эти три бита используются для установки коэффициент деления предделителя АЦП. Поскольку мы используем коэффициент деления предделителя 128, мы должны установить все эти три бита.
DARK GREEN (темно-зеленый, ADSC): этот бит необходимо установить для того чтобы АЦП начал осуществлять преобразование. Далее в программе мы можем его сбросить (в 0) если нам нужно будет остановить процесс аналого-цифрового преобразования.
Объяснение работы программы
Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программы поясняют принцип работы отдельных команд.
Ваттметр на Arduino – измерение напряжения, тока и мощности
У инженеров и просто энтузиастов в мире электроники достаточно часто возникает необходимость в проведении каких-либо измерений, одним из которых является измерение мощности. Поэтому в данной статье мы рассмотрим создание самодельного ваттметра на основе платы Arduino, с помощью которого можно будет измерять напряжение, ток и мощность электрического сигнала.
Некоторые могут сказать зачем делать такой прибор если его можно сейчас сравнительно недорого купить. Да, это так. Но ведь наверняка некоторым из вас хочется сделать более продвинутый ваттметр чем тот, который можно просто купить. Используя плату Arduino для создания ваттметра мы можем выводить измеряемые значения на экран компьютера, строить их график, сохранять их значения на SD карту когда их значения находятся в заданных интервалах и многое другое.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Операционный усилитель LM358 (купить на AliExpress).
- Регулятор напряжения LM7805 (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Шунтирующий резистор 0.22 ohm 2Watt (купить на AliExpress).
- Подстроечный потенциометр 10 кОм (Trimmer pot) (купить на AliExpress).
- Резисторы 10 кОм, 20 кОм, 2,2 кОм, 1 кОм (купить на AliExpress).
- Конденсаторы 0,1 мкФ (купить на AliExpress).
- Тестируемая нагрузка.
- Перфорированная или макетная плата.
Работа схемы
Схема ваттметра на основе платы Arduino представлена на следующем рисунке.
Для облегчения понимания схема разделена на 2 части. Верхняя часть схемы – это ее измерительная часть, а нижняя часть схемы служит для проведения вычислений и отображения их результатов. Места соединения обоих частей схемы обозначены с помощью меток.
Схема спроектирована для работы с напряжением в диапазоне 0-24V с током 0-1A – эти параметры специально подобраны для работы с Solar PV (солнечная фотоэлектрическая система). Но если вы поймете принципы работы этой схемы вы легко можете расширить диапазоны ее работы до необходимых вам. Основополагающий принцип работы этой схемы заключается в измерении напряжения и тока в нагрузке чтобы затем рассчитать потребляемую нагрузкой мощность. Значения всех измеряемых параметров будут отображаться на экране ЖК дисплея 16х2.
Далее рассмотрим работу по отдельности небольших элементов представленной схемы чтобы лучше понять ее работу.
Измерительный блок
Измерительный блок схемы состоит из делителя напряжения на двух резисторах для измерения значения напряжения и шунтирующего резистора с неинвертированным операционным усилителем для измерения силы тока. Делитель напряжения показан на следующем рисунке:
Входное напряжение на этой схеме обозначено как Vcc. Как мы говорили ранее, схема спроектирована для измерения напряжений от 0V до 24V. Но плата Arduino не может измерять такие большие напряжения – она может измерять напряжения только в диапазоне 0-5V. Соответственно, мы должны преобразовать измеряемое напряжение в диапазоне 0-24V в диапазон 0-5V. Это преобразование как раз и осуществляется с помощью представленного делителя напряжения. Соответственно, и номиналы резисторов в схеме этого делителя (10 кОм и 2,2 кОм) как раз подобраны таким образом, чтобы преобразовывать диапазон 0-24V в диапазон 0-5V. Если вам нужно изменить диапазон измеряемых схемой напряжений вам всего лишь нужно изменить значения номиналов резисторов в представленной схеме делителя напряжения. Значение напряжение на выходе делителя напряжения можно рассчитать по хорошо известной формуле:
Vout = (Vin × R2) / (R1 + R2)
Преобразованное к диапазону 0-5V напряжение со средней точки делителя напряжения у нас на схеме обозначено меткой Voltage. В дальнейшем это преобразованное значение напряжения подается на аналоговый вход платы Arduino.
Далее мы должны измерять ток через нагрузку (LOAD). Поскольку микроконтроллеры могут считывать только аналоговые значения напряжения нам необходимо преобразовать значение тока в значение напряжения. Это можно сделать при помощи добавления шунтирующего резистора – в соответствии с законом Ома падение напряжения на нем будет пропорционально протекающему по нему току. Поскольку на шунтирующем резисторе падение напряжения будет очень маленькое мы будем использовать операционный усилитель чтобы усилить его. Схема для осуществления этого процесса показана на следующем рисунке:
Значение сопротивления шунтирующего резистора (SR1) в нашем случае равно 0.22 Ом. Как было указано ранее, наша схема спроектирована для измерения силы тока в диапазоне 0-1A, поэтому в соответствии с законом Ома при максимальном токе через нагрузку 1 А падение напряжения на нашем шунтирующем резисторе будет примерно 0.2V. Это напряжение мало для считывания микроконтроллером, поэтому мы используем операционный усилитель в неинвертированном усилительном режиме чтобы усилить это напряжение до значения, которое можно комфортно считать с помощью платы Arduino.
Операционный усилитель в неинвертированном режиме показан на вышеприведенной схеме. Усилитель спроектирован таким образом чтобы его коэффициент усиления составлял значение 21, итого получаем 0.2*21 = 4.2V. Формула для расчета коэффициента усиления представленного операционного усилителя выглядит следующим образом:
Gain = Vout / Vin = 1 + (Rf / Rin)
Если вам нужно изменить диапазон измеряемых схемой значений тока вам необходимо изменить значение сопротивления шунтирующего резистора, а также значения сопротивлений резисторов, влияющих на коэффициент усиления операционного усилителя.
В нашем случае значение сопротивления резистора Rf равно 20 кОм, а значение сопротивления резистора Rin равно 1 кОм, что обеспечивает коэффициент усиления 21 для операционного усилителя. Далее напряжение с выхода операционного усилителя подается на RC фильтр, состоящий из резистора 1 кОм и конденсатора 0,1 мкФ. Данный фильтр предназначен для фильтрации нежелательных шумов. Далее отфильтрованное напряжение подается на аналоговый вход платы Arduino.
И, наконец, последний компонент который нам необходимо рассмотреть в блоке измерений нашей схемы – это регулятор напряжения. Поскольку мы подаем на вход схемы изменяемое напряжение нам необходимо стабилизированное напряжение +5V для питания платы Arduino и операционного усилителя. Это регулированное (стабилизированное) напряжение в нашей схеме обеспечивается с помощью регулятора напряжения 7805. Конденсатор добавлен на выход схемы регулятора для фильтрации шума.
Блок вычислений и отображения информации
В блоке измерений мы спроектировали схему чтобы конвертировать измеряемые значения и тока в диапазон напряжений 0-5V, которые непосредственно подаются на аналоговые входы Arduino. В этой же части схемы мы подсоединяем эти провода с напряжениями к плате Arduino, а также подключаем к плате Arduino алфавитно-цифровой ЖК дисплей для отображения результатов измерений. Схема этого блока представлена на следующем рисунке.
Как вы можете видеть из схемы, контакт с значением напряжения подключается к аналоговому контакту A3, а контакт со значением тока – к аналоговому контакту A4 платы Arduino. ЖК дисплей запитывается от напряжения +5V с регулятора 7805 и подключен к цифровым контактам платы Arduino в 4-битном режиме. Мы также используем потенциометр 10 кОм, подключенный к контакту Con ЖК дисплея чтобы регулировать его контрастность.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.
Цель функционирования программы – считать значения аналогового напряжения с контактов A3 и A4 и рассчитать напряжение, ток и мощность, а потом отобразить все это на экране ЖК дисплея.
Вначале программы нам необходимо инициализировать используемые контакты: A3 и A4 для измерения напряжения и тока соответственно, и цифровые контакты 3, 4, 8, 9, 10 и 11 для подключения ЖК дисплея.
«V6» — измеритель RMS-значений напряжения, тока, активной и полной мощности (Atmega 8)
Весьма часто возникает необходимость знать величину потребляемой (активной) мощности различными нагрузками. Для решения данной задачи и благодаря комментариям и пожеланиям, высказанные к моей предыдущей статье «Вольтметр-амперметр переменного тока с вычислением мощности на PIC16F690» и был построен новый прибор «V6», измеряющий действующие (RMS) значения этих величин на частоте 50 Гц.
Камрад, рассмотри датагорские рекомендации
? Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.
↑ Как посчитать правильно?
Действующее значение тока и напряжения можно определить по формуле:
Вычисляется активная мощность через интеграл по одному периоду от мощности мгновенной:
Для цепей несинусоидального тока электрическая мощность равна сумме соответствующих средних мощностей отдельных гармоник.
Активная мощность характеризует скорость необратимого превращения электрической энергии в другие виды энергии (тепловую и электромагнитную). Активная мощность может быть также выражена через силу тока, напряжение и активную составляющую сопротивления цепи.
Полная мощность — величина, равная произведению действующих значений периодического электрического тока I в цепи и напряжения U на её зажимах:
Полная мощность имеет практическое значение, как величина, описывающая нагрузки, фактически налагаемые потребителем на элементы подводящей электросети (провода, кабели, распределительные щиты, трансформаторы, линии электропередачи), так как эти нагрузки зависят от потребляемого тока, а не от фактически использованной потребителем энергии. Именно поэтому номинальная мощность трансформаторов и распределительных щитов измеряется в Вольт-Амперах, а не в Ваттах.
На практике измеряемый период делим на некоторое число частей и измеряем напряжение и ток на каждом участке. Таким образом, мы получаем функции U (t) и I (t). Точнее, не сами функции, а таблицу их значений – поэтому от интегрирования переходим к суммированию:
Здесь N – количество отсчётов, приходящееся на один период сетевого напряжения.
↑ Технические характеристики измерителя RMS-значений
1. Пределы изменения измеряемого напряжения 50 – 255 Вольт, дискретность 0,5 Вольта. Показания отображаются с шагом 1 Вольт.
2. Пределы изменения измеряемого тока:
1-й диапазон 0 – 1 Ампер, дискретность — 2 mA
2-й диапазон 1 – 20 Ампер, дискретность — 0,04 A
3. Активная мощность отображается в Ваттах.
4. Полная мощность отображается в Вольт-Амперах.
↑ Принципиальная схема
Исключён фрагмент. Полный вариант доступен меценатам и полноправным членам сообщества.
Измеряемое напряжение через входной делитель поступает на вход микроконтроллера ADC4 (PC4) через конденсатор.
Измеряемый ток протекает по шунту, напряжение, снимаемое с него, усиливается инвертирующими операционными усилителями и поступает на вход микроконтроллера ADC1 (PC1) на первом диапазоне и на вход ADC2 (PC2) на втором диапазоне. В связи с тем, что размах напряжения, снимаемого с ОУ должен быть около 5 Вольт, на микросхему усилителя поступает повышенное питание (9-15 Вольт).
На вход ADC3 (PC3) поступает постоянное стабилизированное смещение около 2,5 Вольта. Это напряжение позволяет правильно измерять положительный и отрицательный полупериоды входных напряжений.
На вход ADC5 (PC5) поступает сетевое напряжение, ограниченное до 5-и Вольт, для синхронизации измерений с сетью (аппаратный детектор перехода через ноль).
Конденсаторы, подключённые параллельно входам ADC, служат для уменьшения помех при работе АЦП микроконтроллера.
К микроконтроллеру подключён LCD дисплей, с отображением 2-х строк по 16 символов.
Питание прибора осуществляется от встроенного бестрансформаторного источника на микросхеме LNK306DN c выходным напряжением 10 Вольт. Стабилизатор питания +5 Вольт собран на микросхеме 78L05 и особенностей не имеет.
Внимание! Устройство имеет гальваническую связь с питающей сетью. При настройке необходимо все подключения необходимо производить только при отключённом сетевом питании устройства.
Обязательно проверить по даташиту правильность подсоединения питания (ножки 1 и 2) своего ЖК индикатора.
↑ Программа
Программа написана на языке Bascom-AVR и снабжена комментариями. Применён микроконтроллер Atmega8 с довольно большим объёмом памяти, что позволило применить LCD дисплей и подготовить программу на языке высокого уровня без особых ухищрений. Тактовая частота внутреннего генератора выбрана 8 МГц, опорное напряжение выбрано равным напряжению питания микроконтроллера с целью уменьшения помех и повышения точности измерения.
Измерения производятся, согласно рисунку в течение одного периода входного напряжения
Предварительно измеряется 2,5V, получаемое от микросхемы TL431, и затем измеряется входное напряжение. В случае положительной полуволны измеряемое напряжение будет равно разности Uвх – U2,5V, а в случае отрицательной полуволны будет равно U2,5-Uвх. За один период делается около 175-190 измерений. Затем производится обработка результатов измерений и вычисление значений. Следует учесть, что напряжение с токового шунта усиливается инвертирующим усилителем и, поэтому при вычислениях его необходимо инвертировать повторно. Это хорошо видно на приведённой диаграмме.
Переключение диапазонов тока и форматирование результатов производиться автоматически, практически незаметно для пользователя.
Описание программы очень подробно отображено в комментариях к ней.
Программируется микросхема в режиме последовательного программирования через SPI, используя разъем дисплея. Дисплей вынимается на время программирования и подключается программатор. При этом прибор должен быть отключён от сети! Конфигурационные биты указаны на снимке
↑ Детали и конструкция
Все детали установлены на печатной плате. Дисплей вставляется в разъёмы платы. Шунт выполнен в виде четырёх параллельно соединённых резисторов мощностью 0,1 Ом 2 Вт. В связи с тем, что различные типы дисплеев могут иметь различное подключение питания (ножки 1 и 2), то на печатной плате питание на ножки дисплея 1 и 2 поступает через перемычки. Их надо коммутировать правильно, в соответствии с применяемым дисплеем.
Вид собранного прибора без кожуха
Вид на плату со стороны печати
Исключён фрагмент. Полный вариант доступен меценатам и полноправным членам сообщества.
Плата установлена в корпусе из пластмассы.
↑ Настройка
Необходимо проверить монтаж платы и включить устройство.
1. Вращая резистор (первый слева), выставляем оптимальную контрастность дисплея. На индикаторе должны отобразиться нулевые значения, тока и мощности.
2. Вращая резистор (четвёртый слева), устанавливаем показания напряжения на дисплее равными напряжению, поданному на вход.
3. Для настройки правильных показаний амперметра на 1-ом диапазоне подключаем нагрузку (лампу накаливания на 60 – 100 Ватт) через контрольный амперметр. При этом на индикаторе должны отобразиться значения тока. Вращая резистор (третий слева), устанавливаем показания тока на дисплее равными току на контрольном амперметре.
4. Для настройки правильных показаний амперметра на 2-ом диапазоне подключаем нагрузку (лампу накаливания или какую-либо другую нагрузку мощностью более 200 Вт) через контрольный амперметр. При этом на индикаторе должны отобразиться значения тока. Вращая резистор (второй слева), устанавливаем показания тока на дисплее равными току на контрольном амперметре.
Исключён фрагмент. Полный вариант доступен меценатам и полноправным членам сообщества.
↑ Итоги:
Познакомился с микроконтроллерами AVR и научился программировать на языке Bascom-AVR.
Получился прибор, легко меряющий мощности, потребляемые различной бытовой техникой как активную, так и полную.
↑ При разработке использованы следующие материалы:
↑ Файлы:
Схема, печатная плата и программа с прошивкой:
21-03-2014 Обновлена схема ?RMS-V6.7z 57.53 Kb ⇣ 274
Наш файловый сервис предназначен для полноправных участников сообщества «Datagor Electronics».
Для получения файла зарегистрируйтесь и войдите на сайт с паролем.
Иван Внуковский,
г. Днепропетровск, Украина