Theis Rotating Platform Demo code
Dependencies: X_NUCLEO_IHM01A1_Demo_Code mbed
Fork of Demo_IHM01A1_3-Motors by
main.cpp@24:9b5c3f8ad3c5, 2017-05-24 (annotated)
- Committer:
- Arkadi
- Date:
- Wed May 24 09:58:22 2017 +0000
- Revision:
- 24:9b5c3f8ad3c5
- Parent:
- 23:f9d35a756e79
Thesis Rotating Platform Demo code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Arkadi | 23:f9d35a756e79 | 1 | //////////////////////////////////////// |
Arkadi | 23:f9d35a756e79 | 2 | // Rotating Platform Demo Code // |
Arkadi | 23:f9d35a756e79 | 3 | // Arkadiraf@gmail.com - 24/05/2017 // |
Arkadi | 23:f9d35a756e79 | 4 | //////////////////////////////////////// |
Arkadi | 23:f9d35a756e79 | 5 | |
Arkadi | 23:f9d35a756e79 | 6 | /* |
Arkadi | 23:f9d35a756e79 | 7 | Parts: |
Arkadi | 23:f9d35a756e79 | 8 | Nucleo STM32F401RE |
Arkadi | 23:f9d35a756e79 | 9 | X-NUCLEO-IHM01A1 - 3 Stepper motor controller |
Arkadi | 23:f9d35a756e79 | 10 | */ |
Arkadi | 23:f9d35a756e79 | 11 | |
Arkadi | 23:f9d35a756e79 | 12 | /* |
Arkadi | 23:f9d35a756e79 | 13 | Pinout: |
Arkadi | 23:f9d35a756e79 | 14 | Nucleo STM32F401RE |
Arkadi | 23:f9d35a756e79 | 15 | PA_5 --> led (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 16 | |
Arkadi | 23:f9d35a756e79 | 17 | PC - Serial 2 |
Arkadi | 23:f9d35a756e79 | 18 | PA_2 (Tx) --> STLINK |
Arkadi | 23:f9d35a756e79 | 19 | PA_3 (Rx) --> STLINK |
Davidroid | 0:e6a49a092e2a | 20 | |
Arkadi | 23:f9d35a756e79 | 21 | X-NUCLEO-IHM01A1 (http://www.st.com/content/ccc/resource/technical/document/data_brief/59/ff/d0/16/94/ff/49/85/DM00122463.pdf/files/DM00122463.pdf/jcr:content/translations/en.DM00122463.pdf) |
Arkadi | 23:f9d35a756e79 | 22 | SPI: |
Arkadi | 23:f9d35a756e79 | 23 | PA_7 (D11) --> mosi |
Arkadi | 23:f9d35a756e79 | 24 | PA_9 (D12) --> miso |
Arkadi | 23:f9d35a756e79 | 25 | PA_8 (D13) --> sclk |
Arkadi | 23:f9d35a756e79 | 26 | |
Arkadi | 23:f9d35a756e79 | 27 | Motor 1 |
Arkadi | 23:f9d35a756e79 | 28 | PA_10(D2) --> flag_irq (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 29 | PA_9 (D8) --> Standby (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 30 | PA_8 (D7) --> MOT1Dir (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 31 | PC_7 (D9) --> MOT1Step (PWM) |
Arkadi | 23:f9d35a756e79 | 32 | PB_6 (D10)--> ssel (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 33 | |
Arkadi | 23:f9d35a756e79 | 34 | Motor 2 |
Arkadi | 23:f9d35a756e79 | 35 | PA_10(D2) --> flag_irq (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 36 | PA_9 (D8) --> Standby (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 37 | PB_5 (D4) --> MOT2Dir (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 38 | PB_3 (D3) --> MOT2Step (PWM) |
Arkadi | 23:f9d35a756e79 | 39 | PB_6 (D10)--> ssel (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 40 | |
Arkadi | 23:f9d35a756e79 | 41 | Motor 3 |
Arkadi | 23:f9d35a756e79 | 42 | PA_10(D2) --> flag_irq (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 43 | PA_9 (D8) --> Standby (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 44 | PB_4 (D5) --> MOT3Dir (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 45 | PB_10(D6) --> MOT3Step (PWM) |
Arkadi | 23:f9d35a756e79 | 46 | PB_6 (D10)--> ssel (DigitalOut) |
Arkadi | 23:f9d35a756e79 | 47 | |
Arkadi | 23:f9d35a756e79 | 48 | |
Arkadi | 23:f9d35a756e79 | 49 | */ |
Davidroid | 0:e6a49a092e2a | 50 | |
Davidroid | 0:e6a49a092e2a | 51 | /* Includes ------------------------------------------------------------------*/ |
Davidroid | 0:e6a49a092e2a | 52 | |
Davidroid | 0:e6a49a092e2a | 53 | /* mbed specific header files. */ |
Davidroid | 0:e6a49a092e2a | 54 | #include "mbed.h" |
Davidroid | 0:e6a49a092e2a | 55 | |
Davidroid | 0:e6a49a092e2a | 56 | /* Helper header files. */ |
Davidroid | 0:e6a49a092e2a | 57 | #include "DevSPI.h" |
Davidroid | 0:e6a49a092e2a | 58 | |
Davidroid | 0:e6a49a092e2a | 59 | /* Component specific header files. */ |
Davidroid | 0:e6a49a092e2a | 60 | #include "l6474_class.h" |
Davidroid | 0:e6a49a092e2a | 61 | |
Davidroid | 0:e6a49a092e2a | 62 | |
Davidroid | 0:e6a49a092e2a | 63 | /* Definitions ---------------------------------------------------------------*/ |
Davidroid | 0:e6a49a092e2a | 64 | |
Davidroid | 9:a9e51320aee4 | 65 | /* Number of steps to move. */ |
Davidroid | 9:a9e51320aee4 | 66 | #define STEPS 3200 |
Davidroid | 0:e6a49a092e2a | 67 | |
Davidroid | 0:e6a49a092e2a | 68 | |
Davidroid | 0:e6a49a092e2a | 69 | /* Variables -----------------------------------------------------------------*/ |
Davidroid | 0:e6a49a092e2a | 70 | |
Davidroid | 0:e6a49a092e2a | 71 | /* Motor Control Component. */ |
Davidroid | 3:02d9ec4f88b2 | 72 | L6474 *motor1; |
Davidroid | 3:02d9ec4f88b2 | 73 | L6474 *motor2; |
Arkadi | 21:ed054abddfe4 | 74 | L6474 *motor3; |
Davidroid | 0:e6a49a092e2a | 75 | |
Davidroid | 0:e6a49a092e2a | 76 | /* Main ----------------------------------------------------------------------*/ |
Davidroid | 0:e6a49a092e2a | 77 | |
Davidroid | 0:e6a49a092e2a | 78 | int main() |
Davidroid | 0:e6a49a092e2a | 79 | { |
Davidroid | 8:cec4c2c03a27 | 80 | /*----- Initialization. -----*/ |
Davidroid | 8:cec4c2c03a27 | 81 | |
Davidroid | 0:e6a49a092e2a | 82 | /* Initializing SPI bus. */ |
Davidroid | 0:e6a49a092e2a | 83 | DevSPI dev_spi(D11, D12, D13); |
Davidroid | 0:e6a49a092e2a | 84 | |
Davidroid | 9:a9e51320aee4 | 85 | /* Initializing Motor Control Components. */ |
Davidroid | 5:a0268a435bb1 | 86 | motor1 = new L6474(D2, D8, D7, D9, D10, dev_spi); |
Davidroid | 16:810667a9f31f | 87 | motor2 = new L6474(D2, D8, D4, D3, D10, dev_spi); |
Arkadi | 21:ed054abddfe4 | 88 | motor3 = new L6474(D2, D8, D5, D6, D10, dev_spi); |
Davidroid | 14:fcd452b03d1a | 89 | if (motor1->Init() != COMPONENT_OK) |
Davidroid | 14:fcd452b03d1a | 90 | exit(EXIT_FAILURE); |
Davidroid | 14:fcd452b03d1a | 91 | if (motor2->Init() != COMPONENT_OK) |
Davidroid | 14:fcd452b03d1a | 92 | exit(EXIT_FAILURE); |
Arkadi | 21:ed054abddfe4 | 93 | if (motor3->Init() != COMPONENT_OK) |
Arkadi | 21:ed054abddfe4 | 94 | exit(EXIT_FAILURE); |
Arkadi | 21:ed054abddfe4 | 95 | |
Arkadi | 21:ed054abddfe4 | 96 | |
Arkadi | 21:ed054abddfe4 | 97 | |
Arkadi | 21:ed054abddfe4 | 98 | /*----- Changing motor setting. -----*/ |
Arkadi | 21:ed054abddfe4 | 99 | |
Arkadi | 21:ed054abddfe4 | 100 | /* Setting High Impedance State to update L6474's registers. */ |
Arkadi | 21:ed054abddfe4 | 101 | motor1->SoftHiZ(); |
Arkadi | 21:ed054abddfe4 | 102 | motor2->SoftHiZ(); |
Arkadi | 21:ed054abddfe4 | 103 | motor3->SoftHiZ(); |
Arkadi | 21:ed054abddfe4 | 104 | // Disabling motor |
Arkadi | 21:ed054abddfe4 | 105 | motor1->Disable(); |
Arkadi | 21:ed054abddfe4 | 106 | motor2->Disable(); |
Arkadi | 21:ed054abddfe4 | 107 | motor3->Disable(); |
Arkadi | 21:ed054abddfe4 | 108 | /* Changing step mode. */ |
Arkadi | 21:ed054abddfe4 | 109 | motor1->SetStepMode(STEP_MODE_1_16); |
Arkadi | 21:ed054abddfe4 | 110 | motor2->SetStepMode(STEP_MODE_1_16); |
Arkadi | 21:ed054abddfe4 | 111 | motor3->SetStepMode(STEP_MODE_1_16); |
Arkadi | 23:f9d35a756e79 | 112 | |
Arkadi | 23:f9d35a756e79 | 113 | /* Increasing the torque regulation current. */ |
Arkadi | 21:ed054abddfe4 | 114 | motor1->SetParameter(L6474_TVAL, 1250); // Limit 2.0A |
Arkadi | 23:f9d35a756e79 | 115 | motor2->SetParameter(L6474_TVAL, 1650); // Limit 1.7A |
Arkadi | 23:f9d35a756e79 | 116 | motor3->SetParameter(L6474_TVAL, 300); // Limit 0.28A |
Arkadi | 21:ed054abddfe4 | 117 | |
Arkadi | 21:ed054abddfe4 | 118 | /* Max speed to 2400 step/s. */ |
Arkadi | 23:f9d35a756e79 | 119 | motor1->SetMaxSpeed(750); |
Arkadi | 23:f9d35a756e79 | 120 | motor2->SetMaxSpeed(750); |
Arkadi | 23:f9d35a756e79 | 121 | motor3->SetMaxSpeed(750); |
Arkadi | 21:ed054abddfe4 | 122 | |
Arkadi | 21:ed054abddfe4 | 123 | /* Min speed to 200 step/s. */ |
Arkadi | 21:ed054abddfe4 | 124 | motor1->SetMinSpeed(100); |
Arkadi | 21:ed054abddfe4 | 125 | motor2->SetMinSpeed(100); |
Arkadi | 21:ed054abddfe4 | 126 | motor3->SetMinSpeed(100); |
Arkadi | 21:ed054abddfe4 | 127 | |
Arkadi | 21:ed054abddfe4 | 128 | /* set accelerations */ |
Arkadi | 23:f9d35a756e79 | 129 | motor1->SetAcceleration(250); |
Arkadi | 23:f9d35a756e79 | 130 | motor2->SetAcceleration(250); |
Arkadi | 23:f9d35a756e79 | 131 | motor3->SetAcceleration(250); |
Arkadi | 23:f9d35a756e79 | 132 | motor1->SetDeceleration(250); |
Arkadi | 23:f9d35a756e79 | 133 | motor2->SetDeceleration(250); |
Arkadi | 23:f9d35a756e79 | 134 | motor3->SetDeceleration(250); |
Arkadi | 21:ed054abddfe4 | 135 | |
Arkadi | 21:ed054abddfe4 | 136 | // Enabling motor |
Arkadi | 21:ed054abddfe4 | 137 | motor1->Enable(); |
Arkadi | 21:ed054abddfe4 | 138 | motor2->Enable(); |
Arkadi | 21:ed054abddfe4 | 139 | motor3->Enable(); |
Arkadi | 21:ed054abddfe4 | 140 | |
Davidroid | 0:e6a49a092e2a | 141 | |
Davidroid | 0:e6a49a092e2a | 142 | /* Printing to the console. */ |
Arkadi | 21:ed054abddfe4 | 143 | printf("Motor Control Application Example for 3 Motors\r\n\n"); |
Davidroid | 8:cec4c2c03a27 | 144 | |
Davidroid | 8:cec4c2c03a27 | 145 | /*----- Moving. -----*/ |
Arkadi | 21:ed054abddfe4 | 146 | |
Davidroid | 8:cec4c2c03a27 | 147 | /* Moving N steps in the forward direction. */ |
Arkadi | 21:ed054abddfe4 | 148 | motor1->Move(StepperMotor::FWD, STEPS); |
Davidroid | 9:a9e51320aee4 | 149 | motor2->Move(StepperMotor::FWD, STEPS); |
Arkadi | 21:ed054abddfe4 | 150 | motor3->Move(StepperMotor::FWD, STEPS); |
Davidroid | 8:cec4c2c03a27 | 151 | /* Waiting while the motor is active. */ |
Davidroid | 8:cec4c2c03a27 | 152 | motor1->WaitWhileActive(); |
Davidroid | 8:cec4c2c03a27 | 153 | motor2->WaitWhileActive(); |
Arkadi | 21:ed054abddfe4 | 154 | motor3->WaitWhileActive(); |
Arkadi | 21:ed054abddfe4 | 155 | |
Arkadi | 21:ed054abddfe4 | 156 | /* Waiting 2 seconds. */ |
Davidroid | 8:cec4c2c03a27 | 157 | wait_ms(2000); |
Arkadi | 21:ed054abddfe4 | 158 | |
Davidroid | 8:cec4c2c03a27 | 159 | |
Davidroid | 8:cec4c2c03a27 | 160 | /* Moving N steps in the backward direction. */ |
Arkadi | 21:ed054abddfe4 | 161 | motor1->Move(StepperMotor::BWD, STEPS); |
Davidroid | 9:a9e51320aee4 | 162 | motor2->Move(StepperMotor::BWD, STEPS); |
Arkadi | 21:ed054abddfe4 | 163 | motor3->Move(StepperMotor::BWD, STEPS); |
Davidroid | 8:cec4c2c03a27 | 164 | /* Waiting while the motor is active. */ |
Davidroid | 8:cec4c2c03a27 | 165 | motor1->WaitWhileActive(); |
Davidroid | 8:cec4c2c03a27 | 166 | motor2->WaitWhileActive(); |
Arkadi | 21:ed054abddfe4 | 167 | motor3->WaitWhileActive(); |
Davidroid | 8:cec4c2c03a27 | 168 | |
Davidroid | 8:cec4c2c03a27 | 169 | /* Waiting 2 seconds. */ |
Davidroid | 8:cec4c2c03a27 | 170 | wait_ms(2000); |
Davidroid | 8:cec4c2c03a27 | 171 | |
Arkadi | 21:ed054abddfe4 | 172 | /* Infinite Loop. */ |
Arkadi | 21:ed054abddfe4 | 173 | while(1) |
Arkadi | 21:ed054abddfe4 | 174 | { |
Arkadi | 21:ed054abddfe4 | 175 | /*----- Moving. -----*/ |
Davidroid | 8:cec4c2c03a27 | 176 | |
Arkadi | 21:ed054abddfe4 | 177 | /* Moving N steps in the forward direction. */ |
Arkadi | 21:ed054abddfe4 | 178 | motor1->Move(StepperMotor::FWD, STEPS); |
Arkadi | 21:ed054abddfe4 | 179 | motor2->Move(StepperMotor::FWD, STEPS); |
Arkadi | 21:ed054abddfe4 | 180 | motor3->Move(StepperMotor::FWD, STEPS); |
Davidroid | 8:cec4c2c03a27 | 181 | /* Waiting while the motor is active. */ |
Davidroid | 8:cec4c2c03a27 | 182 | motor1->WaitWhileActive(); |
Davidroid | 8:cec4c2c03a27 | 183 | motor2->WaitWhileActive(); |
Arkadi | 21:ed054abddfe4 | 184 | motor3->WaitWhileActive(); |
Arkadi | 21:ed054abddfe4 | 185 | |
Arkadi | 21:ed054abddfe4 | 186 | /* Moving N steps in the backward direction. */ |
Arkadi | 21:ed054abddfe4 | 187 | motor1->Move(StepperMotor::BWD, STEPS); |
Arkadi | 21:ed054abddfe4 | 188 | motor2->Move(StepperMotor::BWD, STEPS); |
Arkadi | 21:ed054abddfe4 | 189 | motor3->Move(StepperMotor::BWD, STEPS); |
Davidroid | 8:cec4c2c03a27 | 190 | /* Waiting while the motor is active. */ |
Davidroid | 8:cec4c2c03a27 | 191 | motor1->WaitWhileActive(); |
Davidroid | 8:cec4c2c03a27 | 192 | motor2->WaitWhileActive(); |
Arkadi | 21:ed054abddfe4 | 193 | motor3->WaitWhileActive(); |
Arkadi | 21:ed054abddfe4 | 194 | |
Davidroid | 8:cec4c2c03a27 | 195 | /* Waiting 2 seconds. */ |
Davidroid | 8:cec4c2c03a27 | 196 | wait_ms(2000); |
Davidroid | 0:e6a49a092e2a | 197 | } |
Davidroid | 0:e6a49a092e2a | 198 | } |