Меню

Ардуино защита по току

Амперка / Блог

koder-4.900.600.s

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

В рамках одного проекта (будет отдельная публикация) с использованием Arduino Uno потребовалось измерять силу тока в цепи в пределах нескольких ампер с большими допустимыми погрешностями. Проект был временный: собирается модель, проводятся испытания, делаются выводы, модель разбирается. Поэтому части модели подбирались по принципу «что ближе лежит на полке».

Ближе всех лежал сенсор тока ACS758 производства DFROBOT. Амперка называет это изделие «Сенсором», а сам чувствительный элемент «Датчиком», но я бы называл их наоборот. Сам автор в тексте вышеуказанной страницы на сайте Амперки в паре мест путается и меняет систему названий. Я и сам датчик ACS758, и его же с обвязкой, далее буду называть просто датчиком. Датчик для измерения использует эффект Холла.

Для подключения питания и провода данных предусмотрен как стандартный разъём, так и отверстия на плате под пайку, обозначенные как VCC, GND и два VOUT. Я решил подключить датчик именно через них. Один из двух VOUTов я выбрал случайным образом.

Всё спаял, собрал, как рекомендует DFROBOT на примере. Не работает. Судя по тому, что считывает Arduino с VOUT, последний просто висит в воздухе. Странно…

Взял мультиметр и стал «звонить» все ножки и контакты. И действительно «в воздухе»: один из двух VOUT не был ни к чему припаян. Сигнал надо было снимать с другого VOUT. Большое «фи» DF-роботу за «точную» маркировку контактной площадки.

Убедившись, что соответствующий аналоговый порт Adrduino реагирует на изменения протекающего тока через одноимённый датчик, я стал искать на сайте производителя инструкции по преобразованию цифровых значений в реальные аналоговые. Они там быстро нашлись в виде скетча для Arduino.

В прошлой своей публикации я писал про корявый китайский код. DFROBOT тоже является китайской компанией. И её код оказался не менее корявым. Но оба вышеупомянутых кода являются рабочими. Что неудивительно, т.к. это напрямую влияет на объёмы продаж. А вот корявость вряд ли влияет. В общем, кнута и Кнута на них не хватает. Но желания коммерческих компаний сэкономить на программистах вполне понятны.

Непонятно другое: в качестве шаблона для своего кода DFROBOT взял пример с официального сайта arduino.cc. Но это ведь не мелкий китайский производитель датчиков. Это же, в т.ч., обучающий проект. Он должен сеять вечное и доброе.

А что же он сеет?

Итак, скетч со страницы «Сглаживание» сайта arduino.cc, которую следовало озаглавить «Как не надо программировать».

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

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

Итак, чему же он учит.

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

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

Это в разы читабельнее.

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

Числа в коде — это неправильно. Надо объявлять в заголовке в помощью #define мнемонические идентификаторы и потом использовать их в тексте программы.

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

А это уже грубая ошибка. Предположим, что датчик выдал одно значение, равное 0, и девять значений, равных 1. Нет сомнений, что итоговое, «сглаженное» значение, должно быть равно 1. Однако по алгоритму автора мы получим 0 как результат целочисленного деления 9 на 10 с отбрасыванием дробной части.

И ещё ошибка: пока не будет считано 10 значений, все результаты фактически являются неправильными, т.к. усредняются с инициализирующими буфер нулями. В большинстве практических применений это, наверное, не имеет большого значения. А где имеет — легко поправить код. На раз публикация носит академический характер, то я считаю это недопустимой ошибкой.

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

В целом, у них такой же стиль, как и у скетча-донора. Поэтому остановимся только на различиях.

Буфер увеличен до 30. Почему именно до этой величины — непонятно.

Все величины они сделали float. Это устраняет вышеупомянутую ошибку с неправильным округлением. Но это в корне неверный подход. analogRead() даёт целую величину, в буфере хранятся эти же самые целые величины, операции по корректировке суммы всех величин в буфере тоже являются целочисленными. Следовательно, все переменные для хранения этих величин должны иметь тип int. Целому — целое! А вот когда при делении появляется float, то именно в тот момент и надо сделать коррекцию как я написал выше. Т.е. непосредственно перед делением использовать явное приведение типа int к float.

