Проблема с драйвером A4988

igorduino
Offline
Зарегистрирован: 13.04.2021

Есть готовый скетч для управления шаговым двигателем. Драйвер подключен через макетную плату к ардуино и двигателю. Проблема в следующем: драйвер, который был у меня изначально похоже неисправен, он крутит двигатель только в одну сторону; я купил такой же новый, поставил его на макетную плату вместо старого и он не крутит двигатель вообще, слышны только щелчки и писк. Я подстраивал потенциометр на драйвере, менял питание, но двигатель так и не крутится, только сильно греется. Исполнитель, написавший код, говорит что я что-то не правильно подключил, но я вроде бы все перепроверил.


#include <TimerOne.h>

#include <StepDirDriver.h>

bool Enable_147394081_1;
bool Direction_147394081_1;
int Steps_147394081_1;
bool StartSteps_147394081_1;
bool Continuous_147394081_1;
byte divider_147394081_1;
int balanceSteps_147394081_1;
StepDirDriver myMotor_147394081_1( 11 ,  12 ,  13 );
bool _trgrt1_147394081_1= 0;
bool _trgrt1I_147394081_1= 0;
bool temp_147394081_1=0;
bool rTrig_147394081_1;
bool _bounseInputD4S = 0;
bool _bounseInputD4O = 0;
unsigned long _bounseInputD4P = 0UL;
bool _bounseInputD2S = 0;
bool _bounseInputD2O = 0;
unsigned long _bounseInputD2P = 0UL;
bool _bounseInputD3S = 0;
bool _bounseInputD3O = 0;
unsigned long _bounseInputD3P = 0UL;

void setup()
{
pinMode(4, INPUT_PULLUP); 
pinMode(2, INPUT_PULLUP); 
pinMode(3, INPUT_PULLUP); 


_bounseInputD4O =  digitalRead(4);
_bounseInputD3O =  digitalRead(3);
_bounseInputD2O =  digitalRead(2);
Timer1.initialize( 40 );  // инициализация таймера 1, период 200 мкс
Timer1.attachInterrupt(timerInterrupt_147394081_1,  40 );  // задаем обработчик прерываний
myMotor_147394081_1.setMode(0, 1 );  // шаговый режим, без фиксации при остановке
// делитель частоты

}
void loop()
{


bool  _bounceInputTmpD4 =  (digitalRead (4));

if (_bounseInputD4S) 
    {
     if (millis() >= (_bounseInputD4P + 40)) 
         {_bounseInputD4O= _bounceInputTmpD4; _bounseInputD4S=0;}
     }
else
    {
     if (_bounceInputTmpD4 != _bounseInputD4O )
         {_bounseInputD4S=1; _bounseInputD4P = millis();} 
      } 
bool  _bounceInputTmpD2 =  (digitalRead (2));

if (_bounseInputD2S) 
    {
     if (millis() >= (_bounseInputD2P + 40)) 
         {_bounseInputD2O= _bounceInputTmpD2; _bounseInputD2S=0;}
     }
else
    {
     if (_bounceInputTmpD2 != _bounseInputD2O )
         {_bounseInputD2S=1; _bounseInputD2P = millis();} 
      } 
bool  _bounceInputTmpD3 =  (digitalRead (3));

if (_bounseInputD3S) 
    {
     if (millis() >= (_bounseInputD3P + 40)) 
         {_bounseInputD3O= _bounceInputTmpD3; _bounseInputD3S=0;}
     }
else
    {
     if (_bounceInputTmpD3 != _bounseInputD3O )
         {_bounseInputD3S=1; _bounseInputD3P = millis();} 
      } 




//Плата:1
Enable_147394081_1 = 1;
Direction_147394081_1 = !(_bounseInputD3O);
Steps_147394081_1 = 0;
StartSteps_147394081_1 = 0;
Continuous_147394081_1 = ( (_bounseInputD4O) || (!(_bounseInputD3O)) || (!(_bounseInputD2O)) );
divider_147394081_1 = 255;
if (Enable_147394081_1) {
rTrig_147394081_1 = false;
balanceSteps_147394081_1 = myMotor_147394081_1.readSteps(); //чтение количества оставшихся шагов
if (   StartSteps_147394081_1   ) { if (_trgrt1I_147394081_1) { _trgrt1_147394081_1 = 0;} else {_trgrt1_147394081_1 = 1; _trgrt1I_147394081_1 = 1;} } else {_trgrt1_147394081_1 = 0; _trgrt1I_147394081_1 = 0;}; //импульс на начала вращения

if (Continuous_147394081_1 )
{
 if (balanceSteps_147394081_1<100) starting_147394081_1(30000);
}
else
{
if ( temp_147394081_1 ) myMotor_147394081_1.step( 0 );//Если в прошлом цикле было ноль, остановить
if (_trgrt1_147394081_1 )starting_147394081_1(Steps_147394081_1); // 
}
temp_147394081_1 = Continuous_147394081_1; 
} else {
	if (!rTrig_147394081_1) {
		rTrig_147394081_1 = true;
		myMotor_147394081_1.step(0);
	}
}






}

