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:
Manu_L
Date:
Tue Jun 14 12:14:28 2016 +0000
Revision:
3:b06e38d365d7
Use BDCMotor_class.h instead of Motor_class.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Manu_L 3:b06e38d365d7 1 /**
Manu_L 3:b06e38d365d7 2 ******************************************************************************
Manu_L 3:b06e38d365d7 3 * @file BCDMotor_class.h
Manu_L 3:b06e38d365d7 4 * @author IPC Rennes
Manu_L 3:b06e38d365d7 5 * @version V1.0.0
Manu_L 3:b06e38d365d7 6 * @date April 6th, 2016
Manu_L 3:b06e38d365d7 7 * @brief This file contains the abstract class describing the interface of a
Manu_L 3:b06e38d365d7 8 * Brush DC motor component.
Manu_L 3:b06e38d365d7 9 ******************************************************************************
Manu_L 3:b06e38d365d7 10 * @attention
Manu_L 3:b06e38d365d7 11 *
Manu_L 3:b06e38d365d7 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
Manu_L 3:b06e38d365d7 13 *
Manu_L 3:b06e38d365d7 14 * Redistribution and use in source and binary forms, with or without modification,
Manu_L 3:b06e38d365d7 15 * are permitted provided that the following conditions are met:
Manu_L 3:b06e38d365d7 16 * 1. Redistributions of source code must retain the above copyright notice,
Manu_L 3:b06e38d365d7 17 * this list of conditions and the following disclaimer.
Manu_L 3:b06e38d365d7 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Manu_L 3:b06e38d365d7 19 * this list of conditions and the following disclaimer in the documentation
Manu_L 3:b06e38d365d7 20 * and/or other materials provided with the distribution.
Manu_L 3:b06e38d365d7 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Manu_L 3:b06e38d365d7 22 * may be used to endorse or promote products derived from this software
Manu_L 3:b06e38d365d7 23 * without specific prior written permission.
Manu_L 3:b06e38d365d7 24 *
Manu_L 3:b06e38d365d7 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Manu_L 3:b06e38d365d7 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Manu_L 3:b06e38d365d7 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Manu_L 3:b06e38d365d7 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Manu_L 3:b06e38d365d7 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Manu_L 3:b06e38d365d7 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Manu_L 3:b06e38d365d7 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Manu_L 3:b06e38d365d7 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Manu_L 3:b06e38d365d7 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Manu_L 3:b06e38d365d7 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Manu_L 3:b06e38d365d7 35 *
Manu_L 3:b06e38d365d7 36 ******************************************************************************
Manu_L 3:b06e38d365d7 37 */
Manu_L 3:b06e38d365d7 38
Manu_L 3:b06e38d365d7 39
Manu_L 3:b06e38d365d7 40 /* Define to prevent from recursive inclusion --------------------------------*/
Manu_L 3:b06e38d365d7 41
Manu_L 3:b06e38d365d7 42 #ifndef __BCDMMOTOR_CLASS_H
Manu_L 3:b06e38d365d7 43 #define __BCDMMOTOR_CLASS_H
Manu_L 3:b06e38d365d7 44
Manu_L 3:b06e38d365d7 45
Manu_L 3:b06e38d365d7 46 /* Includes ------------------------------------------------------------------*/
Manu_L 3:b06e38d365d7 47
Manu_L 3:b06e38d365d7 48 #include <Component_class.h>
Manu_L 3:b06e38d365d7 49
Manu_L 3:b06e38d365d7 50
Manu_L 3:b06e38d365d7 51 /* Classes ------------------------------------------------------------------*/
Manu_L 3:b06e38d365d7 52
Manu_L 3:b06e38d365d7 53 /** An abstract class for BDCMotor components.
Manu_L 3:b06e38d365d7 54 */
Manu_L 3:b06e38d365d7 55 class BDCMotor : public Component
Manu_L 3:b06e38d365d7 56 {
Manu_L 3:b06e38d365d7 57 public:
Manu_L 3:b06e38d365d7 58 /**
Manu_L 3:b06e38d365d7 59 * @brief Rotation modes.
Manu_L 3:b06e38d365d7 60 */
Manu_L 3:b06e38d365d7 61 typedef enum
Manu_L 3:b06e38d365d7 62 {
Manu_L 3:b06e38d365d7 63 BWD = 0, /* Backward. */
Manu_L 3:b06e38d365d7 64 FWD = 1 /* Forward. */
Manu_L 3:b06e38d365d7 65 } direction_t;
Manu_L 3:b06e38d365d7 66
Manu_L 3:b06e38d365d7 67 /**
Manu_L 3:b06e38d365d7 68 * @brief Disabling the specified bridge.
Manu_L 3:b06e38d365d7 69 * @param bridgeId from 0 for bridge A to 1 for bridge B.
Manu_L 3:b06e38d365d7 70 * @retval None.
Manu_L 3:b06e38d365d7 71 */
Manu_L 3:b06e38d365d7 72 virtual void DisableBridge(unsigned int) = 0;
Manu_L 3:b06e38d365d7 73
Manu_L 3:b06e38d365d7 74 /**
Manu_L 3:b06e38d365d7 75 * @brief Enabling the specified bridge.
Manu_L 3:b06e38d365d7 76 * @param bridgeId from 0 for bridge A to 1 for bridge B
Manu_L 3:b06e38d365d7 77 * @retval None.
Manu_L 3:b06e38d365d7 78 */
Manu_L 3:b06e38d365d7 79 virtual void EnableBridge(unsigned int) = 0;
Manu_L 3:b06e38d365d7 80
Manu_L 3:b06e38d365d7 81 /**
Manu_L 3:b06e38d365d7 82 * @brief Getting the PWM frequency of the specified bridge;
Manu_L 3:b06e38d365d7 83 * @param bridgeId from 0 for bridge A to 1 for bridge B.
Manu_L 3:b06e38d365d7 84 * @retval The frequency in Hz of the specified bridge input PWM.
Manu_L 3:b06e38d365d7 85 */
Manu_L 3:b06e38d365d7 86 virtual unsigned int GetBridgeInputPwmFreq(unsigned int) = 0;
Manu_L 3:b06e38d365d7 87
Manu_L 3:b06e38d365d7 88 /**
Manu_L 3:b06e38d365d7 89 * @brief Getting the bridge status.
Manu_L 3:b06e38d365d7 90 * @param bridgeId from 0 for bridge A to 1 for bridge B.
Manu_L 3:b06e38d365d7 91 * @retval The status.
Manu_L 3:b06e38d365d7 92 */
Manu_L 3:b06e38d365d7 93 virtual unsigned int GetBridgeStatus(unsigned int) = 0;
Manu_L 3:b06e38d365d7 94
Manu_L 3:b06e38d365d7 95 /**
Manu_L 3:b06e38d365d7 96 * @brief Getting the device State.
Manu_L 3:b06e38d365d7 97 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
Manu_L 3:b06e38d365d7 98 * @retval The device state
Manu_L 3:b06e38d365d7 99 */
Manu_L 3:b06e38d365d7 100 virtual motorState_t GetDeviceState(unsigned int) = 0;
Manu_L 3:b06e38d365d7 101
Manu_L 3:b06e38d365d7 102 /**
Manu_L 3:b06e38d365d7 103 * @brief Getting the current speed in % of the specified motor.
Manu_L 3:b06e38d365d7 104 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
Manu_L 3:b06e38d365d7 105 * @retval The current speed in %.
Manu_L 3:b06e38d365d7 106 */
Manu_L 3:b06e38d365d7 107 virtual unsigned int GetSpeed(unsigned int) = 0;
Manu_L 3:b06e38d365d7 108
Manu_L 3:b06e38d365d7 109 /**
Manu_L 3:b06e38d365d7 110 * @brief Stopping the motor and disabling the power bridge immediately.
Manu_L 3:b06e38d365d7 111 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
Manu_L 3:b06e38d365d7 112 * @retval None.
Manu_L 3:b06e38d365d7 113 */
Manu_L 3:b06e38d365d7 114 virtual void HardHiZ(unsigned int) = 0;
Manu_L 3:b06e38d365d7 115
Manu_L 3:b06e38d365d7 116 /**
Manu_L 3:b06e38d365d7 117 * @brief Stopping the motor immediately.
Manu_L 3:b06e38d365d7 118 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
Manu_L 3:b06e38d365d7 119 * @retval None.
Manu_L 3:b06e38d365d7 120 */
Manu_L 3:b06e38d365d7 121 virtual void HardStop(unsigned int) = 0;
Manu_L 3:b06e38d365d7 122
Manu_L 3:b06e38d365d7 123 /**
Manu_L 3:b06e38d365d7 124 * @brief Running the motor.
Manu_L 3:b06e38d365d7 125 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
Manu_L 3:b06e38d365d7 126 * @param direction The direction of rotation.
Manu_L 3:b06e38d365d7 127 * @retval None.
Manu_L 3:b06e38d365d7 128 */
Manu_L 3:b06e38d365d7 129 virtual void Run(unsigned int, direction_t) = 0;
Manu_L 3:b06e38d365d7 130
Manu_L 3:b06e38d365d7 131 /**
Manu_L 3:b06e38d365d7 132 * @brief Setting the PWM frequency of the specified bridge.
Manu_L 3:b06e38d365d7 133 * @param bridgeId from 0 for bridge A to 1 for bridge B.
Manu_L 3:b06e38d365d7 134 * @param frequency of the PWM in Hz
Manu_L 3:b06e38d365d7 135 * @retval None.
Manu_L 3:b06e38d365d7 136 */
Manu_L 3:b06e38d365d7 137 virtual void SetBridgeInputPwmFreq(unsigned int, unsigned int) = 0;
Manu_L 3:b06e38d365d7 138
Manu_L 3:b06e38d365d7 139 /**
Manu_L 3:b06e38d365d7 140 * @brief Setting the dual bridge configuration mode.
Manu_L 3:b06e38d365d7 141 * @param configuration. The bridge configuration.
Manu_L 3:b06e38d365d7 142 * @retval None.
Manu_L 3:b06e38d365d7 143 */
Manu_L 3:b06e38d365d7 144 virtual void SetDualFullBridgeConfig(unsigned int) = 0;
Manu_L 3:b06e38d365d7 145
Manu_L 3:b06e38d365d7 146 /**
Manu_L 3:b06e38d365d7 147 * @brief Setting the speed in %.
Manu_L 3:b06e38d365d7 148 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
Manu_L 3:b06e38d365d7 149 * @param speed The new speed in %.
Manu_L 3:b06e38d365d7 150 * @retval "true" in case of success, "false" otherwise.
Manu_L 3:b06e38d365d7 151 */
Manu_L 3:b06e38d365d7 152 virtual bool SetSpeed(unsigned int, unsigned int) = 0;
Manu_L 3:b06e38d365d7 153
Manu_L 3:b06e38d365d7 154
Manu_L 3:b06e38d365d7 155 };
Manu_L 3:b06e38d365d7 156
Manu_L 3:b06e38d365d7 157 #endif /* __BCDMMOTOR_CLASS_H */
Manu_L 3:b06e38d365d7 158
Manu_L 3:b06e38d365d7 159 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/