Очень сомнительная идея, захламляющая код: ввести в программу мнемоническую переменную (currentValue) только для того, чтобы показать, что вычисленное среднее значение один к одному становится текущим значением целевого параметра (тока, в данном случае).

По умолчанию, Serial.println выведет 2 знака после запятой. Что, учитывая контекст, эквивалентно утверждению производителя «Датчик + Arduino c 10-битным аналоговым портом меряют ток с точностью 0.01″ (10 бит потому, что в коде скетча считанное значение после знакового сдвига делится на 1024). А так ли это?

DFROBOT пишет про свой датчик: «Sensitivity: 40 mV/A».

10-битный аналоговый порт с опорным напряжением в 5 вольт (это тоже следует из кода скетча) измеряет напряжение с точностью 5/1024 =

Таким образом, максимальная теоретическая точность измерений: (5/1024) / 0.04 =

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

Тут 2 ошибки стиля. Во-первых, лучше использовать мнемоническую константу А0. Во-вторых, лучше сделать как в оригинале: завести константный идентификатор, инициализацию которого вынести в верхнюю часть кода, и использовать потом его.

Это вообще что-то очень странное. Почему именно такая скорость? Скорее всего, у большинства в Arduino IDE в настройках стоит 9600 по умолчанию, чего хватает для отладочных нужд. Чтобы заработал этот скетч, надо лезть в меню и менять скорость. А при отладке другого скетча, наверняка, возвращать в умалчиваемое значение. Или исправлять скорость на 9600 в этом скетче. В любом случае, какие-то совсем ненужные хлопоты. А у неопытного пользователя может возникнуть впечатление, что указанная скорость является рекомендуемой производителем и как-то связана с аппаратными особенностями датчика.

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

Каждые 30 мс скетч будет отправлять максимум 6 байт (например, 17.67 + ‘\n’). Для этого потребуется канал: 6 байт * 8 бит/байт / 0.03 с = 1600 бод. Т.е. 9600 хватает с большим запасом.

Ну и с точки зрения визуального контроля отладочной информации, delay(30) — это запредельно быстро и не имеет никакого практического смысла. Не думаю, что даже китайцы в состоянии контролировать показатели со скоростью 30 измерений в секунду.

К скорости работы датчика и порта «delay(30)» тоже не имеет никакого отношения.

Наверняка, DFROBOT и Массимо Банци читают блоги Амперки и поправят свои программные косяки.

total= total — readings[index];

total= total + readings[index];
index = index + 1;
——————————-

total -= readings[index];

total += readings[index];
index++;
———————————

«В т.ч. помогает компилятору сделать более оптимальный код, т.к. отражает суть процессорной системы команд.»

А что, еще есть компиляторы, которые для данных вариантов породят разный исполняемый код даже при отключенной оптимизации?

Наверное, уже нет. Но помогает же

int readings[numReadings];
int index = 0;
int total = 0;
int average = 0;
———————————

int readings[_numReadings],
index = 0,
total = 0,
average = 0;
———————————
«Это в разы читабельнее.»

Это уже религиозное. Для меня все-таки читабельнее первый вариант.

#define _numReadings 10

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

Читайте также:  Реактивная энергия в сети переменного тока

Я всего лишь хотел сказать, что идентификатор в макроопределении должен визуально отличаться от идентификаторов других типов. И привёл пример. Лично мне подчёркивание очень нравится для визуальных разделений: слова не теряют читабельность, поддаются поиску по началу и т.п. У других известных систем свой набор преимуществ и недостатков. Полный обзор выходит за рамки этой заметки. Моя задача была — дать пищу для размышлений тем, кто ещё сам для себя не выбрал систему и даже не знал, что её нужно выбирать.

Валерий, Вы действительно верите, что
#define _x 10
будет генерировать более короткий и быстрый код, чем
const int x = 10;
На чем основана ваша вера, позвольте узнать?

