Датчик тока для ардуино

Для измерения тока с помощью 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.

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

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

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

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

ACS712

Arduino

+5В

К любому аналоговому выводу, например А2

Скетч №1. Считываем значение с аналогового выхода ACS712:

Как уже упоминал выше, при нулевом значении тока на клеммах датчика, напряжение на его аналоговом выходе VIOUT равняется половине напряжения питания датчика (2,5В). В первом примере ничего не будем подключать к клеммам, что бы создать нагрузку в 0Ампер.

В первой строке скетча прописываем аналоговый пин, к которому подключаем датчик,в примере 2 (A2). В строке «Value = analogRead(analogPin);» с помощью функции «analogRead» считываем значение с аналогового пина в переменную «Value». Далее, с помощью «Serial.println» выводим содержимое переменной на дисплей, которое можно посмотреть в мониторе последовательного порта Arduino IDE.

Результатом выполнения скетча будет повторяющаяся запись со значением 512. Что такое 512?

Вспоминаем, что каждый из 6 каналов аналого-цифрового преобразователя Arduino — 10 битный, это значит, что входное напряжение от 0 до 5В, преобразовывается в значения от 0 до 1023. 2,5В будет соответствовать значению 512.

Скетч №2. Вычисляем постоянный ток с помощью ACS712:

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

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

При конструировании различных систем измерения и контроля может потребоваться измерить ток, протекающий по проводнику. Встроенными средствами аппаратной платформы Arduino низкое постоянное напряжение можно измерить без каких-либо проблем, а вот ток так просто измерить не получится. Одним из специальных датчиков, предназначенных решить данную проблему, является датчик тока ACS712, эти датчики бывают рассчитаны на различные максимальные значения измеряемого тока, в данном случае автор использовал датчик на 20А. Физически работа этого устройства основана на эффекте Холла. Данный эффект заключается в том, что носители электрического тока при движении вдоль проводника, помещенного в поперечное магнитное поле испытывают на себе действие силы Лоренца и отклоняются в сторону. Из за этого на боковых, по отношению к направлению тока, сторонах проводника возникает разность потенциалов, которую можно измерить . Датчик приобретен здесь всего за 100 рублей:

Устройство поставляется в антистатическом пакете

На печатной плате устройства хорошо видна клеммная колодка для подключения контролируемой цепи.

Габариты платы датчика 31 х 13 х 12 мм, масса 3,1 г.

Тестирование токового датчика

Автор обзора приобрел версию датчика рассчитанную на ток до 20 А, и это в целом было ошибкой. В радиолюбительской практике все же довольно редко приходится иметь дело с подобными значениями силы тока, так что более рациональным было бы приобретение версии рассчитанной на 5 А, так как у нее разрешение 185 мВ/А, против 100 мВ/А у 20А версии. Тем не менее, и данную версию можно использовать, но точность у нее ниже при измерении токов порядка 1 А.

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

В опытах по тестированию данного модуля использован блок питания, дающий напряжение 5 В, который согласно маркировке рассчитан на максимальный ток 2 А. При подключении одного резистора сопротивлением 10 Ом, ток через датчик составляет примерно 0,47 А.

При этом АЦП возвращает значение около 504.

При подключении параллельно первому резистору второго резистора с аналогичным сопротивлением, общее сопротивление потребителя составит 5 Ом, при этом амперметр показывает значение силы тока около 0,9 А.

При этом АЦП возвращает значение около 496.

Как известно встроенный АЦП Arduino UNO является 10 разрядным, т.е. диапазону напряжений от 0 до 5 В ставится в соответствие двоичное число от 0 до 1023. Таким образом, разрешение АЦП составляет примерно 0,0049 В. Как следует из приведенных выше данных току в 0,47 А соответствует напряжение 2,46 В, а току 0,9 А – 2,42 В, т.е изменению тока на 0,43 А соответствует изменение напряжения на 40 мВ, что вполне соответствует заявленным продавцом 100 мВ/А.В целом рассмотренный датчик заданные функции выполняет вполне успешно, устройство своих денег стоит.

