Страница 2 из 5

Re: Arduino AccelStepper

Добавлено: 15 янв 2014, 11:30
Nick
Да, у меня там много чего стоит (samba, postfix, ltsp и куча чего еще)... и обычно что-то ломается... И самое хреновое, что с этого компа работает пол офиса... Был бы это только мой комп - было бы проще, а тут это сервак...

Re: Arduino AccelStepper

Добавлено: 15 янв 2014, 11:41
aftaev
Nick писал(а):Был бы это только мой комп
почему у тебя еще нет своего компа с Линухом :)

Re: Arduino AccelStepper

Добавлено: 15 янв 2014, 11:47
Сергей Саныч
aftaev писал(а):почему у тебя еще нет своего компа с Линухом :)
дык, сапожник завсегда босой ходит :hehehe:

Re: Arduino AccelStepper

Добавлено: 15 янв 2014, 12:59
Serg
Сергей Саныч писал(а):дык, сапожник завсегда босой ходит :hehehe:
Ну не скажи.
Мы сервера в аренду сдаём. На днях я решил взять сервер и поставить на него оригинальный дистрибут с linuxcnc.org, ну просто чтоб было, мало-ли чего попробовать/посмотреть. Подключил, установил, настроил сеть, пробую что-нибудь попинговать - половина пакетов теряется. :thinking:
Вобщем через минут 20 изысканий выяснилось, что такой сервер я себе уже давно поставил, даже с таким-же IP (потому и не работало), просто забыл про него... :idiot: :hehehe:

Re: Arduino AccelStepper

Добавлено: 15 янв 2014, 13:14
Nick
Ладно, вернемся к делу :).

Почему-то у меня
stepper.currentPosition() всегда возвращает 0. Даже если движок уже куда-то ездил.
И, соответственно runToNewPosition едет всегда в относительное положение, т.е.
stepper.runToNewPosition(100);
stepper.runToNewPosition(100);
дважды проедет по 100 шагов. Хотя он должен работать в абсолютных координатах.
void AccelStepper::runToNewPosition ( long position )
Moves the motor to the new target position and blocks until it is at position. Dont use this in event loops, since it blocks.
Parameters
[in] position The new target position.
Examples:
Blocking.pde, and Overshoot.pde.
References moveTo(), and runToPosition().

Re: Arduino AccelStepper

Добавлено: 25 май 2015, 12:32
aftaev
Померили осцылом что может генерить ардуинка:

макс 1.2кгЦ

Код: Выделить всё

#include <AccelStepper.h>
// 11- степ
// 12 - дир
// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::FULL2WIRE, 10, 11);

void setup()
{  
  stepper.setMinPulseWidth(10); // ширина импульса
    stepper.setMaxSpeed(200000.0);
    stepper.setAcceleration(5000.0);
}

void loop()
{    
    stepper.runToNewPosition(0);
    stepper.runToNewPosition(10000000);
       
62кгц

Код: Выделить всё

int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13
void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
}
 
void loop()
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
delayMicroseconds(1);
  digitalWrite(ledPin, LOW);    // выключает светодиод
delayMicroseconds(1);
}
72кгц

Код: Выделить всё

int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13
void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
}
 
void loop()
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
  digitalWrite(ledPin, LOW);    // выключает светодиод
}

Re: Arduino AccelStepper

Добавлено: 25 май 2015, 12:35
Nick
aftaev писал(а):stepper.setMinPulseWidth(10); // ширина импульса
А если тут 0 поставить, никак не повлияет?

Re: Arduino AccelStepper

Добавлено: 25 май 2015, 12:49
aftaev
Nick писал(а):А если тут 0 поставить, никак не повлияет?
1-10 ставил на обороты сервы никак не влияло ;)

Re: Arduino AccelStepper

