0

Измерение переменного напряжения микроконтроллером

Блог о электронике

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

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

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

Ну, а дальше все просто. У оптопары 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, что стоит у меня).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Задача кто в каком доме живет

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

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

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

Там же не али можно взять. Стоит не дорого, на нем схема с поднятием нуля на LM358 и можно еще амплитуду подкрутить переменником. Схемотехника там примерно следующая:

Но это не точно.

Вот что он выдает у меня в мастерской с сети:

Когда сети нет, то на выходе постоянка в 2.5 вольта. А появление сети дает вот такую синусоиду с центром 2.5 и размахом от 1 до 4 вольт. Подстроечником можно менять амплитуду сигнала, но это вот максимум. Выше уже начинаются искажения — срезает вершину.

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

48 thoughts on “Замер сетевого напряжения”

то есть транс нужен обязательно. а если на аналоговый компаратор этот сигнал подать, то не нужен zero cross detector?
(для тиристорного управления нагрузкой переменного тока)

Ну, в принципе можно без него обойтись, только учти, что транс сдвигает фазу, градусов на 30 вроде бы. Надо в ДШ это посмотреть. Так что то, что ты увидишь после транса сильно будет запаздывать с тем, что в реале. Так что я бы зекрокрос оставил на горячей стороне. Вроде бы есть про это отдельные микрухи с опторазвязкой.

Когда то нарыл в сети простой Zero Cross Detector. Жил он на сайте dextrel.net/diyzerocrosser.htm (сейчас там 404)…

Достаточно интересный. Открывает транзистор оптопары при переходе через 0, на короткое время.

парсер съел ссылку на картинку
страница прсмотра картинки : picua.org/?v=2018-03-23_4wcqos13o8d27yk9m0mx39dcn.jpg

Оффтоп: Вот как в комментарий добавить картинку или активную ссылку ?

Просто ее вставить. Работают хтмл тэги (НЕ ББ КОДЫ!)

Вставлял. Но комментарий ушел на премодерацию и, возможно, из-за этого съелись теги.

Прямая проекция размаха сетевого напряжения на диапазон АЦП.
Для атмег диапазон АЦП — 1024 отсчета.
Т.е. 254 вольта при идеальном подборе резисторов укладываются в 1024 отсчета. Что дает точность 0,25 вольта. В идеале. В реале младшие 2 бита достаточно шумят. И их надо отбрасывать или усреднять несколько показаний. А усреднять на синусоиде — не всегда удобно.
Либо возиться с усреднением по нескольким полупериодам.
Иначе получим точность 1 вольт/отсчет.
А хотелось бы более точно измерить. Что бы, например, диапазон 170-250 вольт растянуть на 1024 отсчета АЦП. 80 вольт — не 250…
Вот и вопрос — как отбросить лишние 170 вольт ?

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

Блог о электронике

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

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

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

Ну, а дальше все просто. У оптопары 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, что стоит у меня).

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

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

Читайте также:  Беспроводные наушники свен как подключить к телефону

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Там же не али можно взять. Стоит не дорого, на нем схема с поднятием нуля на LM358 и можно еще амплитуду подкрутить переменником. Схемотехника там примерно следующая:

Но это не точно.

Вот что он выдает у меня в мастерской с сети:

Когда сети нет, то на выходе постоянка в 2.5 вольта. А появление сети дает вот такую синусоиду с центром 2.5 и размахом от 1 до 4 вольт. Подстроечником можно менять амплитуду сигнала, но это вот максимум. Выше уже начинаются искажения — срезает вершину.

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

48 thoughts on “Замер сетевого напряжения”

то есть транс нужен обязательно. а если на аналоговый компаратор этот сигнал подать, то не нужен zero cross detector?
(для тиристорного управления нагрузкой переменного тока)

Ну, в принципе можно без него обойтись, только учти, что транс сдвигает фазу, градусов на 30 вроде бы. Надо в ДШ это посмотреть. Так что то, что ты увидишь после транса сильно будет запаздывать с тем, что в реале. Так что я бы зекрокрос оставил на горячей стороне. Вроде бы есть про это отдельные микрухи с опторазвязкой.

Когда то нарыл в сети простой Zero Cross Detector. Жил он на сайте dextrel.net/diyzerocrosser.htm (сейчас там 404)…

Достаточно интересный. Открывает транзистор оптопары при переходе через 0, на короткое время.

парсер съел ссылку на картинку
страница прсмотра картинки : picua.org/?v=2018-03-23_4wcqos13o8d27yk9m0mx39dcn.jpg

Оффтоп: Вот как в комментарий добавить картинку или активную ссылку ?

Просто ее вставить. Работают хтмл тэги (НЕ ББ КОДЫ!)

Вставлял. Но комментарий ушел на премодерацию и, возможно, из-за этого съелись теги.

