Добрый день! Пытаюсь настроить шаговый двигатель, чтобы за 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;
}
}
Аксельстеппер при пустом лупе гонит до 3500PPS.
Около 10000PPS у большинства любительских конфигураций со степпером начинаются проблемы физического плана.
В коде не вижу логики.
Tick() вызывается в проверке каждого условия, ещё и Println до кучи.
12000 шагов/с это 83 мкс на один шаг. Печать в терминал в несколько раз дольше.
Тик вызываю даже в условиях, чтобы проверка условий не так сильно оттягивала время до следующего тика
Сериал нужен был для отладки части с весами, сейчас попробовал оптимизировать и выжать максимум, оставил пустой луп, больше 5000 не получается все равно
Но соглашусь, код далеко не самый лучший, первый опыт работы с шаговиками, еще и необходимо совместить его с АЦП, поэтому могу чего-то не понимать
Хочу попробовать вместо библиотечных функций, на STEP подавать шим сигнал, ближайшие частоты, с которыми его можно получить на ардуино, 15 и 8 кГц, может получится
Ну у любого шаговика есть ограничение по мощности при котором он перестаёт вращаться. Вы дали ток в фазу на 10 мс и шаг есть, а при 2 мс уже нет к примеру… Поднимите напряжение питания и посмотрите.
Да,невозможно судить о проблеме. Может банально не хватает тока из-за низкого напряжения. Надо глянуть сколько тактов занимает сам tick(), дабы понимать теоритический предел частоты. Я бы эту функцию вызывал прерыванием с наивысшим приоритетом. Там крайне важно именно постоянство частоты вызова.
Напряжение какое на драйвере?
Чудес не бывает.
Шаговик не предназначен для работы на высоких скоростях.
Если у Вас получилось, что
То, вероятнее всего, Вы где-то серьезно ошиблись при проектировании устройства.
В принципе, если Вам удалось заставить работать шаговик на 2000 шагах,сек, а нужно немного больше, то можно попытаться запустить двигатель с ускорением. Т.е. начать с тех же 1800-2000, а потом постепенно по шагам (имеется в виду не шаг двигателя, а шаг в приращении его скорости) поднимать. Скажем, с дискретностью по 50. На каждый шаг подъема скорости, естественно, должно приходиться несколько шагов двигателя. Скажем, установили 2000, подождали 10 шагов (5 мс), установили 2050, еще через 5 мс - 2100 и т.д. Возможно, таким образом удастся догнать до 3000.
Еще лучше - делать небольшие приращения на каждом шаге.
Тут скорость достаточно большая, по звуку слышно. Только с разгоном и торможением. Управление через регистры масками.
Спецальный покрасочный манипулятор.
Делал мешалку на шаговике и тоже упёрся в максимальные обороты. Делал через гайверовскую библу, потом перешёл на ШИМ - не помогло. В итоге после штудирования инета выяснилось, что и тип драйвера и сам двигатель ограничивают максимальные обороты(как ни странно ) Quod licet NEMA23, non licet NEMA17
Я так понимаю с места в карьер?
Попробуйте пробежать какое-то расстояние с максимальной скоростью. Вы ее сразу разовьете? И остановитесь “как вкопанный”?
Также и с ШД (собственно и любым другим двигателем). Собственно тут это уже писалось.
Не мучайте народ, возьмите сервопривод (не тот что для моделек, а настоящий, ватт на 100). Только смотрите чтобы скоростной был. Их драйвера вроде умеют сами разгонять, есть даже такие что задать сколько оборотов надо сделать за какое время, а они уже сами режим подберут разгона/остановки.
Совет хороший и я бы, безусловно, так и сделал, если бы на это было время и цель - запустить проект на шаговиках
Но в моих реалиях, времени на это не так много, готовые шаговики уже шагают на производстве с плк укладываясь в рамки 100 грамм за 3 секунды, моя же задача перепроектировать весовой модуль, для калибровки коэффициентов фильтра нужно симулировать условия насыпания, как на производстве, для этого мне выдали старую экспериментальную установку и сказали “развлекаться”
Поэтому с такими глупыми вопросами и обращаюсь на форум
24 с копейками подаю на драйвер. Я уже думал про прерывания, но код весового датчика принимает 24 бита, если делать с прерываниями, то данные будут битые, а если запретить прерывания во время приема данных, ни о какой частоте вызова речи уже не будет
Тут как раз суть в том, что мне нужно не выдумать что-то новое, а просто повторить имеющееся
Такие же шаговики на производстве с плк нужные скорости развивают, смотрели с парнем, программировавшим плк там, какая у него там частота, нашли какую-то переменную скорости на 2000, но из-за того, что программу он писал давно и сейчас занят другим проектом, он не может сходу разобраться, в каких величинах и что с этими 2000 происходило дальше
2000ш/с, которые я воспроизвел на ардуино, он прокомментировал как “в несколько раз медленнее, чем там”, а 5000 “больше похоже на правду”, из чего я делаю вывод, что скорость действительно нужна выше хотя бы раза в полтора и она достижима