Датчик тока ACS712

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Подключил датчик тока 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

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Во-первых, "ноль" надо выставлять, во-вторых - данные надо усреднять и выбрасывать явно ошибочные результаты.

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

Ноль тока (половина напряжения питания модуля) - где-то в районе 512 единиц. Реально, у меня, например, он в районе 518.

Дальше делите свое напряжение питания модуля на 1023, умножаете на "mV/A" датчика, и получаете некий коэффициент пересчета K: это делается просто чтобы сэкономить время программе, и не делать каждый раз множество операций с плавающей точкой.

http://inet-deal.mpa.ru/articles/arduino-002.html

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Вот здесь http://forum.arduino.cc/index.php?topic=108953.0

пишут "In my case .0264 would be .0074 since I have the 30A version."

там еще полезное в тему пишут.

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

СПС , буду пробовать

 

 

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Попробовал , значения -

-9.73
-9.73
-9.73
-9.73
-9.73
-9.73
 
HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013
Nikolaha53rus
Offline
Зарегистрирован: 17.04.2016

inhelp, дак а чем всё таки закончилось дело? Какая формула всё таки?

angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

Nikolaha53rus пишет:

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
 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Неправильная у Вас формула. За правильной - в дэйташит.

Nikolaha53rus
Offline
Зарегистрирован: 17.04.2016

У меня получилась (.0742 * analogRead(A0) -37.873) / 1000

Мерял мультиметром, похоже на правду.

Barny
Offline
Зарегистрирован: 23.01.2015

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

Кстати, можно ли его питать напряжением 8,4В ? Не хочется менять DC преобразователь.

Barny
Offline
Зарегистрирован: 23.01.2015

Забыл написать - правильная формула для 30 амперного датчика:

I=0.0148*Vcc*(count-512)

Vcc почти никогда не 5В, поэтому его желательно юстировать каждый раз перед замером тока при помощи внутреннего ИОНа.

Да и 512 выбирается из расчета выхода на "ноль". Т.е. при отсутствии нагрузки на измерительной части дачтика "512" берется таким, что бы результат был "0".

Ну и питать контроллер и датчик от одного источника.

MacMillan
Offline
Зарегистрирован: 25.10.2016

Всё гораздо проще. Применение формулы из англоязычной статьи не совсем правильно. 

Датчик реально не прост в использовании - реагирует на металлы и проводники поблизости, требует ИОН в качестве питания, 10 битного АЦП мало ему, стоит пробовать подключать 12-16 битные внешние АЦП со встроеным ИОНом, например ADS1115 (15 бит, стоит 130 руб).

Самое простое решение без использования ИОНов и АЦП - питание Ардуино DC-DC конвертерами, использование алгоритмов вычисления среднего значения за определённый период и калибровка с помощью более или менее нормального тестера.

Для себя я делал вольтметр-амперметр для LiPo 4S аккумулятора - LCD 1602 по I2C, датчик ACS712 на 5А, делитель напряжения на 1% резисторах:

#include <LCD_1602_RUS.h>
#include <MsTimer2.h>
LCD_1602_RUS lcd(0x3F, 16, 2); //инициализация дисплея по адресу 0х27 (для 2004) и 0x3F (для 1602)
#define R1 560 //резистор делителя на +
#define R2 36 //резистор делителя на -
#define MEASURE_PERIOD 500  // время периода измерения
int timeCount;  // счетчик времени
long  sumVOLTAGE, sumCURRENT ; // переменные для суммирования кодов АЦП
long  averageVOLTAGE, averageCURRENT; // сумма кодов АЦП (среднее значение * 500)
boolean flagReady;  // признак готовности данных измерения


void setup() {
  lcd.init(); //включаем дисплей
  lcd.backlight(); //включаем подсветку
  MsTimer2::set(1, timerInterupt); // прерывания по таймеру, период 1 мс 
  MsTimer2::start();              // разрешение прерывания
}

