Встраиваемый ампервольтметр на ATmega8

Работа с АЦП микроконтроллера ATmega8

АЦП – аналогово-цифровой преобразователь (ADC- Analog-to-Digital Converter). Преобразует некий аналоговый сигнал в цифровой. Битность АЦП определяет точность преобразования сигнала. Время преобразования – соответственно скорость работы АЦП. АЦП встроен во многих микроконтроллерах семейства AVR и упрощает использование микроконтроллера во всяких схемах регулирования, где требуется оцифровывать некий аналоговый сигнал. Рассмотрим принцип работы АЦП. Для преобразования нужен источник опорного напряжения и собственно напряжение, которое мы хотим оцифровать (напряжение, которое преобразуется должно быть меньше опорного). Также нужен регистр, где будет храниться преобразованное значение, назовем его Z. Входное напряжение = Опорное напряжение*Z/2^N, где N – битность АЦП. Условимся, что этот регистр, как у ATmega8, 10-ти битный. Преобразование в нашем случае проходит в 10 стадий. Старший бит Z9 выставляется в единицу.

Далее генерируется напряжение (Опорное напряжение*Z/1024), это напряжение, с помощью аналогового компаратора сравнивается с входным, если оно больше входного, бит Z9 становиться равным нулю, а если меньше – остается единицей. Далее переходим к биту Z8 и вышеописанным способом получаем его значения. После того, как вычисление регистра Z окончено, выставляется некий флаг, который сигнализирует, что преобразование закончено и можно считывать полученное значение. На точность преобразования могут очень сильно влиять наводки и помехи, а также скорость преобразования. Чем медленнее происходит преобразования – тем оно точней. С наводками и помехами следует бороться с помощью индуктивности и емкости, как советует производитель в даташите: Встраиваемый ампервольтметр на ATmega8

В микроконтроллерах AVR как источник опорного напряжения может использоваться вывод AREF, или внутренние источники 2,56В или 1,23В. Также источником опорного напряжения может быть напряжение питания. В некоторых корпусах и моделях микроконтроллеров есть отдельные выводы для питания АЦП: AVCC и AGND. Выводы ADCn – каналы АЦП.

С какого канала будет оцифровываться сигнал можно выбрать с помощью мультиплексора. Теперь продемонстрируем примером сказанное выше. Соорудим макет, который будет работать как вольтметр с цифровой шкалой. Условимся, что максимальное измеряемое напряжение будет 10В. Также пусть наш макет выводит на ЖКИ содержимое регистра ADC.

Напряжение питания и тактовая частота

– 2.7 — 5.5V for ATmega8L

– 4.5 — 5.5V for ATmega8

Имеется две модификации данного МК: одна работоспособна при широком диапазоне питающих напряжение, вторая — в узком.

— ATmega8L: 0 – 8 MHz @ 2.7 — 5.5V

— ATmega8: 0 – 16 MHz @ 4.5 — 5.5V

Максимальная тактовая частота:

— Atmega8L: 0 – 8 МГц при напряжении питания 2,7 – 5,5 вольт

— Atmega8: 0 – 16 МГц при напряжении питания 4,5 – 5,5 вольт.

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

Power Consumption at 4 Mhz, 3V, 25°C

— Active: 3.6 mA

— Idle Mode: 1.0 mA

— Power-down Mode: 0.5 µA

Потребляемая мощность:

— при работе на частоте 4 МГц и напряжении питания 3 вольта потребляемый ток: 3,6 миллиампер,

— в различных режимах энергосбережения потребляемый ток: от 1 миллиампер до 0,5 микроампера

Делаем вольтметр на базе Arduino

Встраиваемый ампервольтметр на ATmega8

Обычно при построении различных вольтметров на базе Arduino предполагают, что напряжение питания Vcc строго равно 5В. Но это далеко не так, точнее – совсем не так. Как результат – немалая погрешность в измерениях.

Малоизвестной особенностью Arduino и многих других AVR является возможность измерения внутреннего опорного напряжения 1.1В.