Намёк ваш понял и посмотрел ассемблерный листинг avr-gcc.
И действительно: операции с переменными, объявленными const, скомпилированы как будто это было объявлено с помощью #define. Т.е. компилятор вместо переменной просто оперирует тем, чем она была инициализирована. Раньше такого безобразия не было

Вы уверены, что когда-то было по-другому? Или просто сглаживаете ситуацию?
С++ компилятор считает все константные выражения до генерации кода.

Я имею ввиду идеологию языка С.
Тот же самый компилятор avr-gcc в отношении файла *.c, если он запущен с ключом -O0, прекрасно понимает, что от него хотят: он создаёт полноценную переменную, потом её же и использует, а объявление const использует только на этапе компиляции для проверки.
В идеологии C++ так управлять компиляцией не удаётся (я этого не знал до публикации).
В этом смысле «раньше» действительно было по-другому.

Объяснения про то, что совсем раньше (в прошлом тысячелетии) был C, в котором изначально не было const, принимаются.
Но, справедливости ради, надо отметить, что в Arduino-среде с самого начала был уже C++. Так что const int x = NNN; можно использовать везде, где должны быть константные выражения. По мне так это лучше, чем #define, поскольку типизировано. Но не буду навязывать свою точку зрения.

И поправьте, если не трудно, текст. А то новички будут думать, что const int x = y; менее эффективно, чем #define

Боюсь, что тут такой фичи нет. Будем считать обсуждение публикации неотъемлемой частью самой публикации

>> был C, в котором изначально не было const
Не в const дело. Я удивился тому, что оказывается в С++ программист уже не имеет полной власти над компилятором. Это для меня и есть «безобразие».

Насчёт «поскольку типизировано» — это весомый аргумент.

Валерий, что Вы подразумеваете под «не имеет власти над компилятором»? Может, просто программисту надо хотя бы прочитать langauge reference, чтобы получить эту власть?

Может быть. Но я, пожалуй, воздержусь от продолжения нашего диалога, т.к. он не эффективен с точки зрения целей этого блога: маркетинг через обучение, обмен информацией, мнениями и т.п. С точки зрения этих целей, от участников ожидается прямое изложение информации. В случае с const и #define, например, вам просто достаточно было написать, что компилятор сгенерирует одинаковый код. Но вы действуете иначе, ставя какие-то цели, больше относящиеся к области психологии.

По-моему как раз это вам надо было написать, что будет одинаковый код!

Вы, ребята, зануды 80-го уровня Сначала всерьёз читал, потом улыбался
Я — новичок. На меня больше подействовало бы такое:
«вот, решил испытать два одинаковых кода по скомпилированному размеру и по времени выполнения моего самописного бенчмарка на тему констант vs определений»

Думаю, в данном случае удобнее использовать экспоненциальное скользящее среднее:

average = (alpha * analogRead(inputPin) ) + (1.0 — alpha) * average;

где alpha подбирается от 0 до 1, в зависимости от numReading.

Может быть 57600 взято потому, что при задержке в 30 мс между
измерениями скорости 9600 не хватит для передачи данных?
—————
сейчас там у dfrobot скорость 115200 и пауза в loop 10ms.
может для калибровки нуля это все так быстро ?

еще они там в конце статьи померили синусоиду тока в сети 220в 50гц(20мс период), снизив паузу в loop до 2мс.

Каждые 30 мс скетч будет отправлять максимум 6 байт (например, 17.67 + ‘n’). Для этого потребуется канал: 6 байт * 8 бит/байт / 0.03 с = 1600 бод. Т.е. 9600 хватает с большим запасом.

Это не совсем правильный расчёт, ибо там же 9 бит передаётся: 8 данных и один стоповый

Источник

Как не спалить Ардуино — советы для начинающих

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

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

Как не спалить ардуино - советы для начинающих

Как сжечь микроконтроллер?