>Ссылки по теме

Датчик тока ACS712

Измерение и контроль протекающего тока являются принципиальным требованием для широкого круга приложений, включая схемы защиты от перегрузки по току, зарядные устройства, импульсные источники питания, программируемые источники тока и пр. Один из простейших методов измерения тока –использование резистора с малым сопротивлением, – шунта между нагрузкой и общим проводом, падение напряжения на котором пропорционально протекающему току. Несмотря на то, что данный метод очень прост в реализации, точность измерений оставляет желать лучшего, т.к. сопротивление шунта зависит от температуры, которая не является постоянной. Кроме того, такой метод не позволяет организовать гальваническую развязку между нагрузкой и измерителем тока, что очень важно в приложениях, где нагрузка питается высоким напряжением. Датчик тока ACS712 основан на эффекте Холла, суть которого в следующем: если проводник с током помещён в магнитное поле, на его краях возникает ЭДС, направленная перпендикулярно к направлению тока и направлению магнитного поля (рисунок 1).

Рисунок 1. Эффект Холла.

Датчик тока ACS712 состоит из датчика Холла и медного проводника. Протекающий через медный проводник ток создает магнитное поле, которое воспринимается элементом Холла. Магнитное поле линейно зависит от силы тока. ACS712 датчик построен на эффекте Холла и имеет линейную зависимость измеряемого тока и выходного сигнального напряжения. Уровень выходного напряжения сенсора пропорционально зависит от измеряемого тока. Диапазон измерения от −5 А до 5 A. Чувствительность — 185 мВ/А. При отсутствии тока выходное напряжение будет равняться половине напряжения питания. Датчики ACS712 и ACS713 питаются от +5В и имеют выход по напряжению. При токе равном нулю напряжение на выходе для ACS712 равно 2,5В и отклоняется в или ближе к нулю или ближе к напряжению питания — зависит от направления протекания тока. ACS712 обеспечивает экономное и прецизионное решение для измерения AC и DC тока в промышленных, автомобильных, коммерческих системах и системах связи. Корпус устройства обеспечивает удобную реализацию для пользователя. Устройство состоит из прецизионного линейного датчика тока на базе эффекта Холла с медным проводником на нижней части. Прикладываемый к медному проводнику ток создает, улавливаемое датчиком, магнитное поле, которое преобразуется в пропорциональное напряжение. Точность устройства оптимизирована за счет непосредственной близости от магнитного сигнала к датчику. Напряжение обеспечивается BiCMOS Hall микросхемой с низким смещением и заводскими настройками точности.

Пример использования

Датчик тока подключается к нагрузке в разрыв цепи через колодки под винт. Для работы с датчиком мы можно использовать библиотеку TroykaCurrent, которая переводит значения аналогового выхода датчика в миллиамперы. В листинге 1 представлен скетч для измерения постоянного тока.
Листинг 1 // пин подключения контакта OUT #define PIN_OUT A0 // подключение библиотеки #include <TroykaCurrent.h> // создание объекта ACS712 dataI(PIN_OUT); void setup() { // запуск последовательного порта Serial.begin(9600); } void loop() { // вывод показаний в последовательный порт Serial.print(«i = «); Serial.print(dataI.readCurrentDC()); Serial.println(» A»); delay(1000); } Загружаем скетч на плату Arduino, подключаем нагрузку к источнику питания 12В и смотрим значение тока при подключении хоппера выдачи монет (рис. 4) и двигателя для вендингового аппарата (рис. 6).

Рисунок 3. Подключение хоппера выдачи монет к источнику питания 12В.

Рисунок 4. Измерение силы тока при подключении хоппера выдачи монет к источнику питания 12В.

Рисунок 5. Подключение двигателя для вендингового аппарата к источнику питания 12В.

Рисунок 6. Измерение силы тока при подключении двигателя для вендингового аппарата к источнику питания 12В.