Эта возможность может быть использована для повышения точности функции Arduino analogRead ()или для измерения питающего напряжения (Vcc), что обеспечивает средство мониторинга напряжения питания (например, батареи) без задействования драгоценного аналогового входа.

Другие «знатоки» считают, что указание analogReference(INTERNAL) или DEFAULTболее чем достаточно.

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

Зачем всё это

Не проще ли просто мигать светодиодиками как все и радоваться жизни, что вы — крутые микроэлектронщики ?

Есть как минимум две причины, чтобы точно и правильно измерить напряжение, подаваемое на ваш Arduino (Vcc). Первая причина — если наш проект на батарейках или аккумуляторах и мы хотим следить за напряжением Vcc как мерилом уровня заряда батарей.

Вторая — когда питание производится от батареи или от USB, Vcc не будет равно 5В, так что, если мы хотим сделать точные аналоговые измерения мы должны либо использовать внутреннее опорное напряжение 1.1В, либо внешнее опорное напряжение.

Почему?

Даже официальная документация по Arduino analogReadтакже приводит нас к этому неправильному допущению. Факт, что напряжение по умолчанию не 5.0 вольт.

Если ваше питание не идеально отрегулировано или если вы работаете от батареи, это напряжение может немного изменяться. Вот пример, иллюстрирующий проблему:

double Vcc = 5.0; // не всегда так int value = analogRead(0); double volt = (value / 1023) * Vcc; // правильно если Vcc = 5.0В

Я экспериментальным путем выяснил, что на разных ПК при питании от USB напряжение пина 5V на Arduino составляет около 4.5В; при питании от аккумулятора типа «Крона» (8.4В) — 4.97В.

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

  • внутренний источник 1.1В (в некоторых 2.56В)
  • внешний опорный источник
  • Vcc

Внешний источник опорного напряжения является наиболее точным, но требует дополнительного оборудования. Внутренний reference стабилен, но имеет погрешность +/- 10%. Голый Vcc полностью ненадежен в большинстве случаев.

Выбор внутреннего reference оправдан, но в большинстве случаев мы бы хотели измерять более широкий диапазон, поэтому выбор Vcc является наиболее практичным, но потенциально наименее точным и в некоторых случаях полностью ненадежным!

Как правильно

Многие AVR чипы, включая серию ATmega и многие из ряда Attiny обеспечивают средства для измерения внутреннего опорного напряжения. Зачем это кому-то надо? Причина проста — путем измерения опорного напряжения мы можем определить точное значение Vcc.Вот как это делается:

Сначала устанавливаем опорное (reference) напряжение в значение Vcc
Измеряем внутреннее опорное напряжение
Рассчитываем величина Vcc

Наше измеренное напряжение

Vcc * (АЦП-измерение) / 1023

которое, как мы знаем равно 1.1В. Согласно даташиту на ATMEGA 328 оно может быть равно:

  • минимально 1.0В,
  • обычно 1.1В,
  • максимально 1.2В.

Забегая вперед скажу, что эта константа требует ручной калибровки, у меня она получилась равной 1.179В.

АЦП у Arduino имеет разрядность 10 бит, это означает, что входное напряжение от 0В до 5В преобразовывается в целочисленное значение от 0 до 1023. Вот откуда здесь число 1023.

Далее рассчитываем Vcc и получаем:

Vcc = 1.1 * 1023 / АЦП-измерение

Другими словами, вся фишка в том, чтобы выяснить реальное напряжение питания Vcc, читая internal 1.1V reference и используя Vcc в качестве эталона. Затем с помощью простой математики высчитываем реальное Vcc.

Кусок кода функции выглядит так:

ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); ADCSRA |= _BV(ADSC); // Начало преобразований while (bit_is_set(ADCSRA,ADSC)); // измерение uint8_t low = ADCL; // сначала нужно прочесть ADCL – это запирает ADCH uint8_t high = ADCH; // Разлочить оба float result = (high

