нужна помощь с датчиком тока и двигателем постоянного тока

quadroestedro
Offline
Зарегистрирован: 10.03.2018

Суть вопроса в следующем,



Есть DC motor, есть аналоговый сигнал по которому двигатель приводиться в движение,



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



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



сила тока равна = силе препятствия, с программы имеем силу тока 800 - это макс. значение



оно длиться около 0.1-0.1.5сек при старте двигателя и далее спадает до 125-250 (из-за резьбы) при достижении препятствия сила возрастает до 800(нужно остановить подачу при препятствии). Требуется сделать так чтобы двигатель отключался и напряжение пропадало, но при подаче сигнала приводилось в движение снова.



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



Может кто-то что-то предложить по решению вопроса?

quadroestedro
Offline
Зарегистрирован: 10.03.2018

Помимо этого, есть еще датчик, от которого происходит старт, допустим:

CM11 = analogRead(1)

current_sensor = analogRead(0)

If (CM11 > 0)

{

analogWrite(MOTOR1, 255);

}

else

{analogWrite(MOTOR2, 255);

}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Ну так не ловите его при старте, поставьте задержку на 0,5-1с ( или сколько там по ТЗ), а дальше уже мониторьте.

quadroestedro
Offline
Зарегистрирован: 10.03.2018

Парадокс, когда двигатель достигает препятствия то, ток постоянно 800, чтобы привести в движение опять нужен ток 800 но уже в другом направлении против препятствия, желательно обойтись без delay() ибо важна скорость, если есть пример решения, с радостью почитаю вашу идею) по ТЗ 0.5-1с оч много. 0.125-0.2сек макс.

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

bwn
Offline
Зарегистрирован: 25.08.2014

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

P/S по такому принципу:

if (условие) {
  //Мотор старт
  flag = false;
  prevMillis = millis();
}


if (flag) {
  amper = analogRead(pin);
}

if (millis() - prevMillis > 200) {
  flag = true;
}

 

quadroestedro
Offline
Зарегистрирован: 10.03.2018

Да, но есть проблема, один датчик определяет положение вращения двигателя, влево или вправо. Т.е если датчик выдает инфу 400 - то двигатель крутиться в одну сторону, если 0, то крутиться в другую, так вот, когда он крутиться в другую ток составляет 120-250, при стартовом токе 800, когда он доходит в окончательное положение, встречает препятствие и ток меняется на 800, нужно остановить его. Как, будут предложения?

bwn
Offline
Зарегистрирован: 25.08.2014

Не понимаю вашу задачу, препятствие может возникнуть моментально после старта? Если нет, то if (amper >=800) {двигатель стоп}/

А даже если и возникнет, мы все равно не сможем определить что это.

quadroestedro
Offline
Зарегистрирован: 10.03.2018

препятствие не возникает, но при старте двигателя датчик тока показывает макс. значение, на 0.1сек, потом оно спадает в 5 раз.

bwn
Offline
Зарегистрирован: 25.08.2014

Вы мой код смотрели? 200 миллисекунд он вообще аналогрид не делает.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вот тоже что и в bwn только подробней

bool f_pravo; //Флаг право
bool f_levo; //Флаг лево
uint16_t amper; // Меряем ток
uint32_t prevMillis;//Засекаем время

if (kn_levo && !f_pravo) { //Нажели кнопку влево
  //Мотор старт
  f_pravo = 1;
  f_levo = 0;
  amper = 0;
  prevMillis = millis();
}

if (kn_pravo && !f_levo) {//Нажали кнопку вправо
  //Мотор старт
  f_pravo = 0;
  f_levo = 1;
  amper = 0;
  prevMillis = millis();
}

if (millis() - prevMillis > 200) {//Пршло время пуска - меряем ток
  amper = analogRead(pin);
}
 
 if (amper >= 800)//Остановка по препяствию
 {
   //Мотор stop
 }

 if (kn_stop)//Остановка по кнопке
 {
   //Мотор stop
   f_levo = 0;
   f_pravo = 0;
 }

 

quadroestedro
Offline
Зарегистрирован: 10.03.2018

Работает, но переменная, которая постоянно меняется 100~700

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

mexanic38
Offline
Зарегистрирован: 26.02.2018

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

тока при пуске срабатывать не будет.