Датчик тока ACS712
- Войдите на сайт для отправки комментариев
Пт, 13/12/2013 - 15:54
Подключил датчик тока ACS712 на 30А к ардуино нано.
Залил скетч
void setup(void){ Serial.begin(9600); } void loop(){ { float average = 0; for(int i = 0; i < 100; i++) { average = average + (.0264 * analogRead(A6) -13.51) / 100; delay(1); } Serial.println(average); } }
Значения в компорте когда датчик ни к чему не подключен
-0.04
-0.04
-0.04
-0.03
-0.03
-0.04
-0.03
-0.04
А когда подключаю к линии (светодиод включен к аккумулятору) , значения
0.03
0.03
0.03
0.03
0.03
0.03
0.04
0.03
0.03
Потом погуглив, увидел в "тырнете" статью http://www.lucadentella.it/en/2011/11/29/sensore-di-corrente-con-arduino/ , где есть формула для правильного просчета...
Там датчик на 5А , а у меня 30А ... Как изменить формулу ???
average = average + (.0264 * analogRead(A6) -13.51) / 100;
Что бы правильно считать значения ...
Чуствительность датчика на 5А --- 185mV / A
А у датчика на 30А --- 66mV / A
Во-первых, "ноль" надо выставлять, во-вторых - данные надо усреднять и выбрасывать явно ошибочные результаты.
Формула исчисляется достаточно просто: сам датчик, как Вы уже догадались, преобразует ток в напряжение, а аналоговый вход преобразует напряжение в некую величину от нуля до 1023.
Ноль тока (половина напряжения питания модуля) - где-то в районе 512 единиц. Реально, у меня, например, он в районе 518.
Дальше делите свое напряжение питания модуля на 1023, умножаете на "mV/A" датчика, и получаете некий коэффициент пересчета K: это делается просто чтобы сэкономить время программе, и не делать каждый раз множество операций с плавающей точкой.
http://inet-deal.mpa.ru/articles/arduino-002.html
Вот здесь http://forum.arduino.cc/index.php?topic=108953.0
пишут "In my case .0264 would be .0074 since I have the 30A version."
там еще полезное в тему пишут.
СПС , буду пробовать
Попробовал , значения -
http://inet-deal.mpa.ru/articles/arduino-002.html
inhelp, дак а чем всё таки закончилось дело? Какая формула всё таки?
inhelp, дак а чем всё таки закончилось дело? Какая формула всё таки?
//(.0264 * analogRead(A0) -13.51) / 1000;
//for the 5A mode, if 20A or 30A mode, need to modify this formula to
//(.049 * analogRead(A0) -25) for 20A mode and
//(.044 * analogRead(A0) -3.78) for 30A mode
Неправильная у Вас формула. За правильной - в дэйташит.
У меня получилась (.0742 * analogRead(A0) -37.873) / 1000
Мерял мультиметром, похоже на правду.
Датчик конский. Боится любых наводок, пришлось его в пермаллой закатать.
Кстати, можно ли его питать напряжением 8,4В ? Не хочется менять DC преобразователь.
Забыл написать - правильная формула для 30 амперного датчика:
I=0.0148*Vcc*(count-512)
Vcc почти никогда не 5В, поэтому его желательно юстировать каждый раз перед замером тока при помощи внутреннего ИОНа.
Да и 512 выбирается из расчета выхода на "ноль". Т.е. при отсутствии нагрузки на измерительной части дачтика "512" берется таким, что бы результат был "0".
Ну и питать контроллер и датчик от одного источника.
Всё гораздо проще. Применение формулы из англоязычной статьи не совсем правильно.
Датчик реально не прост в использовании - реагирует на металлы и проводники поблизости, требует ИОН в качестве питания, 10 битного АЦП мало ему, стоит пробовать подключать 12-16 битные внешние АЦП со встроеным ИОНом, например ADS1115 (15 бит, стоит 130 руб).
Самое простое решение без использования ИОНов и АЦП - питание Ардуино DC-DC конвертерами, использование алгоритмов вычисления среднего значения за определённый период и калибровка с помощью более или менее нормального тестера.
Для себя я делал вольтметр-амперметр для LiPo 4S аккумулятора - LCD 1602 по I2C, датчик ACS712 на 5А, делитель напряжения на 1% резисторах:
Вычисление тока я делал по другой формуле, где фактически не важно, какое напряжение на ардуино, вычисление идёт по шкале 1024. Единственное, нужно внести изменение в цифру "514" под себя, это нужно для калибровки.
Выбрасил нахрен этот датчик. Он очень часто хватает гистерезис и только сброс питания помогает. Еще он боится любых наводок. Сейчас есть бредовая, но вероятно рабочая идея - взять дешевый китайский вольтметр-амперметр типа dsn-vc288 или YB27VA. Этот девайс довольно точно считывает напряжение и ток. Можно считать его показания прямо с пинов индикатора через мультиплектор или расширитель портов.
Друзья, товарищи выручайте.
Хочу измерять Амперы (до тысячной доли Ампера)
Подключив данную схему к источнику питания 5,00 Вольт (Мультиметр XL830L показывает 4,99-5,00 Вольт Питание от преобразователя LM2596 DC-DC)
В порту получаю:
Подключив нагрузку к модулю ASC712 в виде кулера от компьютера, получаю:
(Питание на кулер отдельное, 9 Вольт 1 Ампер)
Что-то типо такого:
При значении на входе датчика (Vxod) напряжения, равному напряжению питания (Pitanie) - это 30А, соответственно:
Датчик двухполярный. 2.5 вольта это 0 ампер. 5 вольт это 30 ампер. 0 вольт это -30 ампер. Если датчик поместить в коробочку из мягкого железа толщиной стенок не менее 5 мм и сглаживать результат то можно довести точность до 1мА.
Т.е. 2,5 Вольт - это 30А
2,5=30
х=1
Получаем что 1 Ампер - это 0,0833333333333333 Вольт
Получаю Vxod:
2.5 вольта это ноль ампер. (V-2.5)*k.
temp=(Vxod-2.5)*0.0833333333333333;
Получаю:
А если ток подать?
1. Вычитать нужно не 2.5 Вольта, а половину напряжения питания.
2. Для 30-амперного датчика 5 Вольт соответствует не 30, а где-то в районе 40-50 А. Точную цифру можно посмотреть в дэйташите.
3. !60 мА - это около 3-х единиц младшего разряда, т.е. где-то на границе погрешности. Измерять столь малые токи 30-амперным датчиком - весьма сомнительное занятие. Следовало бы взять хотя бв 5-амперный датчик.
А если ток подать?
Это были показания с учётом подачи тока.
Про 40-50 Ампер при 5 Вольтах в даташите я ничего не нашла.
Tok=(Vxod-(Pitanie/2))*0.0833333333333333;
Результат неверный
Странно. У меня на калькуляторе 30/2.5=12 а не 0.0833333
Про 40-50 Ампер при 5 Вольтах в даташите я ничего не нашла.
Открыл первый попавшийся - на первой странице: "66 to 185 mV/A output sensitivity". Вот 66 - это для 30-амперного, а 185 - для 5-амперного. На второй стренице - табличка, из которой выясняем, что для 20-амперного - 100 мВ/А. (ну это - так, для полноты)
Возвращаемся к 30-амперному. 2500мВ / 66мВ/А = 37.9А. До 40 А, конечно, не дотягивает, но все ближе к 40, чем к 30.
Получается вот так?
temp=(Vxod-(Pitanie/2))*(37.9/(Pitanie/2));
У вас вообще чистые показания датчика тока меняются в зависимости от нагрузки ? И да, 30А датчик практически не реагирует на слабый ток. Попробуйте подключить что-то с током потребления не ниже 0.5А или больше.
Из даташита для 30А:
Sensitivity Sens Over full range of IP , TA = 25°C | 64 | 66 | 68 | mV/A
Можно temp=(Vxod-(Pitanie/2))/0.066;
Но если нужна точность, то подобрать на что делить по образцовому амперметру в диапазоне 0.064-0.068 .
использую " map " вполне устраивает.
Если нужна точность, то добавляете в программу прибора калибровку типа "подать 1А, 5А, 10А, 30А" после чего производится расчет корректора. Калибровку лучше всего производить хотя бы перед каждой серией замеров, подавать ток с поверенного прибора.
Можно temp=(Vxod-(Pitanie/2))/0.066;
0,50 кажет мультиметр
0,522--0,528 кажет Ардуино
Более менее точно
У вас вообще чистые показания датчика тока меняются в зависимости от нагрузки ?
Да, меняются
Бился я с 5-амперным модулем довольно долго и в итоге понял, что пытаться ловить с его помощью миллиамперы - безнадежное занятие. Схема у меня примерно такая же, как в посте Irinka - модуль ACS712 - модуль ADS1115 - Arduino Nano - Display 1602 на I2C.
При отсутствии измеряемого тока показания на дисплее скакали вокруг нуля в пределах до сотни миллиампер в плюс и в минус. Стал разбираться, откуда эта нестабильность берется.
Первое с чем столкнулся - нужен хороший источник питания, желательно отдельный от Arduino. Поначалу Arduino у меня был подключен к компьютеру через USB порт для заливки скетчей, а от его 5 вольт питались и все остальные модули. Такой вариант явно не прокатывает - нужен отдельный стабилизатор для ACS712, его же можно использовать и для ADS1115, а вот Arduino и дисплей должны быть запитаны отдельно, это немного снижает нестабильность показаний.
Затем боролcя с шумом на выходе ACS712 - попробуйте подключить к нему осциллограф, увидите сами, что там творится. Даташит обещает типовое значение шума на выходе 21mV peak-to-peak, у меня получалось несколько больше, милливольт 30-35. Понятно, что на фоне такого шума единицы милливольт поймать трудно, даже если усреднять результаты десятков измерений. Рекомендуемое в даташите увеличение емкости конденсатора, подключенного к 6-й ноге микросхемы, вместо ожидаемого снижения уровня шума даже несколько его увеличило. Пришлось между выходом ACS712 и входом ADS1115 приделать RC фильтр, шум значительно снизился, но нестабильность показаний снизилась опять же не очень сильно.
Потом обнаружился значительный температурный дрейф нуля. После включения схемы выходное напряжение ACS712 плывет в сторону уменьшения в течение нескольких минут и лишь минут через 10 более-менее стабилизируются, так что если подобрать в программе значение напряжения, которое надо вычитать из измеренного АЦП (у меня получилось 2.4865V) "на холодную", то после 10-минутного прогрева результат на дисплее уползает миллиампер на 40 в минус. Ну, а если поднести к микросхеме палец или открыть форточку, то тут уже точно без программной калибровки не обойтись, только это хорошо, если ток надо измерить один раз и непосредственно после калибровки, а если мерить в течение длительного времени, то куда уползет за это время температура, а за ней и результаты измерения - предсказать невозможно.
И, наконец, самое пикантное - чувствительность ACS712 к окружающему магнитному полю, включая магнитное поле Земли. Когда я более-менее победил зависимость от напряжения питания, шумы микросхемы и температурный дрейф и довел нестабильность результатов на дисплее до единиц миллиампер (при нулевом токе на входе), я случайно перевернул плату и вместо нуля увидел на дисплее "50 mA"! Покрутив ее туда-сюда, я обнаружил, что из нее можно сделать отличный электронный компас, а вот амперметр для измерения малых токов - вряд ли. Несильно намагниченный пинцет или плоскогубцы, лежащие в нескольких сантиметрах от модуля, начисто убивают всю предшествующую "ловлю блох", а более сильный магнит, например, от громкоговорителя, он чует чуть ли не за два метра, на дисплее при этом появляются показания до сотен миллиампер.
Вывод: этот модуль хорош для измерения с невысокой точностью токов в диапазоне единиц ампер (или десятков ампер для модулей на 20А и 30А), когда всеми перечисленными выше погрешностями (от нестабильности питания, от собственных шумов, от температуры и от внешних магнитных полей) можно пренебречь. Его основные достоинства - полная изоляция датчика тока от выхода микросхемы, а также практически нулевое его сопротивление, что позволяет втыкать его куда угодно без нарушения работы устройства, в котором измеряется ток. А вот насчет измерения малых токов с приемлемой точностью, тут - увы! Надо искать другие решения.
Бился я с 5-амперным модулем довольно долго и в итоге понял, что пытаться ловить с его помощью миллиамперы - безнадежное занятие.
1ма/5000ма = 0,0002 = 0,02%
вряд ли лабораторный амперметр такого класса точности можно купить по цене ACS712.
Вывод: этот модуль хорош для измерения с невысокой точностью токов в диапазоне единиц ампер (или десятков ампер для модулей на 20А и 30А), когда всеми перечисленными выше погрешностями (от нестабильности питания, от собственных шумов, от температуры и от внешних магнитных полей) можно пренебречь. Его основные достоинства - полная изоляция датчика тока от выхода микросхемы, а также практически нулевое его сопротивление, что позволяет втыкать его куда угодно без нарушения работы устройства, в котором измеряется ток. А вот насчет измерения малых токов с приемлемой точностью, тут - увы! Надо искать другие решения.
С выводами автора в принципе согласен, просто предлагаю небольшой скетч для тестирования этих дачиков (по мотивам Axila).
Кто-нибудь пробовал на шунте ADS1115 использовать? как точность показаний выходит?
evgta, есть же специализированные решения для измерения тока, сразу с цифровым выходом. типа ina226.
evgta, есть же специализированные решения для измерения тока, сразу с цифровым выходом. типа ina226.
Да, поняв, что с ACS712 ничего хорошего не выйдет, я как раз заказал модуль на базе INA226. Жду посылку, как придет, доложу о результатах. К сожалению, в отличие от ACS712, у этого INA226 нет гальванической развязки между токовым датчиком и самой микросхемой, но в большинстве случаев это не проблема.
В дополнение к моему предыдущему комменту: выяснил, отчего первые несколько минут после включения у модуля на базе ACS712 ползет выходное напряжение. Дело в том, что на плате совсем рядом с микросхемой расположен SMD светодиод, призванный показывать, что на модуль подано питание. Пользы от него ноль, поскольку модуль этот скорее всего будет располагаться где-то в глубинах корпуса изделия и вряд ли будет виден снаружи, а вот при подаче питания, он начинает греться и согревать находящуюся поблизости микросхему. Пока тепловой режим не установится, показания будут заметно плыть. Выход простой - отпаять его за ненадобностью и, как минимум, одной бедой станет меньше, однако, зависимость от температуры окружающей среды все равно останется.
Еще одно дополнение к моему комменту от 11 октября.
Пока ждал посылки с INA226 решил еще поэкспериментировать с ACS712 и пришел к выводу, что все перечисленные в том комменте проблемы можно в значительной степени ослабить, если использовать два модуля ACS712, у которых токовые датчики включены встречно-последовательно, а выходы модулей включены на два канала ADS1115. Результаты оцифровки выходных напряжений надо вычесть друг из друга, при этом, если считать, что обе микросхемы ACS712 имеют примерно одинаковые температурные дрейфы нуля, находятся в одинаковом внешнем магнитном поле и одинаково зависят от изменения напряжения источника питания, то при вычитании, все эти погрешности обнулятся. Полезный же сигнал, вызванный протеканием измеряемого тока, при вычитании, наоборот, удвоится, поскольку датчики тока включены в противоположном направлении.
Попробовал это на практике - работает! Конечно, стопроцентной компенсации всех погрешностей таким способом добиться невозможно, но раз в десять точность все-таки повысилась. Во всяком случае, почти исчезло влияние внешнего магнитного поля - теперь конструкцию можно вертеть как угодно без заметного ухода нуля, исчез дрейф нуля при прогреве и так далее. Разумеется, два модуля ACS712 для этого должны быть расположены как можно ближе и строго параллельно друг другу. В целом, если с одним модулем максисмум, чего удалось добиться, это +/- 40mA на дисплее при отсутствии измеряемого тока, то в схеме с двумя модулями получается +/- 4mA.
...выходы модулей включены на два канала ADS1115. Результаты оцифровки выходных напряжений надо вычесть друг из друга, ...при вычитании, все эти погрешности обнулятся. Полезный же сигнал, вызванный протеканием измеряемого тока, при вычитании, наоборот, удвоится, поскольку датчики тока включены в
Уважаемый Doctor, я начинающий ардуинщик, но хочу попробовать Ваш способ с двумя входами АЦП.
Опыта не хватает к сожалению. Не могли бы Вы поподробнее рассказать про то, что я у Вас процитировал.
Может быть я не совсем понял, но мне кажется,что после вычитания выходных напряжений останется как раз только помеха, или я не прав? Подскажите пожплуйста, как правильно вычитать сигналы оцифровки. Например у меня с одного выхода 522, с другого 509. Т.е. 522 - 509 = 13. Вобщем запутался.
Сложить и поделить на два
Может быть я не совсем понял, но мне кажется,что после вычитания выходных напряжений останется как раз только помеха, или я не прав? Подскажите пожплуйста, как правильно вычитать сигналы оцифровки. Например у меня с одного выхода 522, с другого 509. Т.е. 522 - 509 = 13. Вобщем запутался.
Тут вы действительно не совсем поняли. Судя по тому, что ваши цифры находятся вблизи значения 512 вы не используете ADS1115, а подали выходные напряжения двух модулей ACS712 на два аналоговых входа Ардуино. Так тоже можно, хотя точность при этом будет несколько ниже за счет того, что ADS1115 - 16-ти разрядный АЦП, а у Ардуино разрядность АЦП всего 10.
Далее. Я так предполагаю, что цифры 522 и 509 у вас получаются при отсутствии измеряемого тока. В идеале обе цифры должны быть 512 (или 511) и разность их будет равна 0, что соответствует нулевому измеряемому току. Поскольку модули не совершенно одинаковы и имеют некоторый разброс нулевой точки, у вас разность получилась не равной нулю и ее надо в программе скорректировать. Т.е. для ваших конкретных двух модулей эти лишние 13 единиц нужно дополнительно вычесть:
N = N1 - N2 - 13 (1)
где N1 и N2 это оцифрованные значения выходных напряжений двух модулей, которые для 10-разрядного АЦП Ардуино могут меняться в диапазоне от 0 до 1023. Для других экземпляров ACS712, величина, на которую надо скорректировать разность, наверняка окажется какой-то другой, поэтому для каждого конкретного изделия эта поправка подбирается индивидуально.
После такой корректировки у вас нулевому измеряемому току будет соответствовать нулевое значение N. Теперь подаем измеряемый ток. При этом, поскольку датчики тока включены в противоположном направлении, выходное напряжение одного модуля будет повышаться, а другого - на столько же понижаться. Например, при некотором измеряемом токе число N1 повысится на 50 единиц, а N2 на столько же понизится, т.е.
было N1=522, N2=509, а стало N1=572, N2=459
Тогда, если снова посчитать N по формуле (1), то получится:
N = 572 - 459 - 13 = 100
т.е. один датчик намерил 50 в плюс, другой - 50 в минус, а их разность пропорциональна удвоенному значению измеренного тока. Для того чтобы это число N перевести в реальные амперы или миллиамперы, нужно найти коэффицииент пересчета из этих единиц в ток. Можно, конечно, вычислить этот коэффициент теоретически, зная, что диапазону 0-1023 соответсвует 5V на аналоговом входе Ардуино, т.е. одна единица - это 4.8828mV, затем поделить это на чувствительность ACS712, которая для 5-амперного модуля составляет 185mV на 1A измеряемого тока, а также не забыть поделить это все на два, что в итоге даст требуемый коэффициент. Однако, проще (и точнее) получить этот коэффициент экспериментально, подав на датчики известный ток и контролируя его величину каким-нибудь достаточно точным амперметром, посмотреть, какое при этом получится значение N и, поделив одно на другое, вычислить нужный коэффициент.
А что касается погрешностей, вызванных температурой, нестабильностью источника питания или магнитными полями, то все они будут действовать на оба модуля в одинаковом направлении и при вычитании взаимно уничтожатся. Так что уважаемый evgta в предыдущем комменте не совсем прав - числа N1 и N2 надо вычитать, а не складывать.
Это смотря как подключить, если и первый и второй измеряет в одну сторону то сложить , а если один положительный ток а другой отрицательный то вычесть
Огромное спасибо за развёрнутый и очень обстоятельный ответ. Очень рад, что на форуме присутствуют такие замечательные люди-специалисты, которые помогают начинающим в познании технических тонкостей. Буду пробовать. Действительно, я подал сигнал с двух датчиков тока ADS758 (50А, 40mV/A) на два разных аналоговых входа ардуины, поскольку ADS1115 только заказан и еще не пришел. Но мне важно было понять принцип, и Вы мне в этом помогли, за что я Вам весьма признателен.
Огромное спасибо за развёрнутый и очень обстоятельный ответ.
Не за что. Я сам впервые столкнулся с этими модулями на базе датчиков Холла и мне было интересно понять, как с ними работать. Пока я пытался использовать один модуль, мое отношение к ним было довольно скептическим - достаточной точности измерений получить не удавалось, потом, когда пришла в голову идея с использованием двух модулей, оптимизма прибавилось.
Благодаря длинным новогодним каникулам доделал приборчик, в котором для измерения тока используется пара пятиамперных ACS712, включенных по дифференциальной схеме. И не только приборчик доделал, но и описание к нему написал, кратенькое, страниц на 10, но с картинками. Там же и скетч лежит. Если кому интересно, смотрите тут.
Вопрос от новичка? А нельзя все проще сделать.
Задать масив. Потом в масив загнать измерения больше чем за 20 мс (поймать хотябы один период).
С масива вытянуть максимальное значение. Умножить на коефициент и для действующего значения на 0.707
for (byte i=0; i<240; i++){ // До 250 измерений если иначе менять тип i
Curnt1Arr[i]=analogRead(AMP1);
}
I1max = Curnt1Arr[0]; // берем первый элемент массива
for (byte i=0; i<240; i++) { // переберем весь массив
if (I1max < Curnt1Arr[i]) I1max = Curnt1Arr[i]; // если элемент больше, чем в переменной, то присваиваем его значение переменной
}
I1=0.0148*4.9*(I1max-512);
Мда, оч сложно все с этим датчиком.
Подключил через него дисплей 1602 и никак не могу высчитать потребляемый им ток. Помогите пож, я уже се формулы перепробывал для 20А датчика.
Вот перепробыванные варианы, результаты оч странные и неправдивые.
Voltage кажет 2333.98
А вот Amp 23
Еще вопрос, им же замерить напряжение питания дисплея не получится? Какой способ простой посоветуете?
Мда, оч сложно все с этим датчиком.
Подключил через него дисплей 1602 и никак не могу высчитать потребляемый им ток. Помогите пож, я уже се формулы перепробывал для 20А датчика.
Вот перепробыванные варианы, результаты оч странные и неправдивые.
Voltage кажет 2333.98
А вот Amp 23
Еще вопрос, им же замерить напряжение питания дисплея не получится? Какой способ простой посоветуете?
Загрузи скетч с поста 34.
Как можно замерить напряжение датчиком тока ? - НИ КАК. Напряжение мерить нужно вольтметром.
Посоветуйте еще как лучше замерить постоянное напряжение, ,каким-то модулем или пином через резисторы?
Проще всего (старую зарядку от телефона, не импульсную) и вперед
http://adatum.ru/izmerenie-napryazheniya-220-volt-na-arduino.html