acs712 ловим скачек тока

Grigory
Offline
Зарегистрирован: 29.03.2014

Добрый день, подскажите с решением следующего вопроса:

к arduino uno подключен датчик тока acs712, через этот датчик подключен двигатель на 24 в(постоянка), 

к механизму двигателя приделана платка с кнопкой. Как только двигатель делает один оборот то механизм на короткое время зажимает кнопку, и по сути получается скачек тока. Проблема в том что исходя из следующего кода с которым я экспирементирую если кноку не зажимать то значение effective_value = 34,7 , при быстром  нажатии на кнопку оно равно 56,3 , а далее это значение 1 или 2 цикла равно 0. Как избавиться от нулевого значения?

#define CURRENT_SENSOR A0 // Analog input pin that sensor is attached to float amplitude_current;
  float effective_value,amplitude_current; 
//effective current 
void setup() { 
Serial.begin(9600);
 pins_init();
 }
 void loop() { 
int sensor_max; 
sensor_max = getMaxValue();
 Serial.print("sensor_max = ");
 Serial.println(sensor_max); //the VCC on the Grove interface of the sensor is 5v 
amplitude_current=float(sensor_max-512)/1024*5/185*1000000;
 effective_value=amplitude_current/1.414; 
//minimum_current=1/1024*5/185*1000000/1.414=18.7(mA) 
//Only for sinusoidal alternating current
 Serial.println("The amplitude of the current is(in mA)"); 
Serial.println(amplitude_current,1);//Only one number after the decimal point 
Serial.println("The effective value of the current is(in mA)");
Serial.println(effective_value,1); 
delay(5000);
}
 void pins_init() { 
pinMode(CURRENT_SENSOR, INPUT);
 } 
/*Function: Sample for 1000ms and get the maximum value from the S pin*/ 
int getMaxValue() { 
int sensorValue; //value read from the sensor
 int sensorMax = 0; 
uint32_t start_time = millis();
 while((millis()-start_time) < 1000)//sample for 1000ms
 { sensorValue = analogRead(CURRENT_SENSOR);
 if (sensorValue > sensorMax) { 
/*record the maximum sensor value*/ 
sensorMax = sensorValue; 
return sensorMax; 
}
axill
Offline
Зарегистрирован: 05.09.2011

какую задачу вы решаете? зачем вообще ток измерять?

у вас делается поиск максимума тока в течении секунды. Датчик вообще-то двунаправленный, нулевой ток соотвествует половине напряжения питания на выходе (у вас в расчете это 512 отсчетов ADC). Но если у вас в схеме с мотором нет диода в обратном включении паралелльно мотору, то будет возникать еще и ток обратной самоиндукции, с обратным направлением. Не исключено, что в те моменты когда вы видите ноль, ток на самом деле отрицательный

Grigory
Offline
Зарегистрирован: 29.03.2014

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

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

вам кнопку нажимать?

е усложняйте. Сделайте подпружиненый или не сильно жесткий привод кнопки и давите по времени сгарантированной задержкой

я делал нажатие кнопки сервой с не сильно жестким креплением самой сервы http://arduino.ru/forum/proekty/zhmem-knopku-servoi

Grigory
Offline
Зарегистрирован: 29.03.2014

я бы рад, но у меня таких двигателей порядка 200 штук))))

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

это не повод городить огород) Если механика еще не сделана, то проще в механике все реализовать. Мотор не пресс, кнопку не раздавит

Grigory
Offline
Зарегистрирован: 29.03.2014

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

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

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

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

и кстати, почему без механики  не нажимать кнопки? реле или оптопары

Grigory
Offline
Зарегистрирован: 29.03.2014

потомучто рано или поздно пойдет смещение. Это уже проходили.

Grigory
Offline
Зарегистрирован: 29.03.2014

Grigory
Offline
Зарегистрирован: 29.03.2014

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

 

Grigory
Offline
Зарегистрирован: 29.03.2014