void  timerInterupt() {
  timeCount++;  // +1 счетчик выборок усреднения
  sumVOLTAGE+= analogRead(A1);  // суммирование кодов АЦП для напряжения
  sumCURRENT+= analogRead(A3);  // суммирование кодов АЦП для тока
   // проверка числа выборок усреднения
  if ( timeCount >= MEASURE_PERIOD ) {
    timeCount= 0;
    averageVOLTAGE = sumVOLTAGE; // перегрузка среднего значения для напряжения
    averageCURRENT = sumCURRENT; // перегрузка среднего значения для тока
    sumVOLTAGE= 0;
    sumCURRENT= 0;
    flagReady= true;  // признак результат измерений готов
    }
}

void loop () {
  lcd.setCursor (0, 0);
  lcd.print(L"Бат:");
  lcd.print((float)averageVOLTAGE / 500. * 5.112 / 1024. / R2 * (R1 + R2), 2); //расчёт напряжения
  lcd.print(L"V  ");
  lcd.setCursor (11, 0);
  lcd.print((float)(.0264 * ((averageCURRENT / 500.) - 514)), 2); //расчёт тока
  lcd.print(L"A ");
  lcd.setCursor (0, 1);
  lcd.print(L"Заряд: ");
  lcd.print((float)((averageVOLTAGE / 500. * 5.112 / 1024. / R2 * (R1 + R2) - 13.2) / 3.6) * 100, 0); //расчёт процентов
  lcd.print(L"%   ");
  delay(1000);
}

Вычисление тока я делал по другой формуле, где фактически не важно, какое напряжение на ардуино, вычисление идёт по шкале 1024. Единственное, нужно внести изменение в цифру "514" под себя, это нужно для калибровки.

 

Barny
Offline
Зарегистрирован: 23.01.2015

Выбрасил нахрен этот датчик. Он очень часто хватает гистерезис и только сброс питания помогает. Еще он боится любых наводок. Сейчас есть бредовая, но вероятно рабочая идея - взять дешевый китайский вольтметр-амперметр типа dsn-vc288 или YB27VA. Этот девайс довольно точно считывает напряжение и ток. Можно считать его показания прямо с пинов индикатора через мультиплектор или расширитель портов.

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Друзья, товарищи выручайте.

Хочу измерять Амперы (до тысячной доли Ампера)

Подключив данную схему к источнику питания 5,00 Вольт (Мультиметр XL830L показывает 4,99-5,00 Вольт      Питание от преобразователя LM2596 DC-DC) 

В порту получаю:

Pitanie: 4.9590001
Vxod: 2.4851250
Pitanie: 4.9608750
Vxod: 2.4862499
Pitanie: 4.9610624
Vxod: 2.4864375
 
 
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads(0x48);
float Pitanie = 0.0;
float  Vxod= 0.0;


void setup(void) 
{
  Serial.begin(9600);
  ads.begin(); 
}

void loop(void) 
{
int16_t adc0;
int16_t adc1;
adc0 = ads.readADC_SingleEnded(0);
adc1 = ads.readADC_SingleEnded(1);
Pitanie = (adc0 * 0.1875)/1000;
Vxod = (adc1 * 0.1875)/1000;


Serial.println("Pitanie: "); 
Serial.println(Pitanie,7); 
Serial.println("Vxod: ");  
Serial.println(Vxod,7); 
delay(1000);
}

Подключив нагрузку к модулю ASC712  в виде кулера от компьютера, получаю:

(Питание на кулер отдельное, 9 Вольт 1 Ампер)

Pitanie: 4.9801874
Vxod: 2.5020000
Pitanie: 4.9801874
Vxod: 2.5016250
Pitanie: 4.9801874
Vxod: 2.5018124
Pitanie: 4.9801874
Vxod: 2.5014374
 
Согласно мультиметра, кулер потребляет 159,4mA
 
Согласно какой формулы, из вышепредлодженных по ссылкам, мне проивзодить расчёт?
 
 
 

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Что-то типо такого:

При значении на входе датчика (Vxod) напряжения, равному напряжению питания (Pitanie)  - это 30А, соответственно:

