Измеряем ток

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

Получиться ли вот так измерять напряжение и ток потребляемый мотором?

 

maksim
Offline
Зарегистрирован: 12.02.2012

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

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

а как быть с током? ток нужен вообще ппц

maksim
Offline
Зарегистрирован: 12.02.2012

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

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

рисунок можете нарисовать?) можно в пейнте ток подпишите)

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

Как то так:

На пине А0 измеряем напряжение питания, на А1 ток

датчик можно выбрать не только 712, но и 750, у них нужно смотреть макимальные токи.

 

UDP забыл питание на ACS нарисовать... но смысл должен быть понятен.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

мне ток в основном 20-40А макс 50А мерять, напряжение 14-15В

UPD: по цене не очень 100р(шунт) против 450р(acs75x) и месяца ожиданий

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

AnImAsHkO пишет:

мне ток в основном 20-40А макс 50А мерять, напряжение 14-15В

Есть датчики на 50А

 

AnImAsHkO пишет:

UPD: по цене не очень 100р(шунт) против 450р(acs75x) и месяца ожиданий

В том то и дело, что если вешать шунт на минусовой провод и выводить его на А1, то при большом токе(50А) у вас упадет 75мВ (Если шунт такой же, как  на схеме), но чем вы будите мерить такое напряжение?

Разрядность АЦП ардуины 10 бит. Следовательно при опорном напряжении в 5В имеем соотношение 1 отсчет = 5/1024=4,9 мВ. Таким образом если мерить токи 20 А, то получаем напряжение на шунте:

U = 0.075x20/50 = 30 мВ , а это примерно на АЦП будет 6. При токе 40 А имеем значение 12. Все это я говорю к тому, что вы при диапазоне 1024 отсчетов вы используете лишь маленький диапазон в 100 раз меньший. То есть на один отсчет у вас выходит ток примерно 3А

Дело можно улучшить если подать 3.3 В в качестве опорного, но в реальности это не сильно улучшит ситуацию.

Если ставить шунт с большим падением напряжения, то естественно это будет влиять на двигатель, да и греться он будет.

Чем хорош датчик тока, тем, что он развязан гальванически от силовой части и выдает на выходе весь диапазон (5В) при максимуме тока.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

убедили) спасибо, за разъяснения!

возьму попробовать на 30А они на ебее по 100р стоят)

step962
Offline
Зарегистрирован: 23.05.2011

Bim_Sony пишет:

Дело можно улучшить если подать 3.3 В в качестве опорного, но в реальности это не сильно улучшит ситуацию.

1. Дело можно улучшить, сконфигурировав АЦП на работу от внутреннего источника опорного напряжения (1.1 В). "Улучшение" почти в 5 раз.

2. Дело можно улучшить, сконфигурировав АЦП на работу от внешнего источника опорного напряжения (вывод AREF) и подав на AREF, например, 0.1 В. "Улучшение" в 50 раз.

Работа АЦП с Vcc в качестве опорного напряжения есть "не догма, а руководство к действию"...

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

step962 пишет:

Bim_Sony пишет:

Дело можно улучшить если подать 3.3 В в качестве опорного, но в реальности это не сильно улучшит ситуацию.

2. Дело можно улучшить, сконфигурировав АЦП на работу от внешнего источника опорного напряжения (вывод AREF) и подав на AREF, например, 0.1 В. "Улучшение" в 50 раз.

1) При таком напряжении на шунте, помех не избежать.

2) городить источник опорного в 0.1 В, даже из самого простого стабилизатора и делителя - это минимум 3-5 деталей, которые стоят практически те-же деньги, что и ACS712.

3) Если уже все методы использовать, то можно было поставить усилитель сигнала. Только я просто предложил простое решение, а метод с шунтом (ИМХО) считаю не верным.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

спасибо за помощь и рекомендацию

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

Bim_Sony пишет:

датчик можно выбрать не только 712, но и 750, у них нужно смотреть макимальные токи.

У меня датчик на acs712 "шумит" при отсутствии тока - на ноль так и не получается вывести...

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

У меня минимальный ток будет порядка 1А, надо будет только измерить минимальное, всё что ниже него и будет 0. Да и супер точных показаний мне не надо +- 0,5-1А устроит... Хотя если помехи больше 1-3А, то это уже не есть хорошо...

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

AnImAsHkO пишет:

У меня минимальный ток будет порядка 1А, надо будет только измерить минимальное, всё что ниже него и будет 0. Да и супер точных показаний мне не надо +- 0,5-1А устроит... Хотя если помехи больше 1-3А, то это уже не есть хорошо...

