Контакты

Измерение сопротивления активной нагрузки на avr. Простой модульный вольтметр переменного напряжения на PIC16F676

Ibrahim Kamal (IKALOGIC)

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

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

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

Существует множество способов и решений для отслеживания уровня напряжения батареи питания, многие из них требуют использования внешних компонентов и узлов. Рассматриваемое нами решение не требует внешних компонентов, мы будем использовать лишь ресурсы и периферию микроконтроллера - встроенный АЦП.

Использовать будем микроконтроллер компании ATMEGA48 , но программный код полностью совместим с микроконтроллерами ATMEGA88 , ATMEGA168 , ATMEGA328 . Кроме того, немного исправив исходный код, можно применить данное решение для микроконтроллеров AVR со встроенным АЦП.

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

Вы, наверное, скажете: «Так в чем же дело. Мы подключим положительный вывод батареи, от которой питается микроконтроллер, к входу АЦП и преобразуем величину напряжения в цифровое значение!».

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

Если рассмотреть данную проблему с математической точки зрения, если вы понимаете проблему. В общем случае соотношение между измеренным напряжением и величиной в цифровой форме, преобразованной 8-разрядным АЦП, следующее:

,

где ADC_VALUE - значение полученное при аналого-цифровом преобразовании,
V_measure - измеренная величина напряжения, V_REF - опорное напряжение для АЦП.

Теперь, по условиям нашей задачи, мы знаем что V_measure = V_REF = Vcc и в итоге результатом уравнения всегда будет значение равное 255 и оно не будет изменяться при изменении напряжения батареи. Такая ситуация всегда будет иметь место при измерении напряжение батареи, которое также используется в качестве источника опорного напряжения.

Для решения задачи без использования каких-либо внешних компонентов, AVR микроконтроллер имеет очень полезный встроенный узел, называемый внутренний Band Gap источник опорного напряжения (Band Gap Reference Voltage). Выходное напряжение этого источника около 1.1 В, и оно остается неизменным при изменении температуры и напряжения питания микроконтроллера. Это напряжение может подаваться на вход АЦП, как и любое внешнее напряжение, с единственным исключением, что делается это программно, без включения дополнительных внешних компонентов.

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

Рассмотрим наше уравнение

ADC_VALUE = V_measure * 255/V_REF ,

Но, решая измерить опорное напряжение V_BG , мы получим следующее выражение

ADC_VALUE = V_BG * 255/V_REF

И так как в нашем случае опорное напряжение АЦП равно Vcc (основной момент нашей задачи), то уравнение примет вид

ADC_VALUE = V_BG * 255/Vcc

Зная, что V_BG=1.1 В , из уравнения мы можем вычислить напряжение питания микроконтроллера

Vcc = 1.1 * 255/ADC_VALUE

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

Рассмотрим пример реализации.

Принципиальная схема

Мы используем три NiCad аккумулятора для питания микроконтроллера. Напряжение питания, при полностью заряженных аккумуляторах, составит 4.2 В. Нам необходимо включить светодиод, подключенный к порту PB0, если напряжение будет ниже 3.2 В.

Листинг

#include avrio.h #include avrinterrupt.h
// Global variables
float vcc;//variable to hold the value of Vcc
void setup_adc(void)
{
ADMUX = 0xE; //Set the Band Gap voltage as the ADC input
ADCSRA = (1ADEN)|(1ADATE)|(1ADIE)|(1ADSC)|5;
}
ISR(ADC_vect) //ADC End of Conversion interrupt
{
unsigned char adc_data;
adc_data = ADC>>2; //read 8 bit value
vcc = 1.1 * 255 / adc_data;
}
// Main program
// ***********************************************************
int main(void)
{
DDRB = DDRB | (1PB0); //set PB0 as output (for the LED).
sei(); //Activate interrupts setup_adc();
//setup the ADC

while(1)
{
// Infinite loop
if (vcc < 3.2)
{
PORTB |= (1PB0);
}
else
{
PORTB &= ~(1PB0);
}
}
}