О внутреннем устройстве микроконтроллеров можно написать книгу, поэтому рассмотрим только основные моменты, на которые нужно обращать внимание при работе. Микроконтроллеры чувствительны, как к токам, так и к напряжениям. Аварийные режимы работы допустимы лишь кратковременно, либо недопустимы вообще.

Я постараюсь рассматривать ситуации с реальными условиями и чипами. Давайте опираться на datasheet Atmega328. Это распространенный микроконтроллер, встречается почти во всех платах arduino, в ранних версиях использовали 168, его основное отличие заключалось вдвое меньшем объеме памяти.

1. Напряжение питания должно быть в норме!

Известные мне модели микроконтроллеров работают от постоянного напряжения (DC), При этом напряжение питания может варьироваться в пределах допустимого. В технической документации на 328 атмегу указан диапазон питающих напряжений от 1.8 до 5.5 Вольт. При этом от напряжения зависит скорость работы, но это тонкости, которые влияют на выбор рабочей частоты и логических уровней.

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

Вывод:

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

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

Ардуино uno

Ардуино:

На оригинальных, а также на большинстве клонов Nano, Uno установлены линейные стабилизаторы, поэтому можно подавать питание либо на предназначенные для этого пины, либо через USB-порт. Не более 15 В.

ВАЖНО:

Пин с названием «5V» предназначен только для подключения к стабилизированному источнику на пять вольт, не больше, этот пин напрямую подключается к ножке Vсс самого микроконтроллера, тогда как Vin – на плате идет через линейный стабилизатор к микроконтроллеру.

И полярность тоже

На плате не предусмотрено защиты от обратного напряжения, поэтому в случае ошибки вы рискуете её спалить. Чтобы этого избежать установите диод последовательно со входом по питанию катодом к плате (пин Vin).

2. Не замыкай пины

Производитель установил рекомендуемый ток через пин микроконтроллера, не более 30 мА. При напряжении питания в 5 Вольт, это значит, что нужно подключать незнакомую (новую) нагрузку, через резистор не менее 200 Ом, что установит максимальный ток в 25 мА. Я думаю, это не совсем понятно звучит. «Замкнуть» и «Перегрузить» слова разные, но описывают один и тот, же процесс.

Короткое замыкание – это состояние когда между выводом с высоким потенциалом и выводом с низким потенциалом установлена нагрузка, сопротивление которой близко к 0. Реальным эквивалентом такой нагрузки служит капля припоя, кусок провода и другие проводящие ток материалы, соединяющие плюсовой контакт с минусовым.

Когда пин установлен в логическую единицу или «high», напряжение относительно общего провода на нём 5 В (3.3 или любое другое, уровень которого принят за логическую единицу). Если его замкнуть на «землю», на плате ардуино она может обозначаться, как «gnd», протекающий ток будет стремиться к бесконечности.

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

Решение:

Вывод Vin также нельзя замыкать на gnd, хоть он и не относится к микроконтроллеру, но дорожки платы могут сгореть и придется их восстанавливать. В целях безопасности не поленитесь, и подавайте питание через предохранитель рассчитанный на ток 0.5 А.

ВАЖНО:

В технической документации на 328-ю атмегу четко обозначено, что ОБЩИЙ ток через ВСЕ пины не должен превышать 200 мА.

3. Не превышай логические уровни!

Пояснение:

Если на микроконтроллреа в качестве логической единицы выбран уровень 5 В, то и датчик, кнопка или другой микроконтроллер должен посылать сигнал с таким же напряжением.

Читайте также:  Задание по теме электрический ток в различных средах

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

Вот как выглядит функциональная схема вывода микроконтроллера. Элементы (диоды и ёмкость) нужны для защиты от электростатики, т.н. «ESD-protection», они способны защищать чип от КРАТКОВРЕМЕННЫХ всплесков напряжения, но не длительного.

Примечание: превышение даже на половину секунды считается длительным.

Как защитить входы?

