Как выводить данные на дисплей одновременно с работой ШД?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
Хочу одновременно с работой ШД выводить на дисплей пройденное расстояние и количество оборотов.
Но на время вывода данных ШД замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде в CNC на Arduino таких проблем нету. Как реализовать такое?

#include <AccelStepper.h>
#define DRIVER_ENA             4      // выход на клемму ENA "умного" драйвера ШД
#define DRIVER_DIR             6      // выход на клемму DIR "умного" драйвера ШД
#define DRIVER_PUL             5      // выход на клемму PUL "умного" драйвера ШД
#define DRIVER_IN1             4      // выход на клемму IN1 драйвера на L298N для ДШИ200-2
#define DRIVER_IN2             5      // выход на клемму IN2 драйвера на L298N для ДШИ200-2
#define DRIVER_IN3             6      // выход на клемму IN3 драйвера на L298N для ДШИ200-2
#define DRIVER_IN4             9      // выход на клемму IN4 драйвера на L298N для ДШИ200-2
#define STEPS                  200    // задаётся количество шагов на оборот, для ШД на 1,8 градуса это 200 шагов
#define MAX_SPEED              480.0  // максимальная скорость вращения ШД (шагов в сек) // для ДШИ200 это 480...512
#define MIN_SPEED              2.0    // минимальная скорость вращения ШД
#define ACCELERATION           MAX_SPEED  // ускорение ШД

// для драйвера STEP/DIR:
//AccelStepper stepper(AccelStepper::DRIVER, DRIVER_PUL, DRIVER_DIR);
// для драйвера на L298N:
AccelStepper stepper(AccelStepper::FULL4WIRE, DRIVER_IN1, DRIVER_IN2, DRIVER_IN3, DRIVER_IN4);

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  stepper.setMaxSpeed(MAX_SPEED);
  stepper.setAcceleration(ACCELERATION);
  stepper.setSpeed(0);
  Serial.println("Enable Motor.");
  stepper.enableOutputs();
  stepper.moveTo(5000);
}

void loop()
{      
  static unsigned long time = millis();
  stepper.run();

  if(millis() - time <500) digitalWrite(LED_BUILTIN, HIGH);
  else digitalWrite(LED_BUILTIN, LOW);

  if( millis() - time >= 1000) // вывод на дисплей (пока в Serial)
  {
    Serial.println(time/1000); // в этот момент ШД "замирает" :(
    time = millis();
  }

  if(stepper.distanceToGo() == 0)
  {
    stepper.setSpeed(0);
    stepper.stop();
    Serial.println("End.");
    Serial.println("Disable Motor.");
    stepper.disableOutputs();
  }
}

 

 

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

А какая плата используется и как маркированы ШИМ входы драйвера? По идее, аппаратному ШИМ не должно быть помехой передача по UART, хотя ХЗ, я сам не пробовал, нужно бы осцилографом глянуть.

Да, и почему такая каша с выводами?


#define DRIVER_ENA             4      // выход на клемму ENA "умного" драйвера ШД
#define DRIVER_DIR             6      // выход на клемму DIR "умного" драйвера ШД
#define DRIVER_PUL             5      // выход на клемму PUL "умного" драйвера ШД
#define DRIVER_IN1             4      // выход на клемму IN1 драйвера на L298N для ДШИ200-2
#define DRIVER_IN2             5      // выход на клемму IN2 драйвера на L298N для ДШИ200-2
#define DRIVER_IN3             6      // выход на клемму IN3 драйвера на L298N для ДШИ200-2

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

используются драйвера на L298N (4 дискретных ввода) и THB7128-3 (STEP/DIR) - результат одинаковый.

С выводами не каша - в зависимости от двигателя используется либо один, либо другой, выбирается через #ifdef

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

Для того, чтоб не зависимо работало все это дело, этот драйвер с этой библиотекой не пойдет. Отвязаться можно только используя таймеры, но в данном случае никак. Вот кусок кода из библиотеки(AccelStepper.cpp):

// 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;
    }
} 

Афигенный набор отверток. :)

Да, в зависимости конечно от Вашей задачи, можно попробовать использовать сдвиговый регистр или счётчик делитель, а на него подавать импульсы с аппаратного ШИМа.