Одновременное управление 3 шаговыми двигателями
Dependencies: AccelStepper mbed-STM32F103C8T6 mbed
Fork of Delta_Robot_2018 by
main.cpp
- Committer:
- yuliyasm
- Date:
- 2018-07-08
- Revision:
- 1:2b8f94cdaaea
- Parent:
- 0:1825dad3704f
File content as of revision 1:2b8f94cdaaea:
//X300Y500Z1000\r\n - пример команды управления (3 угла в градусах) #include "stm32f103c8t6.h" #include "mbed.h" #include "AccelStepper.h" #include <ctype.h> const int q = 8; // микрошаг #define MSpeed 2000 // максимальная скорость bool parseXYZ(char* m, float* A); float readNum(char* m, int i); void MotorsInit(); void Rx_interrupt(); PinName stp[3] = {PB_15,PA_8,PA_9}; PinName dir[3] = {PB_12,PB_13,PB_14}; AccelStepper axis1(1, stp[0], dir[0]); AccelStepper axis2(1, stp[1], dir[1]); AccelStepper axis3(1, stp[2], dir[2]); AccelStepper Motors[3] = {axis1, axis2, axis3}; DigitalOut myled(LED1); DigitalOut enb(PA_10); Timer t; Timer t_my; Serial pc(PB_10, PB_11); bool flags[3] = {true, true, true}; //////////////////////////////////////////////////////////////////////////////////// int main() { confSysClock(); //Configure system clock (72MHz HSE clock, 48MHz USB clock) t.start(); t_my.start(); pc.baud(9600); pc.attach(&Rx_interrupt, Serial::RxIrq); pc.printf("Hello\r\n"); MotorsInit(); while(1) { for (int i = 0; i < 3; i++) { Motors[i].runSpeedToPosition(); if (Motors[i].distanceToGo() == 0 && flags[i] == false) { flags[i] = true; pc.printf("%d - finish in %d msec\r\n", i, t_my.read_ms()); } } if (Motors[0].distanceToGo() == 0 && Motors[1].distanceToGo() == 0 && Motors[2].distanceToGo() == 0) myled = 1; } } /////////////////////////////////////////////////////////////////////////////////// void MotorsInit() { enb = 0; myled = 0; for (int i = 0; i < 3; i++) { Motors[i].setMinPulseWidth (20); Motors[i].setMaxSpeed (MSpeed*2); Motors[i].setCurrentPosition(0); } myled = 1; pc.printf("Ready\r\n\r\n"); } bool parseXYZ(char* m, float* A) { for(int i = 0; i < 32; i++) { if (m[i] == '\n' || m[i] == '\r') break; ///////////////////////////////// if (m[i] == 'X') { i++; A[0] = readNum(m, i); } //////////////////////////////// if (m[i] == 'Y') { i++; A[1] = readNum(m, i); } ////////////////////////////////// if (m[i] == 'Z') { i++; A[2] = readNum(m, i); } } return true; } float readNum(char* m, int i) { char buff[10] = ""; int n = 0; while ((isdigit(m[i]) || m[i] == '.' || m[i] == '-') && n < 9) { buff[n] = m[i]; i++; n++; } if (n == 0) { buff[n] = '0'; n++; } buff[n] = '\0'; return(atof(buff)); } void constTime() { float DeltaMax = 0; for (int i = 0; i < 3; i++) { if(abs(Motors[i].distanceToGo()) > DeltaMax) DeltaMax = abs(Motors[i].distanceToGo()); } float k = MSpeed/DeltaMax; for (int i = 0; i < 3; i++) { Motors[i].setSpeed(k*abs(Motors[i].distanceToGo())); pc.printf("\r\nSpeed %d", int(k*abs(Motors[i].distanceToGo()))); } } void Rx_interrupt() { char message[32] = ""; pc.scanf("%[^\n]s", message); strcat(message, "\n"); pc.printf("\r\n%s", message); float angles[3] = {0, 0, 0}; parseXYZ(message, angles); pc.printf("Angle: "); for (int i = 0; i < 3; i++) { pc.printf("%.2f ", angles[i]); Motors[i].move(int(angles[i]*q/1.8)); flags[i] = false; } constTime(); myled = 0; t_my.stop(); t_my.reset(); t_my.start(); pc.printf("\r\nWait!\r\n"); return; }