В листинге 2 представлен скетч для измерения переменного тока.
Листинг 2 // пин подключения контакта OUT #define PIN_OUT A0 // подключение библиотеки #include <TroykaCurrent.h> // создание объекта ACS712 dataI(PIN_OUT); void setup() { // запуск последовательного порта Serial.begin(9600); } void loop() { // вывод показаний в последовательный порт Serial.print(«Current is «); Serial.print(dataI.readCurrentAC()); Serial.println(» A»); delay(1000); }

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

  1. Электроны
  2. Пластина
  3. Магниты
  4. Магнитное поле
  5. Источник тока

Различная плотность электронов на сторонах пластины создаёт разность потенциалов, которую можно усилить и измерить, что датчики Холла и делают.
Датчики Холла (далее просто ДХ) бывают аналоговыми и цифровыми. Аналоговый преобразует индукцию магнитного поля в напряжение, знак и величина которого будут зависеть от полярности и силы поля. Цифровой же выдаёт лишь факт наличия/отсутствия поля, и обычно имеет два порога: включения — когда значение индукции выше порога, датчик выдает логическую единицу; и выключения — когда значение ниже порога, датчик выдаёт логический ноль. Наличие зоны нечувствительности между порогами называется и служит для исключения ложного срабатывания датчика на всяческие помехи — аналогично работает цифровая электроника с логическими уровнями напряжения. Цифровые ДХ делятся ещё на униполярные и биполярные: первые включаются магнитным полем определённой полярности и выключаются при снижении индукции поля; биполярные же включаются полем одной полярности, а выключаются полем противоположной полярности.

Аналоговый ДХ
Его размер — всего 4×3 мм, и он имеет три вывода:

Как видно, питание датчику нужно биполярное — тогда на южный полюс магнита датчик будет реагировать положительным уровнем на выходе, на северный — отрицательным, а на отсутствие поля — нулевым. Однако можно обойтись однополярным питанием — в этом случае уровень на выходе (Vo) в половину напряжения питания (Vdc/2) будет означать отсутствие магнитного поля, Vo > Vdc/2 — южный полюс, Vo < Vdc/2 — северный.
Характеристики при однополярном питании 5 В и температуре от -40 до 85 °C:

  • Потребляемый ток: от 6 до 10 мА
  • Выходной ток: от 1.0 до 1.5 мА
  • Выходное напряжение: от 1.0 до 1.75 мВ/Гс, в среднем 1.4 мВ/Гс (милливольт на )
  • Нулевая точка: от 2.25 до 2.75 В, в среднем 2.5 В
  • Магнитный диапазон: от ±650 Гс до ±1000Гс
  • Время отклика: 3 мс

Из этих данных следует, что при стандартном питании от Arduino (+5V, GND) при 25 °C датчик в отсутствие магнитного поля будет выдавать 2.5 В, а на поле силой 1000 Гс — 2.5 ± 1.4 В. Соответственно, если воспользоваться АЦП, разброс значений будет примерно в диапазоне от 280 до 800 со нулевой точкой в 512.
Приступим к экспериментам. Подключаем вывод “+” к 5V Arduino, вывод “-” к GND, оставшийся — к Analog 0:
Заливаем в Arduino следующий скетч:
void setup() { Serial.begin(9600); } void loop() { Serial.println(analogRead(0)); delay(500); }
Не спеша подносим магнит вплотную сначала одним полюсом, потом другим, глядя в Serial monitor:

Цифровой биполярный ДХ
Выглядит он точно так же, как и аналоговый, даже выводы расположены так же:

Тут можно не бояться, биполярный он только в магнитном смысле, а питание ему можно подавать вполне себе обычное, однополярное. К слову, питание этот датчик принимает в довольно широком диапазоне — от 3.8 до 24 В, а ток может отдавать до 100 мА, что позволяет непосредственно от него запитывать управляемые им устройства (например, реле). Чувствительность у него почти точь-в-точь как у аналогового SS49E: от -600 Гс до -1000 Гс (северный полюс магнита) и от 600 Гс до 1000 Гс.
Подключается он чуть посложнее, чем аналоговый: выход датчика Q нужно подтянуть к питанию резистором в 10 кОм, так как выход у него с открытым коллектором:
А вот и суперсложное подключение, где выход Q подключен к цифровому пину 2:
Зальём в Arduino ещё один крутой скетч:
void setup() { Serial.begin(9600); } void loop() { static uint8_t prev_state = LOW; uint8_t state = digitalRead(2); if (state != prev_state) { prev_state = state; Serial.println(state == LOW ? «OFF» : «ON»); } }
Теперь подносим магнит то одним полюсом, то другим и смотрим в Serial monitor:

Обратите внимание — датчик не переключается, пока не поднесёшь магнит другим полюсом, а ещё он очень чувствительный и переключается магнитом, вытащенным из дохлого CD-ROM’а, на расстоянии около 2 см!
Применение
Датчики Холла используются в качестве бесконтактных выключателей, как замена герконам, для бесконтактных замеров тока в проводниках, управления моторами, чтения магнитных кодов, измерения уровня жидкости (магнитный поплавок) и т.д.
Ну а я, имея два цифровых биполярных ДХ, сделаю бесконтактный магнитный . Принцип прост: на вращающийся диск лепим рядышком два магнита разными полюсами вверх (для униполярных ДХ хватит одного), а над ними размещаем цифровые ДХ и снимаем показания. Можно использовать скетч из статьи про энкодеры, но смотреть на стрелочки скучно, ведь хочется ещё посчитать обороты, так что напишем новый:
#include <LiquidCrystal.h> LiquidCrystal lcd(13, 12, 11, 10, 9, 8); /* Пины, к которым подключен энкодер */ enum { ENC_PIN1 = 2, ENC_PIN2 = 3 }; enum { FORWARD = 1, BACKWARD = -1 }; /* Если что, revolutions здесь и далее — обороты, а не революции (: */ long revolutions = 0, revolutions_at_last_display = 0; int direction = FORWARD; uint8_t previous_code = 0; /* Реакция на событие поворота */ void turned(int new_direction) { if (new_direction != direction) { revolutions = 0; revolutions_at_last_display = 0; } else ++revolutions; direction = new_direction; } /* Объеденил чтение кода Грея с энкодера с его декодированием */ uint8_t readEncoder(uint8_t pin1, uint8_t pin2) { uint8_t gray_code = digitalRead(pin1) | (digitalRead(pin2) << 1), result = 0; for (result = 0; gray_code; gray_code >>= 1) result ^= gray_code; return result; } void setup() { pinMode(ENC_PIN1, INPUT); pinMode(ENC_PIN2, INPUT); lcd.begin(8, 2); } void loop() { /* Читаем значение с энкодера */ uint8_t code = readEncoder(ENC_PIN1, ENC_PIN2); /* Обрабатываем его */ if (code == 0) { if (previous_code == 3) turned(FORWARD); else if (previous_code == 1) turned(BACKWARD); } previous_code = code; /* Раз в секунду выводим накопленную информацию */ static unsigned long millis_at_last_display = 0; if (millis() — millis_at_last_display >= 1000) { /* Выводим на экран направление вращения */ lcd.clear(); lcd.print(direction == FORWARD ? «>> » : «<< «); /* … скорость вращения в оборотах в секунду */ lcd.print(revolutions — revolutions_at_last_display); lcd.print(«/s»); /* … и общее число обротов в текущем направлении */ lcd.setCursor(0, 1); lcd.print(revolutions); millis_at_last_display = millis(); revolutions_at_last_display = revolutions; } }
Выглядеть конечная установка может так:
Я разобрал старый нерабочий жёсткий диск и установил на его пластину два магнита от системы позиционирования головки CD-ROMа на расстоянии ~5 мм друг от друга, а датчики разместил на креплении над пластиной, на расстоянии ~15 мм друг от друга. Вот как оно работает:

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