А какой максимальный ток? На ибее есть готовые датчики на 5, 20 и 30 ампер. Вот 20 амперный у меня сейчас стоит, "шум" порядка 30 миллиампер, и "ноль", в зависимости от питания ардуины, сползает вверх-вниз на 50-60 миллиампер. 5 амперный должен быть поточнее: жду - он еще едет почтой.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

я буду брать на 30А т.к. на 50А дороговато для тестов, если погрешности в миллиамперах, то вообще шикарно

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

AnImAsHkO пишет:

я буду брать на 30А т.к. на 50А дороговато для тестов, если погрешности в миллиамперах, то вообще шикарно

Там контакты микросхемы очень хлипкие! Если надо реально 50 ампер мерять - я бы подумал о схеме с шунтом и 5 апмерным датчиком.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

ну 100-200р для теста норм) там посмотрим)

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

Andrey_Y_Ostanovsky пишет:

Bim_Sony пишет:

датчик можно выбрать не только 712, но и 750, у них нужно смотреть макимальные токи.

У меня датчик на acs712 "шумит" при отсутствии тока - на ноль так и не получается вывести...

30 мА на каком датчике? Если на 30А датчике, то это 0,1% погрешности. Плюс ко всему АЦП у ардуины в младшем разряде гуляет, отсюда такая погрешность.

demon969
Offline
Зарегистрирован: 24.04.2012

А может кто -нибудь привести пример кода работы с датчиком ACS712?

Как амперы померять? Вольты?

Так правильно?

void setup(void){
  Serial.begin(9600);
}
void loop(){
//ACS712
   {
   float average = 0;
for(int i = 0; i < 100; i++) {
    average = average + (.0264 * analogRead(A3) -13.51) / 100;
   delay(1);
    }
       
  Serial.println(average);  
}
}

 

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

demon969 пишет:

А может кто -нибудь привести пример кода работы с датчиком ACS712? Как амперы померять? Вольты?