Популярные статьи  8 признаков, которые помогут выбрать сахарный арбуз почти со 100% вероятностью

Работа схемы

Схема устройства приведена на следующем рисунке.

Встраиваемый ампервольтметр на ATmega8

Принципы взаимодействия микроконтроллера AVR с ЖК дисплеем можно изучить в этой статье (или, если в сокращенной форме, то в этой).

Напряжение на резисторах R2 и R4 (точка, где мы измеряем напряжение) не будет полностью линейным, оно будет зашумлено. Для фильтрации этого шума в схему включен конденсатор C6.

Аналого-цифровой преобразователь (АЦП) микроконтроллера ATmega8 может быть использован на любом из четырех каналов PORTC – мы выберем канал 0 (PIN0) PORTC.

В микроконтроллере ATmega8 АЦП имеет разрешение (разрешающую способность) 10 бит, таким образом микроконтроллер способен реализовать чувствительность равную Vref/2^10, то есть если опорное напряжение (Vref) равно 5В мы получим цифровой инкремент на выходе 5/2^10 = 5мВ. Таким образом, на каждое приращение напряжения на 5 мВ мы будем получать один дополнительный инкремент цифрового выхода АЦП.

Для обеспечения работы схемы мы должны установить значения регистров АЦП следующим образом:

  1. Сначала мы должны активировать АЦП микроконтроллера.
  2. Затем необходимо установить максимальное входное напряжение для АЦП равное 5В. Это можно сделать путем установки значения опорного напряжения АЦП равного 5В.
  3. АЦП микроконтроллера в нашей схеме будет начинать действовать при внешнем воздействии (не от действий пользователя), поэтому нам следует установить его в режим непрерывного преобразования (free running mode): в этом режиме запуск преобразований выполняется непрерывно через определенные интервалы времени.
  4. В любом АЦП частота преобразования аналогового значения в цифровое и точность цифрового выхода обратно пропорциональны. То есть для лучшей точности цифрового выхода мы должны выбрать меньшую частоту. Для этого мы должны установить коэффициент деления предделителя АЦП в максимальное значение (2). Поскольку мы используем внутреннюю частоту микроконтроллера 1 МГц, то значение частоты преобразования АЦП будет равно 1000000/2.

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

RED (красный, ADEN): этот бит устанавливается чтобы задействовать функции АЦП в ATmega8.

BLUE (синий, REFS1, REFS0): эти два бита используются для установки опорного напряжения (максимального входного напряжения, которое мы собираемся обрабатывать). Поскольку мы будем использовать опорное напряжение равное 5В, бит REFS0 необходимо выставить в соответствии с приведенной таблицей.

LIGHT GREEN (светло зеленый, ADATE): этот бит должен быть установлен чтобы АЦП работал непрерывно (в режиме непрерывного преобразования).

PINK (розовый, MUX0-MUX4): эти 5 бит используются чтобы задать входной канал. Поскольку мы будем использовать ADC0 (PIN0) то, как следует из ниже приведенной таблицы, нам нет необходимости устанавливать все эти биты.

Встраиваемый ампервольтметр на ATmega8

BROWN (коричневый, ADPS0-ADPS2): эти три бита используются для установки коэффициент деления предделителя АЦП. Поскольку мы используем коэффициент деления предделителя 2, мы должны установить только один из этих битов.

Встраиваемый ампервольтметр на ATmega8

DARK GREEN (темно-зеленый, ADSC): этот бит необходимо установить для того чтобы АЦП начал осуществлять преобразование. Далее в программе мы можем его сбросить (в 0) если нам нужно будет остановить процесс аналого-цифрового преобразования.

↑ К вопросу о точности вообще