Установите на них параметрические стабилизаторы. Схематически это стабилитрон с напряжением стабилизации около 5 Вольт, его ставят между выводом и минусом (gnd), а последовательно нему резистор. Пин подключают в точку между сопротивлением и стабилитроном. При напряжении выше 5 Вольт последний откроется и начнет пропускать ток, на резисторе «останется» лишнее напряжение, а на входе оно зафиксируется на уровне 5-5.1 В.

4. Не нагружайте стабилизатор

Если вы решите запитать нагрузку от пина 5V – можете сжечь линейный стабилизатор, эта шина питает МИКРОКОНТРОЛЛЕР и рассчитана на него, однако, пару маленьких сервомоторчиков он выдержит.

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

Итоги

Запомните эти четыре раздела, и вы обезопасите свою Arduino от ошибок.

Схемы на ардуино

Техника безопасности для микроэлектроники

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

Можно ли паять к плате ардуино элементы?

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

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

Приведу свой пример из жизни. Паяю я уже лет 10, начинал с привычных «ЭПСН», а два года назад обзавелся паяльной станцией. Но это не стало залогом качественной работы, я только убедился, что основное требование – это опыт и качественные материалы.

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

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

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

Плата была новой – я на неё и десяти скетчев не загрузил. Микроконтроллер остался в живых, но дорожки отошли и порвались. Пользы, как и смысла от платы не осталось, паять напрямую к ножкам атмеги на ардуино нано – неудобно и не оперативно. Как результат – выбросил на ветер пару сотен рублей, а мог купить проверенный припой «ПОС-61» и всё было бы прекрасно.

Выводы:

Паяйте нормальным паяльником – это такой паяльник, у которого нет потенциала фазы на жале (проверяется индикатором), а его мощность не превышает 25-40 Вт. Паяйте нормальным припоем и флюсом. Не пользуйтесь кислотами (активным флюсом) и не перегревайте дорожки.

Примечания: если собрались заменить микроконтроллер, во-первых, если он в SMD-корпусе лучше сделать это феном, а во-вторых, не паяйте его слишком долго (более 10-15 секунд), давайте остыть, а при пайке феном можно положить теплоотвод на средину корпуса в виде монетки или малого радиатора.

Работа с ардуино

Как обращаться с платой ардуино?

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

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

Вибрация и удары может привести к потере контакта, в таком случае можно пройтись паяльником или прогреть плату феном, будьте аккуратны, и не сдуйте SMD-компоненты.

К влаге плата относится, как и любое электрооборудование – отрицательно. Если вы планируете эксплуатировать прибор на улице – позаботьтесь о покупке герметичных разъёмов и корпусов иначе могут быть плачевные последствия:

1. Неправильное чтение сигнала с аналоговых датчиков.

2. Ложные срабатывания;

3. Короткие замыкания пинов между собой и на землю (см. начало статьи).

Окисел, образовавшийся от работы во влажной среде, может вызывать такие же последствия, как и сама влага, только добавляется еще и вероятность потери контакта, отгнивания элементов и дорожек.

Выводы

Линейка плат Arduino ничем не отличается от любой другой электроники, она также «боится» перегрузок, замыканий, воды и ударов. Особых тонкостей при работе с ней вы не встретите.

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

Источник

Датчики тока для работы с Ардуино

Главное преимущество микроконтроллера по сравнению со многими средствами управления оборудованием — универсальность. Можно не только отдавать с его помощью конечные команды на включение двигателей, зажигания ламп, или произведения каких-либо действий, но и выполнять определенные «логические» реакции в зависимости от изменившихся внешних условий. Последняя возможность предоставляется в первую очередь внешними датчиками и уже во вторую ветвлениями внутренней программы. В сущности, микроконтроллер — миниатюрный компьютер, ограниченный по мощности, но обладающий определенными плюсами, изначально направленными на применение его в комплексе с различной аппаратурой. Сюда относятся не только контролирующие цепи, но и различные сенсоры, предоставляющие информацию самому логическому блоку. В контексте статьи речь пойдет об одном из ярких представителей названого класса устройств — Ардуино и датчике тока ACS712, специально разработанного в целях совместного с ним использования.

