Привод туда-сюда на шаговом двигателе.
- Войдите на сайт для отправки комментариев
Сб, 05/03/2016 - 13:19
Понадобилось вот. Просто туда-сюда, именно на шаговом. Поскольку программист из меня ...кх-хмм.
А сделать нужно и побыстрее, то на основании скетча "Панорамная головка на Ардуино", очень плохо понимая, что же я все таки делаю, методом тупого тыка вылепил сие... Но оно работает! Эх если бы у кого нашлось бы пяток минуток прокомментировать "творение", был бы безмерно рад! Допустимы любые цензурные выражения.
/* Для управления ШД в программе используется библиотека AccelStepper */ #include <AccelStepper.h> #define MOTOR1_DIR_PIN 8 //контакт DIR #define MOTOR1_STEP_PIN 9 // контакт STEP #define MOTOR1_LS_PIN 6 // контакт концевика #define UPRAV_PIN 3 // управление поворотом с основной платы #define ENABL_PIN 10 // контакт вкл. выкл драйвера #define MOTOR1_SPR 2048 // Кол-во шагов на 1 оборот вала двигателя #define MOTOR1_MAX_SPEED 600.0 #define MOTOR1_INIT_SPEED 150.0 AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN); int nMotor1SP; int nSpeedSP; int nMotor1MV; void setup() { phInit(); } void loop() { phGetCommand(); phMotorRun(); } // end loop void phInit() { pinMode(MOTOR1_DIR_PIN, OUTPUT); pinMode(MOTOR1_STEP_PIN, OUTPUT); pinMode(ENABL_PIN, OUTPUT); pinMode(MOTOR1_LS_PIN, INPUT_PULLUP); pinMode(UPRAV_PIN, INPUT_PULLUP); nMotor1MV = 0; stpMotor1.setMaxSpeed(MOTOR1_MAX_SPEED); stpMotor1.setAcceleration(10); stpMotor1.setSpeed(40); stpMotor1.setSpeed(MOTOR1_INIT_SPEED); while (digitalRead(MOTOR1_LS_PIN) != 0) { stpMotor1.runSpeed(); } delay(500); stpMotor1.setCurrentPosition(0); stpMotor1.setSpeed(-MOTOR1_INIT_SPEED); while (abs(stpMotor1.currentPosition()) < 200) //обратный ход после стопа { stpMotor1.runSpeed(); } stpMotor1.setCurrentPosition(0); stpMotor1.setSpeed(0); return; } // end phInit void phGetCommand() { nMotor1SP = 1023; nSpeedSP = 500; if (nMotor1SP > 100) { nMotor1MV = nSpeedSP; } else if (nMotor1SP < -100) { nMotor1MV = -nSpeedSP; } else { nMotor1MV = 0; } nMotor1MV = nMotor1MV / 5; } void phMotorRun() { //stpMotor1.setSpeed(nMotor1MV); digitalWrite(ENABL_PIN, LOW); // драйвер вкл. if (digitalRead(UPRAV_PIN) == 0) { // если поворот ноль стоим на месте stpMotor1.runToNewPosition(0); digitalWrite(ENABL_PIN, HIGH); } else if (digitalRead(UPRAV_PIN) != 0) { //Идем в поворот digitalWrite(ENABL_PIN, LOW); stpMotor1.runToNewPosition(-2500); // шагов на поворот лотков digitalWrite(ENABL_PIN, HIGH); // драйвер выкл чтоб не греть обмотки двига } }