Начиная с 10 Ом, точность примерно 3% и ухудшается примерно до 6% при 20 Ом (200мВ), но точность при измерениях бракованных элементов не важна. Поскольку измерения проводятся при комнатной температуре, термонестабильность будет мала, испытаний на эту тему я не проводил. При измерениях ESR конденсаторов в компьютерных блоках питания и на материнских платах, я пришел к выводу, что конденсаторы от 1000 мкФ с сопротивлением 0,5 Ом надо срочно выпаивать и отправлять в ведро, нормальное ESR 0,02…0,05 Ом. Попутно обнаружил, что у исправных конденсаторов ESR очень сильно зависит от температуры, так у конденсатора 22 мкФ ESR уменьшалась от тепла пальцев на 10%. Это объясняет, почему некоторые фанатичные лампадные конструкторы специально делают подогрев конденсаторов в катодных цепях с помощью проволочных обогревателей. По этой причине, а также по причине имеющегося сопротивления контактов считаю, что в измерения тысячных долей Ом нет особой необходимости.

На первом фото ЭПС конденсатора 0,03 Ом.

Конденсаторы по питанию

Перед тем, как подать на микроконтроллер питающее напряжение, выполним правило, которое обязательно для всех цифровых микросхем: в непосредственной близости от выводов питания микросхемы должен быть керамический конденсатор емкостью 0,06 — 0,22 мкф. Обычно устанавливают конденсатор 0,1 мкф. Его часто называют блокировочным конденсатором.

Встраиваемый ампервольтметр на ATmega8

В схему необходимо установить и электролитический конденсатор емкостью 4-10 мкф. Он также является блокировочным фильтром, но на менее высоких частотах. Такой конденсатор можно устанавливать один для нескольких микросхем. Обычно на 2-3 корпуса микросхем.

Дело в том, что микроконтроллер (как и другие цифровые микросхемы) состоит из транзисторных ячеек, которые в процессе работы постоянно переключаются из открытого состояния в закрытое, и наоборот. При этом изменяется потребляемая транзисторными ячейками энергия. В линии питания возникают кратковременные «провалы» напряжения. Этих ячеек в микроконтроллере сотни тысяч (думаю, что сейчас уже миллионы!), поэтому по питающим проводам начинают гулять импульсные помехи с частотами от единиц до десятков тысяч Герц.

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

Конденсатор для постоянного тока является изолятором. Но при установке конденсатора в цепи с непостоянным током он делается сопротивлением. Чем выше частота, тем меньшее сопротивление оказывает конденсатор. Следовательно, блокировочный конденсатор с малой емкостью пропускает через себя (шунтирует) высокочастотные сигналы (десятки и сотни Герц), а конденсатор с бОльшей емкостью — низкочастотные. Об этом я писал еще в статье

Генератор тактовой частоты

Но самым важным для нас в настоящее время является блок «Oscillator Circuits/Clock Generation» (Схема генератора/Генератор тактовой частоты).

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

Да и не лишним будет заранее просчитать: успеет ли МК выполнить тот или иной фрагмент программы за отведенное для этого время.

В даташите ищем соответствующую главу: «System Clock and Clock Options» (Тактовый генератор и его параметры). В ней видим раздел «Clock Sources» (Источники тактового сигнала), в котором имеется таблица с перечнем видов тактовых сигналов. В этом разделе указано, что данный МК имеет встроенный тактовый RC-генератор. В разделе «Default Clock Source» имеется указание о том, что МК продается уже настроенным для использования встроенного RC-генератора. При этом тактовая частота МК — 1 МГц.

Из раздела «Calibrated Internal RC Oscillator» (Калиброванный RC-генератор) узнаем, что встроенный RC-генератор имеет температурный дрейф в пределах 7,3 — 8,1 МГц. Может возникнуть вопрос: если частота встроенного тактового генератора 7,3 — 8,1 МГц, то как была получена частота 1 МГц? Дело в том, что тактовый сигнал попадает в схемы микроконтроллера через программируемый делитель частоты (Об это рассказано в разделе «System Clock Prescaler»).