Добавлено: 25 май 2015, 12:50
aftaev
Если сделать разгон торможение через задержки delayMicroseconds(1); мож получиться скорость поднять ;)

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 10:51
Tomasina
Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 11:17
Morroc
Почаще дергать .Run() наверное, оно внутри проверяет сколько прошло времени с предыдущего шага и если пора шагать - шагает. Если нужно прям совсем совсем равномерное и нужно обязательно эту библиотеку - поставьте две ардуины, они дешевые :) Попробуйте Run() по прерыванию от таймера прикрутить, я так не делал - антенну кручу, ей сильно равномерно не нужно.

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 11:53
selenur
Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Дисплей (на базе ТМ1637) или OLED (на базе SSD1306), нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение.
Можно ли сделать отображение данных "в фоне"? Вроде на видео в CNC на Arduino таких проблем нету. Как реализовать такое?
Возможно просто не понимаю, как она работает.
Если делать программу с нуля, то можно было-бы используя «аппаратные прерывания», им отдать выполнение управление мотором, а оставшиеся ресурсы уже отдать для вывода на дисплей, а вот использовать прерывания для дисплея, уже может быть не лучшей идеей, т.к. выполнение кода по прерыванию имеет более высокий приоритет, и равномерности работы мотора может не получиться.

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 14:35
Morroc
Дисплей вряд ли использует прерывание в ардуине, но обновить OLED экранчик типа указанного занимает прилично времени, указанная библиотека тоже прерывания не использует и получается, что пока вывод инфы на OLED не закончится двигатель шагать не будет. Но с нуля дольше будет писать, так то библиотека неплохая вроде - крутит, ускоряет. В качестве извращения можно в библиотеку дисплея засунуть вызовы .Run() после вывода каждого символа (правда придется повозиться).

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 14:57
ALS
Не надо извращений :)
Если надо просто выводить какие-то цифры, то незачем использовать для этого графический дисплей.
А ТМ1637 настолько быстро "обслуживает" передаваемые ей сигналы управления, что все должно работать без тормозни (и без прерываний).

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 17:03
Tomasina
не настолько быстро, чтобы двигатель не замечал ее работы.
Сейчас так:

Код: Выделить всё

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

  if( millis() - time >= 1000 ) // вывод на дисплей раз в сек
  {
   if(needStepper == true) // если движок крутится
    {
    Digits[0] = (currentPositionMM / 1000) % 10;
    Digits[1] = (currentPositionMM / 100) % 10;
    Digits[2] = (currentPositionMM / 10) % 10;
    Digits[3] = (currentPositionMM % 10);
    Display.display(Digits);   // в этот момент ШД "замирает" :(
    needDisplayUpdate = false;
    time = millis();
    }
  }
}

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 17:33
Morroc
Прерывание по таймеру не пробовали прикрутить и туда .run() ?

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 21:32
ALS
Попробуйте сначала так :

Код: Выделить всё

   if(needStepper == true) // если движок крутится
    {
    Digits[0] = (currentPositionMM / 1000) % 10;
    Digits[1] = (currentPositionMM / 100) % 10;
    Digits[2] = (currentPositionMM / 10) % 10;
    Digits[3] = (currentPositionMM % 10);

    needDisplayUpdate = false;
    time = millis();
    }
Т.е. вычисляем, но не выводим число на индикацию.
А то, может, ардуина там интегралы в степеня возводит, пытаясь проделать элементарные вычисления...

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 23:42
grakun
aftaev писал(а):Померили осцылом что может генерить ардуинка:
Какой код такая и частота.
Во здесь она выдает 1,5Мгц

int led = 13;
// int led1 = 7;
void setup()
{ DDRB = B00110000; // устанавливаем 13 пин как OUTPUT(8-13)PIN
DDRD = B00100000;//(0-7 PIN)
//pinMode(led, OUTPUT);
}
void loop()
{



PORTB = B00110000; // устанавливаем состояние pin13 как HIGH
PORTD = B00100000;
//delayMicroseconds (1);

PORTB = B00000000; // устанавливаем состояние pin13 как LOW
PORTD = B00000000;
// delayMicroseconds (1);


}

Re: Arduino AccelStepper

Добавлено: 01 фев 2016, 23:45
grakun
Tomasina писал(а):Подскажите, как в этой библиотеке выводить данные на дисплей, не прерывая работу ШД?
Никак. Или ШД или индикатор.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 05:13
selenur
grakun писал(а):
aftaev писал(а):Померили осцылом что может генерить ардуинка:
Какой код такая и частота.
Во здесь она выдает 1,5Мгц

int led = 13;
// int led1 = 7;
void setup()
{ DDRB = B00110000; // устанавливаем 13 пин как OUTPUT(8-13)PIN
DDRD = B00100000;//(0-7 PIN)
//pinMode(led, OUTPUT);
}
void loop()
{



PORTB = B00110000; // устанавливаем состояние pin13 как HIGH
PORTD = B00100000;
//delayMicroseconds (1);

PORTB = B00000000; // устанавливаем состояние pin13 как LOW
PORTD = B00000000;
// delayMicroseconds (1);


}
А толку то от этих 1,5 мгц?
На ассемблере используя всего 3 команды можно получить еще выше частоту.
В свое время делал контроллер на Меге 16 (типа ардуина только выводов больше), так вот Step, стабильный и равномерный, все равно большой не получить, даже если-бы это делать на ассемблере, т.к. оперировать приходится числами явно более 8 бит, то математические операции с 32-х битными числами у меня использовали от 16 то 40 тактов микроконтроллера, что в итоге дает результат step 17-18 кГц, можно конечно используя кое какие хитрости увеличить частоту step, но равномерности уже не будет.