Прямая проекция размаха сетевого напряжения на диапазон АЦП.
Для атмег диапазон АЦП — 1024 отсчета.
Т.е. 254 вольта при идеальном подборе резисторов укладываются в 1024 отсчета. Что дает точность 0,25 вольта. В идеале. В реале младшие 2 бита достаточно шумят. И их надо отбрасывать или усреднять несколько показаний. А усреднять на синусоиде — не всегда удобно.
Либо возиться с усреднением по нескольким полупериодам.
Иначе получим точность 1 вольт/отсчет.
А хотелось бы более точно измерить. Что бы, например, диапазон 170-250 вольт растянуть на 1024 отсчета АЦП. 80 вольт — не 250…
Вот и вопрос — как отбросить лишние 170 вольт ?

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

Вольтметры на микроконтроллере – что может быть проще? Это так, если речь идет об измерении на постоянном токе, или определения мгновенных значений переменного. Но измерение действующего значения переменного напряжения, тем более несинусоидальной формы – нетривиальная задача. Однако, и она решаема, причем на достаточно простом и недорогом микроконтроллере семейства AVR.

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

Итак, сначала микро-экскурс в теорию. Как известно, действующим значением переменного тока и напряжения называют величину, которая принимается в расчетах выделяющейся теплоты или мощности. Для постоянного тока действующее значение равно амплитудному, среднему и мгновенному, для переменного тока – это все разные величины.

Мгновенное значение переменного напряжения – это абсолютный уровень напряжения в конкретный момент времени, одиночный отсчет. Амплитудное значение – это наибольшее значение синусоиды (или другой кривой для несинусоидальной формы сигнала) за период. Амплитудное значение берется по модулю, т.е. не бывает минусовой и плюсовой амплитуды. Среднее значение, как следует из самого термина, это сумма всех мгновенных значений (отсчетов) за период, деленная на количество отсчетов. Математически – это интеграл мгновенных значений за период. Очевидно, что для синусоидальной формы среднее за период значение будет равно нулю. Если форма кривой напряжения искажена, то среднее значение за период может оказаться ненулевым – тогда оно получает название постоянной составляющей переменного напряжения. Наконец, действующее или эффективное значение напряжения – это величина, численно равная половине интеграла квадрата мгновенных значений напряжения за период. Поэтому его еще называют среднеквадратичным напряжением.

Теперь подумаем, как эта теория поможет нам решить нашу задачу. В МК мы имеем дело с АЦП, которое (в некотором приближении) способно давать нам отдельные отсчеты напряжения, т.е. оно умеет определять мгновенные значения напряжения. Легко понять, что для определения действующего значения нам необходимо проинтегрировать (т.е. просуммировать) квадраты результатов АЦП, взятых через равные промежутки в течение одного периода измеряемого напряжения. Почему я не говорю о необходимости делить сумму квадратов пополам, хотя теория вроде бы этого требует? Да потому, что АЦП дает нам результат в абстрактных числах, оторванных от реальности. Чтобы из этой абстракции получить реальное значение, нам все равно надо умножить их на какой-то размерный коэффициент, в котором может быть учтено то самое деление на 2. Поясню: если «один шаг» АЦП соответствует 0,02В напряжения, то для перевода в реальные вольты нам надо умножить результат АЦП на 0,02. Если же в процессе вычислений нам потом потребуется разделить эти значения на 2, так не проще ли умножать сразу на коэффициент 0,01В?!

Наметим алгоритм нашей программы. В общих чертах он будет таким:

  1. Получить через равные промежутки N отсчетов АЦП в течение одного периода измеряемого напряжения.
  2. Возвести результаты в квадрат и просуммировать.
  3. Извлечь квадратный корень из полученной суммы.
  4. Умножить полученный результат на масштабирующий коэффициент и вывести результат на индикатор.

Чтобы наш вольтметр показывал значение непрерывно, этот алгоритм надо выполнять циклически.

Теперь давайте разбираться с деталями. Прежде всего, определимся с числом отсчетов N. Казалось бы, все просто: чем оно больше, тем точнее результат. И это действительно так, однако не следует забывать о том, что в нашем распоряжении не суперкомпьютер, а всего лишь микроконтроллер AVR, возможности которого весьма ограничены.

Прежде всего, есть ограничение на скорость работы АЦП. Atmel рекомендует использовать АЦП при работе от тактовой частоты не более 200 кГц, иначе будет увеличиваться погрешность результатов. Один цикл измерений АЦП длится (в установившемся режиме) 13 тактов, т.е. при любых ухищрениях мы не сможем использовать АЦП чаще, чем 15384 раза в секунду, если хотим получать все 10 бит результата верно. Прикинем, что же мы получаем в результате. Длительность периода сетевого напряжение 20 мс. При вышеобозначенной частоте семплов за один период мы просто не успеем получить более 307 отсчетов. Конечно, если немного пожертвовать точностью, можно увеличить скорость АЦП и соответственно, число отсчетов за период.

