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

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

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

001#include <TimerOne.h>
002 
003#include <StepDirDriver.h>
004 
005bool Enable_147394081_1;
006bool Direction_147394081_1;
007int Steps_147394081_1;
008bool StartSteps_147394081_1;
009bool Continuous_147394081_1;
010byte divider_147394081_1;
011int balanceSteps_147394081_1;
012StepDirDriver myMotor_147394081_1( 11 ,  12 ,  13 );
013bool _trgrt1_147394081_1= 0;
014bool _trgrt1I_147394081_1= 0;
015bool temp_147394081_1=0;
016bool rTrig_147394081_1;
017bool _bounseInputD4S = 0;
018bool _bounseInputD4O = 0;
019unsigned long _bounseInputD4P = 0UL;
020bool _bounseInputD2S = 0;
021bool _bounseInputD2O = 0;
022unsigned long _bounseInputD2P = 0UL;
023bool _bounseInputD3S = 0;
024bool _bounseInputD3O = 0;
025unsigned long _bounseInputD3P = 0UL;
026 
027void setup()
028{
029pinMode(4, INPUT_PULLUP);
030pinMode(2, INPUT_PULLUP);
031pinMode(3, INPUT_PULLUP);
032 
033 
034_bounseInputD4O =  digitalRead(4);
035_bounseInputD3O =  digitalRead(3);
036_bounseInputD2O =  digitalRead(2);
037Timer1.initialize( 40 );  // инициализация таймера 1, период 200 мкс
038Timer1.attachInterrupt(timerInterrupt_147394081_1,  40 );  // задаем обработчик прерываний
039myMotor_147394081_1.setMode(0, 1 );  // шаговый режим, без фиксации при остановке
040// делитель частоты
041 
042}
043void loop()
044{
045 
046 
047bool  _bounceInputTmpD4 =  (digitalRead (4));
048 
049if (_bounseInputD4S)
050    {
051     if (millis() >= (_bounseInputD4P + 40))
052         {_bounseInputD4O= _bounceInputTmpD4; _bounseInputD4S=0;}
053     }
054else
055    {
056     if (_bounceInputTmpD4 != _bounseInputD4O )
057         {_bounseInputD4S=1; _bounseInputD4P = millis();}
058      }
059bool  _bounceInputTmpD2 =  (digitalRead (2));
060 
061if (_bounseInputD2S)
062    {
063     if (millis() >= (_bounseInputD2P + 40))
064         {_bounseInputD2O= _bounceInputTmpD2; _bounseInputD2S=0;}
065     }
066else
067    {
068     if (_bounceInputTmpD2 != _bounseInputD2O )
069         {_bounseInputD2S=1; _bounseInputD2P = millis();}
070      }
071bool  _bounceInputTmpD3 =  (digitalRead (3));
072 
073if (_bounseInputD3S)
074    {
075     if (millis() >= (_bounseInputD3P + 40))
076         {_bounseInputD3O= _bounceInputTmpD3; _bounseInputD3S=0;}
077     }
078else
079    {
080     if (_bounceInputTmpD3 != _bounseInputD3O )
081         {_bounseInputD3S=1; _bounseInputD3P = millis();}
082      }
083 
084 
085 
086 
087//Плата:1
088Enable_147394081_1 = 1;
089Direction_147394081_1 = !(_bounseInputD3O);
090Steps_147394081_1 = 0;
091StartSteps_147394081_1 = 0;
092Continuous_147394081_1 = ( (_bounseInputD4O) || (!(_bounseInputD3O)) || (!(_bounseInputD2O)) );
093divider_147394081_1 = 255;
094if (Enable_147394081_1) {
095rTrig_147394081_1 = false;
096balanceSteps_147394081_1 = myMotor_147394081_1.readSteps(); //чтение количества оставшихся шагов
097if (   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;}; //импульс на начала вращения
098 
099if (Continuous_147394081_1 )
100{
101 if (balanceSteps_147394081_1<100) starting_147394081_1(30000);
102}
103else
104{
105if ( temp_147394081_1 ) myMotor_147394081_1.step( 0 );//Если в прошлом цикле было ноль, остановить
106if (_trgrt1_147394081_1 )starting_147394081_1(Steps_147394081_1); //
107}
108temp_147394081_1 = Continuous_147394081_1;
109} else {
110    if (!rTrig_147394081_1) {
111        rTrig_147394081_1 = true;
112        myMotor_147394081_1.step(0);
113    }
114}
115 
116 
117 
118 
119 
120 
121}
122 
123void timerInterrupt_147394081_1()
124{
125myMotor_147394081_1.control(); // управление двигателем
126}
127void starting_147394081_1(int _Steps)
128{
129myMotor_147394081_1.setDivider( divider_147394081_1 );
130if ( Direction_147394081_1==0 ) _Steps = -1* _Steps ;
131myMotor_147394081_1.step( _Steps );
132}

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

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

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

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

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

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

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