4.9801874=30А
2.5014374=x
 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Датчик двухполярный. 2.5 вольта это 0 ампер. 5 вольт это 30 ампер. 0 вольт это -30 ампер. Если датчик поместить в коробочку из мягкого железа толщиной стенок не менее 5 мм и  сглаживать результат то можно довести точность до 1мА. 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Т.е. 2,5 Вольт - это 30А

2,5=30

х=1

 

Получаем что 1 Ампер - это 0,0833333333333333 Вольт

 

if (Vxod<=2.5){
  Vxod=0.0;
  }else{
 Vxod=Vxod*0.0833333333333333;
 }

Получаю Vxod: 

0.2088750, неверно
nik182
Offline
Зарегистрирован: 04.05.2015

2.5 вольта это ноль ампер. (V-2.5)*k.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

temp=(Vxod-2.5)*0.0833333333333333;

Получаю:

Pitanie: 4.9220623
Vxod: 2.4663751
temp: -0.0028021
 
 
nik182
Offline
Зарегистрирован: 04.05.2015

А если ток подать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Вычитать нужно не 2.5 Вольта, а половину напряжения питания.

2. Для 30-амперного датчика 5 Вольт соответствует не 30, а где-то в районе 40-50 А. Точную цифру можно посмотреть в дэйташите.

3. !60 мА - это около 3-х единиц младшего разряда, т.е. где-то на границе погрешности. Измерять столь малые токи 30-амперным датчиком - весьма сомнительное занятие. Следовало бы взять хотя бв 5-амперный датчик.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

А если ток подать?

Это были показания с учётом подачи тока.

Про 40-50 Ампер при 5 Вольтах в даташите я ничего не нашла.

Tok=(Vxod-(Pitanie/2))*0.0833333333333333;

Результат неверный

nik182
Offline
Зарегистрирован: 04.05.2015

Странно. У меня на калькуляторе 30/2.5=12 а не 0.0833333

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Irinka пишет:

Про 40-50 Ампер при 5 Вольтах в даташите я ничего не нашла.

Открыл первый попавшийся - на первой странице: "66 to 185 mV/A output sensitivity". Вот 66 - это для 30-амперного, а 185 - для 5-амперного. На второй стренице - табличка, из которой выясняем, что для 20-амперного - 100 мВ/А. (ну это - так, для полноты)

Возвращаемся к 30-амперному. 2500мВ / 66мВ/А = 37.9А. До 40 А, конечно, не дотягивает, но все ближе к 40, чем к 30.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Получается вот так?

 

temp=(Vxod-(Pitanie/2))*(37.9/(Pitanie/2));

Barny
Offline
Зарегистрирован: 23.01.2015

У вас вообще чистые показания датчика тока меняются в зависимости от нагрузки ? И да, 30А датчик практически не реагирует на слабый ток. Попробуйте подключить что-то с током потребления не ниже 0.5А или больше.

nik182
Offline
Зарегистрирован: 04.05.2015

Из даташита для 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 .

 

renoshnik
Offline
Зарегистрирован: 11.04.2013

#define AmperMax 3297 // *** КОРРЕКТИРОВАТЬ !!!


for (i=0; i<16; i++) { 
		do{ sbi(ADCSRA, ADSC); }  					// Начинаем преобразование 
		while ((ADCSRA & (1 << ADIF)) == 0); 		
		Cdata = (ADCL|ADCH << 8); 					// Считываем  полученное значение
		reV += Cdata; }
	Cdata = reV >> 2;									
	Adis = map (Cdata, 2012, 4092, 0, AmperMax);    
	Adis = Adis/100;  
	if ( Adis <= 0.09 ) { Adis = 0.0; }

 

использую " map " вполне устраивает.

nevkon
Offline
Зарегистрирован: 20.01.2015

Если нужна точность, то добавляете в программу прибора калибровку типа "подать 1А, 5А, 10А, 30А" после чего производится расчет корректора. Калибровку лучше всего производить хотя бы перед каждой серией замеров, подавать ток с поверенного прибора.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Можно temp=(Vxod-(Pitanie/2))/0.066;

 