В данном микроконтроллере он имеет несколько коэффициентов деления: 1, 2, 4 и 8. При выборе первого мы получим частоту самого тактового генератора, при включении последнего — в 8 раз меньше, т.е., 8/8=1 МГц. С учетом вышесказанного получаем, что тактовая частота данного МК при включенном делителе с коэффициентом 8 будет в пределах от 7,3/8 = 0,9125 МГц (9125 КГц) до 8,1/8 = 1,0125 МГц.

Популярные статьи  Как сделать несложные столярные тиски для верстака

Обратите внимание на один ну очень важный факт: стабильность частоты дана при температуре МК 25 градусов по шкале Цельсия. Вспомним, что внутренний генератор выполнен по RC схеме

А емкость конденсатора очень зависит от температуры!

↑ Мой вариант схемы измерителя ESR

Я внес минимальные изменения. Корпус — от неисправного «электронного дросселя» для галогеновых ламп. Питание — батарея «Крона» 9 Вольт и стабилизатор 78L05 . Убрал переключатель — измерять LowESR в диапазоне до 200 Ом надо очень редко (если приспичит, использую параллельное подключение). Изменил некоторые детали. Микросхема 74HC132N, транзисторы 2N7000 (to92) и IRLML2502 (sot23). Из-за увеличения напряжения с 3 до 5 Вольт отпала необходимость подбора транзисторов. При испытаниях устройство нормально работало при напряжении батареи свежей 9,6 В до полностью разряженной 6 В.

Кроме того, для удобства, использовал smd-резисторы. Все smd-элементы прекрасно паяются паяльником ЭПСН-25. Вместо последовательного соединения R6R7 я использовал параллельное соединение — так удобнее, на плате я предусмотрел подключение переменного резистора параллельно R6 для подстройки нуля, но оказалось, что «нуль» стабилен во всем диапазоне указанных мною напряжений.

Удивление вызвало то, что в конструкции «разработанной в журнале» перепутана полярность подключения VT1 — перепутаны сток и исток (поправьте, если я неправ). Знаю, что транзисторы будут работать и при таком включении, но для редакторов такие ошибки недопустимы.

↑ Описание программы

При включении происходит измерение падения напряжения на резисторе R4 и по результатам измерений происходит выбор примененного типа индикатора «Общий катод» или «Общий анод».

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

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

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

Программа написана на «mikroC for PIC» и снабжена достаточным количеством комментариев для понимания ее работы.

Распиновка Atmega8

На следующей странице публикуется расположение выводов данного микроконтроллера при использовании разных типов корпусов:

Встраиваемый ампервольтметр на ATmega8

Встраиваемый ампервольтметр на ATmega8

Встраиваемый ампервольтметр на ATmega8

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

Внимание!

Обратите внимание на такой факт: микросхема микроконтроллера может иметь (и имеет в данной модели) несколько выводов для подключения источника питания. То есть имеется несколько выводов для подключения «земли» — «общего провода», и несколько выводов для подачи положительного напряжения

Встраиваемый ампервольтметр на ATmega8

Изготовители микроконтроллеров рекомендуют подключать соответствующие выводы вместе, т.е., минус подавать на все выводы, помеченные как Gnd (Ground — Земля), плюс — на все выводы помеченные как Vcc.

При этом через одинаковые выводы МК не должны протекать токи, так как внутри корпуса МК они соединены тонкими проводниками! То есть при подключении нагрузки эти выводы не должны рассматриваться как «перемычки».

Вольтметр 220 вольт с защитой на ATmega8

Встраиваемый ампервольтметр на ATmega8

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

Устройство защиты имеет следующие технические характеристики:Диапазон контролируемых напряжений, В . . . . . . . . . . . . . . . . . .120…380Нижний/верхний предел устанавливаемых напряжений срабатывания, В . . . . . .170…209/216…

280V Время срабатывания при аварии при использовании реле, с . . . . . . . . .0,1 Погрешность измерения напряжения, В . . . . . . . . . . . . . . . . . . . . . . . . .±1 Время включения после аварии (задаётся пользователем), с . . . . . .

Потребляемый ток (без учёта реле), мА . . . . . . . . . . . . . . . . . . . . . . ..30

