Цифровой вольтметр на микроконтроллере

Теги статьи: Добавить тег

Простой миниатюрный встраиваемый цифровой вольтметр для БП (0…19,99В/0…39,99В)

Автор: SSMix
Опубликовано 17.09.2013
Создано при помощи КотоРед.

В статье описывается простой встраиваемый 4-х разрядный цифровой вольтметр, разработанный для установки в домашний лабораторный БП с выходным напряжением 0…15В, как более дешевая и миниатюрная альтернатива китайским 3-х разрядным поделкам. Вольтметр может быть также использован для контроля напряжения в бортовой сети автомобиля.

Изменением номиналов резисторов делителя и варианта программы прошивки можно выбрать предел измерения 0…19,99 В или 0…39,99 В . Для универсальности предусмотрены прошивки для установки светодиодных индикаторов с ОА и ОК .

Вот фото вольтметра в работе:

Диапазон измерения, В……………. 0…19,99 (0…39,99);

Дискретность измерения, мВ………. 10;

Точность во всём диапазоне, мВ…. ±10;

Напряжение питания, В……………. 7…20*;

Потребляемый ток, мА……………. ≤40**;

Габаритные размеры, мм…………. 43х20х11.

Индикация…………………………. 4-х разрядный 7-сегментный с ОА или ОК.

* — при использовании DA1 78L05A

** — зависит от сопротивлений R4…R11

Схема электрическая вольтметра:

Входное измеряемое напряжение поступает на делитель R1, R2, R3, R13 с коэффициентом деления 1:8, а с него на вход PC4 АЦП микроконтроллера DD1. Конденсатор C2 – помехоподавляющий.

Микроконтроллер выбран широко распространённый ATmega8A в малогабаритном корпусе TQFP-32.

В качестве источника опорного напряжения (ИОН) для АЦП использован внутренний напряжением Vref=2.56В. При этом максимальное измеряемое напряжение на входе делителя составляет 2,56•8=20,48В.

Если применить входной делитель с коэффициентом деления 1:16, максимальное измеряемое напряжение можно увеличить до 2,56•16=40,96В.

В программе МК предусмотрены оба варианта делителя. Максимальный предел измерения программно ограничивается величиной 19,99В (39,99В). При превышении предела на индикатор выводится “ 1 -. — — “ (как в старой доброй КР572ПВ2) или “ 3 -. — — ”.

При 10-ти разрядном АЦП его диапазон измерения составляет 0…1023, что дает дискретность измерения непосредственно на входе АЦП: 2560мВ/1024=2,5мВ. С учётом входного делителя напряжения получается дискретность измерения 2,5мВ•8=20мВ (для предела 0…20В) или 2,5мВ•16=40мВ (для предела 0…40В). Для получения необходимой дискретности 10 мВ использован приём многократных выборок АЦП с усреднением результата. На официальном сайте Atmel есть интересный pdf-документ под названием “AVR121. Enhancing ADC resolution by oversampling” (Расширение разрешающей способности АЦП, используя передескритезацию).

На 8-й странице этого документа в таблице 3-1 (правда для Vref=5В) показано, как растёт разрешающая способность 10-разрядного АЦП при увеличении числа выборок. При 4-х выборках с усреднением результата наш АЦП “превращается” в 11-разрядный (0…2047), при 16-ти выборках – в 12-разрядный (0…4095), при 64-х выборках – в 13-разрядный (0…8191) и т.д.

Общая формула для вычисления необходимого количества выборок для прибавки к разрешению АЦП дополнительных n бит: sf = 2 n .

В данном случае для полного использования переменной накопления результата АЦП типа unsigned int (0…65535) оказалось удобным применить 64 выборки. При этом даже при максимальном коде АЦП 1023 переменная накопления результата никогда не переполнится (1023•64=65472), а разрешающая способность вольтметра для случая (0…40В) улучшится в 8 раз и составит 5 мВ, что вполне подходит.

Для компенсации разброса сопротивлений резистивного делителя и начального напряжения ИОН служит подстроечный резистор R3. Подбором сопротивления резистора R13 можно подстроить точность показаний вольтметра более грубо.

Для варианта (0…19,99)В соотношение сопротивлений верхнего плеча делителя к нижнему должно быть 7:1 , а для варианта (0…39,99)В – 15:1 , т.е. во втором случае сопротивление резистора R1 нужно будет увеличить до 510кОм, и возможно подобрать R13.