Теоретически... :) На практике я набираю пачку значений, выкидываю явно лишние и усредняю оставшееся... dac_div - коррекция АЦП, если текущее питание отличается от 5 вольт. Можно не заморачиваться и принять пока единицей... Но это только для постоянного тока, для переменного - все гораздо хитрее и надо делать среднеквадратичные выборки (http://arduino.ru/forum/proekty/upravlenie-obogrevom-komnaty-pri-pomoshc...).

/*
Calculate value from current sensor
*/
float getSensorValue( int sensorPin, float dac_div = 1 ) // Value from sensor
{
  float reperValue = 0;
  float sensorValue = 0;  // variable to store the value coming from the sensor
  const byte countValues = 250; // how many values must be averaged in ohne cycle

  for (int count =0; count < 10; count++) {

    reperValue = reperValue + constrain(analogRead(sensorPin),0,1023);
    delay(3);

  }
    // усредняем значения эталона
    reperValue =  reperValue / 10;

    // устанавливаем границы допустимых значений
    int reperValue_max = reperValue + 25;
    int reperValue_min = reperValue - 25;

    // main routine
  for (int count =0; count < countValues; count++) {
    // read the value from the sensor:
    float TMPsensorValue = constrain(analogRead(sensorPin),0,1023);
    // delay(3);

      // detect the maximum sensor value
      if (TMPsensorValue >= reperValue_max) { TMPsensorValue = reperValue; }
      // select the minimum sensor value
      else if (TMPsensorValue <= reperValue_min) { TMPsensorValue = reperValue; }
      // if value between +-25 - set the new reper and recalculate min-max
      else { 
       reperValue = TMPsensorValue;
       reperValue_max = reperValue + 25;
       reperValue_min = reperValue - 25;
      }
    // summarize
    sensorValue = ( sensorValue + TMPsensorValue );
   }
    // усредняем значения
    sensorValue = dac_div * sensorValue / countValues;
    return sensorValue;
  }

 

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

может кто нибудь дать полный код для датчика ACS712 30A? 3й день мучаюсь... сил моих больше нет... либо ему почти пофиг на мотор, либо данные скачут от 0 до 1023 вне зависимости подключен датчик или нет... причем на 2х ардуинах одно и то же...

maksim
Offline
Зарегистрирован: 12.02.2012

Код тут скорее всего не причем ищите проблему в железе. Не так или не туда подключаете, непропай, нет контакта и т.д.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

подключаю по этой схеме ток без резистора(т.к. к контроллеру мотора) и без переключателя... ток у мя мега2560, 4 датчика на всех одно и то же

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

Вы хотя бы "ноль" (512 на АЦП) - должны были бы зафиксировать... У меня он на 517-518, но не суть.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

думаете все 4 датчика брак\подделка? на ардуино не грешить(порт рабочий, дитчики проверял на 2х ардуинах)...

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

AnImAsHkO пишет:

думаете все 4 датчика брак\подделка? на ардуино не грешить(порт рабочий, дитчики проверял на 2х ардуинах)...

Не знаю. У меня - работает. На пустом подключенном к 5 вольтам датчике можно просто тестором напряжение на выходе померять. Должно быть 1/2 от питания.

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

3 датчика из 4 скачут от 1 до 2 вольт при подключенном + и - замеряю между - и out один на 1,9 постоянно, походу фейл... я в печали мало того что пришли BTS555 тоже не рабочие еще и это...

axill
Offline
Зарегистрирован: 05.09.2011

AnImAsHkO пишет:

3 датчика из 4 скачут от 1 до 2 вольт при подключенном + и - замеряю между - и out один на 1,9 постоянно, походу фейл... я в печали мало того что пришли BTS555 тоже не рабочие еще и это...

А что за выводы с пометками vref и gain? По даташиту acs712 нужно всего два конденсатора из обвязки. посмотрите схему в даташите и сравните с тем, что на вашем шилде. Может быть ваш шилд предполагает какое-то подключение к gain и vref

AnImAsHkO
Offline
Зарегистрирован: 04.12.2012

Обычный шилд(http://www.ebay.com/itm/130704794707?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649), из лишнего ток резистор с светодиодом. 

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

AnImAsHkO пишет:

Обычный шилд(130704794707, из лишнего ток резистор с светодиодом. 

Я у этого продавца (czb6721960) много всякой мелочевки покупаю - явных подделок ни разу не было...

axill
Offline
Зарегистрирован: 05.09.2011

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

Snubist
Offline
Зарегистрирован: 18.02.2013

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

axill
Offline
Зарегистрирован: 05.09.2011

Snubist пишет:

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

кстати, я тут делал устройство с управлением шим мощного вентилятора - пока отлаживал схему на "кроликах" все работало, а как подключил боево вентилятор - МК стал зависать, дисплей нокиа 3310 стал высвечивать случайные точки. Стало ясно - сильное влияние помех. Решилось только после того, как я в цепь питания МК включил дроссель на 200мкгн. А ведь перед МК стоит и стабилизатор, танталовый конденсатор и керамический - не спасало.

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

axill
Offline
Зарегистрирован: 05.09.2011

решал кто нибудь задачу измерения переменного тока этим датчиком acs712?

у него значения скачать в плюс и минус от VCC/2

как построить измерение, чтобы иметь переменный ток?

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

axill пишет:

решал кто нибудь задачу измерения переменного тока этим датчиком acs712?

у него значения скачать в плюс и минус от VCC/2

как построить измерение, чтобы иметь переменный ток?

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

axill
Offline
Зарегистрирован: 05.09.2011

Andrey_Y_Ostanovsky пишет:

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

читал http://arduino.ru/forum/apparatnye-voprosy/datchik-toka-acs756-izmerenie...

но там обсуждение не завершено

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

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

используйте таймер... настроили на 10мс или 20мс...пока работает таймер оцифровываем сигнал и складываем в массив.... по отсечки времени вырубаем ацп, считаем всю математику. Если считаете среднее квадратическое значение, то начала запуска оцифровки нас особо не колышет.

главное чтобы как можо точнее в преиод измерений уложилось целое количество съемов с ацп(точнее результат будет)

axill
Offline
Зарегистрирован: 05.09.2011

из обсуждения я понял, что надо посчитать среднее значение за полные периоды и умножить на 0,707 - получу действующее значение тока

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

нужно ли а массив складывать? если просто среднее счиатть - достаточно сложить в одну переменную поделив на кол-во измерений

да и сколько нужно измерений? 10? 100?

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

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

т.е. надо схемку нормальную делать.  В даташите есть пример для АЦП "App.4. Reciefid output". На выходе получиться DCout ~ ACin. 

axill
Offline
Зарегистрирован: 05.09.2011

схему видел)) но я уже свою собрал, хочу решить программно

axill
Offline
Зарегистрирован: 05.09.2011

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

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

Michal пишет:

В даташите есть пример для АЦП "App.4. Rectified output". На выходе получится DCout ~ ACin. 

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

acs712 rectified output

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

вообще то да... задолбается разряжаться кондер, у АВРа входное на АЦП поядка 100МОм

axill
Offline
Зарегистрирован: 05.09.2011

попробовал сделать так:

- настроил измерения по таймеру - каждое срабатывание таймера происходит измерение

- псевдокод такой:

volatile unsigned long current_avg = 0;
volatile unsigned int current_measures = 0;

void adc_vector() {
	int current_1 = analogRead(2) - 512;		// вычитаем середину измерения - 512 соотвествует нулевому току
	if(current_1 < 0) { current_1 = -current_1; }		// будем считать среднее без учета знака
	current_avg += current_1;							// важно чтобы не было переполнения при суммировании - контролируем CURRETN_MEASURES=1000
	current_measures++;
	if(current_measures >= CURRENT_MEASURES) {
		current = (current_avg * CURRENT_MULT) / CURRENT_MEASURES;
		current_avg      = 0;
		current_measures = 0;
       }
}

CURRENT_MULT опеределен как = 5000 / 1024 / 0,185 - это преобразование значения полученного с аналогового входа в значение тока в мА. Я пока считаю среднее без умножения на 0.704 - это даст действующее значение вместо среднего

Подключаю нагрузку и ставклю точку остановки в adc_vector. Смотрю значение current - оно плавает от 700 до 1500 мА, мультиметр показывает примерно 1А. Что не так в логике? Я исхожу из того, что за 1000 измерений я усредняю полученное значение и так как у меня 1000 (много) измерений то нет необходимости начинать отсчет строго от начала синусоиды (от нуля)

adc_vector вызывается 5000 раз в секунду, т.е. 1000 измерений это 0,2 сек или 10 периодов синусоиды

 

axill
Offline
Зарегистрирован: 05.09.2011

пока писал вопрос осознал, что за 1000 измерений я на самом деле охватываю всего 10 периодов (казалось 1000 так много))). Увеличил до 10000 измерений, что соотвествует 2 секундам - в итоге стал получать стабильные показания - 50-60мА при отсутсвии нагрузки (соотвествует даташиту - до 21мВ шум или в пересчете до 0,11А)

