Simple program to test a steppermotor. Min/maxspeed, accelleration, distance and steps/m can be changed while the program is running for quick adjustment.

Dependencies:   mbed-rtos mbed

Fork of cmsis_rtos_queue by mbed official

Committer:
tuxic
Date:
Mon Jun 16 05:25:02 2014 +0000
Revision:
5:63fe92075b71
Parent:
4:09c35ecb3218
Child:
6:cfbef7079a6f
running with isr instead of threaded

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:85e3058aad0f 1 #include "mbed.h"
emilmont 1:85e3058aad0f 2 #include "cmsis_os.h"
emilmont 1:85e3058aad0f 3
tuxic 3:08c16b8a78bf 4 DigitalOut StepLED(LED1);
tuxic 3:08c16b8a78bf 5 DigitalOut CmdLED(LED2);
tuxic 3:08c16b8a78bf 6 DigitalOut DirLED(LED3);
tuxic 3:08c16b8a78bf 7
emilmont 1:85e3058aad0f 8 typedef struct {
tuxic 3:08c16b8a78bf 9 int steps; // number of steps to take
tuxic 3:08c16b8a78bf 10 int speed; // speed in steps/sec
tuxic 3:08c16b8a78bf 11 int accel; // accelleration in steps/sec^2
tuxic 3:08c16b8a78bf 12 int maxspeed; // maximum speed in steps/sec
tuxic 3:08c16b8a78bf 13 int minspeed; // minimum speed in steps/sec
tuxic 3:08c16b8a78bf 14 bool dir; // direction
tuxic 3:08c16b8a78bf 15 } stepcmd;
emilmont 1:85e3058aad0f 16
tuxic 3:08c16b8a78bf 17 osPoolDef(cmdpool, 16, stepcmd);
tuxic 3:08c16b8a78bf 18 osPoolId cmdpool;
emilmont 1:85e3058aad0f 19
tuxic 3:08c16b8a78bf 20 osMessageQDef(queue, 16, stepcmd);
emilmont 1:85e3058aad0f 21 osMessageQId queue;
tuxic 4:09c35ecb3218 22 int qcnt = 0;
tuxic 5:63fe92075b71 23 Timeout timer;
emilmont 1:85e3058aad0f 24
tuxic 5:63fe92075b71 25 void read_isr()
tuxic 4:09c35ecb3218 26 {
tuxic 5:63fe92075b71 27 StepLED = !StepLED;
tuxic 3:08c16b8a78bf 28 osEvent evt = osMessageGet(queue, 0);
tuxic 3:08c16b8a78bf 29 if (evt.status == osEventMessage) {
tuxic 3:08c16b8a78bf 30 stepcmd *cmd = (stepcmd*)evt.value.p;
tuxic 3:08c16b8a78bf 31 DirLED = cmd->dir;
tuxic 3:08c16b8a78bf 32 osPoolFree(cmdpool, cmd);
tuxic 4:09c35ecb3218 33 qcnt--;
tuxic 5:63fe92075b71 34 }
tuxic 5:63fe92075b71 35 timer.attach(read_isr, 2);
emilmont 1:85e3058aad0f 36 }
emilmont 1:85e3058aad0f 37
tuxic 4:09c35ecb3218 38 int main (void)
tuxic 4:09c35ecb3218 39 {
tuxic 3:08c16b8a78bf 40 cmdpool = osPoolCreate(osPool(cmdpool));
emilmont 1:85e3058aad0f 41 queue = osMessageCreate(osMessageQ(queue), NULL);
tuxic 4:09c35ecb3218 42
tuxic 5:63fe92075b71 43 timer.attach(read_isr, 2);
tuxic 3:08c16b8a78bf 44 bool mydir = true;
tuxic 4:09c35ecb3218 45
emilmont 1:85e3058aad0f 46 while (true) {
tuxic 3:08c16b8a78bf 47 const float startspeed = 0.05; // speed in m/s
tuxic 3:08c16b8a78bf 48 const float maxspeed = 2; // speed in m/s
tuxic 3:08c16b8a78bf 49 const float accel = 2; // accelleration in m/s^2
tuxic 3:08c16b8a78bf 50 const float distance = 1.26; // maximum distance on the rod in m
tuxic 3:08c16b8a78bf 51 const int steps = 36000; // steps per meter
tuxic 4:09c35ecb3218 52 if (qcnt < 15) {
tuxic 4:09c35ecb3218 53 stepcmd *cmd = (stepcmd*)osPoolAlloc(cmdpool);
tuxic 4:09c35ecb3218 54 cmd -> minspeed = int(startspeed * steps);
tuxic 4:09c35ecb3218 55 cmd -> maxspeed = int(maxspeed * steps);
tuxic 4:09c35ecb3218 56 cmd -> accel = int(accel * steps);
tuxic 4:09c35ecb3218 57 cmd -> steps = int(distance * steps);
tuxic 4:09c35ecb3218 58 cmd -> speed = cmd -> minspeed;
tuxic 4:09c35ecb3218 59 cmd -> dir = mydir;
tuxic 4:09c35ecb3218 60 mydir = !mydir;
tuxic 4:09c35ecb3218 61
tuxic 4:09c35ecb3218 62 osStatus res = osMessagePut(queue, (uint32_t)cmd, 0);
tuxic 4:09c35ecb3218 63 while (res != osOK) {
tuxic 4:09c35ecb3218 64 osDelay(500);
tuxic 4:09c35ecb3218 65 res = osMessagePut(queue, (uint32_t)cmd, 0);
tuxic 4:09c35ecb3218 66 }
tuxic 4:09c35ecb3218 67 printf("Storage succeeded %d\n\r", ++qcnt);
tuxic 4:09c35ecb3218 68 } else {
tuxic 4:09c35ecb3218 69 printf("Storage full\n\r");
emilmont 1:85e3058aad0f 70 }
tuxic 3:08c16b8a78bf 71 osDelay(1000);
tuxic 3:08c16b8a78bf 72 CmdLED = ! CmdLED;
emilmont 1:85e3058aad0f 73 }
emilmont 1:85e3058aad0f 74 }