Robo l minuscolo
Dependencies: X_NUCLEO_IHM04A1 mbed
Fork of HelloWorld_IHM04A1 by
main.cpp
- Committer:
- carlotara
- Date:
- 2018-02-10
- Revision:
- 6:d5d776281222
- Parent:
- 5:4c1e581bbb8b
File content as of revision 6:d5d776281222:
/** ****************************************************************************** * @file Multi/Examples/MotionControl/IHM04A1_ExampleFor4UniDirMotors/Src/main.c * @author IPC Rennes * @version V1.0.0 * @date May 16, 2016 * @brief This example shows how to use 1 IHM04A1 expansion board with * 4 unidirectionnal Brush DC motors. * Each motor has one lead connected to one of the bridge output, * the other lead to the ground. The input bridges are not parallelised. * The demo sequence starts when the user button is pressed. * Each time, the user button is pressed, one new motor is activated ****************************************************************************** * @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" /* Component specific header files. */ #include "l6206_class.h" /* Definitions ---------------------------------------------------------------*/ #define MAX_MOTOR (4) /* Variables -----------------------------------------------------------------*/ static volatile uint16_t gLastError; static volatile uint8_t gStep = 0; /* Variables -----------------------------------------------------------------*/ /* Initialization parameters. */ L6206_Init_t init = { L6206_CONF_PARAM_PARALLE_BRIDGES, {L6206_CONF_PARAM_FREQ_PWM1A, L6206_CONF_PARAM_FREQ_PWM2A, L6206_CONF_PARAM_FREQ_PWM1B, L6206_CONF_PARAM_FREQ_PWM2B}, {100,100,100,100}, {FORWARD,FORWARD,BACKWARD,FORWARD}, {INACTIVE,INACTIVE,INACTIVE,INACTIVE}, {FALSE,FALSE} }; /* Motor Control Component. */ L6206 *motor; /* User button on Nucleo board */ //InterruptIn mybutton_irq(USER_BUTTON); /* Functions -----------------------------------------------------------------*/ /** * @brief This function is executed in case of error occurrence. * @param error number of the error * @retval None */ void Error_Handler(uint16_t error) { /* Backup error number */ gLastError = error; /* Enter your own code here */ } /** * @brief This function is the User handler for the flag interrupt * @param None * @retval None * @note If needed, implement it, and then attach and enable it: * + motor->AttachFlagInterrupt(MyFlagInterruptHandler); */ void MyFlagInterruptHandler(void) { /* Code to be customised */ /************************/ /* Get the state of bridge A */ uint16_t bridgeState = motor->GetBridgeStatus(0); if (bridgeState == 0) { if ((motor->GetDeviceState(0) != INACTIVE)|| (motor->GetDeviceState(1) != INACTIVE)) { /* Bridge A was disabling due to overcurrent or over temperature */ /* When at least on of its motor was running */ Error_Handler(0XBAD0); } } /* Get the state of bridge B */ bridgeState = motor->GetBridgeStatus(1); if (bridgeState == 0) { if ((motor->GetDeviceState(2) != INACTIVE)|| (motor->GetDeviceState(3) != INACTIVE)) { /* Bridge A was disabling due to overcurrent or over temperature */ /* When at least on of its motor was running */ Error_Handler(0XBAD1); } } } /* Private functions ---------------------------------------------------------*/ /** * @brief Button Irq * @param None * @retval None */ /*void button_pressed(void) { mybutton_irq.disable_irq(); gStep++; if (gStep > MAX_MOTOR) { gStep = 0; } wait_ms(200); mybutton_irq.enable_irq(); } */ /** * @brief Main program * @param None * @retval None */ int main(void) { printf("ESTRONCIO\n"); /*Con il codice motor->run(0, BDCMotor::FWD); // Forward fai andare avanti. Se vuoi cambiare il verso devi usare questo codice motor->run(0, BDCMotor::BWD); // Backword Lo 0 indica il motore 0, per il secondo motore puoi usare 1 collegandolo opportunamente. Quindi ad esempio se devi fare andare tutti e due avanti, usi questo codice motor->run(0, BDCMotor::FWD); // Forward motor->run(1, BDCMotor::FWD); // Forward Per farli andare indietro motor->run(0, BDCMotor::BWD); // Forward motor->run(1, BDCMotor::BWD); // Forward */ /*----- Initialization. -----*/ /* Initializing Motor Control Component. */ motor = new L6206( D2, A4, D5, D4, A0, A1); /* When Init method is called with NULL pointer, the L6206 parameters are set */ /* with the predefined values from file l6206_target_config.h, otherwise the */ /* parameters are set using the initDeviceParameters structure values. */ // if (motor->Init(&init) != COMPONENT_OK) // exit(EXIT_FAILURE); /* Attach the function MyFlagInterruptHandler (defined below) to the flag interrupt */ // motor->AttachFlagInterrupt(MyFlagInterruptHandler); /* Attach the function Error_Handler (defined below) to the error Handler*/ // motor->AttachErrorHandler(Error_Handler); /* Printing to the console. */ printf("Motor Control Application Example for 4 Motor\r\n\n"); /* Select the configuration with no bridge paralleling, two unidirectionnal motors on bridge A and two unidirectionnal motors on bridge B */ // motor->SetDualFullBridgeConfig(PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B); motor->SetDualFullBridgeConfig(PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B); /* Set PWM Frequency of bridge A inputs to 1000 Hz */ motor->SetBridgeInputPwmFreq(0,2000); /* Set PWM Frequency of bridge B inputs to 2000 Hz */ motor->SetBridgeInputPwmFreq(1,2000); // // Attach button_pressed function to Irq // mybutton_irq.fall(&button_pressed); /* Infinite loop */ while(1) { // if (gStep > 0) // { printf("ESTRONCIOLETTO\n"); // printf("Run motor 0 at 20%% of the maximum speed\n"); // /* Set speed of motor 0 to 20% */ // motor->SetSpeed(0,40); /* start motor 0 */ // motor->Run(0, BDCMotor::FWD); // } // if (gStep > 1) // { printf("Run motor 1 e 2 at 50% avanti\n"); /* Set speed of motor 1 to 30 % */ motor->SetSpeed(0,100); motor->SetSpeed(1,100); /* start motor 1 */ motor->Run(1, BDCMotor::FWD); motor->Run(0, BDCMotor::FWD); // Avanti printf("Motori 1 e 2 FERMI\n"); wait_ms(5000); motor->HardHiZ(0); motor->HardHiZ(1); // printf("Motori 1 e 2 FERMI\n"); wait_ms(1000); printf("Run motor 1 e 2 at 50% indietro\n"); motor->Run(1, BDCMotor::BWD); motor->Run(0, BDCMotor::BWD); // Indietro wait_ms(5000); motor->HardHiZ(0); motor->HardHiZ(1); printf("Motori 1 e 2 FERMI\n"); wait_ms(1000); // } // if (gStep > 2) // { // printf("Run motor 2 at 40%% of the maximum speed\n"); // /* Set speed of motor 2 to 40 % */ // motor->SetSpeed(2,100); // /* start motor 2 */ // motor->Run(2, BDCMotor::FWD); // } // if (gStep > 3) // { // printf("Run motor 3 at 50%% of the maximum speed\n"); // /* Set speed of motor 3 to 50 % */ // motor->SetSpeed(3,100); // /* start motor 3 */ // motor->Run(3, BDCMotor::FWD); // } // if (gStep > 0) // { // wait_ms(1000); // motor->HardHiZ(0); // motor->HardHiZ(1); // motor->HardHiZ(2); // motor->HardHiZ(3); // wait_ms(1000); // } } } /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/