01bool _bounseInputD2S = 0;
02bool _bounseInputD2O = 0;
03unsigned long _bounseInputD2P = 0UL;
04bool _bounseInputD4S = 0;
05bool _bounseInputD4O = 0;
06unsigned long _bounseInputD4P = 0UL;
07bool _bounseInputD3S = 0;
08bool _bounseInputD3O = 0;
09unsigned long _bounseInputD3P = 0UL;
10bool _gen1I = 0;
11bool _gen1O = 0;
12unsigned long _gen1P = 0UL;
13 
14void setup()
15{
16pinMode(4, INPUT_PULLUP); //Датчик препятствие
17pinMode(2, INPUT_PULLUP); //кнопка право
18pinMode(3, INPUT_PULLUP); //кнопка лево
19pinMode(11, OUTPUT); //на STEP драйвера шагового двигателя
20digitalWrite(11, 0);
21pinMode(12, OUTPUT); // на DIR драйвера шагового двигателя
22digitalWrite(12, 0);
23 
24 
25_bounseInputD4O =  digitalRead(4); // переменая входов пинов
26_bounseInputD3O =  digitalRead(3); // переменая входов пинов
27_bounseInputD2O =  digitalRead(2); // переменая входов пинов
28 
29}
30void loop()
31{
32 
33 
34bool  _bounceInputTmpD2 =  (digitalRead (2));
35 
36if (_bounseInputD2S)
37    {
38     if (millis() >= (_bounseInputD2P + 40))
39         {_bounseInputD2O= _bounceInputTmpD2; _bounseInputD2S=0;}
40     }
41else
42    {
43     if (_bounceInputTmpD2 != _bounseInputD2O )
44         {_bounseInputD2S=1; _bounseInputD2P = millis();}
45      }
46bool  _bounceInputTmpD4 =  (digitalRead (4));
47 
48if (_bounseInputD4S)
49    {
50     if (millis() >= (_bounseInputD4P + 40))
51         {_bounseInputD4O= _bounceInputTmpD4; _bounseInputD4S=0;}
52     }
53else
54    {
55     if (_bounceInputTmpD4 != _bounseInputD4O )
56         {_bounseInputD4S=1; _bounseInputD4P = millis();}
57      }
58bool  _bounceInputTmpD3 =  (digitalRead (3));
59 
60if (_bounseInputD3S)
61    {
62     if (millis() >= (_bounseInputD3P + 40))
63         {_bounseInputD3O= _bounceInputTmpD3; _bounseInputD3S=0;}
64     }
65else
66    {
67     if (_bounceInputTmpD3 != _bounseInputD3O )
68         {_bounseInputD3S=1; _bounseInputD3P = millis();}
69      }
70 
71 
72 
73 
74//Плата:1
75digitalWrite(12, !(_bounseInputD3O)); //                                                                                                                                                                                                  200 это время паузы между импульсами
76if (( (_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;  } } }
77digitalWrite(11, _gen1O);
78 
79 
80 
81 
82 
83// внизу таймер
84}
85 
86bool _isTimer(unsigned long startTime, unsigned long period )
87  {
88  unsigned long currentTime;
89currentTime = millis();
90if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
91  }
92bool _isTimerMicros(unsigned long startTime, unsigned long period )
93  {
94  unsigned long currentTime;
95currentTime = micros();
96if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
97  }

 

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

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