Solutions for the Stepper Motor experiments for LPC812 MAX

Dependencies:   lpc812_exp_lib_PCF8591 mbed

main.cpp

Committer:
embeddedartists
Date:
2013-11-25
Revision:
0:9a590fe3a1a1

File content as of revision 0:9a590fe3a1a1:

#include "mbed.h"
#include "PCF8591.h"

DigitalOut ph1(D10);
DigitalOut ph2(D11);
DigitalOut ph3(D12);
DigitalOut ph4(D13);

PCF8591 adc;

Serial pc(USBTX, USBRX);

static void experiment1()
{
    // Delay between steps
    float number = 0.5;

    // Initialize outputs
    ph1=1;
    ph2=1;
    ph3=1;
    ph4=1;
    pc.printf("\nStarting program...\n");

    while(1) {
        ph1 = 1;
        ph2 = 0;
        ph3 = 1;
        ph4 = 0;
        wait(number);
        ph1 = 1;
        ph2 = 0;
        ph3 = 0;
        ph4 = 1;
        wait(number);
        ph1 = 0;
        ph2 = 1;
        ph3 = 0;
        ph4 = 1;
        wait(number);
        ph1 = 0;
        ph2 = 1;
        ph3 = 1;
        ph4 = 0;
        wait(number);
    }
}

static void experiment2_alt1()
{
    // Delay between steps
    float number = 0.5;

    // Initialize outputs
    ph1=1;
    ph2=1;
    ph3=1;
    ph4=1;
    pc.printf("\nStarting program...\n");

    while(1) {
        //read trimming potentiometer and convert to value in the 0-0.5 range
        number = adc.read(PCF8591::A0);
        number = number/512; //
        pc.printf("%f\n", number);

        ph1 = 1;
        ph2 = 0;
        ph3 = 1;
        ph4 = 0;
        wait(number);
        ph1 = 1;
        ph2 = 0;
        ph3 = 0;
        ph4 = 1;
        wait(number);
        ph1 = 0;
        ph2 = 1;
        ph3 = 0;
        ph4 = 1;
        wait(number);
        ph1 = 0;
        ph2 = 1;
        ph3 = 1;
        ph4 = 0;
        wait(number);
    }
}

#define ALPHA 0.6
float getDelayAndDirection()
{
    static float lastValue = 0;

    // read a value
    int v = adc.read(PCF8591::A0);

    // convert from 0..255 to -0.5..0.5
    float f = v - 128;
    f = f/256;

    // apply filter
    lastValue = (ALPHA * lastValue) + (1-ALPHA) * f;

    return f;
}

static void experiment2_alt2()
{
    // Delay between steps
    float delay = 0.5;

    // Direction
    bool clockwise = true;

    // Initialize outputs
    ph1=1;
    ph2=1;
    ph3=1;
    ph4=1;
    pc.printf("\nStarting program...\n");

    while(1) {
        delay = getDelayAndDirection();
        pc.printf("%f\n", delay);

        // determine direction and make sure speed is lowest around 0
        clockwise = (delay < 0);
        delay = 0.5 - abs(delay);

        if (clockwise) {
            ph1 = 1;
            ph2 = 0;
            ph3 = 1;
            ph4 = 0;
            wait(delay);
            ph1 = 1;
            ph2 = 0;
            ph3 = 0;
            ph4 = 1;
            wait(delay);
            ph1 = 0;
            ph2 = 1;
            ph3 = 0;
            ph4 = 1;
            wait(delay);
            ph1 = 0;
            ph2 = 1;
            ph3 = 1;
            ph4 = 0;
            wait(delay);
        } else {
            ph1 = 0;
            ph2 = 1;
            ph3 = 1;
            ph4 = 0;
            wait(delay);
            ph1 = 0;
            ph2 = 1;
            ph3 = 0;
            ph4 = 1;
            wait(delay);
            ph1 = 1;
            ph2 = 0;
            ph3 = 0;
            ph4 = 1;
            wait(delay);
            ph1 = 1;
            ph2 = 0;
            ph3 = 1;
            ph4 = 0;
            wait(delay);
        }
    }
}

int getTargetStep(bool filter)
{
    static int lastValue = -1;

    // read a value
    int v = adc.read(PCF8591::A0);

    if (lastValue == -1) {
        lastValue = v;
    }

    // apply filter
    if (filter) {
        lastValue = ((3*lastValue) + v) >> 2;
    } else {
        lastValue = v;
    }

    // convert from 0..255 to 0..19
    return lastValue/13;
}

static void experiment3()
{
    // Delay between steps
    float delay = 0.05;

    // Current step
    int current = 0;

    // Initialize outputs
    ph1=1;
    ph2=1;
    ph3=1;
    ph4=1;
    pc.printf("\nStarting program...\n");
    

    while(1) {
        int target = getTargetStep(true);

        if (target == current) {
            wait(0.02);
            continue;
        }
        //pc.printf("%d -> %d\n", current, target);

        int clockwise = (target + 20 - current) % 20;
        int anticlockwise = (current + 20 - target) % 20;
        if (clockwise < anticlockwise) {
            for (int i = 0; i < clockwise; i++) {
                switch (current%4) {
                    case 0:
                        ph1 = 0;
                        ph2 = 1;
                        ph3 = 1;
                        ph4 = 0;
                        break;
                    case 1:
                        ph1 = 0;
                        ph2 = 1;
                        ph3 = 0;
                        ph4 = 1;
                        break;
                    case 2:
                        ph1 = 1;
                        ph2 = 0;
                        ph3 = 0;
                        ph4 = 1;
                        break;
                    case 3:
                        ph1 = 1;
                        ph2 = 0;
                        ph3 = 1;
                        ph4 = 0;
                        break;
                }
                wait(delay);
                current++;
            }
        } else {
            for (int i = 0; i < anticlockwise; i++) {
                switch (current%4) {
                    case 0:
                        ph1 = 0;
                        ph2 = 1;
                        ph3 = 1;
                        ph4 = 0;
                        break;
                    case 1:
                        ph1 = 0;
                        ph2 = 1;
                        ph3 = 0;
                        ph4 = 1;
                        break;
                    case 2:
                        ph1 = 1;
                        ph2 = 0;
                        ph3 = 0;
                        ph4 = 1;
                        break;
                    case 3:
                        ph1 = 1;
                        ph2 = 0;
                        ph3 = 1;
                        ph4 = 0;
                        break;
                }
                wait(delay);
                current+=19;
            }
        }
        current = current % 20;
    }
}

int main()
{
    //experiment1();  // Fixed delay
    //experiment2_alt1(); // Trimming pot controls delay
    experiment2_alt2(); // Trimming pot controls delay and direction
    //experiment3(); // Absolute positioning
}