Измеряем ток

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

Судя по всему вы сами осознали.

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

А про какие ошибки вы пишите? У меня нет ошибок измерений

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

По 1-ware иногда выскакивают очень большие величины. Причину найти не могу. Может много всего на линии (17 шт) ,может далеко (20 м), может преобразование ,но скорее всего всё в куче. Искать нет смысла ,проще отфильтровать. У вас всё рядом проблем быть не должно.

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

zhuki пишет:

По 1-ware иногда выскакивают очень большие величины. Причину найти не могу. Может много всего на линии (17 шт) ,может далеко (20 м), может преобразование ,но скорее всего всё в куче. Искать нет смысла ,проще отфильтровать. У вас всё рядом проблем быть не должно.

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

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

началось.... измеряю максимум при нулевом токе и получаю аж 400-500 мА! что я теперь упускаю? ошибки измерений остались теже. но похоже наводки дают выбросы значений

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

алгоритм с поиском максимума дает очень сильные шумы. не понимаю как с этим бороться. по сути к нужному значению добавляются лишние 300-400 мА, смотрю на осциилографе - дейсвительно есть выбросы на синусоиде

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

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

посмотрите в инете темы про переделку АТХ блоков питания...там где народ мутит контрольную панель на МК, вот там есть дельные советы по реализации приборов контроля

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

Michal пишет:

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

посмотрите в инете темы про переделку АТХ блоков питания...там где народ мутит контрольную панель на МК, вот там есть дельные советы по реализации приборов контроля

сделал усреднение перед поиском максимума

ISR (ADC_vect)
{
	// датчик asc712-5a
	// нулевой ток соответствует VCC/2, т.е измерение = 512
	// 1024 соотвествует 5в, чувствительность датчика 0,185в нв 1А
	// current(A) = abs(ADCW-512) * 5(V) / 1024 / 0,185(V) 
	
	ADCSRA |= 0x10;
	
	// усредняем значение измерения
	current_adc_avg += ADCW;
	current_avg_measures++;
	
	if(current_avg_measures >= CURRENT_MEASURES_AVG) {
		current_adc_avg /= CURRENT_MEASURES_AVG;			// получаем усредненное значение измерения
	
		if(current_max < current_adc_avg) {
			current_max = current_adc_avg;
		}
		current_measures++;
		if(current_measures >= CURRENT_MEASURES) {
			current = (current_max - 512) * CURRENT_MULT;
			current_max      = 512;
			current_measures = 0;
		}
		current_adc_avg = 0;
		current_avg_measures = 0;
	}
}

результат меня теперь вполне устраивает. Даже удивлен, что мк может снимать по 5000 измерений в секунду. Может это даже лишнее, но раз работает - оставлю. Сейчас другая проблема )) Отладил на кроликах - подключаю диспенсер а там ток при старте зашкаливает за 8А. Наверно надо менять датчик 5-ти амперный на 20ти

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

axill пишет:

подключаю диспенсер а там ток при старте зашкаливает за 8А. Наверно надо менять датчик 5-ти амперный на 20ти

Я бы, для начала, поставил туда зелененький NTC-резистор из компьютерного блока питания для сглаживания броска тока. :)

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

Andrey_Y_Ostanovsky пишет:

Я бы, для начала, поставил туда зелененький NTC-резистор из компьютерного блока питания для сглаживания броска тока. :)

да не буду заморачиваться - по даташиту у acs712 пятикратный запас по току

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

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

axill пишет:

да не буду заморачиваться - по даташиту у acs712 пятикратный запас по току

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

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

Andrey_Y_Ostanovsky пишет:

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

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

и что и от кого вы предлагаете защищать?

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

axill пишет:

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

Ну, я даже не знаю... Почитайте что-нибудь, типа: http://www.kit-e.ru/assets/files/pdf/2008_11_92.pdf

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

Andrey_Y_Ostanovsky пишет:

Ну, я даже не знаю... Почитайте что-нибудь, типа: http://www.kit-e.ru/assets/files/pdf/2008_11_92.pdf

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

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

