Program for STCL Control of motors via PWM

Dependencies:   SoftPWM USBDevice mbed

Committer:
Dzak
Date:
Fri Apr 17 03:14:39 2015 +0000
Revision:
1:2c0e9ef138a4
Parent:
0:651738eb850c
Child:
2:31a9ee6d066d
Updated to include Z axis. Do not update USBDevice library! New version not working properly with Mbuino

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Dzak 0:651738eb850c 1 #include "mbed.h"
Dzak 0:651738eb850c 2 #include "USBSerial.h"
Dzak 0:651738eb850c 3 #include "SoftPWM.h"
Dzak 0:651738eb850c 4
Dzak 0:651738eb850c 5 AnalogIn Y_Axis(P0_13);
Dzak 0:651738eb850c 6 AnalogIn X_Axis(P0_11);
Dzak 1:2c0e9ef138a4 7 AnalogIn Z_Axis(P0_15);
Dzak 0:651738eb850c 8
Dzak 0:651738eb850c 9 SoftPWM X_PWM(P0_9); //P0_9
Dzak 0:651738eb850c 10 SoftPWM Y_PWM(P0_10); //P0_10
Dzak 1:2c0e9ef138a4 11 SoftPWM Z_PWM(P0_4); //P0_4
Dzak 0:651738eb850c 12
Dzak 0:651738eb850c 13 USBSerial serial;
Dzak 0:651738eb850c 14
Dzak 0:651738eb850c 15 #define MAX_LOGIC 10000 // Full-deflection Max Range
Dzak 0:651738eb850c 16 #define MIN_LOGIC 0 // Full-deflection Min Range
Dzak 0:651738eb850c 17
Dzak 1:2c0e9ef138a4 18 #define SWITCH_LEVELS 5 // # of possible levels
Dzak 0:651738eb850c 19 #define FWD 1
Dzak 0:651738eb850c 20 #define REV 0
Dzak 0:651738eb850c 21
Dzak 0:651738eb850c 22
Dzak 0:651738eb850c 23
Dzak 0:651738eb850c 24 //NOTE: Period MUST be defined 1st, them DC.
Dzak 0:651738eb850c 25
Dzak 1:2c0e9ef138a4 26 float Period_Array [SWITCH_LEVELS] = {0.01, 0.1, 100.0, 0.1, 0.01}; // Period Corresponding to 10, 100, 0, 100, 10 Hz
Dzak 0:651738eb850c 27 uint16_t SpeedThreshold = MAX_LOGIC / SWITCH_LEVELS;
Dzak 0:651738eb850c 28
Dzak 0:651738eb850c 29 uint16_t X_Speed = 4;
Dzak 0:651738eb850c 30 uint16_t Y_Speed = 4;
Dzak 1:2c0e9ef138a4 31 uint16_t Z_Speed = 4;
Dzak 0:651738eb850c 32
Dzak 1:2c0e9ef138a4 33 bool X_Direction = FWD;
Dzak 1:2c0e9ef138a4 34 bool Y_Direction = FWD;
Dzak 1:2c0e9ef138a4 35 bool Z_Direction = FWD;
Dzak 0:651738eb850c 36
Dzak 0:651738eb850c 37 uint16_t tempX_Speed = 1;
Dzak 0:651738eb850c 38 uint16_t tempY_Speed = 1;
Dzak 1:2c0e9ef138a4 39 uint16_t tempZ_Speed = 1;
Dzak 0:651738eb850c 40
Dzak 0:651738eb850c 41
Dzak 0:651738eb850c 42 main()
Dzak 0:651738eb850c 43 {
Dzak 0:651738eb850c 44 while(1)
Dzak 0:651738eb850c 45 {
Dzak 0:651738eb850c 46 wait_ms(5);
Dzak 0:651738eb850c 47
Dzak 0:651738eb850c 48 X_Speed = (uint16_t) (X_Axis.read() * MAX_LOGIC) / (SpeedThreshold + SpeedThreshold / SWITCH_LEVELS);
Dzak 0:651738eb850c 49
Dzak 0:651738eb850c 50 Y_Speed = (uint16_t) (Y_Axis.read() * MAX_LOGIC) / (SpeedThreshold + SpeedThreshold / SWITCH_LEVELS);
Dzak 0:651738eb850c 51
Dzak 1:2c0e9ef138a4 52 Z_Speed = (uint16_t) (Z_Axis.read() * MAX_LOGIC) / (SpeedThreshold + SpeedThreshold / SWITCH_LEVELS);
Dzak 1:2c0e9ef138a4 53
Dzak 1:2c0e9ef138a4 54 if (X_Speed > 2) {X_Direction = FWD;}
Dzak 1:2c0e9ef138a4 55 if (X_Speed < 2) {X_Direction = REV;}
Dzak 1:2c0e9ef138a4 56 if (Y_Speed > 2) {Y_Direction = FWD;}
Dzak 1:2c0e9ef138a4 57 if (Y_Speed < 2) {Y_Direction = REV;}
Dzak 1:2c0e9ef138a4 58 if (Z_Speed > 2) {Z_Direction = FWD;}
Dzak 1:2c0e9ef138a4 59 if (Z_Speed < 2) {Z_Direction = REV;}
Dzak 0:651738eb850c 60
Dzak 0:651738eb850c 61
Dzak 1:2c0e9ef138a4 62 serial.printf(" X_Direction : %u", X_Direction);
Dzak 1:2c0e9ef138a4 63 serial.printf(" Y_Direction : %u \n",Y_Direction);
Dzak 1:2c0e9ef138a4 64 serial.printf(" Z_Direction : %u \n",Z_Direction);
Dzak 0:651738eb850c 65
Dzak 0:651738eb850c 66 if(tempX_Speed != X_Speed)
Dzak 0:651738eb850c 67 {
Dzak 0:651738eb850c 68 tempX_Speed = X_Speed;
Dzak 0:651738eb850c 69 X_PWM.period(Period_Array[X_Speed]);
Dzak 0:651738eb850c 70 X_PWM.write(0.5);
Dzak 0:651738eb850c 71
Dzak 1:2c0e9ef138a4 72 serial.printf(" X_Period : %4.4f \n",Period_Array[X_Speed]);
Dzak 0:651738eb850c 73 }
Dzak 0:651738eb850c 74
Dzak 0:651738eb850c 75 if(tempY_Speed != Y_Speed)
Dzak 0:651738eb850c 76 {
Dzak 0:651738eb850c 77 tempY_Speed = Y_Speed;
Dzak 0:651738eb850c 78 Y_PWM.period(Period_Array[Y_Speed]);
Dzak 0:651738eb850c 79 Y_PWM.write(0.5);
Dzak 1:2c0e9ef138a4 80 serial.printf(" Y_Period : %4.4f \n",Period_Array[Y_Speed]);
Dzak 1:2c0e9ef138a4 81 }
Dzak 1:2c0e9ef138a4 82
Dzak 1:2c0e9ef138a4 83 if(tempZ_Speed != Z_Speed)
Dzak 1:2c0e9ef138a4 84 {
Dzak 1:2c0e9ef138a4 85 tempZ_Speed = Z_Speed;
Dzak 1:2c0e9ef138a4 86 Z_PWM.period(Period_Array[Z_Speed]);
Dzak 1:2c0e9ef138a4 87 Z_PWM.write(0.5);
Dzak 1:2c0e9ef138a4 88 serial.printf(" Z_Period : %4.4f \n",Period_Array[Z_Speed]);
Dzak 0:651738eb850c 89 }
Dzak 0:651738eb850c 90 }
Dzak 0:651738eb850c 91 }
Dzak 0:651738eb850c 92
Dzak 0:651738eb850c 93