воскресенье, 11 октября 2015 г.

Шаговый двигатель и Arduino (часть 3)

Решил написать о полушаговом режиме управления шаговым двигателем. Да. Ещё один способ управления двигателем.


Приведенные ранее программы управления позволяют установить вал моего шагового двигателя в сорок восемь фиксированных точек.

360.0 / 7.5 = 48

Программы из предыдущих статей перемещали вал шагового двигателя по шагам. Однако существует способ уменьшения перемещения вала шагового двигателя в два раза. Иначе говоря, можно перемещать вал на половину шага.

7.5 / 2.0 = 3.75

При этом число фиксированных положений в которые можно установить вал двигателя увеличивается до девяносто шести.

360.0 / 3.75 = 96

Это позволяет позиционировать вал двигателя с большей точностью.

Программа

////////////////////////
//
// Arduino Uno
//
////////////////////////
//
// Sketch: Stepper Motor
//

#include <util/delay.h>

const unsigned char IN1 = 11; // Digital Pin 11
const unsigned char IN2 = 10; // Digital Pin 10
const unsigned char IN3 = 9; // Digital Pin 9
const unsigned char IN4 = 8; // Digital Pin 8

const unsigned char SW1 = 14; // Analog Pin 0
const unsigned char SW2 = 15; // Analog Pin 1

unsigned char step = 1;

void setup()
{
    pinMode(IN1, OUTPUT);
    pinMode(IN2, OUTPUT);
    pinMode(IN3, OUTPUT);
    pinMode(IN4, OUTPUT);
    
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, HIGH);

    pinMode(SW1, INPUT);
    pinMode(SW2, INPUT);
}

void loop()
{
    if ( digitalRead(SW1) == LOW ) step -= 1;
    if ( digitalRead(SW2) == LOW ) step += 1;

    if ( step == 0 ) step = 8;
    if ( step == 9 ) step = 1;

    if ( step == 1 )
    {
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, HIGH);
    }

    if ( step == 2 )
    {
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, HIGH);
    }

    if ( step == 3 )
    {
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, HIGH);
    }

    if ( step == 4 )
    {
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
    }

    if ( step == 5 )
    {
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
    }

    if ( step == 6 )
    {
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
    }

    if ( step == 7 )
    {
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
    }

    if ( step == 8 )
    {
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
    }

    _delay_ms(20);
}

//
// End
//
////////////////////////

Железо как в первой части. Подключается всё как описано во второй части.