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 10:34:39 2014 +0000
Revision:
3:08c16b8a78bf
Parent:
2:54e171ca91a6
Child:
4:09c35ecb3218
threaded first test based on cmsis_rtos_queue - main.cpp

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