74HC595 L293D

DIGIUS
Offline
Зарегистрирован: 17.09.2015

Доброе время суток форумчане, вопрос следующий:

Решил расширить количество ног на ардуино нано,  для увеличения использовал пару  сдвиговых регистров (74HC595),  для теста поразвлекался с библиотекой Shift595 всё работает, дальше пришла мысть что схема управления шаговиками немного изменилась и теперь вместо включения или отключения ноги на дурине нужно на ноги байты посылать.  Тут я немного приуныл так как естественно библиотека AccelStepper с подачей байтов на ноги не дружит. Нужно ли переписывать эти библы для совместной работы или есть какие-то уже решения?

AccelStepper нужна для управления паралельно несколькими шаговиками (5 шт).

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Вот кусок из библиотеки 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;
    }
} 

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Зачем вам библиотека для управления шаговыми? Она ведь просто перебирает ноги в нужном порядке. В вашем случае лучше сделать так: подготовка состояния выводов по всем шаговым (иначе говоря то что в библиотеке меняет состояние вывода надо сохранить в переменную без команды смены состояния), собираете состояния выводов в байт или в 2 байта, отправляете на сдвиговый регистр. Можете переделать библиотеку под получение состояний вывода вместо его смены, а смену уже делайте вручную после получения состояния для всех 5 шаговиков.

DIGIUS
Offline
Зарегистрирован: 17.09.2015

В моей версии  всё более со стороны функций запутанно, если не трудно скинте свою версию сюда.

DIGIUS
Offline
Зарегистрирован: 17.09.2015

Спасибо разобрался.

DIGIUS
Offline
Зарегистрирован: 17.09.2015

После несложных манипуляций с подключением библиотеки 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 ничего кроме замедления добиться не получаеться, в чем может быть проблема?