Следует учитывать, что напряжение V_BG будет разное у разных микроконтроллеров, особенно из разных партий, и может находиться в пределах 1.01 В - 1.2 В, следовательно необходима будет калибровка. Таким образом, если вычисленное значение Vcc с использованием данного кода неправильное, необходимо проделать следующие действия: измерить вольтметром напряжение питания Vсс и, используя уравнение ниже и зная значение ADC_VALUE , вычислить значение V_BG

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

▌Измерить толщину сиськи
Изначально в проекте было заложено вот такое решение:

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

Ну, а дальше все просто. У оптопары H11L1M внутри стоит триггер Шмитта, т.е. есть некоторый гистерезис на включение и выключение. Включается он при токе через его светодиод примерно в 1мА, а выключается на токе 0.8мА.

Если посмотреть осциллограмму тока на светодиоде, сняв ее с резистора R35, то увидим такую картину для 220 вольт:


Разрешение 50мВ на деление, триггер стоит на 80мВ по спаду.

Включаться он должен на 100мВ, а выключаться на 80мВ, что будет 1мА и 0.8мА соответственно. Курсорами выделены моменты включения и выключения. Разница по времени, dx = 8.38ms

Если снизить напряжение до 110 вольт, то:

dx уменьшится до 6.94ms т.е. А что такое миллисекунда для микроконтроллера тикающего на мегагерцовых частотах? Да колоссальная величина! Замерить ее точно таймером в режие захвата не составляет проблем. Дальше сунуть в память таблицу соответствия и, казалось бы, все круто? Да, но не совсем…

Решение дешевое, простое. Но не слишком точное. А в ряде случаев его вообще не получится применить.

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

Вроде всяких там, сварочников, инверторов, мощных приводов и прочего. Что искажает форму синуса. Делая его вообще каким-то непотребным. А если это не синус, а херня какая-то, то все эти наши красивые построения основанные на таймингах пролетают. Во-первых, точность падает катастрофически, а она изначально была так себе. Во-вторых, калибровать придется каждый раз под новую сеть, раз и навсегда таблицы в память не забить. Ну и форма синуса зависит вовсе не от вас, а от ООО «Сварщик каннибал» расположенную в соседнем цехе.

Так что 220 вольт от 110 вы еще отличите, а вот о точности хотя бы до 5 вольт можно позабыть. Но в некоторых случаях большего и не требуется.

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

Первая мысль была поставить на горячей стороне преобразователь напряжения в частоту, просунув его через ту же оптопару. Но его надо было чем то питать на горячей стороне. Ставить конденсаторный источник вообще не хотелось. Можно было бы, конечно, сунуть мелкий модуль 220AC-5DC на обратноходовике, вроде TSP-05. Есть на Али, стоит недорого.

Надо на этот модуль обзор не полениться сделать. Классная штука для питания всякой маломощной шняги от 220 вольт. Но получалось бы довольно громоздко. Считай питальник, потом ПНЧ, оптика…

▌Трансформатор
Второй мыслью был обычный трансформатор. Купить самый маленький силовой транс какой можно найти и на вторичке измерять напряжение. Спросил у Элемента, что у них есть такого рода — подобрали ТПК-2.

В принципе пригодно, но нашлось решение лучше.

Крошечная фитюлька размером с бульонный кубик. Держит до 3кВ на пробой, соотношение витков 1:1, но это трансформатор тока 2мА:2мА. То есть мы подаем ему на вход ток и снимаем ток. Ток на входе задается просто резистором последовательно, а для получения напряжения на выходе тоже применяется резистор, параллельно.

Т.е. схема примерно выглядит так:

