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@5:63fe92075b71, 2014-06-16 (annotated)
- 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?
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; |
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 | } |