axill пишет:

смысл предложенного вамим документа относится к выполнени требований Европы по экологии.

Нет. Там по-русски написано: "для уменьшения бросков тока".

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

Andrey_Y_Ostanovsky пишет:

Нет. Там по-русски написано: "для уменьшения бросков тока".

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

не нужен мне NTC, если он нужен, он наверняка уже встроен. А если не встроен - то не факт, что его подключение не выведет мотор в непредусмотренный режим - начнет клинить или стартовать через раз. У всего должен быть смысл. Я уверен, что все, что надо уже предусмотрено. Вот если бы я делал новое устройство, то обязательно бы прислушался.

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

кстати, у МК есть режим когда измерение по АЦП автоматически запускаются по таймеру - нет необходимости писать обработчик для таймера и в него вставлять код считывания данных с АЦП.

Ардуина напрямую не дает возможность это использовать, но можно самому настроить такой режим через контрольные регистры. Настраиваем таймер, в качестве триггера для него ставим timer overflow после чего пишем обработчик прерывания для ADC_vect. Этот обработчик будет срабатывать всегда когда у нас завершилась оцифровка. Такой способ позволяет наиболее эффективно организовать оцифровку для случаев когда нужны измерения с заданными интервалами

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

я же вам такое и предлогал :)

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

Michal пишет:

я же вам такое и предлогал :)

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

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

ну да, таймер только для отключения АЦП, а АЦП работает в режими повторных перобразований

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

Michal пишет:
в режими повторных перобразований

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

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

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

kotproger
Offline
Зарегистрирован: 10.03.2015

Да бы не плодить лишних тем, отпишусь тут. Решил поиграться с датчиком тока ACS712 20А в связке с Teensy 3.1(МК). Питание использую внешнее( что на рисунке и видно) Так как этот МК не имеет выходов 5V  для питания датчиков - подключил датчик параллельно МК. Пунуктиром отметил подключение для измерения потребляемогог тока всей цепью и получения результатов без нагрузки.

Изза особенности АЦП на МК (3.3 V и выше = 1023) получаем при 2.5v 775 (а не 512 как у ардуинки). Теоретически это должно повысить точность, если пренебречь токами, дающими на АЦП от дачика более 3.3V - то есть принять число разрядов не 1023 а 775*2=1550. 

При пересчёте получил коэффициент 0,0322580

Вот код программы:

float Ival = 0;
int AV9;
void setup() {
    Serial.begin(9600);
}

void loop() {
	calcI();
	delay(2000);
}

void calcI(){
	int values[100];
	int summ = 0;
	int count = 0;
	float pre;
        // Вычисляем среднее значение из 100 измерений
	for (int i=0; i <= 100; i++){
		values[i] = analogRead(A9);
		summ += values[i];
	}
	pre = summ / 100;
        
        // Пересчёт среднего значения без учёта величин, отклоняющихся на 10 единиц
	summ = 0;
	for (int i=0; i <= 100; i++){
		if(abs(values[i] - pre) < 10){
			count++;
			summ += values[i];
		};
	}
	Serial.print("Count = ");
	Serial.print(count);
	Serial.print("; Summ = ");
	Serial.print(summ);
	Serial.print("; Calc I = ");
        //754 вместо 775 - из за падения напряжения
	Serial.println((754-(summ/count))*0.0331125827814569);
}

Но результаты очень непредсказуемы. Значения скачут бывает в пределах 1.5А без нагрузки.  Я так полагаю из-за незащищённости от разного рода помех. Да и напряжение питания на контактах МК и датчика гуляет от 4.88 до 4.96, хотя источник питания мне на вольтметре клёнтся, что 5v.

Иммет вообще место такая схема подключения и каковы советы по повышению стабильности значений?

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

А вот здесь http://www.lucadentella.it/en/2011/11/29/sensore-di-corrente-con-arduino/ почитайте.

for (int i=0; i <= 100; i++), 100 маловато будет.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