Практические ниши применения

Несмотря на определенные ограничения сенсора, ниши в которых он действительно пригодится весьма широки. Посудите сами — в сущности, потребление электроэнергии возникает единовременно с моментами включения устройств, находящихся на линии. А сам сенсор именно в это время начинает регистрировать показания. То есть датчик тока с Arduino можно использовать не только, как конечный измеряющий прибор, но и в качестве контролирующей части, определяющей активацию какого-либо оборудования. Самый простой пример — обычная лампа. Совместив микроконтроллер с датчиком света и тока можно добиться того, что будет не только производиться активация освещения в темный период времени, но и станет отправляться сигнал пользователю, если источник видимого излучения выйдет из строя. Или, другим примером может стать контроль физического состояния насоса, двигателя, а также любого электрического прибора, потребляющего энергию.

Опять же. Применяя Arduino одновременно с ACS712, как наиболее распространенным датчиком тока платформы, можно использовать микроконтроллер именно в роли детектирующего прибора, который в зависимости от определенного времени производит замер потребления конечной сети. Или как очень «умный» мультиметр, с возможностью построения On-line графиков на дополнительно соединенном к аппарату экране или внешнем компьютере.

ACS712 на основе эффекта Холла

Описываемый датчик построен на основе эффекта Холла. Представьте себе проводящую пластину, к двум сторонам которой подключены полюсы источника тока. На боковых ее гранях напряжение регистрироваться не будет, так как количество «дырок» поступающей энергии с одной стороны равно сумме электронов с другой. Ситуация изменится, если на поверхность начнет действовать магнитное поле. На боковые грани пластины при нем начнет идти часть тока линии, который можно замерить. Его количество станет пропорционально равному воздействию, а значит доступным к определению. Именно названый эффект и лежит в основе работы датчика Холла.

Технологически, в ACS712 сенсор настоящего типа представлен микросхемой SOIC-8, со следующим расположением контактов:

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

Конечно, в контексте платы дополняющей Arduino, электрические контакты выполнены с более удобным расположением соединяющих проводников:

Читайте также:  Сила тока реостат введен выведен из цепи

Два контакта одной стороны устройства предназначены для подключения его в разрыв цепи прохождения тока нагрузки, другие три – целям соединения к самому микроконтроллеру. Здесь OUT связывается с любым аналоговым входом Arduino, на VCC подается +5В питания, GND с общей землей.

Вообще существуют три вида датчиков Холла. В случае Arduino используется только один – униполярный, срабатывающий при наличии тока линии, создающего магнитное поле и прекращающий функционировать при его отсутствии. Реализация возможностей одного из оставшихся – биполярного выполняется введением логической переменной в обычный программный скетч Arduino для ACS712. Суть сенсора указанного типа – поступивший сигнал активирует работу устройства, которая продолжается, даже после его исчезновения. При повторном импульсе на линии выполняется отключение названого состояния.

Технические характеристики

Рассмотрим характеристики платы ACS712 более подробно, естественно с разделением их в зависимости от возможностей различных моделей:

  • Питание — 5В;
  • потребляемый ток — 0,11А;
  • сопротивление по шинам — до 1,2 мОм;
  • вид измеряемой характеристики — постоянный или переменный ток;
  • температурный режим работы — от –40 до +85°С;
  • дополнительные индикаторы — присутствует светодиод поступления тока на питание устройства;
  • размеры (в среднем) — 31 x 13 мм;
  • критичная сила тока, приводящая к пробою устройства — 50А.
Модель мВ/А
ACS712 5A 185
ACS712 20A 100
ACS712 30A 66
ACS713 20A 185
ACS713 30A 133

Внутренняя электронная схема сенсора:

Ограничения ACS712

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

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

Теперь, что касается чувствительности: чем датчик рассчитан на больший ампераж работы, тем она ниже. Что тоже нужно брать во внимание, при проектировании схем на основе ACS712. Отдельным вариантом тут выступает ACS713 30A, частично сохраняющий названую возможность за счет относительно удачной схемы.