R1 подбирается таким, чтобы ток через обмотку не превысил 2мА, максимум он держит 10мА, но после 2мА теряется линейность и на выходе будет невесть что. Напряжение у нас 220-250 вольт, берем по верхней планке. Но это действующее, а нам нужно амплитудное. Т.е. умножаем 250 на корень из 2, чтобы получить амплитудное. 250*1.41 = 353,5 вольта. Получаем, что первое сопротивление должно быть 180 кОм.

Напряжение микроконтроллера у меня 5 вольт, поэтому резистор R2 нужен такой, чтобы на 2мА на нем было примерно 4.5 вольта, пол вольта оставляем еще в запас. Это будет примерно 2.2кОм.

Все, на выходе амплитуда теперь в районе 5 вольт, но вот засада. Она переменная. А нам нужны измерения 0…5 вольт. Что делать? Выпрямлять.

▌Дайте мне диод!

Можно поставить диод, он срежет отрицательную полуволну. Но тут есть одна тонкость. Если просто в лоб поставить диод перед нагрузочным резистором:

То на обратной полуволне получается, что мы будем обрывать трансформатор тока, а что получается при обрыве источника тока ? Правильно — бешеное напряжение. Ведь он будет изо всех сил пытаться продавить свои 2мА через ОГРОМНОЕ обратное сопротивление диода. В результате на диоде D1 высадится такое напряжение, что и пробить недолго. В таком включении ставить только мост или обратный диод D2, чтобы у тока всегда были пути на обратной полуволне.

Но это будет уже два диода. А зачем нам лишний полупроводник в схеме? Поэтому проще оставить параллельный резистор и после выпрямлять уже снятое напряжение.

Чтобы система работала, нужен еще один резистор. Дело в том, что у АЦП входное сопротивление ну очень большое, сравнимое с обратным включением диода, так что диод работать не будет, ему надо чтобы ток шел. Поэтому ставим второй резюк на 100кОм и с него уже снимаем наш сигнал.

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

Смотрите внимательней, синий это исходный синус с транса, а желтый это положительная полуволна с диода. От нулевой точки синус идет как и положено синусу, а вот диодная полуволна нарастает с заметной такой экспоненциальной кривизной и не доходит на величину падения на диоде (0.7 вольт примерно для 1N4148, что стоит у меня).

Экспонента берется из ВАХ диода

Мне, в моем проекте, это не сильно критично. НУ будет там возле нуля какая то кривуля, не важно.

▌Ваш диод говно, вы за кого меня принимаете? Дайте мне идеальный диод!
Но если бы было критично, то я бы сгородил идеальный диод. Делается он из диода и операционника. Схем много разных, первая что пришла в голову была такой.

Работает она просто.

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

На положительной полуволне ток I in =U вх /R3 со входа как бы течет в землю через резистор R3. Но поскольку на самом деле никакого КЗ там нет, более того через входы ОУ ничего не втекает и не вытекает (ну почти, там ничтожный мизер в реале). То ток текущий через R3 равный I in будет совершенно равен I out который из выхода ОУ течет через R3 в землю. Образуя падение напряжения U вых прямо пропорционально этому току через резистор. Т.е. U вых = I in *R3 = U вх Без каких либо искажений.

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

Вот такая вот незатейливая схема. Работает на двуполярном и однополярном питании.

Единственное, что для однополярного питания нужно брать усилок во-первых, строго однополярного питания (Single-supply) при этом способный принимать отрицательные значения на входах (Input Common-Mode Voltage Range), а во-вторых, с rail-2-rail выходом, иначе посрезает верхушки.

Т.е. ширпотреб вроде LM358 не прокатит, а что то вроде AD823 в самый раз. Для двуполярного питания же подойдет любой ширпотреб, ну может rail-2-rail будет не лишним, но опять же от напряжения питания зависит и требуемых уровней. Если не нужен полный размах от плюса до минуса питания, то ставим любое говно за три копейки и не паримся.

▌Нет! Засуньте вы этот диод знаете куда…

Второй вариант включения, немного получше, нет диода:

