APS2 MEA Rodrigo Vianna
Dependencies: mbed X_NUCLEO_IHM01A1
Diff: main.cpp
- Revision:
- 0:e6a49a092e2a
- Child:
- 1:fbf28f3367aa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 14 15:21:49 2015 +0000 @@ -0,0 +1,352 @@ +/** + ****************************************************************************** + * @file main.cpp + * @author Davide Aliprandi / AST + * @version V1.0.0 + * @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 + * + * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ + +/* mbed specific header files. */ +#include "mbed.h" + +/* Helper header files. */ +#include "DevSPI.h" + +/* Component specific header files. */ +#include "l6474_class.h" + + +/* Definitions ---------------------------------------------------------------*/ + +/* Number of steps corresponding to one round angle of the motor. */ +#define ROUND_ANGLE_STEPS 1600 + + +/* Variables -----------------------------------------------------------------*/ + +/* Motor Control Component. */ +L6474 *l6474; + +/* Flag to identify whenever a PWM pulse has finished. */ +volatile int pwm_pulse_finished_flag; + +/* Flag to identify whenever the desired delay has expired. */ +volatile int delay_expired_flag; + + +/* Functions -----------------------------------------------------------------*/ + +/* + * @brief PWM callback. + * @param None + * @retval None + */ +void PWMCallback(void) +{ + pwm_pulse_finished_flag = 1; +} + +/* + * @brief Delay callback. + * @param None + * @retval None + */ +void DelayCallback() +{ + delay_expired_flag = 1; +} + +/* + * @brief Waiting until PWM pulse has finished. + * @param None + * @retval None + */ +void WaitForPWMPulse(void) +{ + /* Waiting until PWM flag is set. */ + while (pwm_pulse_finished_flag == 0); + + /* Resetting PWM flag. */ + pwm_pulse_finished_flag = 0; + + /* Setting the device state machine. */ + if (l6474->GetDeviceState() != INACTIVE) + l6474->StepClockHandler(); +} + +/* + * @brief Waiting while the motor is active. + * @param None + * @retval None + */ +void WaitWhileActive(void) +{ + while (l6474->GetDeviceState() != INACTIVE) + WaitForPWMPulse(); +} + +/* + * @brief Waiting until delay has expired. + * @param delay delay in milliseconds. + * @retval None + */ +void WaitForDelay(int delay) +{ + Timeout timeout; + timeout.attach(&DelayCallback, delay / 1E3); + + delay_expired_flag = 0; + while (delay_expired_flag == 0) + WaitForPWMPulse(); +} + + +/* Main ----------------------------------------------------------------------*/ + +int main() +{ + /* Initializing SPI bus. */ + DevSPI dev_spi(D11, D12, D13); + + /* Resetting Timer PWM flag. */ + pwm_pulse_finished_flag = 0; + + /* Initializing Motor Control Component. */ + l6474 = new L6474(D8, D7, D9, D10, dev_spi); + if (l6474->Init(NULL) != COMPONENT_OK) + return false; + + /* Printing to the console. */ + printf("Motor Control Application Example for 1 Motor\r\n\n"); + + /* Main Loop. */ + while(true) + { + /*----- Moving forward of N steps. -----*/ + + /* Printing to the console. */ + printf("--> Moving forward %d steps.\r\n", ROUND_ANGLE_STEPS); + + /* Moving N steps in the forward direction. */ + l6474->Move(FORWARD, ROUND_ANGLE_STEPS); + + /* Waiting while the motor is active. */ + WaitWhileActive(); + + /* Getting current position. */ + int position = l6474->GetPosition(); + + /* Printing to the console. */ + printf(" Position: %d.\r\n", position); + + /* Waiting 2 seconds. */ + wait_ms(2000); + + + /*----- Moving backward N steps. -----*/ + + /* Printing to the console. */ + printf("--> Moving backward %d steps.\r\n", ROUND_ANGLE_STEPS); + + /* Moving N steps in the backward direction. */ + l6474->Move(BACKWARD, ROUND_ANGLE_STEPS); + + /* Waiting while the motor is active. */ + WaitWhileActive(); + + /* Getting current position. */ + position = l6474->GetPosition(); + + /* Printing to the console. */ + printf(" Position: %d.\r\n", position); + + /* Setting the current position to be the home position. */ + l6474->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. */ + l6474->GoTo(ROUND_ANGLE_STEPS >> 1); + + /* Waiting while the motor is active. */ + WaitWhileActive(); + + /* Getting current position. */ + position = l6474->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. */ + l6474->GoHome(); + + /* Waiting while the motor is active. */ + WaitWhileActive(); + + /* Getting current position. */ + position = l6474->GetPosition(); + + /* Printing to the console. */ + printf(" Position: %d.\r\n", position); + + /* Waiting 2 seconds. */ + wait_ms(2000); + + + /*----- Moving backward. -----*/ + + /* Printing to the console. */ + printf("--> Moving backward.\r\n"); + + /* Requesting to run backward. */ + l6474->Run(BACKWARD); + + /* Waiting until delay has expired. */ + WaitForDelay(6000); + + /* Getting current speed. */ + int speed = l6474->GetCurrentSpeed(); + + /* 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. */ + l6474->SetMaxSpeed(2400); + + /* Waiting until delay has expired. */ + WaitForDelay(6000); + + /* Getting current speed. */ + speed = l6474->GetCurrentSpeed(); + + /* 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. */ + l6474->SetMaxSpeed(1200); + + /* Waiting until delay has expired. */ + WaitForDelay(8000); + + /* Getting current speed. */ + speed = l6474->GetCurrentSpeed(); + + /* Printing to the console. */ + printf(" Speed: %d.\r\n", speed); + + + /*----- Moving forward. -----*/ + + /* Printing to the console. */ + printf("--> Moving forward.\r\n"); + + /* Requesting to run in forward direction. */ + l6474->Run(FORWARD); + + /* Waiting until delay has expired. */ + WaitForDelay(4000); + + + /*----- Requiring hard-stop while running. -----*/ + + /* Printing to the console. */ + printf("--> Requiring hard-stop while running.\r\n"); + + /* Requesting to immediatly stop. */ + l6474->HardStop(); + + /* Waiting while the motor is active. */ + 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. */ + l6474->SetHome(); + + /* Infinite Loop. */ + while(1) + { + /* Requesting to go to a specified position. */ + l6474->GoTo(- ROUND_ANGLE_STEPS >> 2); + + /* Waiting while the motor is active. */ + WaitWhileActive(); + + /* Requesting to go to a specified position. */ + l6474->GoTo(ROUND_ANGLE_STEPS >> 2); + + /* Waiting while the motor is active. */ + WaitWhileActive(); + } + } +}