APS2 MEA Rodrigo Vianna
Dependencies: mbed X_NUCLEO_IHM01A1
Diff: main.cpp
- Revision:
- 6:32166bfc04b0
- Parent:
- 5:8065b587ade0
- Child:
- 7:1d8a73b24eba
--- a/main.cpp Fri Nov 20 18:02:01 2015 +0000 +++ b/main.cpp Wed Nov 25 12:09:18 2015 +0000 @@ -6,8 +6,6 @@ * @date October 14th, 2015 * @brief mbed test application for the STMicrolectronics X-NUCLEO-IHM01A1 * Motor Control Expansion Board: control of 1 motor. - * This application makes use of a C++ component architecture obtained - * from the C component architecture through the Stm32CubeTOO tool. ****************************************************************************** * @attention * @@ -63,86 +61,13 @@ L6474 *motor; -/* Functions -----------------------------------------------------------------*/ - -/** - * @brief This is an example of user handler for the flag interrupt. - * @param None - * @retval None - * @note If needed, implement it, and then attach and enable it: - * + motor->AttachFlagIRQ(&FlagIRQHandler); - * + motor->EnableFlagIRQ(); - * To disable it: - * + motor->DisbleFlagIRQ(); - */ -void FlagIRQHandler(void) -{ - /* Set ISR flag. */ - motor->isrFlag = TRUE; - - /* Get the value of the status register. */ - unsigned int status = motor->GetStatus(); - - /* Check HIZ flag: if set, power brigdes are disabled. */ - if ((status & L6474_STATUS_HIZ) == L6474_STATUS_HIZ) - { /* HIZ state. Action to be customized. */ } - - /* Check direction. */ - if ((status & L6474_STATUS_DIR) == L6474_STATUS_DIR) - { /* Forward direction is set. Action to be customized. */ } - else - { /* Backward direction is set. Action to be customized. */ } - - /* Check NOTPERF_CMD flag: if set, the command received by SPI can't be performed. */ - /* This often occures when a command is sent to the L6474 while it is in HIZ state. */ - if ((status & L6474_STATUS_NOTPERF_CMD) == L6474_STATUS_NOTPERF_CMD) - { /* Command received by SPI can't be performed. Action to be customized. */ } - - /* Check WRONG_CMD flag: if set, the command does not exist. */ - if ((status & L6474_STATUS_WRONG_CMD) == L6474_STATUS_WRONG_CMD) - { /* The command received by SPI does not exist. Action to be customized. */ } - - /* Check UVLO flag: if not set, there is an undervoltage lock-out. */ - if ((status & L6474_STATUS_UVLO) == 0) - { /* Undervoltage lock-out. Action to be customized. */ } - - /* Check TH_WRN flag: if not set, the thermal warning threshold is reached. */ - if ((status & L6474_STATUS_TH_WRN) == 0) - { /* Thermal warning threshold is reached. Action to be customized. */ } - - /* Check TH_SHD flag: if not set, the thermal shut down threshold is reached. */ - if ((status & L6474_STATUS_TH_SD) == 0) - { /* Thermal shut down threshold is reached. Action to be customized. */ } - - /* Check OCD flag: if not set, there is an overcurrent detection. */ - if ((status & L6474_STATUS_OCD) == 0) - { /* Overcurrent detection. Action to be customized. */ } - - /* Reset ISR flag. */ - motor->isrFlag = FALSE; -} - -/** - * @brief This is an example of user handler for the errors. - * @param error error-code. - * @retval None - * @note If needed, implement it, and then attach it: - * + motor->AttachErrorHandler(&ErrorHandler); - */ -void ErrorHandler(uint16_t error) -{ - /* Printing to the console. */ - printf("Error: %d.\r\n", error); - - /* Aborting the program. */ - exit(EXIT_FAILURE); -} - - /* Main ----------------------------------------------------------------------*/ int main() { + /*----- Initialization. -----*/ + + /* Initializing SPI bus. */ DevSPI dev_spi(D11, D12, D13); @@ -154,187 +79,184 @@ /* Printing to the console. */ printf("Motor Control Application Example for 1 Motor\r\n\n"); - /* Main Loop. */ - while(true) - { - /*----- Moving. -----*/ + + /*----- Moving. -----*/ + + /* Printing to the console. */ + printf("--> Moving forward %d steps.\r\n", ROUND_ANGLE_STEPS); + + /* Moving N steps in the forward direction. */ + motor->Move(StepperMotor::FWD, ROUND_ANGLE_STEPS); + + /* Waiting while the motor is active. */ + motor->WaitWhileActive(); + + /* Getting current position. */ + int position = motor->GetPosition(); + + /* Printing to the console. */ + printf(" Position: %d.\r\n", position); + + /* Waiting 2 seconds. */ + wait_ms(2000); + + + /*----- Moving. -----*/ + + /* Printing to the console. */ + printf("--> Moving backward %d steps.\r\n", ROUND_ANGLE_STEPS >> 1); + + /* Moving N steps in the backward direction. */ + motor->Move(StepperMotor::BWD, ROUND_ANGLE_STEPS >> 1); + + /* Waiting while the motor is active. */ + motor->WaitWhileActive(); + + /* Getting current position. */ + position = motor->GetPosition(); + + /* Printing to the console. */ + printf(" Position: %d.\r\n", position); + printf("--> Setting Home.\r\n"); + + /* Setting the current position to be the home position. */ + motor->SetHome(); + + /* Waiting 2 seconds. */ + wait_ms(2000); + + + /*----- Going to a specified position. -----*/ + + /* Printing to the console. */ + printf("--> Going to position %d.\r\n", ROUND_ANGLE_STEPS >> 1); + + /* Requesting to go to a specified position. */ + motor->GoTo(ROUND_ANGLE_STEPS >> 1); + + /* Waiting while the motor is active. */ + motor->WaitWhileActive(); + + /* Getting current position. */ + position = motor->GetPosition(); + + /* Printing to the console. */ + printf(" Position: %d.\r\n", position); + + /* Waiting 2 seconds. */ + wait_ms(2000); + + + /*----- Going Home. -----*/ + + /* Printing to the console. */ + printf("--> Going Home.\r\n"); + + /* Requesting to go to home. */ + motor->GoHome(); + + /* Waiting while the motor is active. */ + motor->WaitWhileActive(); + + /* Getting current position. */ + position = motor->GetPosition(); + + /* Printing to the console. */ + printf(" Position: %d.\r\n", position); - /* Printing to the console. */ - printf("--> Moving forward %d steps.\r\n", ROUND_ANGLE_STEPS); + /* Waiting 2 seconds. */ + wait_ms(2000); + + + /*----- Running. -----*/ + + /* Printing to the console. */ + printf("--> Running backward.\r\n"); + + /* Requesting to run backward. */ + motor->Run(StepperMotor::BWD); + + /* Waiting until delay has expired. */ + wait_ms(6000); + + /* Getting current speed. */ + int speed = motor->GetSpeed(); + + /* Printing to the console. */ + printf(" Speed: %d.\r\n", speed); + + /*----- Increasing the speed while running. -----*/ + + /* Printing to the console. */ + printf("--> Increasing the speed while running.\r\n"); + + /* Increasing speed to 2400 step/s. */ + motor->SetMaxSpeed(2400); + + /* Waiting until delay has expired. */ + wait_ms(6000); + + /* Getting current speed. */ + speed = motor->GetSpeed(); + + /* Printing to the console. */ + printf(" Speed: %d.\r\n", speed); + + + /*----- Decreasing the speed while running. -----*/ - /* Moving N steps in the forward direction. */ - motor->Move(StepperMotor::FWD, ROUND_ANGLE_STEPS); + /* Printing to the console. */ + printf("--> Decreasing the speed while running.\r\n"); + + /* Decreasing speed to 1200 step/s. */ + motor->SetMaxSpeed(1200); + + /* Waiting until delay has expired. */ + wait_ms(8000); + + /* Getting current speed. */ + speed = motor->GetSpeed(); + + /* Printing to the console. */ + printf(" Speed: %d.\r\n", speed); + + + /*----- Requiring hard-stop while running. -----*/ + + /* Printing to the console. */ + printf("--> Requiring hard-stop while running.\r\n"); + + /* Requesting to immediatly stop. */ + motor->HardStop(); + + /* Waiting while the motor is active. */ + motor->WaitWhileActive(); + + /* Waiting 2 seconds. */ + wait_ms(2000); + + + /*----- Infinite Loop. -----*/ + + /* Printing to the console. */ + printf("--> Infinite Loop...\r\n"); + + /* Setting the current position to be the home position. */ + motor->SetHome(); + + /* Infinite Loop. */ + while (1) + { + /* Requesting to go to a specified position. */ + motor->GoTo(ROUND_ANGLE_STEPS >> 1); /* Waiting while the motor is active. */ motor->WaitWhileActive(); - /* Getting current position. */ - int position = motor->GetPosition(); - - /* Printing to the console. */ - printf(" Position: %d.\r\n", position); - - /* Waiting 2 seconds. */ - wait_ms(2000); - - - /*----- Moving. -----*/ - - /* Printing to the console. */ - printf("--> Moving backward %d steps.\r\n", ROUND_ANGLE_STEPS >> 1); - - /* Moving N steps in the backward direction. */ - motor->Move(StepperMotor::BWD, ROUND_ANGLE_STEPS >> 1); - - /* Waiting while the motor is active. */ - motor->WaitWhileActive(); - - /* Getting current position. */ - position = motor->GetPosition(); - - /* Printing to the console. */ - printf(" Position: %d.\r\n", position); - printf("--> Setting Home.\r\n"); - - /* Setting the current position to be the home position. */ - motor->SetHome(); - - /* Waiting 2 seconds. */ - wait_ms(2000); - - - /*----- Going to a specified position. -----*/ - - /* Printing to the console. */ - printf("--> Going to position %d.\r\n", ROUND_ANGLE_STEPS >> 1); - /* Requesting to go to a specified position. */ - motor->GoTo(ROUND_ANGLE_STEPS >> 1); - - /* Waiting while the motor is active. */ - motor->WaitWhileActive(); - - /* Getting current position. */ - position = motor->GetPosition(); - - /* Printing to the console. */ - printf(" Position: %d.\r\n", position); - - /* Waiting 2 seconds. */ - wait_ms(2000); - - - /*----- Going Home. -----*/ - - /* Printing to the console. */ - printf("--> Going Home.\r\n"); - - /* Requesting to go to home. */ - motor->GoHome(); - - /* Waiting while the motor is active. */ - motor->WaitWhileActive(); - - /* Getting current position. */ - position = motor->GetPosition(); - - /* Printing to the console. */ - printf(" Position: %d.\r\n", position); - - /* Waiting 2 seconds. */ - wait_ms(2000); - - - /*----- Running. -----*/ - - /* Printing to the console. */ - printf("--> Running backward.\r\n"); - - /* Requesting to run backward. */ - motor->Run(StepperMotor::BWD); - - /* Waiting until delay has expired. */ - wait_ms(6000); - - /* Getting current speed. */ - int speed = motor->GetSpeed(); - - /* Printing to the console. */ - printf(" Speed: %d.\r\n", speed); - - /*----- Increasing the speed while running. -----*/ - - /* Printing to the console. */ - printf("--> Increasing the speed while running.\r\n"); - - /* Increasing speed to 2400 step/s. */ - motor->SetMaxSpeed(2400); - - /* Waiting until delay has expired. */ - wait_ms(6000); - - /* Getting current speed. */ - speed = motor->GetSpeed(); - - /* Printing to the console. */ - printf(" Speed: %d.\r\n", speed); - - - /*----- Decreasing the speed while running. -----*/ - - /* Printing to the console. */ - printf("--> Decreasing the speed while running.\r\n"); - - /* Decreasing speed to 1200 step/s. */ - motor->SetMaxSpeed(1200); - - /* Waiting until delay has expired. */ - wait_ms(8000); - - /* Getting current speed. */ - speed = motor->GetSpeed(); - - /* Printing to the console. */ - printf(" Speed: %d.\r\n", speed); - - - /*----- Requiring hard-stop while running. -----*/ - - /* Printing to the console. */ - printf("--> Requiring hard-stop while running.\r\n"); - - /* Requesting to immediatly stop. */ - motor->HardStop(); + motor->GoTo(- (ROUND_ANGLE_STEPS >> 1)); /* Waiting while the motor is active. */ motor->WaitWhileActive(); - - /* Waiting 2 seconds. */ - wait_ms(2000); - - - /*----- Infinite Loop. -----*/ - - /* Printing to the console. */ - printf("--> Infinite Loop...\r\n"); - - /* Setting the current position to be the home position. */ - motor->SetHome(); - - /* Infinite Loop. */ - while(1) - { - /* Requesting to go to a specified position. */ - motor->GoTo(ROUND_ANGLE_STEPS >> 1); - - /* Waiting while the motor is active. */ - motor->WaitWhileActive(); - - /* Requesting to go to a specified position. */ - motor->GoTo(- (ROUND_ANGLE_STEPS >> 1)); - - /* Waiting while the motor is active. */ - motor->WaitWhileActive(); - } } }