код для arduino использую с увеличением скорости на чтение с аналогового входа.

#define FASTADC 1
 
// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
 
void setup() {
  int start ;
  int i ;
 
#if FASTADC
  // set prescale to 16
  sbi(ADCSRA, ADPS2) ;
  cbi(ADCSRA, ADPS1) ;
  cbi(ADCSRA, ADPS0) ;
#endif
 
  Serial.begin(9600) ;
  Serial.print("ADCTEST: ") ;
  start = millis() ;
  for (i = 0 ; i < 30000 ; i++)
    analogRead(0) ;
  Serial.print(millis() - start) ;
  Serial.println(" msec (30000 calls)") ;
}
 
void loop() {
}
 
но даже с ним значения при срабатывании микрика не очень то и отличаются.
An25
Offline
Зарегистрирован: 19.09.2014

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

Grigory
Offline
Зарегистрирован: 29.03.2014

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

gena
Offline
Зарегистрирован: 04.11.2012

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

Grigory
Offline
Зарегистрирован: 29.03.2014

В этот момент я выключаю реле которое питает двигатель. 

gena
Offline
Зарегистрирован: 04.11.2012

   Я так понимаю, что обратная связь от микрика в виде двух отдельных от мотора проводов (или одного, где второй передаёт питание на мотор) не подходит? 

Grigory
Offline
Зарегистрирован: 29.03.2014

на эту плату приходит всего 2 провода + и -, если смотреть работу стандартного аппарата то там все расчитано строго на один оборот, а я делаю свою плату управления

gena
Offline
Зарегистрирован: 04.11.2012

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

Grigory
Offline
Зарегистрирован: 29.03.2014

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

gena
Offline
Зарегистрирован: 04.11.2012

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

Grigory
Offline
Зарегистрирован: 29.03.2014

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

gena
Offline
Зарегистрирован: 04.11.2012

  Вот здесь я не понимаю: "и тут возникает вопрос по какому принципу это работает на такомже аппарате с его родной матплатой" - поподробнее.

Grigory
Offline
Зарегистрирован: 29.03.2014

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

)

gena
Offline
Зарегистрирован: 04.11.2012

   Если в оригинальном устройстве используется ТОЛЬКО два провода к мотору, то ничего кроме датчика тока в голову не приходит (пока). Т.е. нужет датчик тока на стороне ардуины. В нужный момент (там где надо обесточить двигатель) нужно создать нагрузку на вал или микриком подключать дополнительный резистор параллельно мотору и отслеживать увеличение потребляемого тока.

Grigory
Offline
Зарегистрирован: 29.03.2014

датчик тока цеплял, но падение в 20 мА он не ловит, с опорным напряжением тоже игрался, 20 мА вычислили через осцилограф

Grigory
Offline
Зарегистрирован: 29.03.2014

возможен ли вариант созвона в скайпе или еще какнить, просто я с электроникой на вы)))))

gena
Offline
Зарегистрирован: 04.11.2012

  А возможно увидеть схему платы, что на фото в сообщении #10? Я так понимаю, что это плата с микриком, по срабатыванию которого и происходит остановка двигателя? Ещё бы я внимательно изучил схемотехнику на оригинальной плате в той части, где к ней подключаются моторы. Возможно там есть что-то интересное.

Какое напряжение идет на мотор? Какой ток потребления мотором при этом?

Смотрю на плату и не могу рассмотреть, что коммутирует микрик? 

gena
Offline
Зарегистрирован: 04.11.2012

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

Grigory
Offline
Зарегистрирован: 29.03.2014

я с Казахстана

gena
Offline
Зарегистрирован: 04.11.2012

  Жду схему платы, хочу понять задумку разработчика.

 

Grigory
Offline
Зарегистрирован: 29.03.2014

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

gena
Offline
Зарегистрирован: 04.11.2012

   Жду ответ на пост #28.