0,50 кажет мультиметр

0,522--0,528 кажет Ардуино

Более менее точно

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

У вас вообще чистые показания датчика тока меняются в зависимости от нагрузки ?

Да, меняются

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

Бился я с 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А), когда всеми перечисленными выше погрешностями (от нестабильности питания, от собственных шумов, от температуры и от внешних магнитных полей) можно пренебречь. Его основные достоинства - полная изоляция датчика тока от выхода микросхемы, а также практически нулевое его сопротивление, что позволяет втыкать его куда угодно без нарушения работы устройства, в котором измеряется ток. А вот насчет измерения малых токов с приемлемой точностью, тут - увы! Надо искать другие решения.

 

SLKH
Offline
Зарегистрирован: 17.08.2015

Doctor пишет:

Бился я с 5-амперным модулем довольно долго и в итоге понял, что пытаться ловить с его помощью миллиамперы - безнадежное занятие. 

1ма/5000ма = 0,0002 = 0,02%

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

 

Цитата:
Вывод: этот модуль хорош для измерения с невысокой точностью токов в диапазоне единиц ампер (или десятков ампер для модулей на 20А и 30А
Да.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Doctor пишет:

Вывод: этот модуль хорош для измерения с невысокой точностью токов в диапазоне единиц ампер (или десятков ампер для модулей на 20А и 30А), когда всеми перечисленными выше погрешностями (от нестабильности питания, от собственных шумов, от температуры и от внешних магнитных полей) можно пренебречь. Его основные достоинства - полная изоляция датчика тока от выхода микросхемы, а также практически нулевое его сопротивление, что позволяет втыкать его куда угодно без нарушения работы устройства, в котором измеряется ток. А вот насчет измерения малых токов с приемлемой точностью, тут - увы! Надо искать другие решения.

С выводами автора в принципе согласен, просто предлагаю небольшой скетч для тестирования этих дачиков (по мотивам Axila).

[code]
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f,16,2);

int oschilograf = 2; //контроль осцилографом pin_2
int sensorPin = A3;
int maxU = 0;
int maxU_sred = 0;

void setup() {
   Wire.begin(); 
   Serial.begin(9600);
   pinMode(oschilograf, OUTPUT);
   lcd.backlight();//подсветка lcd.init();
   lcd.init();     //initialize the lcd 
   lcd.clear();     //очистка дисплея 
}

void loop() {
  maxU_srednee ();
  
  lcd.setCursor(0, 1);
  //lcd.print(maxU_sred * 2.5/512 * 6.6);// для 30А (66mV/A) - амплитудное
  //lcd.print(maxU_sred * 2.5/512 * 6.6 * 0.707);// для 30А (66mV/A) - действующее
  
  //lcd.print(maxU_sred * 2.5/512 * 10.0 );// для 20А (100mV/A) - амплитудное
  lcd.print(maxU_sred * 2.5/512 * 10.0 * 0.707);// для 20А (100mV/A) - действующее
  
  //lcd.print(maxU_sred * 2.5/512 * 18.5);// для 5А (185mV/A) - амплитудное
  //lcd.print(maxU_sred * 2.5/512 * 18.5 * 0.707);// для 5А (185mV/A) - действующее
  lcd.print("A");
  Serial.print("maxU_sred_0 "); 
  Serial.println(maxU_sred);
}

void maxU_srednee () {//усредняем показания сенсора
  maxU_sred = 0;
  for ( int i = 0; i < 8; i++ ){
   maxU_sensor ();
   maxU_sred =  maxU_sred + maxU;
 }
   maxU_sred =  maxU_sred / 8;
}

void maxU_sensor (){    // читаем максимальные показания с сенсора
  digitalWrite(oschilograf, HIGH);// при F=16Mгц время цикла ~ 30ms
   maxU = 0;
  for ( int i = 0; i < 300; i++ ){
    int sensorValue = analogRead(sensorPin) - 512;  //вычитаем середину
    if (sensorValue < 0) { sensorValue = -sensorValue;}//преобразуем в положительное 
    if ( sensorValue > maxU ){ maxU = sensorValue;}//сохраняем максимум значения
  }
  digitalWrite(oschilograf, LOW);
 }
 
 
 
 