Светодиодный 4-х разрядный индикатор HL1 KW4-361AGB (с общим анодом) подключен к МК без дополнительных ключевых транзисторов, учитывая небольшой ток потребления. Резисторы R4…R11 определяют яркость свечения индикатора. Можно применить также индикатор с общим катодом, зашив МК соответствующим вариантом hex-файла прошивки. Схема включения при этом остаётся прежней.

Питание микроконтроллера производится через линейный стабилизатор DA1 78L05A, для которого по DataSheet типовая разность между входом и выходом составляет не менее 1,7 В. Практически минимальное напряжение питания схемы составляет около 7 В. Максимальное – не более 30 В. Если необходимо запитать схему от меньшего напряжения, то следует заменить стабилизатор DA1 на другой тип. Выходное напряжение стабилизатора может находиться в пределах от 3 до 5 В. При питании схемы от большего напряжения, чем 20В, последовательно с цепью питания желательно включить стабилитрон для гашения избыточного напряжения с целью снижения мощности рассеивания на DA1.

Программа для микроконтроллера написана на языке Си в хорошо зарекомендовавшей себя среде WinAVR-20060125. Вот вкраце рабочий вариант программы для индикатора с ОА и пределом измерения 19.99В.

Начинается программа традиционно, с подключения библиотек:

#include //Подключение библиотеки задержек

Определяем константы в flash-памяти микроконтроллера::

//Знакогенератор сегментов светодиодного индикатора с ОА:

static unsigned char __attribute__ ((progmem)) SEGMENTE[] =

Это байты, которые будут выводиться в порт D микроконтроллера для получения различных символов в разряде индикатора. Сегменты индикатора a, b, c, d, e, f, g, h, соответствуют линиям порта D следующим образом:

Так оказалось проще разводить печатную плату.

Для коммутации разрядов для порта B также используется табличный массив в flash-памяти:

//Таблица динамической коммутации разрядов индикатора

static unsigned char __attribute__ ((progmem)) RAZR[] =

//4 разр. 3 разр. 2 разр. 1 разр.

Далее определяем глобальные переменные:

volatile unsigned char segcounter = 0 ; //Счётчик разрядов индикатора (0-младший справа, 3-старший слева)

volatile unsigned char mass_ind[]=< 12, 12, 12, 12 >; //Массив выводимых чисел для каждого индикатора (0-младший справа, 3-старший слева), при включении вывод "—.—"

volatile unsigned char p_count= 0 ; //Счётчик прерываний (каждые 0,256мс)

Буфер mass_ind[] будет использоваться для хранения индицируемых цифр каждого разряда. Заноситься информация в него будет после каждого суммарного замера АЦП и преобразования результата в формат ХХ.ХХ В. Считывание информации будет производиться в прерывании по переполнению таймера-счётчика 2 (каждые 0,256мс) для динамической индикации. Первоначально в mass_ind[] заносим данные для вывода на индикатор при включении питания значков “— -. — —".

В прерывании выставляем лог.1 на аноде текущего разряда в соответствии с состоянием счётчика segcounter, выводим в порт D байт данных из массива mass_ind[] и увеличиваем на 1 переменную segcounter (с проверкой на переполнение и ограничением до 3). Также инкрементируем счетчик прерываний p_count для отсчёта интервалов времени в 0,256мс. Т.о. в каждом прерывании выводится цифра одного из разрядов через каждые 0,256мс. Для 2-го разряда дополнительно добавляется разделительная точка.

//Прерывание по переполнению T2 (), динамическая индикация

PORTB = (PORTB & 0b11110000 ) | pgm_read_byte(RAZR+segcounter); //Активация текущего разряда индикатора

PORTD = pgm_read_byte(SEGMENTE+mass_ind[segcounter]); //Вывод сегментов текущего разряда

if (segcounter== 2 ) //Если 2-й разряд с точкой

PORTD = PIND & pgm_read_byte(SEGMENTE+ 10 ); //Добавка десятичной точки

segcounter++; //Инкремент разрядов индикатора

if (segcounter> 3 ) segcounter= 0 ; //Ограничение счетчика

p_count++; //Инкремент счётчика прерываний

Никаких сложных вычислений в прерывании специально не делается, чтобы обеспечить минимальное время выполнения. Благодаря этому скорость переключения разрядов индикатора составляет 1/0,256мс=3906,25 Гц, а каждый из четырёх разрядов мигает с частотой 3906,25 Гц/4=976,5625 Гц. Частота довольно высокая, так что никакого мерцания индикатора не заметно.

Далее следует основная функция программы, начинающаяся с конфигурации портов, таймера-счетчика 2 и АЦП:

unsigned char adc_counter= 0 ; //Счётчик замеров АЦП