Вот,за время обеда, появилась такая идея. Мотор соединён последовательно с микриком, который замкнут всегда, кроме точки остановки. В точке остановки микрик размыкается и своими контактами подключает последовательно с мотором до этого замкнутый стабилитрон, ну пусть на 12 В. Ток в цепи практически обрывается, мотор останавливается. Такое именение тока возможно "заметить" аппаратно. Мотор ГАРАНТИРОВАННО останавливается. Что бы запустить следующий цикл вращения, на мотор подаётся повышенное (форсажное) напряжение на время, пока мотор провернётся градусов на 30-ть и микрик вновь закоротит стабилитрон (это время можно измерить и учесть в программе). Затем напряжение понижается до номинального до следующей точки остановки.

Grigory
Offline
Зарегистрирован: 29.03.2014

на двигатель 24 В, 80 мА это потребление при работе

Grigory
Offline
Зарегистрирован: 29.03.2014

на фото плата которая прикручена к двигателю + там же стоит механизм нажимания на кнопку

gena
Offline
Зарегистрирован: 04.11.2012

  Схему платы "в студию".

Если есть возможность, то полезно было бы подключить параллельно мотору на работающем устройстве СТРЕЛОЧНЫЙ вольтметр и прокрутив полный цикл вращения понаблюдать за напряжением на моторе.

gena
Offline
Зарегистрирован: 04.11.2012

 В этой теме упоминается датчик тока, может будет лучше чем  acs712;  http://arduino.ru/forum/apparatnye-voprosy/mini-obzor-monitora-toka-ina2....

Grigory
Offline
Зарегистрирован: 29.03.2014

схему сегодня скину, а вот по поводу этой микрухи сейчас буду искать ее

Grigory
Offline
Зарегистрирован: 29.03.2014

gena
Offline
Зарегистрирован: 04.11.2012

  Укажите номинал резистора, если есть возможность - то и тип диодов (а друг там стабилитроны?). Судя по схеме, микровыключатель вообще никакой роли не играет - можно выпаять. Это настораживает. Капиталист никогда не будет ставить лишних радиодеталей (вон даже на конденсаторе сэкономили).  Если есть возможность, слелайте качественные фото и выложите (только отмойте плату от флюса). Короче - сомневаюсь я в правильности схемы. Кстати, а где в схеме мотор?

gena
Offline
Зарегистрирован: 04.11.2012

  Есть некоторые (новые) соображения по принципу слежения за вращенинем мотора. Так по ним (соображениям) АЦП ВООБЩЕ не нужен!

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

драйвер L298

Ven = H          C = H , D = L           Forward

Ven = H          C = L , D = H           Reverse

Ven = L                C = D                 Fast Motor Stop !!!!!!!!!!!!!!!!!!

 

Ven = L          C = X , D = X           Free Running Motor Stop

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

 Топик стартер. Не пропадайте надолго, теряю спортивный интерес. Вашу задачу я решил (теоретически) оригинально: один вывод микроконтроллера - один управляемый мотор. Без АЦП. Необходима Ваша заинтересованность и проверка моих предположений.

Grigory
Offline
Зарегистрирован: 29.03.2014

добрый день, сегодня купил драйвер L298, сижу разбираюcь с ним

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

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

скорее всего R1 и D2 - последовательно ? по фоте плоховидно :)

подаём питание, начинаем измерять ток ( >= 80 mA )........

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

мотор редуктор по инерции останавливается, по ходу успевая освободить микрик - схема в исходном состоянии !

R1 и D2 - гасят самоиндукцию мотора - чёбы быстрее остановился

щас схему переделаю :)

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

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

if ( питание_М_подано )

    {

         while ( ток _М > 10 mA ) { }

         выключить_питание_М:

    }

 

gena
Offline
Зарегистрирован: 04.11.2012

  Продолжаю ждать качественные фото платы, места подключения микрика должны быть хорошо видны!