кто может подсказать,как увеличить скорость шаговых двигателей,когда они используются в связке с датчиком расстояния.когда запускаю двигатель без датчиков,джостиков,то скорость одна,когда в программу к шаговому двигателю добавляю датчик расстояния,то скорость шагового двигателя становится меньше.спасибо
Элементарно, Ватсон!
Нужно устранить причину, по которой скорость становится меньше.
Мало вводных.
Но предположу , что датчик слишком медленный.
А я предположу, что при правильно написанной программе скорость датчика не играет никакой роли.
ну я так предпологаю,что много времени МК уходит на алгоритмы датчика.только как с этим бороться?
Полагаю, что там дилэи напиханы для чтения ультрасоника.
когда подключаю шаговый двигатель чисто в стандартном примере из библиотеки GyverStepper, то работает как надо ,скорость увеличивается и уменьшается в зависимости от того,какую задашь.но когда добавляю датчик расстояния (шаговик должен крутиться в одну либо другую сторону в зависимости от данных с датчика) она сразу становится меньше.
Значит, либо библиотека кривая (по поводу библиотеки - к Гайверу, у него свой форум есть), либо неправильно добавляете.
в ультразвуковом датчике еще более менее скорость,но все равно меньше чем,без него.а когда подключаешь инфракрасный датчки расстояния,скорость становится еще меньше, чем на ультразвуковом.эти делей можно как-то обойти?
@Geka777 , чем Вы двигатель крутите?
Правильно - таймером. Подозреваю, что у Вас как-то иначе.
Без осмотра нормальный врач рецепт не выписывает.
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(2048, 5, 6, 7);//step,dir,en
unsigned int dist_sm;
unsigned int condist_sm;
unsigned int puls;
void setup() {
Serial.begin(9600);
stepper.setRunMode(KEEP_SPEED);
stepper.setSpeed(1000);
pinMode(9,OUTPUT);
pinMode(8,INPUT);
digitalWrite(9 ,HIGH);
delayMicroseconds(10);
digitalWrite(9,LOW);
puls = pulseIn(8,HIGH);
condist_sm = puls/58;
}
void loop() {
puls = 0;
digitalWrite(9 ,HIGH);
delayMicroseconds(10);
digitalWrite(9,LOW);
puls = pulseIn(8,HIGH);
dist_sm = puls/58;
if(dist_sm > condist_sm+2){
stepper.reverse(0);
stepper.tick();
} else if(dist_sm < condist_sm -2){
stepper.reverse(1);
stepper.tick();
}
}
pulseIn() и тормозит.
так это можно как-то поправить или нет?
Что значит “может”?
Именно оно не только может, но и влияет.
А поправить - переписать с нуля на другом принципе, я уже писал об этом.
В принципе - можно поправить. Справитесь ли - вот в чем вопрос. Заколхозить можно на библиотеке TimerOne, заставив её тикать степпером.
У нас уже ночь, я откланиваюсь.
понял ,спасибо
По моему, вам надо оптимизировать алгоритм.
Сейчас у вас двигатель делает один шаг после одного измерения расстояния. Вам действительно надо замерять расстояние по 300 раз в секунду (цифра примерная т.к. не знаю какое у вас расстояние.) Возможно лучше измерять расстояние например 10 раз в секунду (но не с задержками delay,) и задавать мотору количество шагов которое он должен отработать, чтобы исправить ошибку.
В датчике расстояния в библиотеке применен Deley
Для того чтобы он не тормозил работу шагового двигателя нужно сделать работу в “многопоточном режиме” которого у ардуино нет. Однако Deley можно обойти через цикл void yield()
То есть :
void () {
(код датчика расстояния)
}
void yield(){
(код шагового двигателя)
}
А мужики-то и не знали ))