фьюзы

Меню устройства защиты (УЗ)«Режим»

• UuP – верхнее граничное напряжение (первое нажатие на кнопку «Режим»);

• Udn – нижнее граничное напряжение (второе нажатие на кнопку «Режим»);

• tir – время на задержку включения контактора после вхождения измеряемого напряжения в заданные пределы (третье нажатие на кнопку «Режим» );

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

Таким образом, каждое изменение параметров установки фиксируется в энергонезависимой EEPROM-памяти МК. Это необходимо для того, чтобы при выключении сетевого напряжения ранее установленные значения были сохранены.

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

Выход из системного меню происходит при пятом нажатии кнопки «Режим», или если в течении 30 с не нажималась ни одна из кнопок УЗ.

Работа схемы УЗ в Proteus 7.7 SP2 .

Прошивка е2р, плата, скачать zachita220_е2р.rar

прошивка в формате – НЕХ , протеус zachita220_нех.rar

Печатная плата.

Уважаемые читатели!При более плотной эксплуатации своего прибора я столкнулся с проблемой зависимости показаний прибора от времени суток. Это обусловлено неудачным выбором алгоритма измерения синусоидального напряжения. Дело в том, что форма напряжения 220 В в разное время суток разная. Причина – обилие включенных активных и импульсных нагрузок днем и малое их количество ночью. Эту проблему я смог побороть, только изменив полностью алгоритм измерения напряжения. Теперь мой прибор измеряет действующее значение напряжения, прошивки прилагаю. Правда, несколько снизилось удобство управления прибором: теперь кнопка РЕЖИМ активна только в момент, когда прибор измеряет напряжение, т.е. для повторного нажатия кнопки РЕЖИМ приходится ждать перехода прибора в состояние измерения сетевого напряжения.Алгоритм измерения в двух словах выглядит теперь так: Во время прихода положительной полуволны запускается АЦП, Который успевает за время прохождения этой полуволны сделать порядка 100 выборок, которые обрабатываются по формуле:Urms= sqrt(1/T* Sdt,где: sqrt – корень квадратный, S – интеграл за период времени от 0 до Т. Для дискретного способа взятия интеграла формула упроститься до вида Urms=K*sqrt(1/N*sum (Uadc*Uadc)),Где: К – поправочный коэффициент, Uadc – значение на выходе АЦП, N – число выборок за время прохождения полуволны синусоиды. Более точно подсказать я вам не смогу, т.к. исходники на Си были уничтожены вместе с винчестером, прошивки в hex я вам скачал с оставшегося прототипа, надеюсь, они Вам помогут.Фьюзы программируются так: для меги 8В программаторе кодвижн сверху вниз1. первые два – галки CKSEL0=0, CKSEL1=02. третий – нет галки CKSEL2=13. следующие пять – есть галки CKSEL3=0, SUT0=0, SUT1=0, BODEN=0, BODLEVEL=0.4.остальные нет галок Частота внутреннего генератора микроконтроллера 8 МГц

Статья автора Роман Булышев журнал СОВРЕМЕННАЯ ЭЛЕКТРОНИКА № 8 2006 WWW.SOEL.RU.

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

#include // заголовок чтобы разрешить контроль данных на контактах #define F_CPU 1000000 // задание тактовой частоты микроконтроллера #include // заголовок чтобы задействовать функции задержки в программе #include #define enable 1 // задействуем контакт PB1 PORTB (“enable”), поскольку он соединен с контактом “enable” ЖК дисплея #define registerselection 0 // задействуем PB0 PORTB (“enable”), поскольку он соединен с контактом RS ЖК дисплея void send_a_command(unsigned char command); void send_a_character(unsigned char character); void send_a_string(char *string_of_characters); int main(void) { DDRD = 0xFF; // установка portD на вывод данных DDRC = 0; // установка PC0/ADC0 (вход АЦП) на ввод данных DDRB= 0xFF; // установка portB на вывод данных ADMUX |=(1< ADCSRA |=(1<<< // активация АЦП, установка режима непрерывного преобразования, установка коэффициента деления предделителя АЦП 2 float i =0; float CURRENT = 0; char CURRENTSHOW ; send_a_command(0x01); //очистить экран 0x01 = 00000001 _delay_ms(5); send_a_command(0x38); // сообщаем ЖК дисплею что мы будем использовать 8 битный режим передачи данных/команд _delay_ms(5); send_a_command(0b00001111); //включаем курсор и мигание курсора на ЖК дисплее _delay_ms(5); ADCSRA |=(1< send_a_string («CIRCUIT DIGEST «); // отображение строки «CIRCUIT DIGEST » send_a_command(0x80 + 0x40 + 0); // переводим курсор на 1 позицию второй строки send_a_string («CURRENT=»); // отображение строки «CURRENT=» send_a_command(0x80 + 0x40 + 8); // переводим курсор на 10 позицию второй строки while(1) { i=ADC/204.8; CURRENT = (2*i*1000)/2.7; // ADC/18.618; — вычисление значения тока dtostrf(CURRENT, 4, 1, CURRENTSHOW); //преобразуем число в строку send_a_string(CURRENTSHOW); send_a_string(«mAmp»); //ADCSRA &=~(1< //ADCSRA |=(1< _delay_ms(50); send_a_command(0x80 + 0x40 + 8); //dtostr(double precision value, width, precision, string that will store the numbers); // Value – число, или переменная , содержащая число //Width – общая длина числа, которое функция dtostrf должна преобразовать в строку, включающая точку и отрицательный знак числа(-). Например, если рассматриваем число -532.87, то его длина будет равна 7 (5 цифр + знак (-) + точка (.)) //Precision – задает точность преобразования, то есть сколько знаков после запятой учитывать } } void send_a_command(unsigned char command) { PORTD = command; PORTB &= ~ (1< PORTB |= 1< _delay_ms(2); PORTB &= ~1< PORTD = 0; } void send_a_character(unsigned char character) { PORTD = character; PORTB |= 1< PORTB |= 1< _delay_ms(2); PORTB &= ~1< PORTD = 0; } void send_a_string(char *string_of_characters) { while(*string_of_characters > 0) { send_a_character(*string_of_characters++); } }

Популярные статьи  Домашний сыр из творога

↑ Пример применения

Был собран малогабаритный блок питания, у него получились следующие параметры:Напряжение 0 – 31,2 Вольта.Ток 0 – 2,2 Ампера.

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

Для измерения напряжения в этом случае удобными оказались значения: шкала «343» и запятая после 2-го знака. При этом максимальное значение шкалы составит 34,3 Вольта, что вполне приемлемо.

Для измерения тока удобными оказались значения: шкала «255» и запятая после 1-го знака, соответственно максимальное значение шкалы составит 2,55 Ампера. В связи с тем, что по токоизмерительному шунту протекает ток, потребляемый измерителем, показания тока были завышены. После проведения коррекции этот паразитный ток стал вычитаться из общих показаний и показания стали правильными.

После установки шкал в блоке питания были подобраны значения резисторов делителя R2, R3 и коэффициент усиления OP1 так, чтобы показания соответствовали контрольным.

Здравствуй, читатель! Меня зовут Игорь, мне 45, я сибиряк и заядлый электронщик-любитель. Я придумал, создал и содержу этот замечательный сайт с 2006 года. Уже более 10 лет наш журнал существует только на мои средства.

— Спасибо за внимание! Игорь Котов, главный редактор журнала «Датагор»

Здравствуй, читатель! Меня зовут Игорь, мне 45, я сибиряк и заядлый электронщик-любитель. Я придумал, создал и содержу этот замечательный сайт с 2006 года. Уже более 10 лет наш журнал существует только на мои средства.

— Спасибо за внимание! Игорь Котов, главный редактор журнала «Датагор»

Двойной изолированный вольтметр для ЛАТРа на ATmega8-Arduino

Встраиваемый ампервольтметр на ATmega8

Встраиваемый ампервольтметр на ATmega8

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

Для этих целей, в радиолюбительской практике, обычно применяются Лабораторные АвтоТрансформаторы(ЛАТР’ы). Т.к.

большинство популярных моделей ЛАТР’ов не имеют встроенного вольтметра, приходится “орудовать” несколькими мультиметрами или полагаться на шкалу, обычно нанесенную на ручку регулировки напряжения.

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

На макете был опробован светодиодный индикатор и проведены эксперименты с АЦП. Для работы с семисегментным индикатором была выбрана библиотека SevenSegmentLibrary. Далее в Proteus’е была нарисована схема.

Далее в программе Sprint Layout 5 была разведена плата.

При разводке платы я предусмотрел место как для трансформаторов из списка (TR1 НПК “Комплекс” ТПП-121-207 и TR2 HAHN BV 2020171), так и для более популярного корпуса(ТПК2). Печатная плата была изготовлена фоторезистивным способом на листе одностороннего фольгированного стеклотекстолита размером 110х60мм.

Для того, чтобы установить семисегментники на обратную сторону платы, их необходимо немного доработать, подогнув ноги на 90 градусов.

Далее обрезать ноги, так чтобы осталось пару миллиметров.

Сборка устройства осуществляется “как обычно”: сперва запаиваются детали наименьшей высоты(резисторы, перемычки), затем большей, ну и в последнюю очередь трансформаторы. На м/с линейного стабилизатора напряжения рекомендуется установить небольшой алюминиевый радиатор, при установке желательно использовать теплопроводящую пасту (прим. КПТ-8). 

ВНИМАНИЕ! перед запайкой или установкой в панельку ATmeg’и, включите первичные обмотки обоих трансформаторов(J1 b J2) в сеть и настройте потенциометры делителей напряжения (RV1 и RV2), так чтобы напряжение на контактах 23 и 24 панельке не превышало 5в. Собранная плата выглядит вот так

Собранная плата выглядит вот так.

 Для прошивки я использовал программатор USBTINY. Далее, не отсоединяя “мегу” от программатора, запускаем Arduino IDE, импортируем библиотеку, открываем нужный скетч, выбираем программатор, компилируем(CTRL+R) и прошиваем(CTRL+SHIFT+U).

Теперь можно проверить устройство.

Настройка устройства сводится к подключению сетевого напряжения к разъемам J1 и J2, подключению параллельно образцового вольтметра и установке значений напряжений с помощью потенциометров (RV1 и RV2). 

 В качестве корпуса вольтметра была выбрана распаячная коробка “Abox-i SL-6²” фирмы spelsberg. 

Затем к листу ДСП были прикручены металлические ручки и резиновые ножки. В программе Microsoft Publisher я от рисовал наклейку на переднюю панель устройства, пару наклеек с надписью “СЕТЬ” и наклейку для переключателя лампа – ЛАТР. На тот же лист я закинул пару предупредительных значков и картинку со значком “заземление”.

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

Скачать список элементов (PDF)

↑ Итого

Данный прибор работает у меня около месяца, его показания при измерениях конденсаторов с ESR в единицы Ом совпадают с прибором по схеме Ludens. Он уже прошёл проверку в боевых условиях, когда у меня перестал включаться компьютер из-за емкостей в блоке питания, при этом не было явных следов «перегорания», а конденсаторы были не вздувшимися.

Точность показаний в диапазоне 0,01…0,1 Ом позволила отбраковать сомнительные и не выбрасывать старые выпаянные, но имеющие нормальную ёмкость и ESR конденсаторы. Прибор прост в изготовлении, детали доступны и дёшевы, толщина дорожек позволяет их рисовать даже спичкой. На мой взгляд, схема очень удачна и заслуживает повторения.

Оцените статью
Денис Серебряков
Добавить комментарии

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

Встраиваемый ампервольтметр на ATmega8
Модуль зарядки для 2 аккумуляторов 18650