Вольтметр на микроконтроллере своими руками

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

Простой миниатюрный встраиваемый цифровой вольтметр для БП (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 В.

Вольтметр на микроконтроллере Atmega8 и на светодиодном индикаторе FYT-3031-BSR-21 с общим анодом, применяют в измерениях напряжений блоков питания, при контроле зарядки аккумуляторов и в других устройствах.

Технические характеристики вольтметра

  • количество сегментов индикатора – 3;
  • измеряемый диапазон напряжения: 0 – 50 В;
  • измерительный шаг – 0.1 В;
  • расчетная погрешность – 0.3%;
  • U напряжение питания от 6 до 14 В.

Схема вольтметра представлена на рисунке ниже.

Схема работы вольтметра на микроконтроллере

Питающее входное напряжение ограничивает и стабилизирует микросхема DA1 – 7805. Диод VD1 является своего рода гарантом того что полярность не перепутана. Конденсаторы С1 и С2 стабилизируют работу микросхемы. Измеряемое напряжение подается на вход микроконтроллера через делитель напряжения, R1 и R2 которые расширяют диапазон измерения. Напряжение получаемое на входе в АЦП преобразуется в цифровое значение. Резистор R3 номиналом 10 кОм необходим для защиты микроконтроллера от случайного сброса.

Полученное таким образом цифровое значение раскладывается на разряды. Вывод значения каждого разряда производится последовательно при помощи динамической индикации. Набор резисторов R4 – R11 ограничивает ток в сегментах индикатора до приемлемых значений. На выводах A1 – A3 появляется положительное напряжение последовательно.

Детали и настройка схемы

Резистор R1 лучше применить прецизионный, как пример, типа С2-36 (допуск 0.5%) или С2-29В-0,125 ( допуск 0.25-0.5%). Сопротивление R2 для подстройки многооборотное, как пример, тип его 3296W. Сопротивления R3 – R11 мощностью 0,125-0,5 ватт (допуск +10%) , как пример, тип С2-33; CF1/4 и т. д. Конденсаторы С1, С2 подойдут электролитический любые с пределом Т* = 105*С, емкостью – 22-47 мкФ. Конденсатор С3 с керамики, как пример, К10-17Б. Диод VD1 лучше заменить бы на 1N4148 или даже более мощный КД247; 1N4001; и т. д. Стабилизатор U до 5 В DA1 любой, но в корпусе TO220, как пример, КР142ЕН5А и т. д.

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

Сборка вольтметра

При динамичном управлении индикаторами светодиодными необходимо учитывать эффект от накопившихся зарядов в светодиодах. Если просто снимается U с сегмента, то накопленный заряд в диффузионной емкости p-n-p перехода будет еще какое-то время засвечивать индикатор, пока p-n-p-переходная емкость полностью не потеряет заряд. Это называется паразитной подсветкой индикатора. Чтобы быстро рассеять данный заряд и четко гасить индикатор, необходимо подать на сегменты U с обратной полярностью (как пример, для индикатора с 1-общим анодом на сегмент-катод надо подать уровень до 5 В, а на анод – уровень 0 В.)

Точность вольтметра на микроконтроллере с АЦП 10 – ти разрядными не очень высокая, составляет всего лишь примерно 0.3 %. Ее вычисляют следующим образом: ошибка дискретности 1LSB + нелинейная ошибка (по Даташиту – это 2LSB). Суммарная ошибка будет равна 3LSB. Соответственно погрешность относительная 3/1024

0,3%. Погрешность абсолютная для показаний близких к 50 В 0.3% = ±0,15 В.

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

Сейчас всё большую популярность получают измерительные приборы на основе микроконтроллеров со встроенным АЦП, тем более что доступность и возможности таких МК постоянно растут, схемотехника упрощается, а их сборка становиться под силу даже начинающим радиолюбителям. В качестве устройств отображения информации в цифровых измерительных приборах часто используются 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 Вольта. Ещё более упростить и удешевить схему можно заменив АЛС индикаторы на простую линейку светодиодов.

Читайте также:  Расстояние полка от печи в бане

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector