Подскажите пожалуйста, как быть. Есть 2 кода, оба на обработку движения ШД 28byj-48. Не могу найти разницу почему в одном коде крутящий момент высокий, в другом низкий, хотя принцип работы одинаковый. 1ый код, который с высоким крутящим моментом: Код (C++): #include <Stepper.h> #define STEPS 2048 Stepper motor1(STEPS, 2, 3, 4, 5); Stepper motor2(STEPS, 14, 15, 16, 17); void stop_motor1() { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); } void stop_motor2() { digitalWrite(14, LOW); digitalWrite(15, LOW); digitalWrite(16, LOW); digitalWrite(17, LOW); } void setup() { motor1.setSpeed(10); motor2.setSpeed(10); } void loop() { int i = 0; while (i != 500) { motor1.step(10); motor2.step(10); delay(40); i+=10; } stop_motor1(); stop_motor2(); while (i != 0) { motor1.step(-10); motor2.step(-10); delay(40); i-=10; } stop_motor1(); stop_motor2(); } второй код, у которого вал двигателя проскакивает при небольшом усилии: Код (C++): #include <Stepper.h> #include <VirtualWire.h> #define STEPS 2048 Stepper motor1(STEPS, 2, 3, 4, 5); Stepper motor2(STEPS, 14, 15, 16, 17); int step1=0,step2=0; int open1=0, open2=0, close1=0, close2=0; void stop_m1() { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); } void stop_m2() { digitalWrite(14, LOW); digitalWrite(15, LOW); digitalWrite(16, LOW); digitalWrite(17, LOW); } void setup() { motor1.setSpeed(10); motor2.setSpeed(10); Serial.begin(9600); vw_set_ptt_inverted(true); // Required for DR3100 vw_set_rx_pin(19); vw_setup(4000); // Bits per sec vw_rx_start(); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; vw_get_message(buf, &buflen); if(buf[0] == 49) { if(step1 < 500) { while(buf[0] == 49) { step1+=10; motor1.step(10); buf[0] = 0; vw_get_message(buf, &buflen); } } } if(buf[0] == 55) { if(step2 < 500) { while(buf[0] == 55) { step2+=10; motor2.step(10); buf[0] = 0; vw_get_message(buf, &buflen); } } } stop_m1(); stop_m2(); //если сработала на закрытие if(buf[0] == 51) { if(step1 > 0) { while(buf[0] == 51) { step1-=10; motor1.step(-10); buf[0] = 0; vw_get_message(buf, &buflen); } } } if(buf[0] == 57) { if(step2 > 0) { while(buf[0] == 57) { step2-=10; motor2.step(-10); buf[0] = 0; vw_get_message(buf, &buflen); } } } buf[0] = 0; stop_m1(); stop_m2(); } По сути, разница только что в том, что сигнал ШД дается от радиоприемника. Все остальное так же - количество шагов, размер шага, скорость. Но вот только при работе с радиоприемником вал проворачивается при упоре, а вот если без радиоприемника - то работает прекрасно. Однако, если убрать функцию stop_m1 и stop_m2 то двигатели в состоянии покоя будут нереально сильно греться. Но, если оставить эту функцию, то именно с радиоприемник пропадает крутящий момент, но зато двигатели не греются) В чем различие в коде? Почему в первом примере у двигателей и момент крутящий высокий и не греются, а во втором примере крутящий момент слабый при работе той же функции.
Возможно с приемником питания не хватает ! они питаются от 3 до 12 вольт причем чем больше даешь - тем дальше бьет - мультиметр в руки и померить сколько приходит к шаговаму в первом и втором случае - в любом случае - если все ок , тогда копайте программно ! отпишитесь , если попал!) интересно , программно судя по тому что без функции stop_m у вас хватает более того еще и греется- просто убавить время stop_m при условии что , когда вы пробовали радио не отключали !)
с питанием все в порядке - 5В копать программно куда?) я и спросил с этой целью, чтоб узнать что да как)) для функции stop_m не установлено время, она просто отключает питание в обмотках, чтоб не перегревался ШД.
вы не поняли ответа,вам правильно подсказал AlexU , delay(); обеспечивает задержку в программе дав тем самым повернуться ШД, все же контроллер работает немного быстрей чем делает шаг двигатель
Да, ошибся. Это так, если задержка обеспечивается при каждом шаге. А в данном случае после нескольких шагов -- поэтому задержка не при чём. Второе предположение: библиотека VirtualWire, что-то шаманит с таймерами (что именно -- смотрите сами). Это шаманство может привести к тому, что на некоторых выводах, к которым подключен двигатель, будет формироваться сигнал ШИМ (на тех выводах, что ШИМ поддерживают). Что может стать причиной уменьшения крутящего момента при использовании этой библиотеки (второй вариант программы). Второй двигатель подключен к выводам 14, 15, 16, 17 -- у него так же крутящий момент снижается?
Господа, проблема в том, что во время вращения двигателя Код (C++): vw_get_message(buf, &buflen); if(buf[0] == 49) { if(step1 < 500) { while(buf[0] == 49) { step1+=10; motor1.step(10); buf[0] = 0; vw_get_message(buf, &buflen); } } } код выходит за пределы блока и сразу же нарывается на функцию stop_m. Таким образом, он делает пару оборотов, отключает питание на катушках (stop_m) и затем пытается заново провернуться. На повернуться ему хватает, а вот крутящего момента уже недостаточно. Для правильной работы необходимо сделать так, чтоб он обращался к функции stop_m Только во время простоя. Тоесть не получает сигнал на вращение 1-2сек. - выполнение функции stop_m. Такие дела. Напишу код, отпишусь после тестов.