unsigned int display = 0 ; //Выводимое напряжение ХХХХ В

TCCR2 |= ( 1 0 0 //Предделитель на N=1, прерывания каждые 0,256мс (1000000 Гц / 256 = 3906,25 Гц), Fинд=3906,25 Гц/4 = 976,5625 Гц

TIMSK |= ( 1 //Разрешение прерывания по переполнению таймера 2

ADMUX = ( 1 1 //Внутренний ИОН 2,56V

|( 0 //Правое выравнивание результата

|( 0 1 0 0 //Вход АЦП — PC4

_delay_ms( 50 ); //Задержка времени на 50 мс

sei(); //Глобальное разрешение прерываний

В следующем бесконечном цикле при помощи счетчика p_count отсчитываем 15 прерываний по 0,256мс, в результате чего получаем интервал 3,84мс и запускаем одиночное преобразование АЦП. Одновременно увеличиваем на 1 счетчик замеров adc_counter. Результат накапливаем в переменной value.

< if (p_count>= 15 ) //Если прошло 15*0,256мс=3.84мс; общее время замеров 64*3.84=245.76мс (4 замера в сек)

ADCSRA= 0b11000011 ; //Пуск АЦП (Кдел=8, f=125 кГц, однократн.)

while (bit_is_set(ADCSRA, ADSC)); //Ожидание завершения преобразования

value = value + ADC; //Чтение и накопление результата преобразования

adc_counter++; //Инкремент счётчика замеров

После 64 замеров вычисляем напряжение в мВ*10:

Измеренное напряжение для N замеров:

Для отображения 4-х разрядов в формате ХX.ХХ В результат делится на 10 с округлением (прибавляется 5 перед делением)

mVolt=(value+5)/32 (N=64, Кдел=8)

if (adc_counter >= 64 ) //Если прошло 64 замера АЦП

При общем количестве замеров 64 получается суммарное время измерения 3,84мс*64=245,76 мс, т.е. примерно 4 измерения в секунду. Чаще делать нет смысла, иначе показания индикатора будут меняться слишком быстро.

Ну и наконец, заполняем буфер mass_ind[4] для вывода из него информации в прерывании.

//Заполнение массива mass_ind[4] для вывода индикации

if (display > 1999 ) //Если напряжение больше 19,99В

mass_ind[ 1 ] = 12 ; //Вывод "-" в 1-м разряде

mass_ind[ 2 ] = 12 ; //Вывод "-" во 2-м разряде

mass_ind[ 3 ] = 1 ; //Вывод "1" в старший разряд (слева)

mass_ind[ 1 ] = (display/ 10 )% 10 ; //1-й разряд

mass_ind[ 2 ] = (display/ 100 )% 10 ; //2-й разряд

mass_ind[ 3 ] = display/ 1000 ; //Старший разряд (слева)

if (mass_ind[ 3 ]== 0 ) mass_ind[ 3 ]= 11 ; //Если в старшем разряде "0" — гашение старшего разряда

Скриншот симуляции работы программы в Протеусе:


Схема вольтметра собрана на плате из одностороннего фольгированного стеклотекстолита размерами 43х20 мм по лазерно-утюжной технологии:

C1 = 10,0х20В (Танталовый, корпус B)

C2, С4…C6 = 0,47 (0603)

C3 = 22,0х6,3В (Танталовый, корпус A)

DA1 = MC78L05A (SOIC-8)

DD1 = ATmega8A-AU (TQFP-32) или ATmega8

HL1 = KW4-361AGB (4 сегмента, общий анод)

L1, L2 = 22uH (0805)

R1 = 240к или 510к (0805)

R3 = 1к (Подстроечный SMD CV-035, EVM (3×3мм))

R4, R5, R7…R12 = 270* (0603)

Для подключения программатора на плате предусмотрены соответствующие контактные площадки MOSI, MISO, SCK, RESET, GND, +Vcc:

После прошивки программы следует запрограммировать следующие фьюзы ("0"-галочки установлены):

CKSEL3…0=0001 (Внутр.RC-генератор 1 МГц),

CKOPT=1 ,

BODEN=1 (схема BOD выключена),

SUT10=10 (16 CK, 65 ms, Slowly rising power),

Подключение вольтметра производится тремя проводниками: +Uизмер. , +Uпит. и Общий . Если измеряемое напряжение не опускается ниже минимального входного напряжения питания стабилизатора DA1, цепи +Uизмер. и +Uпит. соединяются вместе.

В первый момент после включения на индикаторе высветится “ — -. — — “, т.к. измерения и обработка результата ещё не проведены. Это корректнее, чем выводить первоначально нулевое напряжение, как сделано во всех встраиваемых вольтметрах. После завершения первой серии замеров на индикатор будет выведено напряжение в вольтах.

Подключив параллельно измеряемой цепи образцовый цифровой вольтметр, подстроечным резистором R3 необходимо выставить одинаковые с ним показания. Для повышения точности настройки желательно использовать напряжение ближе к верхнему пределу измерения. Регулировка получается довольно плавная. Возможно придётся дополнительно подобрать сопротивление резистора R13 для “попадания” в нужный диапазон подстройки.

Испытания вольтметра совместно с образцовым мультиметром показали, что погрешность измерения не превышает единицы младшего разряда (±10 мВ) во всём диапазоне 0…19.99 В.

Ещё одна маленькая победа Китай-прома над отечественным радиолюбительством произошла в области А/В-метров. Уже несколько лет как стали очень популярны мини LED индикаторы напряжения. Их уже можно увидеть во многих самодельных конструкциях и делание цифрового вольтметра / амперметра на микроконтроллере с нуля уже скорее проходит по категории "мазохизм", если конечно не требуются особые свойства или точность. Значит имеет смысл взглянуть на такие модули по-пристальнее, выбрав самые маленькие из них трех разных цветов для теста.

Модули вольтметры цифровые

Большим преимуществом блоков является относительно низкая цена и отсутствие напряжения питания, они питаются от напряжения которое одновременно измеряют. Производитель дает диапазон напряжения 2,6 — 30 В. Для начала протестируем их при разных значениях напряжения. Питание от преобразователя и литий-ионных аккумуляторов. Сравнивать будем показания с измерителем UNI-T UT210E, а также с ANENG. Модули имеют на плате небольшой потенциометр для коррекции показаний.

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

Точность этих индикаторов будет приемлемой во многих устройствах, особенно учитывая низкую цену этих модулей (можно купить за менее 100 рублей). Индикаторы автоматически переключают диапазон — после превышения значения 9,99 В отображаются только десятичные части, то есть одна цифра после запятой.

Подключение минивольтметров

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

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

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

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

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

Мини вольт-ампер метры

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

Обсудить статью МИНИ ЦИФРОВЫЕ ВОЛЬТМЕТРЫ

Операционные усилители (ОУ). Схема включения, описание принципа функционирования и их работы.

Схема и фотографии готового самодельного усилителя на микросхеме TDA1557.

ПРЕОБРАЗОВАТЕЛЬ НАПРЯЖЕНИЯ 1,5 — 9 ВОЛЬТ

Практический пример создания простейшего преобразователя для того, чтоб из напряжения одной пальчиковой батарейки получить 9V.

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

Электросхема вольтметра


Схема принципиальная вольтметра на PIC16F676 — второй вариант

Это простой вольтметр до 30 вольт на основе PIC16F676 микроконтроллера с 10-разрядный АЦП и трех 7-ми сегментных светодиодных индикаторов. Вы можете использовать эту схему для того, чтобы измерить до 30 В постоянного тока. PIC16F676 — это основа этой схемы. Внутренний АЦП микроконтроллера с резисторами делителя напряжения используют для измерения входного напряжения. Затем 3 цифры comm анод 7-сегментный дисплей используется для отображения финальной преобразованное напряжение. Для уменьшения токопотребления в схеме задействована динамическая индикация. Скачать прошивки на различные индикаторы можно здесь.

Работа прибора

На резисторах R1 и R2 собран делитель напряжения, многооборотный построечный резистор R3 служит для калибровки вольтметра. Конденсатор C1 защищает вольтметр от импульсной помехи и сглаживает входной сигнал. Стабилитрон VD1 служит для ограничения входного напряжения на входе микроконтроллера, что бы вход контроллера не сгорел при превышении напряжения по входу.

Расчеты показаний

10-ти битная АЦП позволяет получить максимальное количество 1023. Значит с 5 вольт мы получаем 5/1023 = 0.0048878 В/Д, значит, если значение 188, то входное напряжение: 188 х 0.0048878 = 0.918 вольт. С делителем напряжения максимальное напряжение 30 В, поэтому все расчеты будут 30/1023 = 0.02932 вольт/деление. Так что если сейчас мы получаем 188, то 188 х 0.02932 = 5.5 Вольта. Ещё более упростить и удешевить схему можно заменив АЛС индикаторы на простую линейку светодиодов.

Читайте также:  Вьющиеся лианы для дачи
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock detector