Схемы подключения и организация работы

Градация аналогового сигнала Arduino составляет 1024 бит. Так как при отсутствии нагрузки сенсор в любом случае показывает 2,5В, значение по умолчанию порта, к которому подключена ACS712 будет 512, что необходимо учитывать при написании скетча микроконтроллера.

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

и скетч для вывода показаний датчика:

#include

LiquidCrystal lcd (7, 6, 5, 4, 3, 2);
const int APIN = A3; // аналоговый пин подключения микроконтроллера
int SENS_ACS712 = 66; // Здесь задается чувствительность конкретного ACS712
int ADCV= 0;
int MINV = 2500;
double ADCVOL = 0;
double tVAL = 0;
void setup()
<
// Отладочная часть, при работе с экраном не используется
// Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(» ACS823 SENS «);
lcd.setCursor(0,1);
lcd.print(» from ARDUINO «);
delay(2000);
>
void loop()
<
ADCV = analogRead(APIN);
ADCVOL = (ADCV / 1024.0) * 5000;
tVAL = ((ADCVOL — MINV) / SENS_ACS712);
// Отладочная часть, при работе с экраном не используется
// Serial.print(«Sens pure = » );
// Serial.print(ADCV);
lcd.clear();
delay(1000);
//lcd.display();
lcd.setCursor(0,0);
lcd.print(«ADC = «);
lcd.setCursor(12,0);
lcd.print(ADCV);
delay(2000);
// Отладочная часть, при работе с экраном не используется
//Serial.print(«\t mV = «);
//Serial.print(ADCVOL,3);
lcd.setCursor(0,0);
lcd.print(«V/mV = «);
lcd.setCursor(10,0);
lcd.print(ADCVOL,1);
delay(2000);
// Отладочная часть, при работе с экраном не используется
//Serial.print(«\t tVAL = «);
//Serial.println(tVAL,3);
lcd.setCursor(0,0);
lcd.print(«ACS712 = «);
lcd.setCursor(10,0);
lcd.print(tVAL,2);
lcd.setCursor(14,0);
lcd.print(«A»);
delay(2500);
>

Есть унифицированные библиотеки, производящие конвертацию показаний сенсора в понятные милливольты без самостоятельной разработки формул. Примером может послужить скетч, выполняющий аналогичные предыдущему действия, только вместо вывода на экран, полученные значения отправляются в COM-порт Arduino. С вычислительными целями применяется библиотека TroykaCurrent. Приведенный код применяется для измерения переменного тока, его модификация для постоянного помечена в тексте.

#include
#define APIN A3
ACS712 dataI(APIN);
void setup() <
Serial.begin(9600);
>
void loop() <
Serial.print(«Troyka value: «);
Serial.print(dataI.readCurrentAC());
// Если требуется постоянный, то используется
// конструкция Serial.print(dataI.readCurrentDC());
Serial.println(» A»);
delay(1000);
>

Теперь, что касается контроля, к примеру, функциональности двигателя. Внешний вид подключенного оборудования:

Кусок кода, который в цикле проверяет работу потребляющего устройства:

const int APIN = A3; // аналоговый пин подключения микроконтроллера
void setup() <
SetSerial(9600);
>
void loop() <
// для обычного контроля любого устройства потребления,
// знание конкретной характеристики объема расходуемого
// тока не важно, главное его определить и отправить
// сообщение в com-порт
if (analogRead(APIN)>2500)
Serial.print(«Device Active)
else
Serial.print(«Device in state OFF»);
delay(2000);
>

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

Ну, и напоследок рассмотрим метод серьезного применения датчика ACS712 для контроля нагрузки домашней сети электропитания 220В, до 30А при допустимых потребителях 6 кВт. Несравненным плюсом конструкции служит вывод получаемой информации при помощи Ардуино в сеть, наглядным для человека образом, с графиками и в браузере. Достаточно набрать в подключенном к сети c Arduino компьютере адрес http://192.168.100.10. Единственное ограничение — требуется, чтобы интернет также был доступен. Последнее нужно для внешних компонентов, обрабатывающими числовые значения и выводящие графики.

