Шаговый двигатель не вращается при большом значении скорости

Добрый день! Пытаюсь настроить шаговый двигатель, чтобы за 3 секунды вращения шнека, высыпалось определенное количество порошка, но шаговик отказывается вращаться при определенных значениях скорости
Из-за моих функций не работал и на низких скоростях, но изменил код так, чтобы tick вызывался как можно чаще, и начал работать, но все равно скорость недостаточна
Использую библиотеку GyverStepper2, на 2000 шагах в секунду вращение еще происходит, но если выставить 3200, шаговик только гудит и не вращается, при этом вал не заблокирован
Мыслей, где еще могут быть задержки tick, нет, пробовал убрать лишний код и оставить в loop только tick, ситуация та же
Модель шаговика 57hs112-4004A08-d21 с 400 шагов на оборот, необходима скорость 12000ш/сек, нигде не нашел информацию по ограничениям скорости на шаговике, драйвер поддерживает частоту степов до 200к в секунду
Драйвер DM556, полный шаг, 4А ток, по лабораторнику кушает 700-800мА
Управление ардуино уно
Код (без класса scale):

//PINB PORTB DDRB
byte B_regs[3] = { 0x03, 0x05, 0x04 };
//DT CLK (8 9)
byte Sc_pins[2] = { 0, 1 };
//steps per round - step - dir
//GStepper2< STEPPER2WIRE> stepper_small(200, 6, 7);
GStepper2< STEPPER2WIRE> stepper(400, A0, A1);

SCALE scales(1);

void setup() {
  Serial.begin(460800);
  // put your setup code here, to run once:
  scales.begin(B_regs, Sc_pins);
  scales.set_scale(1);  // установка масштаба
  scales.tare();        // тарирование
                        // calibration();
  scales.set_scale(382.57);
  stepper.setSpeed(-12000.00);
}
bool maximum = false;
bool overmax = false;
bool timer = false;
long time;
float weight;

void yield() {
  stepper.tick();
}
void loop() {
  
  if (!timer) {
    time = millis();
    timer = true;
  }
  
  weight = scales.value();

stepper.tick();
  // put your main code here, to run repeatedly:
  if (weight < 100.00 && !maximum && stepper.tick()) {
    Serial.println(weight);
    stepper.tick();
    
  }
stepper.tick();
  if (weight > 100.00 && !maximum && stepper.tick()) {
    stepper.setSpeed(0);
    time = millis() - time;
    maximum = true;
  }
stepper.tick();
  if (maximum == true) {
    Serial.print("Время насыпания 100 грамм: ");
    Serial.println(time);
    maximum = false;
    delay(5000);
    Serial.println(weight);
    timer = false;
  }
}

2000 оборотов в минуту для шаговика, не многовато ли?

на 2000 шагах в секунду вращение еще происходит
необходима скорость 12000ш/сек

Про обороты в секунду ничего не говорилось

Аксельстеппер при пустом лупе гонит до 3500PPS.
Около 10000PPS у большинства любительских конфигураций со степпером начинаются проблемы физического плана.

1 лайк

В коде не вижу логики.
Tick() вызывается в проверке каждого условия, ещё и Println до кучи.
12000 шагов/с это 83 мкс на один шаг. Печать в терминал в несколько раз дольше.

Тик вызываю даже в условиях, чтобы проверка условий не так сильно оттягивала время до следующего тика
Сериал нужен был для отладки части с весами, сейчас попробовал оптимизировать и выжать максимум, оставил пустой луп, больше 5000 не получается все равно

Но соглашусь, код далеко не самый лучший, первый опыт работы с шаговиками, еще и необходимо совместить его с АЦП, поэтому могу чего-то не понимать
Хочу попробовать вместо библиотечных функций, на STEP подавать шим сигнал, ближайшие частоты, с которыми его можно получить на ардуино, 15 и 8 кГц, может получится

Может учебник прочитаешь? И расчеты проведешь? Ну типа как инженер делает, который серьезно работает с шаговиками, а не тыкает проводки наугад?

2 лайка

Ну у любого шаговика есть ограничение по мощности при котором он перестаёт вращаться. Вы дали ток в фазу на 10 мс и шаг есть, а при 2 мс уже нет к примеру… Поднимите напряжение питания и посмотрите.

