Как выводить данные на дисплей одновременно с работой ШД?
- Войдите на сайт для отправки комментариев
Ср, 27/01/2016 - 23:37
Хочу одновременно с работой ШД выводить на дисплей пройденное расстояние и количество оборотов.
Но на время вывода данных ШД замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде в 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();
}
}
А какая плата используется и как маркированы ШИМ входы драйвера? По идее, аппаратному ШИМ не должно быть помехой передача по UART, хотя ХЗ, я сам не пробовал, нужно бы осцилографом глянуть.
Да, и почему такая каша с выводами?
используются драйвера на L298N (4 дискретных ввода) и THB7128-3 (STEP/DIR) - результат одинаковый.
С выводами не каша - в зависимости от двигателя используется либо один, либо другой, выбирается через #ifdef
Для того, чтоб не зависимо работало все это дело, этот драйвер с этой библиотекой не пойдет. Отвязаться можно только используя таймеры, но в данном случае никак. Вот кусок кода из библиотеки(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; } }Афигенный набор отверток. :)
Да, в зависимости конечно от Вашей задачи, можно попробовать использовать сдвиговый регистр или счётчик делитель, а на него подавать импульсы с аппаратного ШИМа.