void timerInterrupt_147394081_1()
{
myMotor_147394081_1.control(); // управление двигателем
}
void starting_147394081_1(int _Steps)
{
myMotor_147394081_1.setDivider( divider_147394081_1 );
if ( Direction_147394081_1==0 ) _Steps = -1* _Steps ;
myMotor_147394081_1.step( _Steps );
}

не разобрался как прикрепить изображение схемы подключения

igorduino
Offline
Зарегистрирован: 13.04.2021

Только на питание драйвера подаю 16В и ставлю конденсатор 100 мкФ

vvadim
Offline
Зарегистрирован: 23.05.2012

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

igorduino
Offline
Зарегистрирован: 13.04.2021

Вот такой еще есть вариант скетча)


bool _bounseInputD2S = 0;
bool _bounseInputD2O = 0;
unsigned long _bounseInputD2P = 0UL;
bool _bounseInputD4S = 0;
bool _bounseInputD4O = 0;
unsigned long _bounseInputD4P = 0UL;
bool _bounseInputD3S = 0;
bool _bounseInputD3O = 0;
unsigned long _bounseInputD3P = 0UL;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;

void setup()
{
pinMode(4, INPUT_PULLUP); //Датчик препятствие
pinMode(2, INPUT_PULLUP); //кнопка право
pinMode(3, INPUT_PULLUP); //кнопка лево
pinMode(11, OUTPUT); //на STEP драйвера шагового двигателя
digitalWrite(11, 0); 
pinMode(12, OUTPUT); // на DIR драйвера шагового двигателя
digitalWrite(12, 0); 


_bounseInputD4O =  digitalRead(4); // переменая входов пинов
_bounseInputD3O =  digitalRead(3); // переменая входов пинов
_bounseInputD2O =  digitalRead(2); // переменая входов пинов

}
void loop()
{


bool  _bounceInputTmpD2 =  (digitalRead (2));

if (_bounseInputD2S) 
    {
     if (millis() >= (_bounseInputD2P + 40)) 
         {_bounseInputD2O= _bounceInputTmpD2; _bounseInputD2S=0;}
     }
else
    {
     if (_bounceInputTmpD2 != _bounseInputD2O )
         {_bounseInputD2S=1; _bounseInputD2P = millis();} 
      } 
bool  _bounceInputTmpD4 =  (digitalRead (4));

if (_bounseInputD4S) 
    {
     if (millis() >= (_bounseInputD4P + 40)) 
         {_bounseInputD4O= _bounceInputTmpD4; _bounseInputD4S=0;}
     }
else
    {
     if (_bounceInputTmpD4 != _bounseInputD4O )
         {_bounseInputD4S=1; _bounseInputD4P = millis();} 
      } 
bool  _bounceInputTmpD3 =  (digitalRead (3));

if (_bounseInputD3S) 
    {
     if (millis() >= (_bounseInputD3P + 40)) 
         {_bounseInputD3O= _bounceInputTmpD3; _bounseInputD3S=0;}
     }
else
    {
     if (_bounceInputTmpD3 != _bounseInputD3O )
         {_bounseInputD3S=1; _bounseInputD3P = millis();} 
      } 




//Плата:1
digitalWrite(12, !(_bounseInputD3O)); //                                                                                                                                                                                                  200 это время паузы между импульсами
if (( (_bounseInputD4O) || (!(_bounseInputD3O)) || (!(_bounseInputD2O)) )) {if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P =  micros(); } } else { _gen1I = 0 ;  _gen1O= 0;  } if (_gen1I ) { if (_gen1O) { if ( _isTimerMicros( _gen1P , 200 )) { _gen1P = millis(); _gen1O = 0; } } else  { if ( _isTimer( _gen1P , 10 )) {  _gen1P = micros(); _gen1O = 1;  } } }
digitalWrite(11, _gen1O);





// внизу таймер
}

bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
bool _isTimerMicros(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = micros();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }

 

gfx125
Offline
Зарегистрирован: 27.05.2017

это

vvadim пишет:

 воспаление моска

называется FLProg

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

vvadim пишет:

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

Да это явно сгенерированный код каким-нибудь flprog'ом или tinkercad'ом....

b707
Offline
Зарегистрирован: 26.05.2017

igorduino - а сюда вы зачем написали? Это отдел платынх заказов.

Хотите заказать эту работу кому-то из местных вторично?

rst
Offline
Зарегистрирован: 25.06.2018

igorduino пишет:
Исполнитель, написавший код
Имя героя - в студию!!

Страна должна знать своих героев.  ;)

Он местный?

igorduino
Offline
Зарегистрирован: 13.04.2021

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Могу написать заново. wrk.sadman@gmail.com

SAB
Offline
Зарегистрирован: 27.12.2016

Делителями пощелкай. Наверняка просто стоят не в том состоянии, что выставлял автор скетча

 

 

rst
Offline
Зарегистрирован: 25.06.2018

igorduino пишет:
Или заказать повторно или найти того, кто поможет разобраться возмездно.
А назвать имя героя значит не хотите....

Видимо всё-таки понимаете, что не у него одного "рыльце в пушку".  ;))))

igorduino
Offline
Зарегистрирован: 13.04.2021

Решил спаять схему, а не собирать на макетке, и все заработало