Тут включается напрямую в операционник. Соотношение резисторов точно такое же как и в первом варианте. Трансформатор закорачивается на виртуальную землю, а ток который там течет течет через резистор ОС. Но так как у нас питание однополярное, то нижняя полуволна просто зарывается в грунт. Требования к операционнику те же самые, что и в прошлой схеме. Rail-2-Rail и Single Supply.

▌Эй эй, зачем столько негатива? Будь на позитиве, бро!
Ну и третий вариант включения. Тут даже операционник не нужен, мы не выпрямляем и не срезаем нижнюю полуволну, а добавляем к ней постоянную составляющую. Закинув наш транс на середину делителя напряжения. Резистор на вторичке надо подобрать так, чтобы амплитуда не вылезала за напряжение питания и не проваливалась ниже его.

Результат выглядит примерно так:

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

▌А что Титов Китай?
Ну и для всяких ардуинщиков, не умеющих паять, есть готовый модуль.

Вот такие вот относительно простые варианты замерить сеть и не потерять гальваническую развязку.

Дистанционный вольтметр на микроконтроллере AVR - устройство, позволяющее удалённо измерять уровень переменных напряжений от нескольких источников (в данном исполнении - 6 каналов) и отображать полученные данные на шести дисплеях, каждый из которых это трёхразрядный семисегментный индикатор. Цифровой вольтметр на AVR обеспечивает постоянный контроль энергоснабжения оборудования, которое расположено на некотором расстоянии от рабочего места оператора. Сейчас устройство используется для измерения напряжения трех фаз на входе и на выходе промышленного нормализатора напряжения – трехфазного стабилизатора. Место оператора удалено от стабилизатора на расстояние около 800м.

Конструкция цифрового вольтметра представляет собой два модуля:

  • модуль измерения и передачи, расположенного непосредственно в месте измерения;
  • модуль приёма и отображения, установлен на рабочем месте оператора.

Соединение частей вольтметра выполнено обычной телефонной парой (лапшой). Для повышения устойчивости канала связи к радиопомехам может быть использована витая пара. Линия связи имеет гальваническую развязку от других элементов устройства, которые находятся под высоким напряжением, данные по каналу связи передаются токовым сигналом, величиной до 30мА.

Характеристики устройства:

  • Диапазон измеряемых напряжений: 100 – 330В переменного тока;
  • Частота измеряемых напряжений: 50Гц;
  • Частота измерений: 0,5 сек. (частота обновления измеряемых значений по 6 каналам);
  • Напряжение оперативного питания модуля приёма и отображения: 7 - 25В постоянного тока;
  • Уровень гальванической развязки модулей: 5,0кВ;
  • Погрешность измерения напряжения: ±1,5%.

В схеме цифрового вольтметра преобразование аналогового сигнала в цифровой производится с помощью АЦП, на базе микроконтроллера AVR - ATmega8. Измерение действующего значения напряжения реализовано на алгоритме определения пика синусоидального сигнала с последующим умножением его на амплитудный коэффициент синусоиды.

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

Индикация работы линии связи между модулями устройства обеспечивается светодиодом HL1, расположенным в модуле измерения.

Принципиальная схема модуля приёма и индикации цифрового вольтметра:

Оперативное питание модуля приёма и отображения обеспечивается внешним источником 7-25В постоянного тока. При нормальном функционировании вольтметра на AVR индикаторы отображают значения измеряемых напряжений. При нарушении канала связи или неисправности модуля измерения и передачи, то есть при отсутствии поступления данных от измерительного модуля в течении более 2-х периодов обновления данных (около 1,4 сек.) на индикаторах отображается - “Err”. При восстановлении связи индикация восстанавливается автоматически. Падение уровня напряжения на любом из каналов, за исключением первого, ниже 100В, вызывает отображение на соответствующем индикаторе прочерков “---”, а на остальных индикаторах выводятся измеряемые значения напряжений, соответственно.4.08 (12 Голосов)

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

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