Да,невозможно судить о проблеме. Может банально не хватает тока из-за низкого напряжения. Надо глянуть сколько тактов занимает сам tick(), дабы понимать теоритический предел частоты. Я бы эту функцию вызывал прерыванием с наивысшим приоритетом. Там крайне важно именно постоянство частоты вызова.
Напряжение какое на драйвере?

Чудес не бывает.
Шаговик не предназначен для работы на высоких скоростях.
Если у Вас получилось, что

То, вероятнее всего, Вы где-то серьезно ошиблись при проектировании устройства.

В принципе, если Вам удалось заставить работать шаговик на 2000 шагах,сек, а нужно немного больше, то можно попытаться запустить двигатель с ускорением. Т.е. начать с тех же 1800-2000, а потом постепенно по шагам (имеется в виду не шаг двигателя, а шаг в приращении его скорости) поднимать. Скажем, с дискретностью по 50. На каждый шаг подъема скорости, естественно, должно приходиться несколько шагов двигателя. Скажем, установили 2000, подождали 10 шагов (5 мс), установили 2050, еще через 5 мс - 2100 и т.д. Возможно, таким образом удастся догнать до 3000.
Еще лучше - делать небольшие приращения на каждом шаге.

всё, слил секретные технологии )))

Тут скорость достаточно большая, по звуку слышно. Только с разгоном и торможением. Управление через регистры масками.
Спецальный покрасочный манипулятор.

Тут, вроде, повеселее будет. https://www.youtube.com/watch?v=ShudkgT_fKQ

Делал мешалку на шаговике и тоже упёрся в максимальные обороты. Делал через гайверовскую библу, потом перешёл на ШИМ - не помогло. В итоге после штудирования инета выяснилось, что и тип драйвера и сам двигатель ограничивают максимальные обороты(как ни странно :laughing:) Quod licet NEMA23, non licet NEMA17

Я так понимаю с места в карьер?
Попробуйте пробежать какое-то расстояние с максимальной скоростью. Вы ее сразу разовьете? И остановитесь “как вкопанный”?
Также и с ШД (собственно и любым другим двигателем). Собственно тут это уже писалось.
Не мучайте народ, возьмите сервопривод (не тот что для моделек, а настоящий, ватт на 100). Только смотрите чтобы скоростной был. Их драйвера вроде умеют сами разгонять, есть даже такие что задать сколько оборотов надо сделать за какое время, а они уже сами режим подберут разгона/остановки.

Так какое напряжение?
У меня вот nema23 на 36в уже тухло крутил 500-1000 оборотов. Далее небольшая нагрузка срывает синхронизацию обмоток и якоря.

Совет хороший и я бы, безусловно, так и сделал, если бы на это было время и цель - запустить проект на шаговиках
Но в моих реалиях, времени на это не так много, готовые шаговики уже шагают на производстве с плк укладываясь в рамки 100 грамм за 3 секунды, моя же задача перепроектировать весовой модуль, для калибровки коэффициентов фильтра нужно симулировать условия насыпания, как на производстве, для этого мне выдали старую экспериментальную установку и сказали “развлекаться”
Поэтому с такими глупыми вопросами и обращаюсь на форум

24 с копейками подаю на драйвер. Я уже думал про прерывания, но код весового датчика принимает 24 бита, если делать с прерываниями, то данные будут битые, а если запретить прерывания во время приема данных, ни о какой частоте вызова речи уже не будет

Надо

Посчитать время передачи неких данных,скоростя ШД, возможно применить step/dir драйвера.
А вот с этим:

Можно поспорить. Всё можно сделать,если с умом.

Тут как раз суть в том, что мне нужно не выдумать что-то новое, а просто повторить имеющееся
Такие же шаговики на производстве с плк нужные скорости развивают, смотрели с парнем, программировавшим плк там, какая у него там частота, нашли какую-то переменную скорости на 2000, но из-за того, что программу он писал давно и сейчас занят другим проектом, он не может сходу разобраться, в каких величинах и что с этими 2000 происходило дальше
2000ш/с, которые я воспроизвел на ардуино, он прокомментировал как “в несколько раз медленнее, чем там”, а 5000 “больше похоже на правду”, из чего я делаю вывод, что скорость действительно нужна выше хотя бы раза в полтора и она достижима