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:
Sun Jun 15 20:57:59 2014 +0000
Revision:
4:09c35ecb3218
Parent:
3:08c16b8a78bf
Child:
5:63fe92075b71
running with stepcmd structure

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;
emilmont 1:85e3058aad0f 23
tuxic 4:09c35ecb3218 24 void read_thread (void const *args)
tuxic 4:09c35ecb3218 25 {
emilmont 1:85e3058aad0f 26 while (true) {
tuxic 3:08c16b8a78bf 27 osEvent evt = osMessageGet(queue, 0);
tuxic 3:08c16b8a78bf 28 if (evt.status == osEventMessage) {
tuxic 3:08c16b8a78bf 29 stepcmd *cmd = (stepcmd*)evt.value.p;
tuxic 3:08c16b8a78bf 30 DirLED = cmd->dir;
tuxic 3:08c16b8a78bf 31 StepLED = 1;
tuxic 3:08c16b8a78bf 32 osDelay(100);
tuxic 3:08c16b8a78bf 33 StepLED = 0;
tuxic 3:08c16b8a78bf 34 osPoolFree(cmdpool, cmd);
tuxic 4:09c35ecb3218 35 qcnt--;
tuxic 3:08c16b8a78bf 36 } else { // assume no info available
tuxic 3:08c16b8a78bf 37 osDelay(100);
tuxic 3:08c16b8a78bf 38 }
tuxic 4:09c35ecb3218 39 osDelay(2000);
emilmont 1:85e3058aad0f 40 }
emilmont 1:85e3058aad0f 41 }
emilmont 1:85e3058aad0f 42
tuxic 3:08c16b8a78bf 43 osThreadDef(read_thread, osPriorityNormal, DEFAULT_STACK_SIZE);
emilmont 1:85e3058aad0f 44
tuxic 4:09c35ecb3218 45 int main (void)
tuxic 4:09c35ecb3218 46 {
tuxic 3:08c16b8a78bf 47 cmdpool = osPoolCreate(osPool(cmdpool));
emilmont 1:85e3058aad0f 48 queue = osMessageCreate(osMessageQ(queue), NULL);
tuxic 4:09c35ecb3218 49
tuxic 3:08c16b8a78bf 50 osThreadCreate(osThread(read_thread), NULL);
tuxic 3:08c16b8a78bf 51 bool mydir = true;
tuxic 4:09c35ecb3218 52
emilmont 1:85e3058aad0f 53 while (true) {
tuxic 3:08c16b8a78bf 54 const float startspeed = 0.05; // speed in m/s
tuxic 3:08c16b8a78bf 55 const float maxspeed = 2; // speed in m/s
tuxic 3:08c16b8a78bf 56 const float accel = 2; // accelleration in m/s^2
tuxic 3:08c16b8a78bf 57 const float distance = 1.26; // maximum distance on the rod in m
tuxic 3:08c16b8a78bf 58 const int steps = 36000; // steps per meter
tuxic 4:09c35ecb3218 59 if (qcnt < 15) {
tuxic 4:09c35ecb3218 60 stepcmd *cmd = (stepcmd*)osPoolAlloc(cmdpool);
tuxic 4:09c35ecb3218 61 cmd -> minspeed = int(startspeed * steps);
tuxic 4:09c35ecb3218 62 cmd -> maxspeed = int(maxspeed * steps);
tuxic 4:09c35ecb3218 63 cmd -> accel = int(accel * steps);
tuxic 4:09c35ecb3218 64 cmd -> steps = int(distance * steps);
tuxic 4:09c35ecb3218 65 cmd -> speed = cmd -> minspeed;
tuxic 4:09c35ecb3218 66 cmd -> dir = mydir;
tuxic 4:09c35ecb3218 67 mydir = !mydir;
tuxic 4:09c35ecb3218 68
tuxic 4:09c35ecb3218 69 osStatus res = osMessagePut(queue, (uint32_t)cmd, 0);
tuxic 4:09c35ecb3218 70 while (res != osOK) {
tuxic 4:09c35ecb3218 71 osDelay(500);
tuxic 4:09c35ecb3218 72 res = osMessagePut(queue, (uint32_t)cmd, 0);
tuxic 4:09c35ecb3218 73 }
tuxic 4:09c35ecb3218 74 printf("Storage succeeded %d\n\r", ++qcnt);
tuxic 4:09c35ecb3218 75 } else {
tuxic 4:09c35ecb3218 76 printf("Storage full\n\r");
emilmont 1:85e3058aad0f 77 }
tuxic 3:08c16b8a78bf 78 osDelay(1000);
tuxic 3:08c16b8a78bf 79 CmdLED = ! CmdLED;
emilmont 1:85e3058aad0f 80 }
emilmont 1:85e3058aad0f 81 }