Стандартами стран СНГ допускается разброс сетевого напряжения в диапазоне 187...242 В и изменение частоты в пределах 49...51 Гц. Однако эти параметры варьируются в зависимости от страны и континента (Табл. 3.1), что надо учитывать при разработке продукции на экспорт.

Таблица 3.1. Стандарты электрических сетей в разных странах

Для адаптации напряжения сети 220 В к низковольтным входам МК используют резистивные делители (Рис. 3.1, а...з), оптическую (Рис. 3.2, а...ж) и трансформаторную (Рис. 3.3, а...з) развязку. В двух последних случаях гарантируется гальваническая изоляция первичных и вторичных цепей, что повышает безопасность.

Рис. 3.1. Схемы неизолированных датчиков сетевого напряжения 220 В {начало):

а) диод VD1 отсекает отрицательную полуволну напряжения, резистором R2 регулируется амплитуда сигнала на входе МК (частота 50 Гц), конденсатор С1 устраняет помехи;

б) на вход МК поступает сигнал удвоенной частоты 100 Гц от мостового выпрямителя;

в) провод питания МК +5 В гальванически связан с сетыо 220 В. Резистор R1 ограничивает ток через внутренние защитные диоды МК (0.1...0.3 мА). Частота сигнала 50 Гц;

г) транзисторы VTI, VT2 образуют двухсторонний ограничитель напряжения с нагрузкой в виде резистора R2. Транзистор VT3 — усилитель-инвертор. Конденсатор С1 защищает МК от коммутационных помех, которые могут возникать в сети 220 В при работе тиристоров;

д) МК проверяет исправность симистора VS1 и отсутствие обрыва в нагрузке Конденсатор С1 имеет большую ёмкость, поэтому на входе МК напряжение усредняется. Резистором R2 устанавливается порог напряжения, ниже которого считается, что произошла авария;

е) для устройств, которые критичны к полярности включения вилки в сетевую розетку, «нуль» (N) и «фазу» (L) определяют стандартным прибором электрика «светящаяся отвёртка»;

ж) двухстороннее ограничение сетевого напряжения внутренними диодами МК. Конденсатор С1 высоковольтный (250 В переменного напряжения) на случай обрыва резистора R3.

Рис. 3.2. Схемы датчиков сетевого напряжения 220 В с оптической изоляцией (начало):

а) фототранзисторы оптопары VU1 закрываются на 0.1...0.2 мс в момент перехода сетевого напряжения через нуль. Точная длительность подбирается резистором R2, частота 100 Гц;

б) формирователь импульсов с частотой 50 Гц. Двойная гальваническая развязка: на оптопа-ре VU1 и на трансформаторе 77. Коллекторной нагрузкой оптопары служит внутренний резистор МК. Диод Шоттки VD1 защищает излучатель оптопары VU1 от обратного напряжения;

в) аналогично Рис. 3.2, а, но на двух отдельных оптопарах и без транзисторного ключа;

г) МК проверяет отсутствие обрыва в нагрузке по наличию импульсных сигналов с частотой 50 Гц. Диоды VD1... VD6 запараллелены (встречно) для максимальной симметрии схемы;

Рис. 3.2. Схемы датчиков сетевого напряжения 220 В с оптической изоляцией (окончание)".

д) двухкаскадный формирователь сетевых импульсов на транзисторах VTI, VT2. Частота сигнала на входе МК 100 Гц. Питание первичной стороны формирователя осуществляется от параметрического стабилизатора, собранного на элементах R3, VD2, VD3, С1. Диодный мост VD1 должен быть рассчитан на обратное напряжение не менее 400 В;

е) индикатор наличия сетевого напряжения с гальванической развязкой на оптопаре VU1. Элементы С1, R2 служат соответственно реактивным и активным балластом для стабилитрона VD5. При отключении сети 220 В конденсатор С1 быстро разряжается через резистор R1 (доли секунды). Это повышает безопасность, иначе конденсатор может разрядиться через тело человека, если случайно прикоснуться к обесточенной сетевой вилке руками;

