74HC595 L293D
- Войдите на сайт для отправки комментариев
Чт, 04/02/2016 - 07:04
Доброе время суток форумчане, вопрос следующий:
Решил расширить количество ног на ардуино нано, для увеличения использовал пару сдвиговых регистров (74HC595), для теста поразвлекался с библиотекой Shift595 всё работает, дальше пришла мысть что схема управления шаговиками немного изменилась и теперь вместо включения или отключения ноги на дурине нужно на ноги байты посылать. Тут я немного приуныл так как естественно библиотека AccelStepper с подачей байтов на ноги не дружит. Нужно ли переписывать эти библы для совместной работы или есть какие-то уже решения?
AccelStepper нужна для управления паралельно несколькими шаговиками (5 шт).
Вот кусок из библиотеки AccelStepper, файл AccelStepper.cpp, в нем видно, как выполняются шаги:
void AccelStepper::step(uint8_t step) { switch (_pins) { case 0: step0(); break; case 1: step1(step); break; case 2: step2(step); break; case 4: step4(step); break; } } // 0 pin step function (ie for functional usage) void AccelStepper::step0() { if (_speed > 0) { _forward(); } else { _backward(); } } // 1 pin step function (ie for stepper drivers) // This is passed the current step number (0 to 3) // Subclasses can override void AccelStepper::step1(uint8_t step) { digitalWrite(_pin2, _speed > 0); // Direction // Caution 200ns setup time digitalWrite(_pin1, HIGH); // Caution, min Step pulse width for 3967 is 1microsec // Delay 1microsec delayMicroseconds(1); digitalWrite(_pin1, LOW); } // 2 pin step function // This is passed the current step number (0 to 3) // Subclasses can override void AccelStepper::step2(uint8_t step) { switch (step) { case 0: /* 01 */ digitalWrite(_pin1, LOW); digitalWrite(_pin2, HIGH); break; case 1: /* 11 */ digitalWrite(_pin1, HIGH); digitalWrite(_pin2, HIGH); break; case 2: /* 10 */ digitalWrite(_pin1, HIGH); digitalWrite(_pin2, LOW); break; case 3: /* 00 */ digitalWrite(_pin1, LOW); digitalWrite(_pin2, LOW); break; } } // 4 pin step function // This is passed the current step number (0 to 3) // Subclasses can override void AccelStepper::step4(uint8_t step) { switch (step) { case 0: // 1010 digitalWrite(_pin1, HIGH); digitalWrite(_pin2, LOW); digitalWrite(_pin3, HIGH); digitalWrite(_pin4, LOW); break; case 1: // 0110 digitalWrite(_pin1, LOW); digitalWrite(_pin2, HIGH); digitalWrite(_pin3, HIGH); digitalWrite(_pin4, LOW); break; case 2: //0101 digitalWrite(_pin1, LOW); digitalWrite(_pin2, HIGH); digitalWrite(_pin3, LOW); digitalWrite(_pin4, HIGH); break; case 3: //1001 digitalWrite(_pin1, HIGH); digitalWrite(_pin2, LOW); digitalWrite(_pin3, LOW); digitalWrite(_pin4, HIGH); break; } }Зачем вам библиотека для управления шаговыми? Она ведь просто перебирает ноги в нужном порядке. В вашем случае лучше сделать так: подготовка состояния выводов по всем шаговым (иначе говоря то что в библиотеке меняет состояние вывода надо сохранить в переменную без команды смены состояния), собираете состояния выводов в байт или в 2 байта, отправляете на сдвиговый регистр. Можете переделать библиотеку под получение состояний вывода вместо его смены, а смену уже делайте вручную после получения состояния для всех 5 шаговиков.
В моей версии всё более со стороны функций запутанно, если не трудно скинте свою версию сюда.
Спасибо разобрался.
После несложных манипуляций с подключением библиотеки Shift595 и небольного редактирования библиотеки AccelStepper была переписана функция setOutputPins.
На входе в функцию setOutputPins приходит это: 0b0101 (что в дальнейшем летит в регистр и включает соответственно указанные ноги).
До редактирования:
void AccelStepper::setOutputPins(uint8_t mask) { uint8_t numpins = 2; if (_interface == FULL4WIRE || _interface == HALF4WIRE) numpins = 4; else if (_interface == FULL3WIRE || _interface == HALF3WIRE) numpins = 3; uint8_t i; for (i = 0; i < numpins; i++) digitalWrite(_pin[i], (mask & (1 << i)) ? (HIGH ^ _pinInverted[i]) : (LOW ^ _pinInverted[i])); }После:
void AccelStepper::setOutputPins(uint8_t mask) { uint8_t numpins = 2; if (_interface == FULL4WIRE || _interface == HALF4WIRE) numpins = 4; else if (_interface == FULL3WIRE || _interface == HALF3WIRE) numpins = 3; uint8_t i; for (i = 0; i < numpins; i++) //Shifter.clearRegisters(); Shifter.setRegisterPin(_pin[i], (mask & (1 << i)) ? (HIGH ^ _pinInverted[i]) : (LOW ^ _pinInverted[i])); }Изменение работает и движок крутиться, но только немного не с той скоростью с которой крутился без сдвиговых регистров (медленнее), после изменения скорости вращения двигателя со сдвиговыми регистрами через setMaxSpeed и setAcceleration ничего кроме замедления добиться не получаеться, в чем может быть проблема?