[/code]

 

evgta
Offline
Зарегистрирован: 02.09.2016

Кто-нибудь пробовал на шунте ADS1115 использовать? как точность показаний выходит?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

evgta, есть же специализированные решения для измерения тока, сразу с цифровым выходом. типа ina226

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

dimax пишет:

evgta, есть же специализированные решения для измерения тока, сразу с цифровым выходом. типа ina226

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

В дополнение к моему предыдущему комменту: выяснил, отчего первые несколько минут после включения у модуля на базе ACS712 ползет выходное напряжение. Дело в том, что на плате совсем рядом с микросхемой расположен SMD светодиод, призванный показывать, что на модуль подано питание. Пользы от него ноль, поскольку модуль этот скорее всего будет располагаться где-то в глубинах корпуса изделия и вряд ли будет виден снаружи, а вот при подаче питания, он начинает греться и согревать находящуюся поблизости микросхему. Пока тепловой режим не установится, показания будут заметно плыть. Выход простой - отпаять его за ненадобностью и, как минимум, одной бедой станет меньше, однако, зависимость от температуры окружающей среды все равно останется.

 

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

Еще одно дополнение к моему комменту от 11 октября

Пока ждал посылки с INA226 решил еще поэкспериментировать с ACS712 и пришел к выводу, что все перечисленные в том комменте проблемы можно в значительной степени ослабить, если использовать два модуля ACS712, у которых токовые датчики включены встречно-последовательно, а выходы модулей включены на два канала ADS1115. Результаты оцифровки выходных напряжений надо вычесть друг из друга, при этом, если считать, что обе микросхемы ACS712 имеют примерно одинаковые температурные дрейфы нуля, находятся в одинаковом внешнем магнитном поле и одинаково зависят от изменения напряжения источника питания, то при вычитании, все эти погрешности обнулятся. Полезный же сигнал, вызванный протеканием измеряемого тока, при вычитании, наоборот, удвоится, поскольку датчики тока включены в противоположном направлении.

Попробовал это на практике - работает! Конечно, стопроцентной компенсации всех погрешностей таким способом добиться невозможно, но раз в десять точность все-таки повысилась. Во всяком случае, почти исчезло влияние внешнего магнитного поля - теперь конструкцию можно вертеть как угодно без заметного ухода нуля, исчез дрейф нуля при прогреве и так далее. Разумеется, два модуля ACS712 для этого должны быть расположены как можно ближе и строго параллельно друг другу. В целом, если с одним модулем максисмум, чего удалось добиться, это +/- 40mA на дисплее при отсутствии измеряемого тока, то в схеме с двумя модулями получается +/- 4mA. 

 

Kenobi
Offline
Зарегистрирован: 16.12.2012

Doctor пишет:

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

Уважаемый Doctor, я начинающий ардуинщик, но хочу попробовать Ваш способ с двумя входами АЦП.

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

Может быть я не совсем понял, но мне кажется,что после вычитания выходных напряжений останется как раз только помеха, или я не прав? Подскажите пожплуйста, как правильно вычитать сигналы оцифровки. Например у меня с одного выхода 522, с другого 509. Т.е. 522 - 509 = 13. Вобщем запутался.

evgta
Offline
Зарегистрирован: 02.09.2016

Сложить и поделить на два

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

Kenobi пишет:

Может быть я не совсем понял, но мне кажется,что после вычитания выходных напряжений останется как раз только помеха, или я не прав? Подскажите пожплуйста, как правильно вычитать сигналы оцифровки. Например у меня с одного выхода 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 надо вычитать, а не складывать.

 

evgta
Offline
Зарегистрирован: 02.09.2016

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

Kenobi
Offline
Зарегистрирован: 16.12.2012