ж) светодиод HL1 индицирует наличие сетевого питания и защищает излучатель оптопа-ры VU1 от обратного напряжения. Резистор RI при положительной полуволне задаёт ток через оптопару, а при отрицательной — через светодиод HL1. Частота импульсов на входе МК 50 Гц.

Рис. 3.3. Схемы датчиков сетевого напряжения 220 В с трансформаторной развязкой {начало):

а) транзисторный формирователь импульсов с частотой 100 Гц. Конденсатор С2 подавляет импульсные помехи. Резистор RI подбирается так, чтобы транзистор VT1 был гарантированно открыт при самом низком сетевом напряжении. Оно, в свою очередь, определяется коэффициентом передачи трансформатора 77. Напряжение с диодного моста VD1...VD4 поступает также в систему основного питания, которая формирует напряжение +5 В для МК;

б) детектор перехода сетевого напряжения через нуль. Компаратор DA1 увеличивает крутизну фронтов сигнала и повышает помехоустойчивость. Выход компаратора (открытый коллектор) нагружен на «pull-up» резистор R3. Диоды VD5, VD6 ограничивают напряжение на входах компаратора на уровне 0.6...0.7 В при положительной полуволне сетевого напряжения, а диоды, входящие в мост VDI...VD4, — при отрицательной полуволне;

в) на резисторе R2 выделяется пульсирующее напряжение частотой 100 Гц. Конденсатор С1 подавляет ВЧ-помехи. Элементы VD3, R1 защищают МК от всплесков сетевого напряжения. Диоды VD1, VD2должны соединяться с адаптером А1 отдельными проводами;

г) с диодного моста VDI... VD4 пульсирующее напряжения частотой 100 Гц поступает на входы аналогового компаратора МК. Стабилитроны VD5, VD6 должны иметь пороговое напряжение ниже, чем напряжение питания М К (в данном случае это+5 В). Диоды VD7, VD8защищают М К от большого разбаланса напряжений на входах компаратора;

Рис. 3.3. Схемы датчиков сетевого напряжения 220 В с трансформаторной развязкой (окончание):

д) формирователь прямоугольных импульсов ТТЛ-уровня из переменного сетевого напряжения 9... 12 В. Задействуется свободный канал микросхемы DA1 (драйвер интерфейса RS-232), имеющий на входе триггер Шмитта. Цепочка RI, С2служит фильтром ВЧ-помех;

е) резисторы R2, R3 образуют делитель с уровнем +2.5 В, чтобы АЦП МК работал в линейном режиме. Частота импульсов, снимаемых с диодного ограничителя VD3, VD4, — 50 Гц;

ж) аналогично Рис.3.3, г, но с двумя парами ограничительных диодов Шоттки VD2...VD5. Это, очевидно, перестраховка на случай выхода из строя диодов, находящихся в мосту VDI;

з) амплитуда входного напряжения МК с частотой пульсаций 100 Гц регулируется резистором R2. Конденсатор большой ёмкости С1 при отключении сети поддерживает некоторое время напряжение питания +5 В, чтобы МК успел корректно закончить программные процедуры.

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

Первое о чем нужно сказать — АЦП микроконтроллера умеет измерять только напряжение. Чтобы произвести измерение других физических величин, их нужно вначале преобразовать в напряжение. Сигнал всегда измеряется относительно точки называемой опорное напряжение, эта же точка является максимумом который можно измерить. В качестве источника опорного напряжения (ИОН), рекомендуется выбирать высокостабильный источник напряжения, иначе все измерения будут плясать вместе с опорным.

Одной из важнейших характеристик является разрешающая способность, которая влияет на точность измерения. Весь диапазон измерения разбивается на части. Минимум ноль, максимум напряжение ИОН. Для 8 битного АЦП это 2^8=256 значений, для 10 битного 2^10=1024 значения. Таким образом, чем выше разрядность тем точнее можно измерять сигнал.