A = 0.026394 * units - 13.513514
:)

kotproger
Offline
Зарегистрирован: 10.03.2015

Это всего лишь выборки, усреднения, которые отлавнивают разловые скачки. Но бывают периоды когда датчик довольноо долго клинит В сторону - на пол ампера или выше. тут не в количестве итераций дело. А формула, приведённая мной верна для АЦП с потолком 3.3V. И она верна. Не в ней был вопрос.

Как мысль - через делитель мерять входное напряжение на датчике - для компенсации скачков. И могут ли в цепи питания возрастать помехи, если датчики питаются от одной линии, а нет от МК. Тем более что датчков может быть довольно много. Это вданном случае 1.

kotproger
Offline
Зарегистрирован: 10.03.2015

Корректировка с помощью делителя напряжения дейсвительно сработала (2 резистора по 710ОМ вполне подошли)! Немного доработав схему, получил весьма точные результаты, при чём 100 выборок воплне достаточно для усреднения результата. Да и формула получилась довольно простой. Хотя напряжение весьма сильно гуляет при этом.

Резултаты измерений (без усреднения):

Vcc = 4.69; Vd = 727; Id = 728; Iv = 0.03
Vcc = 4.55; Vd = 705; Id = 704; Iv = -0.03
Vcc = 4.66; Vd = 722; Id = 715; Iv = -0.23
Vcc = 4.40; Vd = 682; Id = 676; Iv = -0.19
Vcc = 4.57; Vd = 709; Id = 706; Iv = -0.10
Vcc = 4.50; Vd = 697; Id = 700; Iv = 0.10
Vcc = 4.46; Vd = 691; Id = 692; Iv = 0.03
Vcc = 4.32; Vd = 669; Id = 668; Iv = -0.03
Vcc = 4.61; Vd = 715; Id = 716; Iv = 0.03
Vcc = 4.46; Vd = 692; Id = 694; Iv = 0.06
Vcc = 4.58; Vd = 710; Id = 710; Iv = 0.00
Vcc = 4.61; Vd = 715; Id = 711; Iv = -0.13
Vcc = 4.61; Vd = 714; Id = 717; Iv = 0.10
Vcc = 4.69; Vd = 727; Id = 725; Iv = -0.06
Vcc = 4.49; Vd = 696; Id = 703; Iv = 0.23
Vcc = 4.55; Vd = 705; Id = 705; Iv = 0.00
Vcc = 4.67; Vd = 724; Id = 713; Iv = -0.35
Vcc = 4.65; Vd = 721; Id = 716; Iv = -0.16
Vcc = 4.59; Vd = 712; Id = 705; Iv = -0.23
Vcc = 4.39; Vd = 680; Id = 680; Iv = 0.00
Vcc = 4.54; Vd = 703; Id = 695; Iv = -0.26
Vcc = 4.54; Vd = 703; Id = 702; Iv = -0.03
Vcc = 4.54; Vd = 704; Id = 699; Iv = -0.16
Vcc = 4.37; Vd = 677; Id = 674; Iv = -0.10
Vcc = 4.42; Vd = 685; Id = 678; Iv = -0.23
Vcc = 4.39; Vd = 680; Id = 677; Iv = -0.10
Vcc = 4.36; Vd = 676; Id = 674; Iv = -0.06
Vcc = 4.32; Vd = 670; Id = 671; Iv = 0.03
Vcc = 4.37; Vd = 677; Id = 680; Iv = 0.10

void setup() {
    Serial.begin(9600);
    pinMode(A9, INPUT);
    pinMode(A8, INPUT);
}

void loop() {
	calcI();
	delay(2000);
}

void calcI(){
        int summ = 0;
	float pre;
	for (int i=0; i <= 100; i++){
	        summ += analogRead(A9) - analogRead(A8);
	}
	pre = summ / 100;
	Serial.print(" Calc I = ");
        // Коофициент = VединицыАЦП / Точность датчика
	Serial.println(pre*0.032258064);	
}