Library used to control ST Nucleo Evaluation board IHM04A1, based on L6206 motor control driver.

Dependencies:   ST_INTERFACES

Dependents:   HelloWorld_IHM04A1 RoboCane_Motore arm_dcmotor_can arm_linear_can_2 ... more

Fork of X_NUCLEO_IHM04A1 by ST Expansion SW Team

Motor Control Library

Library to handle the X-NUCLEO-IHM04A1 Motor Control Expansion Board based on the L6206 component.

It allows a complete management of the L6206 by providing a complete APIs.

The key features of the library are :

  • Configuration of the L6206 (bridges inputs and enabling signals, bridges paralleling)
  • FLAG interrupts handling (overcurrent and thermal alarms reporting)
  • Handling of up to two bidirectional Brush DC motors or up to 4 unidirectional Brush DC motors depending of the bridges paralleling configuration
  • Nucleo and expansion board configuration (GPIOs, PWMs, IRQs…)

To use the L6206 driver library, the user first has to call its initialization method which:

  • Setups the required GPIOs to handle the bridges enable pins, the FLAG interrupt which reports overcurrent detection or thermal protection.
  • Loads the driver parameters with initial values configured by the user or with their predefined values from “l6206_target_config.h”, in order to program the PWMs frequency of the bridges inputs, the bridges paralleling configuration, the number and the type (bidirectional or unidirectional) of brush DC motors.

Once the initialization is done, the user can modify the driver parameters by calling specific functions to change the bridges paralleling configuration, types and numbers of motors or the PWMs frequency.

The user can also write callback functions and attach them to:

  • The flag interrupt handler depending on the actions he wants to perform when an overcurrent or a thermal alarm is reported.
  • The Error handler which is called by the library when it reports an error.

Then, the user can drive the different brush DC motors by requesting to run in a specified direction and by changing the maximal speed. When a motor is requested to run, the corresponding bridge is automatically enabled.

A motion command can be stopped at any moment:

  • Either by a hard stop which immediately stops the motor.
  • Or by a hardHiz command which immediately stops the motor and disables the bridge which is used by the motor.

The library also provides functions to disable or enable the bridges independently from the run or stop commands.

Arduino Connector Compatibility Warning

Using the X-NUCLEO-IHM04A1 expansion board with the NUCLEO-F429ZI requires adopting the following patch:

  • to connect with a wire the PB_4 Nucleo pin to the IN1A expansion board pin;
  • to connect with a wire the PC_7 Nucleo pin to the IN2A expansion board pin;
  • to connect with a wire the PA_15 Nucleo pin to the IN1B expansion board pin;
  • to connect with a wire the PB_3 Nucleo pin to the IN2B expansion board pin.


Board configuration for HelloWorld_IHM04A1 example

/media/uploads/brdirais/drive4brushdcmotor_ihm04a1.png

