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@3:08c16b8a78bf, 2014-06-15 (annotated)
- 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?
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; |
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 | } |