Читайте также:  Зимний дом для кошек своими руками

Другое важное ограничение – это быстродействие математических операций. Возведение в квадрат – процедура очень затратная по числу тактов работы микроконтроллера, и если выполнять интегрирование «на лету», т.е. по мере поступления результатов из АЦП, частота семплирования в 15К будет недостижима даже в теории. Выход один – быстро накапливать нужное количество данных в массиве, а потом неторопясь их обрабатывать. И тут мы наталкиваемся на третье ограничние – объем ОЗУ. Теоретически максимальное количество отсчетов из 307-и 10-битовых чисел потребует для хранения 614 байт ОЗУ, что уже больше всей имеющейся памяти во многих МК, а для, например, Atmega8 составляет больше половины. А ведь для работы нам еще нужно место под стек, под другие промежуточные переменные. Так что число отсчетов N=307 можно считать абсолютно максимальным для всех МК с объемом ОЗУ 1К и менее.

Для заполнения массива отсчетов используем прерывание по завершению цикла АЦП. То есть определим переменную-индекс, указывающую на очередной элемент нашего массива, а в обработчике этого прерывания будем сохранять по этому индексу результат АЦП в массиве и увеличивать индекс. Так как по нашим расчетам с момента первого семпла и до последнего (307-го) должно пройти 20 миллисекунд, можно считать, что задача получения мгновенных значений напряжения за период нами решена. Однако, надо же контролировать выход индекса за пределы допустимого значения, т.е. делать проверку – не больше ли 307-и семплов мы сделали? Естественно, нужно быть уверенным, что время всех дополнительных расчетов не увеличит периодичность поступления семплов, иначе не миновать больших ошибок.

Предположим, мы наконец-то получили наш массив отсчетов, и теперь необходимо провести его обработку. Вы себе представляете возведение в квадрат на ассемблере? А извлечение квадратного корня? Конечно, все решаемо, но гораздо проще применить встроенные функции языка Си square и sqrt. Отсюда 2 неизбежных вывода: программу мы делаем на Си и все предыдущие рассуждения требуют корректировки. Этот ошарашивающий вывод следует понимать так: Си – язык высокого уровня, и потому существенно более медленный, чем ассемблер. Значит, процедуры обработки прерываний могут потребовать больше времени, чем мы рассчитывали, т.е. нарушить стройные расчеты количества и частоты семплов. Значит, надо обязательно проконтролировать время исполнения критических участков нашей программы (например, в той же AVR Studio), и, если окажется, что период семплирования существенно больше расчетного, провести корректировку всех расчетов – от количества семплов до частоты АЦП. Но забудем на время об этом.

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

Надеюсь, принцип понятен. Теперь несколько слов о не затронутых проблемах. Прежде всего, все наши размышления относились к измерению сетевого напряжения, т.е. напряжения с частотой 50 Гц. При других частотах, наша программа будет давать результат с погрешностью. Величина этой погрешности будет минимальна, если в 20 мс будет укладываться целое число периодов напряжения (для симметричных форм сигнала – полупериодов). Если число целых периодов (полупериодов) будет не целое, погрешность будет максимальна, причем характер показаний вольтметра будет иметь вид «биений». Так как напрасно ожидать высокой точности от численного интегрирования при числе семплов за период менее нескольких десятков, то верхнее значение частоты для измеряемого напряжения в реальности будет не больше 200 Гц. Короче говоря, мы все-таки сделаем прибор только на 50 Гц. Хотя на 25 он будет работать совсем не плохо. Разумеется, прибор покажет верное значение для любой формы переменного напряжения 50 Гц, а так же для постоянного тока.

В подтверждение всех изложенных выкладок (и для их проверки) привожу конкретный пример реализации вольтметра. Я не собирал реальную схему, ограничился проектом в протеусе. Однако полученные при моделировании результаты полностью подтвердили изложенное и позволяют утверждать, что реальная схема с минимальными доработками (источник питания и защитные цепи) будет работать. Предлагаемая прошивка для МК полностью работоспособна – дорабатывайте схему, делайте печатную плату и пользуйтесь. Однако, я делал ее по-своему, т.е. чуть-чуть иначе, чем только что рассказал. Самое главное, что в моей программе не так – это число семплов в массиве: у меня их 256. Из-за этого мне пришлось отказаться от «естественной» частоты семплов и привязать их к таймеру, это в свою очередь потребовало поднять рабочую частоту АЦП до 250 кГц (при тактовой частоте МК в 8 мГц). Кстати, получить 250 кГц для АЦП от встроенного RC-генератора меги гораздо проще, чем 200, так что не исключаю, что при написании собственной программы вы тоже будете вынуждены пойти по моему пути.