Огромное спасибо за развёрнутый и очень обстоятельный ответ. Очень рад, что на форуме присутствуют такие замечательные люди-специалисты, которые помогают начинающим в познании технических тонкостей. Буду пробовать. Действительно, я подал сигнал с двух датчиков тока ADS758 (50А, 40mV/A) на два разных аналоговых входа ардуины, поскольку ADS1115 только заказан и еще не пришел. Но мне важно было понять принцип, и Вы мне в этом помогли, за что я Вам весьма признателен.

 

Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016
evgta пишет:
Это смотря как подключить, если и первый и второй измеряет в одну сторону то сложить , а если один положительный ток а другой отрицательный то вычесть
 
Если первый и второй будут измерять в одну сторону, то будут складываться как полезные сигналы, так и помехи, поэтому в результате никакого выигрыша от использования двух модулей по сравнению с одним модулем мы не получим. Весь смысл использования двух модулей как раз и заключается в том, что датчики тока включены встречно, выходные сигналы модулей вычитаются, при этом помехи которые имеют одинаковый знак, значительно уменьшаются, а полезный сигнал, наоборот в два раза увеличивается. На этом принципе основаны все дифференциальные датчики, в которых за счет вычитания синфазная помеха подавляется, а противофазный полезный сигнал - усиливается.
 

Kenobi пишет:

Огромное спасибо за развёрнутый и очень обстоятельный ответ. 

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

 

 
Doctor
Doctor аватар
Offline
Зарегистрирован: 11.01.2016

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

SVVV
Offline
Зарегистрирован: 26.01.2018

Вопрос от новичка? А нельзя все проще сделать.

Задать масив. Потом в масив загнать измерения больше  чем за 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);

pridecom
Offline
Зарегистрирован: 07.07.2017

Мда, оч сложно все с этим датчиком.

Подключил через него дисплей 1602 и никак не могу высчитать потребляемый им ток. Помогите пож, я уже се формулы перепробывал для 20А датчика.

Вот перепробыванные варианы, результаты оч странные и неправдивые.

Voltage кажет 2333.98

А вот Amp 23

Raw = analogRead (A3) ;
  Voltage = (Raw/ 1024.0) * 5000 ;
  lcd.print(Voltage);

  //замерим силу тока
  //Amps = ((Voltage - 2500 ) / 100) ;
  //Amps = (.049 * Raw -25) ;
  Amps = (Raw * 2.5/512 * 10.0 );
  //Amps = (Raw * 2.5/512 * 10.0 * 0.707);

Еще вопрос, им же замерить напряжение питания дисплея не получится? Какой способ простой посоветуете?

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

pridecom пишет:

Мда, оч сложно все с этим датчиком.

Подключил через него дисплей 1602 и никак не могу высчитать потребляемый им ток. Помогите пож, я уже се формулы перепробывал для 20А датчика.

Вот перепробыванные варианы, результаты оч странные и неправдивые.

Voltage кажет 2333.98

А вот Amp 23

Raw = analogRead (A3) ;
  Voltage = (Raw/ 1024.0) * 5000 ;
  lcd.print(Voltage);

  //замерим силу тока
  //Amps = ((Voltage - 2500 ) / 100) ;
  //Amps = (.049 * Raw -25) ;
  Amps = (Raw * 2.5/512 * 10.0 );
  //Amps = (Raw * 2.5/512 * 10.0 * 0.707);

Еще вопрос, им же замерить напряжение питания дисплея не получится? Какой способ простой посоветуете?

Загрузи скетч с поста 34.

Как можно замерить напряжение датчиком тока ? - НИ КАК. Напряжение мерить нужно вольтметром.

  

pridecom
Offline
Зарегистрирован: 07.07.2017

Посоветуйте еще как лучше замерить постоянное напряжение, ,каким-то модулем или пином через резисторы?

SVVV
Offline
Зарегистрирован: 26.01.2018

Проще всего (старую зарядку от телефона, не импульсную) и вперед

http://adatum.ru/izmerenie-napryazheniya-220-volt-na-arduino.html