nema 17
- Войдите на сайт для отправки комментариев
Пт, 08/04/2016 - 09:36
Добрый день
В принципи крутить все получается. Использую а4988. Вопрос возникает в следующем. Как его максимально плавно крутить на ооочень малой скорости. Ну к примеру 1 оборот за 3-5 минут. Важно чтоб скачков резких небыло. Толкните в нужном направлении плиз.
//simple A4988 connection //jumper reset and sleep together //connect VDD to Arduino 3.3v or 5v //connect GND to Arduino GND (GND near VDD) //connect 1A and 1B to stepper coil 1 //connect 2A and 2B to stepper coil 2 //connect VMOT to power source (9v battery + term) //connect GRD to power source (9v battery - term) int stp = 8; //connect pin 13 to step int dir = 10; // connect pin 12 to dir int a = 0; // gen counter byte spd=25; byte spd1=889; void setup() { Serial.begin(9600); pinMode(stp, OUTPUT); pinMode(dir, OUTPUT); } void loop() { a++; digitalWrite(dir, HIGH); digitalWrite(stp, HIGH); digitalWrite(stp, LOW); delay(spd); delayMicroseconds(spd1); Serial.println(a); if (a>25600) {delay(111111111111);} }В таком варианте вроде едет плавно, но все равно периодически идут рывки. напрямую связаны с тонкими свистящими звуками. MS3 +5, MS2 gnd, MS1 gnd (подтягивание последних двух к земле видимого результата не дало)
Скачек наблюдиает каждые примерно 120 шажков.
при подключении только МС3 на + получается 25600 микрошагов на оборот. скачек происходит каждые примерно 128 шагов, т.е. я вплотную приблизился к тому что написано про мотор. 200 шагов 1.8 град. это проблема в моторе?
Покурил пару дней свою темку и выкладываю решение.. Очень надеюсь что кому то оно пригодится!
Решено было отказаться от a4988 и его аналога drv8825. Пытаясь заряжать синусоиду и косинусоиду в L298N столкнулся с проблемой что в пиковых точках 0, 90, 180, 270 градусов движение мотора чуть-чуть замедлялось. Анализируя показания мультиметрта пришел к мысли что подаваемый ШИМ и реально значение на катушках сильно отличаются.. ЭДС? :)
Требовался контроллер тока. Итак: L6506 + L298N
Схема подключения такая:
Отпаяны лапы 1 и 15 у L298N и на них билы подключены 10ая и 15ая нога с 6506. Rsense поставлено 4Ома по 1Вт каждый. Лапа 8 у 298ой была посажена на землю.
На 16ую и 17ую лапу 6506 было подано аналоговое напряжение примерно 2.5В. Реализовано по rc-цепочке. Схема:
Тут было расчитано необходимое сопротивление и емкость кондера из расчета что ШИМ у ардуины 500Гц.:
http://tel-spb.ru/rc.html
В результате получил нереально плавное перемещение мотора на ультанизких сткоростях. 1 оборот за несколько минут. Никаких намеков на шаги и прочее.
Единственный недостаток - высокое пищание. Есть пару мыслей как его побороть, но пока в процессе.
Любые советы по улучшению и оптимизации, а так же критику с удовольствием выслушаю.
Скетч пока такой. Допиливается..
const int motorPin1 = 2; const int motorPin2 = 3; const int motorPin3 = 4; const int motorPin4 = 5; int d1, d2; float Rad = .01745; float xx = .1; int w = 55; // мощность ШИМ от 0 до 255; int motorDelayML = 50; // millis() int motorDelayMS = 0; // micro int x; void setup() { pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); } void loop() { if ( x >= 0 && x < 90 ) { digitalWrite( motorPin1, LOW ); digitalWrite( motorPin2, HIGH ); digitalWrite( motorPin3, HIGH ); digitalWrite( motorPin4, LOW ); } if ( x >= 90 && x < 180 ) { digitalWrite( motorPin1, HIGH ); digitalWrite( motorPin2, LOW ); digitalWrite( motorPin3, HIGH ); digitalWrite( motorPin4, LOW ); } if ( x >= 180 && x < 270) { digitalWrite( motorPin1, HIGH ); digitalWrite( motorPin2, LOW ); digitalWrite( motorPin3, LOW ); digitalWrite( motorPin4, HIGH ); } if ( x >= 270 && x < 360) { digitalWrite( motorPin1, LOW ); digitalWrite( motorPin2, HIGH ); digitalWrite( motorPin3, LOW ); digitalWrite( motorPin4, HIGH ); } x = x + 1 ; if (x > 360) { x = 0; } d1 = w*cos(x*Rad) + xx; if (d1 < 0) { d1 = -d1;} d2 = w*sin(x*Rad) + xx; if (d2 < 0) { d2 = -d2;} // if (x > 355 && x < 360 || x > 0 && x < 5 || x > 175 && x < 185) {d1 = d1 + 1;} // if (x > 85 && x < 95 || x > 265 && x < 275) {d2 = d2 + 1;} analogWrite(10, d1); analogWrite(11, d2); delay(motorDelayML); delayMicroseconds(motorDelayMS); Serial.print(" x = ");Serial.print(x); Serial.print(" d1 = ");Serial.print(d1); Serial.print(" d2 = ");Serial.println(d2); }Борьба со звуком продолжается. На чоппере когда потенциометром пытаюсь загнать звук в ультразвук получается двигатель начинает шагать.. я так понимаю, что не хватает тока в обмотках на промежуточных (между полными шагами) этапах..
Прошу помощи. Нужен контроллер у которого ШИМ будет иметь частоту примерно 20KHz. А еще лучше контроллер с аналоговыми выходами (2 выхода) .Подскажите есть ли такие среди ардуинок? :)
Лучше уж тогда нормальные контроллеры, типа planetCNC и его семейства MK*, имхо. Ну и драйверы шаговых соответствующие. Но - всё это стоит денег, порой достаточно хороших.