Проблема с драйвером A4988
- Войдите на сайт для отправки комментариев
Ср, 14/04/2021 - 16:27
Есть готовый скетч для управления шаговым двигателем. Драйвер подключен через макетную плату к ардуино и двигателю. Проблема в следующем: драйвер, который был у меня изначально похоже неисправен, он крутит двигатель только в одну сторону; я купил такой же новый, поставил его на макетную плату вместо старого и он не крутит двигатель вообще, слышны только щелчки и писк. Я подстраивал потенциометр на драйвере, менял питание, но двигатель так и не крутится, только сильно греется. Исполнитель, написавший код, говорит что я что-то не правильно подключил, но я вроде бы все перепроверил.
#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 );
}
не разобрался как прикрепить изображение схемы подключения
Только на питание драйвера подаю 16В и ставлю конденсатор 100 мкФ
это надо иметь воспаление моска, чтобы придумать такие названия переменным))))
Вот такой еще есть вариант скетча)
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));} }это
воспаление моска
называется FLProg
это надо иметь воспаление моска, чтобы придумать такие названия переменным))))
Да это явно сгенерированный код каким-нибудь flprog'ом или tinkercad'ом....
igorduino - а сюда вы зачем написали? Это отдел платынх заказов.
Хотите заказать эту работу кому-то из местных вторично?
Страна должна знать своих героев. ;)
Он местный?
Или заказать повторно или найти того, кто поможет разобраться возмездно. Один человек написал что дело в драйверах, но я уже 2 шт купил новых и они ведут себя одинаково.
Могу написать заново. wrk.sadman@gmail.com
Делителями пощелкай. Наверняка просто стоят не в том состоянии, что выставлял автор скетча
Видимо всё-таки понимаете, что не у него одного "рыльце в пушку". ;))))
Решил спаять схему, а не собирать на макетке, и все заработало