Solutions for the Stepper Motor experiments for LPC812 MAX
Dependencies: lpc812_exp_lib_PCF8591 mbed
Revision 0:9a590fe3a1a1, committed 2013-11-25
- Comitter:
- embeddedartists
- Date:
- Mon Nov 25 14:47:27 2013 +0000
- Commit message:
- First version
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lpc812_exp_lib_PCF8591.lib Mon Nov 25 14:47:27 2013 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/embeddedartists/code/lpc812_exp_lib_PCF8591/#a7d0ee55d5cd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Nov 25 14:47:27 2013 +0000 @@ -0,0 +1,299 @@ +#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 +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Nov 25 14:47:27 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f \ No newline at end of file