Допустим вы измеряете сигнал от 0 до 10В. Микроконтроллер используем Atmega8, с 10 битным АЦП. Это значит что диапазон 10В будет разделен на 1024 значений. 10В/1024=0,0097В — с таким шагом мы сможем измерять напряжение. Но учтите, что микроконтроллер будет считать, величину 0.0097, 0.0098, 0.0099… одинаковыми.

Тем не менее шаг в 0,01 это достаточно неплохо. Однако, есть несколько рекомендаций, без которых эта точность не будет соблюдена, например для измерения с точностью 10бит, частота на которой работает АЦП должна быть 50-200 кГц. Первое преобразование занимает 25 циклов и 13 циклов далее. Таким образом, при частоте 200кГц мы сможем максимум выжать
200 000/13 = 15 384 измерений.

В качестве источника опорного напряжения можно использовать внутренний источник и внешний. Напряжение внутреннего источника (2,3-2,7В) не рекомендуется использовать, по причине низкой стабильности. Внешний источник подключается к ножке AVCC или Aref, в зависимости от настроек программы.

При использовании АЦП ножка AVCC должна быть подключена. Напряжение AVCC не должно отличаться от напряжения питания микроконтроллера более чем на 0,3В. Как было сказано, максимальное измеряемое напряжение равно опорному напряжению(Vref), находится оно в диапазоне 2В-AVCC. Таким образом, микроконтроллер не может измерить более 5В.

Чтобы расширить диапазон измерения, нужно измерять сигнал через делитель напряжения. Например, максимальное измеряемое напряжение 10В, опорное напряжение 5В. Чтобы расширить диапазон измерения, нужно уменьшить измеряемый сигнал в 2 раза.

Формула для расчета делителя выглядит так:

U вых = U вх R 2 /(R 1 + R 2)

Подставим наши значения в формулу:

5 = 10*R2/(R1+R2)

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

Следовательно, когда мы измеряем напряжение через делитель, нужно полученное значение АЦП умножить на коэффициент=Uвых/Uвх.

Полная формула вычисления измеряемого напряжения будет выглядеть так:
U=(опорное напряжение*значение АЦП*коэффициент делителя)/число разрядов АЦП

Пример: опорное 5В, измеренное значение АЦП = 512, коэффициент делителя =2, АЦП 10разрядный.

(5*512*2)/1024=5В — реальное измеренное значение напряжения.

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

Перейдем к программной реализации. Создаем проект с указанными параметрами. Также подключим дисплей на порт D для отображения информации.

Измерение будет производиться в автоматическом режиме, обработка кода в прерывании, опорное напряжение подключаем к ножке AVCC. По сути нам нужно только обрабатывать получаемые данные. Измеренные данные хранятся в переменной adc_data. Если нужно опрашивать несколько каналов, то выбираем какие каналы сканировать, а данные будут для ножки 0 в adc_data, для ножки 1 в adc_data и т.д.

В основном цикле добавим строки:

result=((5.00*adc_data)/1024.00); //пересчитываем значение АЦП в вольты
sprintf(lcd_buffer,»U=%.2fV»,result); //помещаем во временную переменную результат
lcd_puts(lcd_buffer); //выводим на экран

Небольшое замечание, чтобы использовать числа с плавающей точкой, нужно в настройках проекта изменить (s)printf Features: int, width на float, width, precision. Если этого не сделать десятые и сотые мы не увидим.

Таким образом, мы всего лишь перевели значение АЦП в вольты и вывели на дисплей. Результат в протеусе выглядит так:

Резистором можно менять напряжение, измеряемое напряжение выведено на дисплей. При сборке на реальном железе к ножке Aref нужно подключить конденсатор на 0,1мкФ. Урок получился немного сложным, но думаю он вам понравится.

Файл протеуса и прошивка:

Update:
Измерение тока:

Понравилась статья? Поделитесь ей