при нагрузке в 1,1А по мультиметру получаю 980мА при измерении МК. Теперь не понимаю как мои 0,98А должны соотноситься с 1,1А?

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

та ето мусор при измерении в МК, небось аналоговое питание берется с цифрового

zhuki
Offline
Зарегистрирован: 12.10.2011

Я так понимаю ,что мы говорим об измерении переменного тока.

Не совсем понятно зачем вы оперируете со средними значениями. Вам нужны только максимальные значения. У меня ACS756 по 1-ware , делаю 50 замеров беру максимальное, преобразую ,иногда бывают ошибки (исключаю). Итог, получаю ток потребления. Там выше была ссылка на мои изыскания.

axill
Offline
Зарегистрирован: 05.09.2011

zhuki пишет:

Я так понимаю ,что мы говорим об измерении переменного тока.

Не совсем понятно зачем вы оперируете со средними значениями. Вам нужны только максимальные значения. У меня ACS756 по 1-ware , делаю 50 замеров беру максимальное, преобразую ,иногда бывают ошибки (исключаю). Итог, получаю ток потребления. Там выше была ссылка на мои изыскания.

все верно - переменный ток.

потому считаю среднее, что хочется сделать все правильно)) действующее значение переменного тока величена интегральная - максимальными значениями можно "прикинуть" правильное значение, но усреднее должно дать более точный результат. Ваши опыты выше читал, но у вас есть ограничение - вы не можете делать так много измерений как делаю я из-за наличия 1-wire. У меня этого ограничения нет.

axill
Offline
Зарегистрирован: 05.09.2011

Michal пишет:

та ето мусор при измерении в МК, небось аналоговое питание берется с цифрового

шумит не только МК, но и acs712 - существенно - отклонение до +-0,11A

axill
Offline
Зарегистрирован: 05.09.2011

zhuki пишет:

Я так понимаю ,что мы говорим об измерении переменного тока.

сам себя перечитал и задумался. Измеряя максимум вы определяете амплитуду (при этом фактически замеряете амплитуду одной волны, так как вторая волна дает минимум) тока, ампдитуда соотносится с действующим значением с коэффициентом 0.704, так?

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