Проект для Proteus 7.1 Pro SP2 и файл прошивки можно скачать в файловом архиве. В проекте штрих-пунктиром обведена часть, которая собственно вольтметр. А левее – это источник тестового сигнала. Входной мост и делитель напряжения должны быть с запасом рассчитаны на входное напряжение, лучше выбирать 1000-вольтовые диоды, они-то уж точно выдержат. Делитель лучше сделать именно как показано на схеме – из трех резисторов, т.к. один резистор соответствующего номинала может не выдержать высоких напряжений. Еще лучше взять больше резисторов, кстати, проще будет и коэффициент деления подобрать. На схеме не показаны многие нюансы, например, защитный стабили-трон на входе АЦП, но это именно нюансы. Моя прошивка обеспечивает измерение напряжений до 710В, при этом погрешность не более 2В для синусоидальной формы напряжения. Для других форм напряжения погрешность может увеличиться, но не сильно. Думаю, в 5% точно уложится. Для простого прибора со шкалой 10-700В неплохо, не так ли? Прошивка имеет особенность: если на вход подано напряжение с амплитудным значением более 1000В (примерно), прибор покажет символ «Е» – перегрузка. Это произойдет даже если действующее значение будет существенно меньше 700В.

Добавить в любимые (0) | Просмотров: 76179

1 Написал(а) Сюрикен, в 15:54 21.02.2008
-5
хде настоящая схема? хде исходник?
2 Написал(а) Дмитрий, в 16:28 17.03.2008
Уж прямо так сложно возвести в квадрат на ассемблере. Это простое умножение числа на самого себя, а в мегах для этого есть аппаратный умножитель. Можно успеть во время преобразования АЦП и никакой такой большой памяти не потребуется.
Регенерацию семисегментных индикаторов тоже можно делать с каждым отсчетом АЦП, только данные подготовить придется заранее – сразу после вычисления корня.
Можно попытаться это написать и на C – тонкий момент будет только в умножении из-за чрезмерно прожорливых процедур арифметики, но можно сделать ассемблерную вставку.
3 Написал(а) ARV, в 08:15 19.03.2008
несколько муторно выглядит процедура извлечения корня на ассемблере, возведение в квадрат – ничего, жить можно
4 Написал(а) Руслан, в 15:38 15.04.2009
Помоги с текстом программы
5 Написал(а) Олег, в 14:27 21.05.2009
[QUOTE]действующее или эффективное значение напряжения — это величина, численно равная половине интеграла квадрата мгновенных значений напряжения за период[/QUOTE]
тут, наверное, имелся в виду корень из этого интеграла, и еще интеграл надо поделить на измеряемый период. Иначе размерность будет отлична от Вольта
6 Написал(а) Александр, в 15:11 29.09.2010
Кто-нибудь видел текст программы?
7 Написал(а) ARV, в 18:37 29.09.2010
никто не видел материал носит характер теории, а практика – ваше дело
8 Написал(а) salikoff, в 18:59 08.10.2010
Есть вопрос по алгоритму:
1. Получить через равные промежутки N отсчетов АЦП в течение одного периода измеряемого напряжения.
2. Возвести результаты в квадрат и просуммировать.
3. Извлечь квадратный корень из полученной суммы.
4. Умножить полученный результат на масштабирующий коэффициент и вывести результат на индикатор.
2 пункт. После суммирования нужно сумму поделить на N (количество сэмплов за период). Потом можно уже и корень извлекать
4 пункт. О каком масштабирующем коэффициенте идет речь? Почему мы должны делить на 2?
9 Написал(а) ARV, в 18:59 08.10.2010
Все вопросы – на форуме.
10 Написал(а) Евгений, в 14:43 04.12.2010
Я писал программу для такой задачи, точнее это было частью задачи. Использовал Code Vision. 64 выборки, использовал старшие 8 бит результата так как в младших, я слышал, мусор бывает. Программа на С, кроме вычисления среднего значения в свободное время(раз в период 50Гц)просчитывала сложное уравнение с умножением Float на Float и прочие страшные вещи, опрашивала часы DS1307, термометр DS18B20 изредка, и передавала результаты в компьютер. Работает в "железе". Ничего сложного тут особо нет, думаю. Контроллер мега8, частота 7,3728
11 Написал(а) Grisha, в 21:19 10.02.2015
У Вас стоит диодный мост после которого получается напряжение от 0 до опорного ацп скажем 3,3 вольта. А как быть если есть датчик тока на выходе которого напряжение от 0 до 3,3 где ноль измеряемого это 1,65 вольта, тоесть половина?

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

admin

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

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