Сам скетч, который приводится без изменений — уж очень хорошо реализована идея, можно обнаружить по адресу http://liccontrol.com/articles/web_monitor.ino

Вывод

Хотелось бы заметить, что сенсоры ACS712 с 2017 года больше не производятся. Взамен их правообладатель Allegro Microsystems выпускает модификацию ACS723, которая и поставляется на мировые рынки в текущий момент времени.

Видео по теме

Источник



Ардуино защита по току

Для измерения тока с помощью Arduino воспользуемся датчиком ACS712 от компании Allegro Microsystems. Данный датчик позволяет измерять переменный и постоянный ток в силовой, промышленной и бытовой электронике. Его можно использовать при управлении двигателями, обнаружении и управлении нагрузкой, создании защит от перегрузки по току.

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

Д атчик ACS712 поставляется в корпусе SOIC8 и предназначен для поверхностного монтажа. Выводы IP+ и IP- клеммы для измерения тока. FILTER — вывод для подключения конденсатора. VIOUT — аналоговый выход. VCC — питание датчика 5В. GND — земля.

Действие датчика основывается на эффекте Холла. Вблизи точного линейного датчика Холла расположена медная проводящая дорожка (на концах выводы IP+ и IP-) . Толщина медной дорожки обеспечивает выживание устройства при 5-кратном превышении тока. Её сопротивление 1,2 мОм. Протекающий через эт у дорожку ток , генерирует магнитное поле, которое воспринимается схемой Холла и преобразуется в пропорциональное напряжение.

Семейство датчиков ACS712 состоит из 3-х чипов на разные диапазоны измерения тока: 5 А ( ACS712ELCTR-05B-T ) , 20 А ( ACS712ELCTR-20A-T ) и 30А мпер ( ACS712ELCTR-30A-T ) .

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

При питании датчика от 5 вольт, если к его измеряемым клеммам не будет подключена нагрузка, выходное напряжение датчика будет равно 2,5В (рассчитывается по формуле VCC/2, где VCC — напряжение питания датчика) . 2,5В — это базовое напряжение датчика, которое нужно вычитать из измеренного напряжения.

Чувствительность датчик ов (Sens) изменяется в зависимости от диапазона измерения силы тока микросхемы и зависит от напряжения питания. С увеличением диапазона — уменьшается чувствительность. На графиках ниже представлены графики чувствительности в зависимости от диапазона измеряемого тока:

ACS712ELCTR-05B-T имеет чувствительность 185 мВ/А

ACS712ELCTR-20A-T чувствительность 100 мВ/А

ACS712ELCTR-30A-T чувствительность 66 мВ/А

Датчик облада е т низкой погрешностью ±1% , при температуре от 25 до 150°С. Это достигается благодаря его калибр овке на стадии производства . В процессе этой операции измеряется погрешность чувствительности и выходное напряжение в рабочей точке. Эти параметры измеряются при комнатной температуре и температуре в диапазоне 85…150°С. Данные заносятся в специальную память.

Среди прочих характеристик:
— Работа в диапазоне температур -40…85°C.
— Полоса пропускания 80 кГц.
— Почти нулевой магнитный гистерезис.

Подключение датчика ACS712 к Arduino.

Для подключения датчика к Arduin o удобнее использовать готовый модуль.

Внешний вид с 2-х сторон.

Принципиальная схема модуля. К разъёму Р1 подключается измеряемая цепь, к разъёму Р2 — микроконтроллер (в примере Ардуино). Измеряемая цепь изолирована от выводов микроконтроллера. Среднеквадратичное минимальное напряжение изоляции между контактами 1 — 4 и 5 — 8 — 2,1 кВ. Светодтод D1 сигнализирует о питающем напряжении на датчике. Считаю это бесполезной функцией, поскольку в готовых проектах подобные датчики спрятаны в каких то коробках и не находятся на видном месте.

Для подключения к Arduino используется 3 вывода:

Источник