Committer:
Davidroid
Date:
Fri Mar 24 13:08:23 2017 +0000
Revision:
5:51ad3c4b904c
Parent:
Components/l6206/L6206_def.h@4:24158c44f02e
Typos corrected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davide.aliprandi@st.com 4:24158c44f02e 1 /**
davide.aliprandi@st.com 4:24158c44f02e 2 ******************************************************************************
davide.aliprandi@st.com 4:24158c44f02e 3 * @file L6206_def.h
davide.aliprandi@st.com 4:24158c44f02e 4 * @author IPC Rennes
davide.aliprandi@st.com 4:24158c44f02e 5 * @version V1.2.0
davide.aliprandi@st.com 4:24158c44f02e 6 * @date March 30, 2016
davide.aliprandi@st.com 4:24158c44f02e 7 * @brief Header for L6206 driver (dual full bridge driver)
davide.aliprandi@st.com 4:24158c44f02e 8 * @note (C) COPYRIGHT 2015 STMicroelectronics
davide.aliprandi@st.com 4:24158c44f02e 9 ******************************************************************************
davide.aliprandi@st.com 4:24158c44f02e 10 * @attention
davide.aliprandi@st.com 4:24158c44f02e 11 *
davide.aliprandi@st.com 4:24158c44f02e 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
davide.aliprandi@st.com 4:24158c44f02e 13 *
davide.aliprandi@st.com 4:24158c44f02e 14 * Redistribution and use in source and binary forms, with or without modification,
davide.aliprandi@st.com 4:24158c44f02e 15 * are permitted provided that the following conditions are met:
davide.aliprandi@st.com 4:24158c44f02e 16 * 1. Redistributions of source code must retain the above copyright notice,
davide.aliprandi@st.com 4:24158c44f02e 17 * this list of conditions and the following disclaimer.
davide.aliprandi@st.com 4:24158c44f02e 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
davide.aliprandi@st.com 4:24158c44f02e 19 * this list of conditions and the following disclaimer in the documentation
davide.aliprandi@st.com 4:24158c44f02e 20 * and/or other materials provided with the distribution.
davide.aliprandi@st.com 4:24158c44f02e 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
davide.aliprandi@st.com 4:24158c44f02e 22 * may be used to endorse or promote products derived from this software
davide.aliprandi@st.com 4:24158c44f02e 23 * without specific prior written permission.
davide.aliprandi@st.com 4:24158c44f02e 24 *
davide.aliprandi@st.com 4:24158c44f02e 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
davide.aliprandi@st.com 4:24158c44f02e 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
davide.aliprandi@st.com 4:24158c44f02e 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
davide.aliprandi@st.com 4:24158c44f02e 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
davide.aliprandi@st.com 4:24158c44f02e 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
davide.aliprandi@st.com 4:24158c44f02e 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
davide.aliprandi@st.com 4:24158c44f02e 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
davide.aliprandi@st.com 4:24158c44f02e 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
davide.aliprandi@st.com 4:24158c44f02e 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
davide.aliprandi@st.com 4:24158c44f02e 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
davide.aliprandi@st.com 4:24158c44f02e 35 *
davide.aliprandi@st.com 4:24158c44f02e 36 ******************************************************************************
davide.aliprandi@st.com 4:24158c44f02e 37 */
davide.aliprandi@st.com 4:24158c44f02e 38
davide.aliprandi@st.com 4:24158c44f02e 39 /* Define to prevent recursive inclusion -------------------------------------*/
davide.aliprandi@st.com 4:24158c44f02e 40 #ifndef __L6206_H
davide.aliprandi@st.com 4:24158c44f02e 41 #define __L6206_H
davide.aliprandi@st.com 4:24158c44f02e 42
davide.aliprandi@st.com 4:24158c44f02e 43 #ifdef __cplusplus
davide.aliprandi@st.com 4:24158c44f02e 44 extern "C" {
davide.aliprandi@st.com 4:24158c44f02e 45 #endif
davide.aliprandi@st.com 4:24158c44f02e 46
davide.aliprandi@st.com 4:24158c44f02e 47 /* Includes ------------------------------------------------------------------*/
davide.aliprandi@st.com 4:24158c44f02e 48 #include "L6206_config.h"
davide.aliprandi@st.com 4:24158c44f02e 49 #include "../Common/motor_def.h"
davide.aliprandi@st.com 4:24158c44f02e 50
davide.aliprandi@st.com 4:24158c44f02e 51 /** @addtogroup BSP
davide.aliprandi@st.com 4:24158c44f02e 52 * @{
davide.aliprandi@st.com 4:24158c44f02e 53 */
davide.aliprandi@st.com 4:24158c44f02e 54
davide.aliprandi@st.com 4:24158c44f02e 55 /** @addtogroup Components
davide.aliprandi@st.com 4:24158c44f02e 56 * @{
davide.aliprandi@st.com 4:24158c44f02e 57 */
davide.aliprandi@st.com 4:24158c44f02e 58
davide.aliprandi@st.com 4:24158c44f02e 59 /** @addtogroup L6206
davide.aliprandi@st.com 4:24158c44f02e 60 * @{
davide.aliprandi@st.com 4:24158c44f02e 61 */
davide.aliprandi@st.com 4:24158c44f02e 62
davide.aliprandi@st.com 4:24158c44f02e 63 /* Exported Constants --------------------------------------------------------*/
davide.aliprandi@st.com 4:24158c44f02e 64
davide.aliprandi@st.com 4:24158c44f02e 65 /** @defgroup L6206_Exported_Defines L6206 Exported Defines
davide.aliprandi@st.com 4:24158c44f02e 66 * @{
davide.aliprandi@st.com 4:24158c44f02e 67 */
davide.aliprandi@st.com 4:24158c44f02e 68
davide.aliprandi@st.com 4:24158c44f02e 69 /// Current FW version
davide.aliprandi@st.com 4:24158c44f02e 70 #define L6206_FW_VERSION (0)
davide.aliprandi@st.com 4:24158c44f02e 71 ///Max number of Brush DC motors
davide.aliprandi@st.com 4:24158c44f02e 72 #define L6206_NB_MAX_MOTORS (4)
davide.aliprandi@st.com 4:24158c44f02e 73 ///Max number of Bridges
davide.aliprandi@st.com 4:24158c44f02e 74 #define L6206_NB_MAX_BRIDGES (2)
davide.aliprandi@st.com 4:24158c44f02e 75 ///Max number of input of Bridges
davide.aliprandi@st.com 4:24158c44f02e 76 #define L6206_NB_MAX_BRIDGE_INPUT (2 * L6206_NB_MAX_BRIDGES)
davide.aliprandi@st.com 4:24158c44f02e 77 /// MCU wait time in ms after power bridges are enabled
davide.aliprandi@st.com 4:24158c44f02e 78 #define BSP_MOTOR_CONTROL_BOARD_BRIDGE_TURN_ON_DELAY (20)
davide.aliprandi@st.com 4:24158c44f02e 79
davide.aliprandi@st.com 4:24158c44f02e 80 /**
davide.aliprandi@st.com 4:24158c44f02e 81 * @}
davide.aliprandi@st.com 4:24158c44f02e 82 */
davide.aliprandi@st.com 4:24158c44f02e 83
davide.aliprandi@st.com 4:24158c44f02e 84
davide.aliprandi@st.com 4:24158c44f02e 85 /* Exported Types -------------------------------------------------------*/
davide.aliprandi@st.com 4:24158c44f02e 86
davide.aliprandi@st.com 4:24158c44f02e 87 /** @defgroup L6206_Exported_Types L6206 Exported Types
davide.aliprandi@st.com 4:24158c44f02e 88 * @{
davide.aliprandi@st.com 4:24158c44f02e 89 */
davide.aliprandi@st.com 4:24158c44f02e 90
davide.aliprandi@st.com 4:24158c44f02e 91
davide.aliprandi@st.com 4:24158c44f02e 92
davide.aliprandi@st.com 4:24158c44f02e 93
davide.aliprandi@st.com 4:24158c44f02e 94 /** @defgroup Initialization_Structure Initialization Structure
davide.aliprandi@st.com 4:24158c44f02e 95 * @{
davide.aliprandi@st.com 4:24158c44f02e 96 */
davide.aliprandi@st.com 4:24158c44f02e 97
davide.aliprandi@st.com 4:24158c44f02e 98 typedef struct
davide.aliprandi@st.com 4:24158c44f02e 99 {
davide.aliprandi@st.com 4:24158c44f02e 100 /// Bridge configuration structure.
davide.aliprandi@st.com 4:24158c44f02e 101 dualFullBridgeConfig_t config;
davide.aliprandi@st.com 4:24158c44f02e 102
davide.aliprandi@st.com 4:24158c44f02e 103 /// PWM frequency
davide.aliprandi@st.com 4:24158c44f02e 104 uint32_t pwmFreq[L6206_NB_MAX_BRIDGE_INPUT];
davide.aliprandi@st.com 4:24158c44f02e 105
davide.aliprandi@st.com 4:24158c44f02e 106 /// Motor speed
davide.aliprandi@st.com 4:24158c44f02e 107 uint16_t speed[L6206_NB_MAX_MOTORS];
davide.aliprandi@st.com 4:24158c44f02e 108
davide.aliprandi@st.com 4:24158c44f02e 109 /// Motor direction
davide.aliprandi@st.com 4:24158c44f02e 110 motorDir_t direction[L6206_NB_MAX_MOTORS];
davide.aliprandi@st.com 4:24158c44f02e 111
davide.aliprandi@st.com 4:24158c44f02e 112 /// Current motor state
davide.aliprandi@st.com 4:24158c44f02e 113 motorState_t motionState[L6206_NB_MAX_MOTORS];
davide.aliprandi@st.com 4:24158c44f02e 114
davide.aliprandi@st.com 4:24158c44f02e 115 /// Bridge enabled (true) or not (false)
davide.aliprandi@st.com 4:24158c44f02e 116 bool bridgeEnabled[L6206_NB_MAX_BRIDGES];
davide.aliprandi@st.com 4:24158c44f02e 117 } deviceParams_t;
davide.aliprandi@st.com 4:24158c44f02e 118
davide.aliprandi@st.com 4:24158c44f02e 119
davide.aliprandi@st.com 4:24158c44f02e 120
davide.aliprandi@st.com 4:24158c44f02e 121
davide.aliprandi@st.com 4:24158c44f02e 122 typedef deviceParams_t L6206_init_t;
davide.aliprandi@st.com 4:24158c44f02e 123
davide.aliprandi@st.com 4:24158c44f02e 124
davide.aliprandi@st.com 4:24158c44f02e 125
davide.aliprandi@st.com 4:24158c44f02e 126 /**
davide.aliprandi@st.com 4:24158c44f02e 127 * @}
davide.aliprandi@st.com 4:24158c44f02e 128 */
davide.aliprandi@st.com 4:24158c44f02e 129
davide.aliprandi@st.com 4:24158c44f02e 130
davide.aliprandi@st.com 4:24158c44f02e 131 /** @defgroup Data_Structure Data Structure
davide.aliprandi@st.com 4:24158c44f02e 132 * @{
davide.aliprandi@st.com 4:24158c44f02e 133 */
davide.aliprandi@st.com 4:24158c44f02e 134
davide.aliprandi@st.com 4:24158c44f02e 135 /* ACTION --------------------------------------------------------------------*
davide.aliprandi@st.com 4:24158c44f02e 136 * Declare here the structure of component's data, if any, one variable per *
davide.aliprandi@st.com 4:24158c44f02e 137 * line without initialization. *
davide.aliprandi@st.com 4:24158c44f02e 138 * *
davide.aliprandi@st.com 4:24158c44f02e 139 * Example: *
davide.aliprandi@st.com 4:24158c44f02e 140 * typedef struct *
davide.aliprandi@st.com 4:24158c44f02e 141 * { *
davide.aliprandi@st.com 4:24158c44f02e 142 * int T0_out; *
davide.aliprandi@st.com 4:24158c44f02e 143 * int T1_out; *
davide.aliprandi@st.com 4:24158c44f02e 144 * float T0_degC; *
davide.aliprandi@st.com 4:24158c44f02e 145 * float T1_degC; *
davide.aliprandi@st.com 4:24158c44f02e 146 * } COMPONENT_Data_t; *
davide.aliprandi@st.com 4:24158c44f02e 147 *----------------------------------------------------------------------------*/
davide.aliprandi@st.com 4:24158c44f02e 148 typedef struct
davide.aliprandi@st.com 4:24158c44f02e 149 {
davide.aliprandi@st.com 4:24158c44f02e 150 /// Function pointer to flag interrupt call back
davide.aliprandi@st.com 4:24158c44f02e 151 void (*flagInterruptCallback)(void);
davide.aliprandi@st.com 4:24158c44f02e 152
davide.aliprandi@st.com 4:24158c44f02e 153 /// Function pointer to error handler call back
davide.aliprandi@st.com 4:24158c44f02e 154 void (*errorHandlerCallback)(uint16_t error);
davide.aliprandi@st.com 4:24158c44f02e 155
davide.aliprandi@st.com 4:24158c44f02e 156 /// number of L6206 devices
davide.aliprandi@st.com 4:24158c44f02e 157 uint8_t numberOfDevices;
davide.aliprandi@st.com 4:24158c44f02e 158
davide.aliprandi@st.com 4:24158c44f02e 159 /// L6206 driver instance
davide.aliprandi@st.com 4:24158c44f02e 160 uint8_t deviceInstance;
davide.aliprandi@st.com 4:24158c44f02e 161
davide.aliprandi@st.com 4:24158c44f02e 162 /// L6206 Device Paramaters structure
davide.aliprandi@st.com 4:24158c44f02e 163 deviceParams_t devicePrm;
davide.aliprandi@st.com 4:24158c44f02e 164 } L6206_Data_t;
davide.aliprandi@st.com 4:24158c44f02e 165
davide.aliprandi@st.com 4:24158c44f02e 166 /**
davide.aliprandi@st.com 4:24158c44f02e 167 * @}
davide.aliprandi@st.com 4:24158c44f02e 168 */
davide.aliprandi@st.com 4:24158c44f02e 169
davide.aliprandi@st.com 4:24158c44f02e 170
davide.aliprandi@st.com 4:24158c44f02e 171
davide.aliprandi@st.com 4:24158c44f02e 172 /**
davide.aliprandi@st.com 4:24158c44f02e 173 * @}
davide.aliprandi@st.com 4:24158c44f02e 174 */
davide.aliprandi@st.com 4:24158c44f02e 175
davide.aliprandi@st.com 4:24158c44f02e 176 /* Exported functions --------------------------------------------------------*/
davide.aliprandi@st.com 4:24158c44f02e 177
davide.aliprandi@st.com 4:24158c44f02e 178
davide.aliprandi@st.com 4:24158c44f02e 179 /** @defgroup MotorControl_Board_Linked_Functions MotorControl Board Linked Functions
davide.aliprandi@st.com 4:24158c44f02e 180 * @{
davide.aliprandi@st.com 4:24158c44f02e 181 */
davide.aliprandi@st.com 4:24158c44f02e 182 ///Delay of the requested number of milliseconds
davide.aliprandi@st.com 4:24158c44f02e 183 extern void L6206_Board_Delay(void *handle, uint32_t delay);
davide.aliprandi@st.com 4:24158c44f02e 184 ///Disable the specified bridge
davide.aliprandi@st.com 4:24158c44f02e 185 extern void L6206_Board_DisableBridge(void *handle, uint8_t bridgeId);
davide.aliprandi@st.com 4:24158c44f02e 186 ///Enable the specified bridge
davide.aliprandi@st.com 4:24158c44f02e 187 extern void L6206_Board_EnableBridge(void *handle, uint8_t bridgeId, uint8_t addDelay);
davide.aliprandi@st.com 4:24158c44f02e 188 //Get the status of the flag and enable Pin
davide.aliprandi@st.com 4:24158c44f02e 189 extern uint32_t L6206_Board_GetFlagPinState(void *handle, uint8_t bridgeId);
davide.aliprandi@st.com 4:24158c44f02e 190 ///Initialise GPIOs used for L6206s
davide.aliprandi@st.com 4:24158c44f02e 191 extern void L6206_Board_GpioInit(void *handle);
davide.aliprandi@st.com 4:24158c44f02e 192 ///Set Briges Inputs PWM frequency and start it
davide.aliprandi@st.com 4:24158c44f02e 193 extern void L6206_Board_PwmSetFreq(void *handle, uint8_t bridgeInput, uint32_t newFreq, uint8_t duty);
davide.aliprandi@st.com 4:24158c44f02e 194 ///Deinitialise the PWM of the specified bridge input
davide.aliprandi@st.com 4:24158c44f02e 195 extern void L6206_Board_PwmDeInit(void *handle, uint8_t bridgeInput);
davide.aliprandi@st.com 4:24158c44f02e 196 ///init the PWM of the specified bridge input
davide.aliprandi@st.com 4:24158c44f02e 197 extern void L6206_Board_PwmInit(void *handle, uint8_t bridgeInput);
davide.aliprandi@st.com 4:24158c44f02e 198 ///Stop the PWM of the specified bridge input
davide.aliprandi@st.com 4:24158c44f02e 199 extern void L6206_Board_PwmStop(void *handle, uint8_t bridgeInput);
davide.aliprandi@st.com 4:24158c44f02e 200 /**
davide.aliprandi@st.com 4:24158c44f02e 201 * @}
davide.aliprandi@st.com 4:24158c44f02e 202 */
davide.aliprandi@st.com 4:24158c44f02e 203
davide.aliprandi@st.com 4:24158c44f02e 204
davide.aliprandi@st.com 4:24158c44f02e 205
davide.aliprandi@st.com 4:24158c44f02e 206 /**
davide.aliprandi@st.com 4:24158c44f02e 207 * @}
davide.aliprandi@st.com 4:24158c44f02e 208 */
davide.aliprandi@st.com 4:24158c44f02e 209
davide.aliprandi@st.com 4:24158c44f02e 210
davide.aliprandi@st.com 4:24158c44f02e 211 /**
davide.aliprandi@st.com 4:24158c44f02e 212 * @}
davide.aliprandi@st.com 4:24158c44f02e 213 */
davide.aliprandi@st.com 4:24158c44f02e 214
davide.aliprandi@st.com 4:24158c44f02e 215 /**
davide.aliprandi@st.com 4:24158c44f02e 216 * @}
davide.aliprandi@st.com 4:24158c44f02e 217 */
davide.aliprandi@st.com 4:24158c44f02e 218
davide.aliprandi@st.com 4:24158c44f02e 219 #ifdef __cplusplus
davide.aliprandi@st.com 4:24158c44f02e 220 }
davide.aliprandi@st.com 4:24158c44f02e 221 #endif
davide.aliprandi@st.com 4:24158c44f02e 222
davide.aliprandi@st.com 4:24158c44f02e 223 #endif /* #ifndef __L6206_H */
davide.aliprandi@st.com 4:24158c44f02e 224
davide.aliprandi@st.com 4:24158c44f02e 225
davide.aliprandi@st.com 4:24158c44f02e 226 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
davide.aliprandi@st.com 4:24158c44f02e 227
davide.aliprandi@st.com 4:24158c44f02e 228