Simple program to test a steppermotor. Min/maxspeed, accelleration, distance and steps/m can be changed while the program is running for quick adjustment.
Fork of cmsis_rtos_queue by
main.cpp@4:09c35ecb3218, 2014-06-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |