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:
brdirais
Date:
Tue May 17 12:14:35 2016 +0000
Revision:
2:65057305b86e
Parent:
1:2597a6165252
Child:
3:b06e38d365d7
Change 1E6 by 1000000

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brdirais 0:2cb6ce8e07bd 1 /**
brdirais 0:2cb6ce8e07bd 2 ******************************************************************************
brdirais 0:2cb6ce8e07bd 3 * @file l6206_class.h
brdirais 0:2cb6ce8e07bd 4 * @author IPC Rennes
brdirais 0:2cb6ce8e07bd 5 * @version V1.1.0
brdirais 0:2cb6ce8e07bd 6 * @date March 02, 2016
brdirais 0:2cb6ce8e07bd 7 * @brief L6206 driver (dual full bridge driver)
brdirais 0:2cb6ce8e07bd 8 * @note (C) COPYRIGHT 2015 STMicroelectronics
brdirais 0:2cb6ce8e07bd 9 ******************************************************************************
brdirais 0:2cb6ce8e07bd 10 * @attention
brdirais 0:2cb6ce8e07bd 11 *
brdirais 0:2cb6ce8e07bd 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
brdirais 0:2cb6ce8e07bd 13 *
brdirais 0:2cb6ce8e07bd 14 * Redistribution and use in source and binary forms, with or without modification,
brdirais 0:2cb6ce8e07bd 15 * are permitted provided that the following conditions are met:
brdirais 0:2cb6ce8e07bd 16 * 1. Redistributions of source code must retain the above copyright notice,
brdirais 0:2cb6ce8e07bd 17 * this list of conditions and the following disclaimer.
brdirais 0:2cb6ce8e07bd 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
brdirais 0:2cb6ce8e07bd 19 * this list of conditions and the following disclaimer in the documentation
brdirais 0:2cb6ce8e07bd 20 * and/or other materials provided with the distribution.
brdirais 0:2cb6ce8e07bd 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
brdirais 0:2cb6ce8e07bd 22 * may be used to endorse or promote products derived from this software
brdirais 0:2cb6ce8e07bd 23 * without specific prior written permission.
brdirais 0:2cb6ce8e07bd 24 *
brdirais 0:2cb6ce8e07bd 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
brdirais 0:2cb6ce8e07bd 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
brdirais 0:2cb6ce8e07bd 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
brdirais 0:2cb6ce8e07bd 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
brdirais 0:2cb6ce8e07bd 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
brdirais 0:2cb6ce8e07bd 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
brdirais 0:2cb6ce8e07bd 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
brdirais 0:2cb6ce8e07bd 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
brdirais 0:2cb6ce8e07bd 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
brdirais 0:2cb6ce8e07bd 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
brdirais 0:2cb6ce8e07bd 35 *
brdirais 0:2cb6ce8e07bd 36 ******************************************************************************
brdirais 0:2cb6ce8e07bd 37 */
brdirais 0:2cb6ce8e07bd 38
brdirais 0:2cb6ce8e07bd 39
brdirais 0:2cb6ce8e07bd 40 /* Generated with STM32CubeTOO -----------------------------------------------*/
brdirais 0:2cb6ce8e07bd 41
brdirais 0:2cb6ce8e07bd 42
brdirais 0:2cb6ce8e07bd 43 /* Revision ------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 44 /*
brdirais 0:2cb6ce8e07bd 45 Repository: http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
brdirais 0:2cb6ce8e07bd 46 Branch/Trunk/Tag: trunk
brdirais 0:2cb6ce8e07bd 47 Based on: X-CUBE-SPN4/trunk/Drivers/BSP/Components/l6206/l6206.h
brdirais 0:2cb6ce8e07bd 48 Revision: 0
brdirais 0:2cb6ce8e07bd 49 */
brdirais 0:2cb6ce8e07bd 50
brdirais 0:2cb6ce8e07bd 51
brdirais 0:2cb6ce8e07bd 52 /* Define to prevent recursive inclusion -------------------------------------*/
brdirais 0:2cb6ce8e07bd 53
brdirais 0:2cb6ce8e07bd 54 #ifndef __L6206_CLASS_H
brdirais 0:2cb6ce8e07bd 55 #define __L6206_CLASS_H
brdirais 0:2cb6ce8e07bd 56
brdirais 0:2cb6ce8e07bd 57
brdirais 0:2cb6ce8e07bd 58 /* Includes ------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 59
brdirais 0:2cb6ce8e07bd 60 /* ACTION 1 ------------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 61 * Include here platform specific header files. *
brdirais 0:2cb6ce8e07bd 62 *----------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 63 #include "mbed.h"
brdirais 0:2cb6ce8e07bd 64 /* ACTION 2 ------------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 65 * Include here component specific header files. *
brdirais 0:2cb6ce8e07bd 66 *----------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 67 #include "l6206.h"
brdirais 0:2cb6ce8e07bd 68 /* ACTION 3 ------------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 69 * Include here interface specific header files. *
brdirais 0:2cb6ce8e07bd 70 * *
brdirais 0:2cb6ce8e07bd 71 * Example: *
brdirais 0:2cb6ce8e07bd 72 * #include "../Interfaces/Humidity_class.h" *
brdirais 0:2cb6ce8e07bd 73 * #include "../Interfaces/Temperature_class.h" *
brdirais 0:2cb6ce8e07bd 74 *----------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 75 #include "../Interfaces/Motor_class.h"
brdirais 0:2cb6ce8e07bd 76
brdirais 0:2cb6ce8e07bd 77
brdirais 0:2cb6ce8e07bd 78
brdirais 0:2cb6ce8e07bd 79 /* Private constants ---------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 80
brdirais 0:2cb6ce8e07bd 81 /** @defgroup L6206_Private_Constants L6206 Private Constants
brdirais 0:2cb6ce8e07bd 82 * @{
brdirais 0:2cb6ce8e07bd 83 */
brdirais 0:2cb6ce8e07bd 84
brdirais 0:2cb6ce8e07bd 85 /// The Number of L6206 devices required for initialisation is not supported
brdirais 0:2cb6ce8e07bd 86 #define L6206_ERROR_0 (0x8000)
brdirais 0:2cb6ce8e07bd 87 /// Error: Access a motor index greater than the one of the current brigde configuration
brdirais 0:2cb6ce8e07bd 88 #define L6206_ERROR_1 (0x8001)
brdirais 0:2cb6ce8e07bd 89 /// Error: Access a motor index which is not bidirectionnal
brdirais 0:2cb6ce8e07bd 90 #define L6206_ERROR_2 (0x8002)
brdirais 0:2cb6ce8e07bd 91
brdirais 0:2cb6ce8e07bd 92 /// Maximum frequency of the PWMs in Hz
brdirais 0:2cb6ce8e07bd 93 #define L6206_MAX_PWM_FREQ (100000)
brdirais 0:2cb6ce8e07bd 94
brdirais 0:2cb6ce8e07bd 95 /// Minimum frequency of the PWMs in Hz
brdirais 0:2cb6ce8e07bd 96 #define L6206_MIN_PWM_FREQ (2)
brdirais 0:2cb6ce8e07bd 97
brdirais 0:2cb6ce8e07bd 98 /// Bridge Input 1A
brdirais 0:2cb6ce8e07bd 99 #define INPUT_1A (0)
brdirais 0:2cb6ce8e07bd 100 /// Bridge Input 2A
brdirais 0:2cb6ce8e07bd 101 #define INPUT_2A (1)
brdirais 0:2cb6ce8e07bd 102 /// Bridge Input 1B
brdirais 0:2cb6ce8e07bd 103 #define INPUT_1B (2)
brdirais 0:2cb6ce8e07bd 104 /// Bridge Input 2B
brdirais 0:2cb6ce8e07bd 105 #define INPUT_2B (3)
brdirais 0:2cb6ce8e07bd 106
brdirais 0:2cb6ce8e07bd 107 /// Bridge A
brdirais 0:2cb6ce8e07bd 108 #define BRIDGE_A (0)
brdirais 0:2cb6ce8e07bd 109 /// Bridge B
brdirais 0:2cb6ce8e07bd 110 #define BRIDGE_B (1)
brdirais 0:2cb6ce8e07bd 111
brdirais 0:2cb6ce8e07bd 112
brdirais 0:2cb6ce8e07bd 113
brdirais 0:2cb6ce8e07bd 114
brdirais 0:2cb6ce8e07bd 115
brdirais 0:2cb6ce8e07bd 116 /* Classes -------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 117
brdirais 0:2cb6ce8e07bd 118 /**
brdirais 0:2cb6ce8e07bd 119 * @brief Class representing a L6206 component.
brdirais 0:2cb6ce8e07bd 120 */
brdirais 0:2cb6ce8e07bd 121 class L6206 : public Motor
brdirais 0:2cb6ce8e07bd 122 {
brdirais 0:2cb6ce8e07bd 123 public:
brdirais 0:2cb6ce8e07bd 124
brdirais 0:2cb6ce8e07bd 125 /*** Constructor and Destructor Methods ***/
brdirais 0:2cb6ce8e07bd 126
brdirais 0:2cb6ce8e07bd 127 /**
brdirais 0:2cb6ce8e07bd 128 * @brief Constructor.
brdirais 0:2cb6ce8e07bd 129 */
brdirais 0:2cb6ce8e07bd 130 L6206(PinName EN_flag_A, PinName EN_flag_B, PinName pwm_1A, PinName pwm_2A, PinName pwm_1B, PinName pwm_2B) : Motor(), flag_A_irq(EN_flag_A), flag_B_irq(EN_flag_B), EN_flag_A(EN_flag_A), EN_flag_B(EN_flag_B), pwm_1A(pwm_1A), pwm_2A(pwm_2A), pwm_1B(pwm_1B), pwm_2B(pwm_2B)
brdirais 0:2cb6ce8e07bd 131 {
brdirais 0:2cb6ce8e07bd 132 /* ACTION 4 ----------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 133 * Initialize here the component's member variables, one variable per *
brdirais 0:2cb6ce8e07bd 134 * line. *
brdirais 0:2cb6ce8e07bd 135 * *
brdirais 0:2cb6ce8e07bd 136 * Example: *
brdirais 0:2cb6ce8e07bd 137 * measure = 0; *
brdirais 0:2cb6ce8e07bd 138 * instance_id = number_of_instances++; *
brdirais 0:2cb6ce8e07bd 139 *--------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 140
brdirais 0:2cb6ce8e07bd 141 flagInterruptCallback = 0;
brdirais 0:2cb6ce8e07bd 142 errorHandlerCallback = 0;
brdirais 0:2cb6ce8e07bd 143 numberOfDevices = 0;
brdirais 0:2cb6ce8e07bd 144 deviceInstance = 0;
brdirais 0:2cb6ce8e07bd 145 }
brdirais 0:2cb6ce8e07bd 146
brdirais 0:2cb6ce8e07bd 147 /**
brdirais 0:2cb6ce8e07bd 148 * @brief Destructor.
brdirais 0:2cb6ce8e07bd 149 */
brdirais 0:2cb6ce8e07bd 150 virtual ~L6206(void) {}
brdirais 0:2cb6ce8e07bd 151
brdirais 0:2cb6ce8e07bd 152
brdirais 0:2cb6ce8e07bd 153 /*** Public Component Related Methods ***/
brdirais 0:2cb6ce8e07bd 154
brdirais 0:2cb6ce8e07bd 155 /* ACTION 5 --------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 156 * Implement here the component's public methods, as wrappers of the C *
brdirais 0:2cb6ce8e07bd 157 * component's functions. *
brdirais 0:2cb6ce8e07bd 158 * They should be: *
brdirais 0:2cb6ce8e07bd 159 * + Methods with the same name of the C component's virtual table's *
brdirais 0:2cb6ce8e07bd 160 * functions (1); *
brdirais 0:2cb6ce8e07bd 161 * + Methods with the same name of the C component's extended virtual *
brdirais 0:2cb6ce8e07bd 162 * table's functions, if any (2). *
brdirais 0:2cb6ce8e07bd 163 * *
brdirais 0:2cb6ce8e07bd 164 * Example: *
brdirais 0:2cb6ce8e07bd 165 * virtual int GetValue(float *f) //(1) *
brdirais 0:2cb6ce8e07bd 166 * { *
brdirais 0:2cb6ce8e07bd 167 * return COMPONENT_GetValue(float *f); *
brdirais 0:2cb6ce8e07bd 168 * } *
brdirais 0:2cb6ce8e07bd 169 * *
brdirais 0:2cb6ce8e07bd 170 * virtual int EnableFeature(void) //(2) *
brdirais 0:2cb6ce8e07bd 171 * { *
brdirais 0:2cb6ce8e07bd 172 * return COMPONENT_EnableFeature(); *
brdirais 0:2cb6ce8e07bd 173 * } *
brdirais 0:2cb6ce8e07bd 174 *------------------------------------------------------------------------*/
brdirais 1:2597a6165252 175
brdirais 1:2597a6165252 176 /**
brdirais 1:2597a6165252 177 * @brief Initializing the component.
brdirais 1:2597a6165252 178 * @param init Pointer to device specific initalization structure.
brdirais 1:2597a6165252 179 * @retval "0" in case of success, an error code otherwise.
brdirais 1:2597a6165252 180 */
brdirais 0:2cb6ce8e07bd 181 virtual int Init(void *init = NULL)
brdirais 0:2cb6ce8e07bd 182 {
brdirais 0:2cb6ce8e07bd 183 return (int) L6206_Init((void *) init);
brdirais 0:2cb6ce8e07bd 184 }
brdirais 1:2597a6165252 185
brdirais 1:2597a6165252 186 /**
brdirais 1:2597a6165252 187 * @brief Getting the ID of the component.
brdirais 1:2597a6165252 188 * @param id Pointer to an allocated variable to store the ID into.
brdirais 1:2597a6165252 189 * @retval "0" in case of success, an error code otherwise.
brdirais 1:2597a6165252 190 */
brdirais 0:2cb6ce8e07bd 191 virtual int ReadID(uint8_t *id = NULL)
brdirais 0:2cb6ce8e07bd 192 {
brdirais 0:2cb6ce8e07bd 193 return (int) L6206_ReadId((uint8_t *) id);
brdirais 0:2cb6ce8e07bd 194 }
brdirais 0:2cb6ce8e07bd 195
brdirais 1:2597a6165252 196
brdirais 1:2597a6165252 197 /**
brdirais 1:2597a6165252 198 * @brief Attaches a user callback to the error Handler.
brdirais 1:2597a6165252 199 * The call back will be then called each time the library detects an error
brdirais 1:2597a6165252 200 * @param[in] callback Name of the callback to attach to the error Hanlder
brdirais 1:2597a6165252 201 * @retval None
brdirais 1:2597a6165252 202 */
brdirais 0:2cb6ce8e07bd 203 virtual void AttachErrorHandler(void (*callback)(uint16_t error))
brdirais 0:2cb6ce8e07bd 204 {
brdirais 0:2cb6ce8e07bd 205 L6206_AttachErrorHandler((void (*)(uint16_t error)) callback);
brdirais 0:2cb6ce8e07bd 206 }
brdirais 0:2cb6ce8e07bd 207
brdirais 1:2597a6165252 208
brdirais 1:2597a6165252 209 /**
brdirais 1:2597a6165252 210 * @brief Attaches a user callback to the flag Interrupt
brdirais 1:2597a6165252 211 * The call back will be then called each time the status
brdirais 1:2597a6165252 212 * flag pin will be pulled down due to the occurrence of
brdirais 1:2597a6165252 213 * a programmed alarms ( OCD, thermal alert)
brdirais 1:2597a6165252 214 * @param[in] callback Name of the callback to attach
brdirais 1:2597a6165252 215 * to the Flag Interrupt
brdirais 1:2597a6165252 216 * @retval None
brdirais 1:2597a6165252 217 */
brdirais 0:2cb6ce8e07bd 218 virtual void AttachFlagInterrupt(void (*callback)(void))
brdirais 0:2cb6ce8e07bd 219 {
brdirais 0:2cb6ce8e07bd 220 L6206_AttachFlagInterrupt((void (*)(void)) callback);
brdirais 0:2cb6ce8e07bd 221 }
brdirais 0:2cb6ce8e07bd 222
brdirais 1:2597a6165252 223 /**
brdirais 1:2597a6165252 224 * @brief Returns the current speed of the specified motor
brdirais 1:2597a6165252 225 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 226 * @retval current speed in % from 0 to 100
brdirais 1:2597a6165252 227 */
brdirais 0:2cb6ce8e07bd 228 virtual uint16_t GetCurrentSpeed(uint8_t motorId)
brdirais 0:2cb6ce8e07bd 229 {
brdirais 0:2cb6ce8e07bd 230 return (uint16_t) L6206_GetCurrentSpeed((uint8_t) motorId);
brdirais 0:2cb6ce8e07bd 231 }
brdirais 0:2cb6ce8e07bd 232
brdirais 1:2597a6165252 233 /**
brdirais 1:2597a6165252 234 * @brief Returns the device state
brdirais 1:2597a6165252 235 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 236 * @retval State (STEADY or INACTIVE)
brdirais 1:2597a6165252 237 */
brdirais 0:2cb6ce8e07bd 238 virtual motorState_t GetDeviceState(uint8_t motorId)
brdirais 0:2cb6ce8e07bd 239 {
brdirais 0:2cb6ce8e07bd 240 return (motorState_t) L6206_GetDeviceState((uint8_t) motorId);
brdirais 0:2cb6ce8e07bd 241 }
brdirais 0:2cb6ce8e07bd 242
brdirais 1:2597a6165252 243 /**
brdirais 1:2597a6165252 244 * @brief Returns the FW version of the library
brdirais 1:2597a6165252 245 * @retval L6206_FW_VERSION
brdirais 1:2597a6165252 246 */
brdirais 0:2cb6ce8e07bd 247 virtual uint8_t GetFwVersion(void)
brdirais 0:2cb6ce8e07bd 248 {
brdirais 0:2cb6ce8e07bd 249 return (uint8_t) L6206_GetFwVersion();
brdirais 0:2cb6ce8e07bd 250 }
brdirais 0:2cb6ce8e07bd 251
brdirais 1:2597a6165252 252 /**
brdirais 1:2597a6165252 253 * @brief Returns the max speed of the specified motor
brdirais 1:2597a6165252 254 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 255 * @retval maxSpeed in % from 0 to 100
brdirais 1:2597a6165252 256 */
brdirais 0:2cb6ce8e07bd 257 virtual uint16_t GetMaxSpeed(uint8_t motorId)
brdirais 0:2cb6ce8e07bd 258 {
brdirais 0:2cb6ce8e07bd 259 return (uint16_t) L6206_GetMaxSpeed((uint8_t) motorId);
brdirais 0:2cb6ce8e07bd 260 }
brdirais 0:2cb6ce8e07bd 261
brdirais 1:2597a6165252 262 /**
brdirais 1:2597a6165252 263 * @brief Stops the motor without disabling the bridge
brdirais 1:2597a6165252 264 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 265 * @retval none
brdirais 1:2597a6165252 266 */
brdirais 0:2cb6ce8e07bd 267 virtual void HardStop(uint8_t motorId)
brdirais 0:2cb6ce8e07bd 268 {
brdirais 0:2cb6ce8e07bd 269 L6206_HardStop((uint8_t) motorId);
brdirais 0:2cb6ce8e07bd 270 }
brdirais 0:2cb6ce8e07bd 271
brdirais 1:2597a6165252 272 /**
brdirais 1:2597a6165252 273 * @brief Runs the motor
brdirais 1:2597a6165252 274 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 275 * @param[in] direction FORWARD or BACKWARD
brdirais 1:2597a6165252 276 * @retval None
brdirais 1:2597a6165252 277 * @note For unidirectionnal motor, direction parameter has no effect
brdirais 1:2597a6165252 278 */
brdirais 0:2cb6ce8e07bd 279 virtual void Run(uint8_t stepCount, motorDir_t direction)
brdirais 0:2cb6ce8e07bd 280 {
brdirais 0:2cb6ce8e07bd 281 L6206_Run((uint8_t) stepCount, (motorDir_t) direction);
brdirais 0:2cb6ce8e07bd 282 }
brdirais 0:2cb6ce8e07bd 283
brdirais 1:2597a6165252 284 /**
brdirais 1:2597a6165252 285 * @brief Changes the max speed of the specified device
brdirais 1:2597a6165252 286 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 287 * @param[in] newMaxSpeed in % from 0 to 100
brdirais 1:2597a6165252 288 * @retval true if the command is successfully executed, else false
brdirais 1:2597a6165252 289 */
brdirais 0:2cb6ce8e07bd 290 virtual bool SetMaxSpeed(uint8_t motorId, uint16_t newMaxSpeed)
brdirais 0:2cb6ce8e07bd 291 {
brdirais 0:2cb6ce8e07bd 292 return (bool) L6206_SetMaxSpeed((uint8_t) motorId, (uint16_t) newMaxSpeed);
brdirais 0:2cb6ce8e07bd 293 }
brdirais 0:2cb6ce8e07bd 294
brdirais 1:2597a6165252 295 /**
brdirais 1:2597a6165252 296 * @brief Disable the specified bridge
brdirais 1:2597a6165252 297 * @param[in] bridgeId (from 0 for bridge A to 1 for bridge B)
brdirais 1:2597a6165252 298 * @retval None
brdirais 1:2597a6165252 299 * @note When input of different brigdes are parallelized
brdirais 1:2597a6165252 300 * together, the disabling of one bridge leads to the disabling
brdirais 1:2597a6165252 301 * of the second one
brdirais 1:2597a6165252 302 */
brdirais 0:2cb6ce8e07bd 303 virtual void CmdDisable(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 304 {
brdirais 0:2cb6ce8e07bd 305 L6206_DisableBridge((uint8_t) bridgeId);
brdirais 0:2cb6ce8e07bd 306 }
brdirais 0:2cb6ce8e07bd 307
brdirais 1:2597a6165252 308 /**
brdirais 1:2597a6165252 309 * @brief Enable the specified bridge
brdirais 1:2597a6165252 310 * @param[in] bridgeId (from 0 for bridge A to 1 for bridge B)
brdirais 1:2597a6165252 311 * @retval None
brdirais 1:2597a6165252 312 * @note When input of different brigdes are parallelized
brdirais 1:2597a6165252 313 * together, the enabling of one bridge leads to the enabling
brdirais 1:2597a6165252 314 * of the second one
brdirais 1:2597a6165252 315 */
brdirais 0:2cb6ce8e07bd 316 virtual void CmdEnable(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 317 {
brdirais 0:2cb6ce8e07bd 318 L6206_EnableBridge((uint8_t) bridgeId);
brdirais 0:2cb6ce8e07bd 319 }
brdirais 0:2cb6ce8e07bd 320
brdirais 1:2597a6165252 321 /**
brdirais 1:2597a6165252 322 * @brief Get the status of the bridge enabling of the corresponding bridge
brdirais 1:2597a6165252 323 * @param[in] bridgeId from 0 for bridge A to 1 for bridge B
brdirais 1:2597a6165252 324 * @retval State of the Enable&Flag pin of the corresponding bridge (1 set, 0 for reset)
brdirais 1:2597a6165252 325 */
brdirais 0:2cb6ce8e07bd 326 virtual uint16_t CmdGetStatus(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 327 {
brdirais 0:2cb6ce8e07bd 328 return (uint16_t) L6206_GetBridgeStatus((uint8_t) bridgeId);
brdirais 0:2cb6ce8e07bd 329 }
brdirais 0:2cb6ce8e07bd 330
brdirais 1:2597a6165252 331 /**
brdirais 1:2597a6165252 332 * @brief Immediatly stops the motor and disable the power bridge
brdirais 1:2597a6165252 333 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 334 * @retval None
brdirais 1:2597a6165252 335 * @note if two motors uses the same power bridge, the
brdirais 1:2597a6165252 336 * power bridge will be disable only if the two motors are stopped
brdirais 1:2597a6165252 337 */
brdirais 0:2cb6ce8e07bd 338 virtual void CmdHardHiZ(uint8_t motorId)
brdirais 0:2cb6ce8e07bd 339 {
brdirais 0:2cb6ce8e07bd 340 L6206_HardHiz((uint8_t) motorId);
brdirais 0:2cb6ce8e07bd 341 }
brdirais 1:2597a6165252 342
brdirais 1:2597a6165252 343 /**
brdirais 1:2597a6165252 344 * @brief Error handler which calls the user callback (if defined)
brdirais 1:2597a6165252 345 * @param[in] error Number of the error
brdirais 1:2597a6165252 346 * @retval None
brdirais 1:2597a6165252 347 */
brdirais 0:2cb6ce8e07bd 348 virtual void ErrorHandler(uint16_t error)
brdirais 0:2cb6ce8e07bd 349 {
brdirais 0:2cb6ce8e07bd 350 L6206_ErrorHandler((uint16_t) error);
brdirais 0:2cb6ce8e07bd 351 }
brdirais 0:2cb6ce8e07bd 352
brdirais 1:2597a6165252 353 /**
brdirais 1:2597a6165252 354 * @brief Set dual full bridge parallelling configuration
brdirais 1:2597a6165252 355 * @param[in] newConfig bridge configuration to apply from
brdirais 1:2597a6165252 356 * dualFullBridgeConfig_t enum
brdirais 1:2597a6165252 357 * @retval None
brdirais 1:2597a6165252 358 */
brdirais 0:2cb6ce8e07bd 359 virtual void SetDualFullBridgeConfig(uint8_t newConfig)
brdirais 0:2cb6ce8e07bd 360 {
brdirais 0:2cb6ce8e07bd 361 L6206_SetDualFullBridgeConfig((uint8_t) newConfig);
brdirais 0:2cb6ce8e07bd 362 }
brdirais 0:2cb6ce8e07bd 363
brdirais 1:2597a6165252 364 /**
brdirais 1:2597a6165252 365 * @brief Get the PWM frequency of the specified bridge
brdirais 1:2597a6165252 366 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
brdirais 1:2597a6165252 367 * @retval Freq in Hz
brdirais 1:2597a6165252 368 */
brdirais 0:2cb6ce8e07bd 369 virtual uint32_t GetBridgeInputPwmFreq(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 370 {
brdirais 0:2cb6ce8e07bd 371 return (uint32_t) L6206_GetBridgeInputPwmFreq((uint8_t) bridgeId);
brdirais 0:2cb6ce8e07bd 372 }
brdirais 0:2cb6ce8e07bd 373
brdirais 1:2597a6165252 374 /**
brdirais 1:2597a6165252 375 * @brief Changes the PWM frequency of the bridge input
brdirais 1:2597a6165252 376 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
brdirais 1:2597a6165252 377 * @param[in] newFreq in Hz
brdirais 1:2597a6165252 378 * @retval None
brdirais 1:2597a6165252 379 */
brdirais 0:2cb6ce8e07bd 380 virtual void SetBridgeInputPwmFreq(uint8_t bridgeId, uint32_t newFreq)
brdirais 0:2cb6ce8e07bd 381 {
brdirais 0:2cb6ce8e07bd 382 L6206_SetBridgeInputPwmFreq((uint8_t) bridgeId, (uint32_t) newFreq);
brdirais 0:2cb6ce8e07bd 383 }
brdirais 0:2cb6ce8e07bd 384
brdirais 1:2597a6165252 385 /**
brdirais 1:2597a6165252 386 * @brief Sets the number of devices to be used
brdirais 1:2597a6165252 387 * @param[in] nbDevices (from 1 to MAX_NUMBER_OF_DEVICES)
brdirais 1:2597a6165252 388 * @retval TRUE if successfull, FALSE if failure, attempt to set a number of
brdirais 1:2597a6165252 389 * devices greater than MAX_NUMBER_OF_DEVICES
brdirais 1:2597a6165252 390 */
brdirais 0:2cb6ce8e07bd 391 virtual bool SetNbDevices(uint8_t nbDevices)
brdirais 0:2cb6ce8e07bd 392 {
brdirais 0:2cb6ce8e07bd 393 return (bool) L6206_SetNbDevices((uint8_t) nbDevices);
brdirais 0:2cb6ce8e07bd 394 }
brdirais 0:2cb6ce8e07bd 395
brdirais 0:2cb6ce8e07bd 396
brdirais 0:2cb6ce8e07bd 397 /*** Public Interrupt Related Methods ***/
brdirais 0:2cb6ce8e07bd 398
brdirais 0:2cb6ce8e07bd 399 /* ACTION 6 --------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 400 * Implement here interrupt related methods, if any. *
brdirais 0:2cb6ce8e07bd 401 * Note that interrupt handling is platform dependent, e.g.: *
brdirais 0:2cb6ce8e07bd 402 * + mbed: *
brdirais 0:2cb6ce8e07bd 403 * InterruptIn feature_irq(pin); //Interrupt object. *
brdirais 0:2cb6ce8e07bd 404 * feature_irq.fall(callback); //Attach a callback. *
brdirais 0:2cb6ce8e07bd 405 * feature_irq.mode(PullNone); //Set interrupt mode. *
brdirais 0:2cb6ce8e07bd 406 * feature_irq.enable_irq(); //Enable interrupt. *
brdirais 0:2cb6ce8e07bd 407 * feature_irq.disable_irq(); //Disable interrupt. *
brdirais 0:2cb6ce8e07bd 408 * + Arduino: *
brdirais 0:2cb6ce8e07bd 409 * attachInterrupt(pin, callback, RISING); //Attach a callback. *
brdirais 0:2cb6ce8e07bd 410 * detachInterrupt(pin); //Detach a callback. *
brdirais 0:2cb6ce8e07bd 411 * *
brdirais 0:2cb6ce8e07bd 412 * Example (mbed): *
brdirais 0:2cb6ce8e07bd 413 * void AttachFeatureIRQ(void (*fptr) (void)) *
brdirais 0:2cb6ce8e07bd 414 * { *
brdirais 0:2cb6ce8e07bd 415 * feature_irq.fall(fptr); *
brdirais 0:2cb6ce8e07bd 416 * } *
brdirais 0:2cb6ce8e07bd 417 * *
brdirais 0:2cb6ce8e07bd 418 * void EnableFeatureIRQ(void) *
brdirais 0:2cb6ce8e07bd 419 * { *
brdirais 0:2cb6ce8e07bd 420 * feature_irq.enable_irq(); *
brdirais 0:2cb6ce8e07bd 421 * } *
brdirais 0:2cb6ce8e07bd 422 * *
brdirais 0:2cb6ce8e07bd 423 * void DisableFeatureIRQ(void) *
brdirais 0:2cb6ce8e07bd 424 * { *
brdirais 0:2cb6ce8e07bd 425 * feature_irq.disable_irq(); *
brdirais 0:2cb6ce8e07bd 426 * } *
brdirais 0:2cb6ce8e07bd 427 *------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 428
brdirais 0:2cb6ce8e07bd 429
brdirais 0:2cb6ce8e07bd 430 /**
brdirais 0:2cb6ce8e07bd 431 * @brief Enabling the FLAG interrupt handling.
brdirais 1:2597a6165252 432 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
brdirais 0:2cb6ce8e07bd 433 * @retval None.
brdirais 0:2cb6ce8e07bd 434 */
brdirais 1:2597a6165252 435 virtual void EnableFlagIRQ(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 436 {
brdirais 0:2cb6ce8e07bd 437 if (bridgeId == BRIDGE_A)
brdirais 0:2cb6ce8e07bd 438 {
brdirais 0:2cb6ce8e07bd 439 flag_A_irq.mode(PullUp);
brdirais 0:2cb6ce8e07bd 440 flag_A_irq.fall(this, &L6206::L6206_FlagInterruptHandler);
brdirais 0:2cb6ce8e07bd 441 }
brdirais 0:2cb6ce8e07bd 442 else
brdirais 0:2cb6ce8e07bd 443 {
brdirais 0:2cb6ce8e07bd 444 flag_B_irq.mode(PullUp);
brdirais 0:2cb6ce8e07bd 445 flag_B_irq.fall(this, &L6206::L6206_FlagInterruptHandler);
brdirais 0:2cb6ce8e07bd 446 }
brdirais 0:2cb6ce8e07bd 447 }
brdirais 0:2cb6ce8e07bd 448
brdirais 0:2cb6ce8e07bd 449 /**
brdirais 0:2cb6ce8e07bd 450 * @brief Disabling the FLAG interrupt handling.
brdirais 1:2597a6165252 451 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
brdirais 0:2cb6ce8e07bd 452 * @retval None.
brdirais 0:2cb6ce8e07bd 453 */
brdirais 1:2597a6165252 454 virtual void DisableFlagIRQ(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 455 {
brdirais 0:2cb6ce8e07bd 456 if (bridgeId == BRIDGE_A)
brdirais 0:2cb6ce8e07bd 457 flag_A_irq.fall(NULL);
brdirais 0:2cb6ce8e07bd 458 else
brdirais 0:2cb6ce8e07bd 459 flag_B_irq.fall(NULL);
brdirais 0:2cb6ce8e07bd 460 }
brdirais 0:2cb6ce8e07bd 461
brdirais 0:2cb6ce8e07bd 462
brdirais 0:2cb6ce8e07bd 463 /*** Public In/Out Related Methods ***/
brdirais 0:2cb6ce8e07bd 464
brdirais 1:2597a6165252 465
brdirais 0:2cb6ce8e07bd 466
brdirais 0:2cb6ce8e07bd 467 protected:
brdirais 0:2cb6ce8e07bd 468
brdirais 0:2cb6ce8e07bd 469 /*** Protected Component Related Methods ***/
brdirais 0:2cb6ce8e07bd 470
brdirais 0:2cb6ce8e07bd 471 /* ACTION 7 --------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 472 * Declare here the component's specific methods. *
brdirais 0:2cb6ce8e07bd 473 * They should be: *
brdirais 0:2cb6ce8e07bd 474 * + Methods with the same name of the C component's virtual table's *
brdirais 0:2cb6ce8e07bd 475 * functions (1); *
brdirais 0:2cb6ce8e07bd 476 * + Methods with the same name of the C component's extended virtual *
brdirais 0:2cb6ce8e07bd 477 * table's functions, if any (2); *
brdirais 0:2cb6ce8e07bd 478 * + Helper methods, if any, like functions declared in the component's *
brdirais 0:2cb6ce8e07bd 479 * source files but not pointed by the component's virtual table (3). *
brdirais 0:2cb6ce8e07bd 480 * *
brdirais 0:2cb6ce8e07bd 481 * Example: *
brdirais 0:2cb6ce8e07bd 482 * Status_t COMPONENT_GetValue(float *f); //(1) *
brdirais 0:2cb6ce8e07bd 483 * Status_t COMPONENT_EnableFeature(void); //(2) *
brdirais 0:2cb6ce8e07bd 484 * Status_t COMPONENT_ComputeAverage(void); //(3) *
brdirais 0:2cb6ce8e07bd 485 *------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 486 Status_t L6206_Init(void *init);
brdirais 0:2cb6ce8e07bd 487 Status_t L6206_ReadId(uint8_t *id);
brdirais 0:2cb6ce8e07bd 488 void L6206_TickHandler(uint8_t deviceId); //Handle the device state machine at each tick timer pulse end
brdirais 0:2cb6ce8e07bd 489 void L6206_AttachErrorHandler(void (*callback)(uint16_t error)); //Attach a user callback to the error handler
brdirais 0:2cb6ce8e07bd 490 void L6206_AttachFlagInterrupt(void (*callback)(void)); //Attach a user callback to the flag Interrupt
brdirais 0:2cb6ce8e07bd 491 void L6206_DisableBridge(uint8_t bridgeId); //Disable the specified bridge
brdirais 0:2cb6ce8e07bd 492 void L6206_EnableBridge(uint8_t bridgeId); //Enable the specified bridge
brdirais 0:2cb6ce8e07bd 493 uint16_t L6206_GetBridgeStatus(uint8_t deviceId); //Get bridge status
brdirais 0:2cb6ce8e07bd 494 uint16_t L6206_GetCurrentSpeed(uint8_t motorId); //Return the current speed in pps
brdirais 0:2cb6ce8e07bd 495 motorState_t L6206_GetDeviceState(uint8_t motorId); //Return the device state
brdirais 0:2cb6ce8e07bd 496 uint8_t L6206_GetFwVersion(void); //Return the FW version
brdirais 0:2cb6ce8e07bd 497 uint16_t L6206_GetMaxSpeed(uint8_t motorId); //Return the max speed in pps
brdirais 0:2cb6ce8e07bd 498 void L6206_HardHiz(uint8_t motorId); //Stop the motor and disable the power bridge
brdirais 0:2cb6ce8e07bd 499 void L6206_HardStop(uint8_t motorId); //Stop the motor without disabling the power bridge
brdirais 0:2cb6ce8e07bd 500 void L6206_Run(uint8_t motorId, motorDir_t direction); //Run the motor
brdirais 0:2cb6ce8e07bd 501 uint32_t L6206_GetBridgeInputPwmFreq(uint8_t bridgeId); // Get the PWM frequency of the bridge input
brdirais 0:2cb6ce8e07bd 502 void L6206_SetBridgeInputPwmFreq(uint8_t bridgeId, uint32_t newFreq); // Set the PWM frequency of the bridge input
brdirais 0:2cb6ce8e07bd 503 void L6206_SetDualFullBridgeConfig(uint8_t newConfig); // Set dual full bridge configuration
brdirais 0:2cb6ce8e07bd 504 bool L6206_SetMaxSpeed(uint8_t motorId,uint16_t newMaxSpeed); //Set the max speed in pps
brdirais 0:2cb6ce8e07bd 505 bool L6206_SetNbDevices(uint8_t nbDevices); //Set the number of driver devices
brdirais 0:2cb6ce8e07bd 506 void L6206_ErrorHandler(uint16_t error);
brdirais 0:2cb6ce8e07bd 507 void L6206_FlagInterruptHandler(void);
brdirais 0:2cb6ce8e07bd 508 uint8_t L6206_GetBridgeIdUsedByMotorId(uint8_t motorId);
brdirais 0:2cb6ce8e07bd 509 uint8_t L6206_GetBridgeInputUsedByMotorId(uint8_t motorId);
brdirais 0:2cb6ce8e07bd 510 uint8_t L6206_GetMotorIdUsingbridgeInput(uint8_t bridgeInput);
brdirais 0:2cb6ce8e07bd 511 uint8_t L6206_GetSecondBridgeInputUsedByMotorId(uint8_t motorId);
brdirais 0:2cb6ce8e07bd 512 bool L6206_IsBidirectionnalMotor(uint8_t motorId);
brdirais 0:2cb6ce8e07bd 513 void L6206_SetDeviceParamsToPredefinedValues(void);
brdirais 0:2cb6ce8e07bd 514 void L6206_SetDeviceParamsToGivenValues(L6206_Init_t* initDevicePrm);
brdirais 0:2cb6ce8e07bd 515
brdirais 0:2cb6ce8e07bd 516 /*** Component's I/O Methods ***/
brdirais 0:2cb6ce8e07bd 517
brdirais 0:2cb6ce8e07bd 518 /* ACTION 8 --------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 519 * Implement here other I/O methods beyond those already implemented *
brdirais 0:2cb6ce8e07bd 520 * above, which are declared extern within the component's header file. *
brdirais 0:2cb6ce8e07bd 521 *------------------------------------------------------------------------*/
brdirais 1:2597a6165252 522
brdirais 1:2597a6165252 523 /**
brdirais 1:2597a6165252 524 * @brief Utility function to set or unset EN pin for Bridge A or Bridge B.
brdirais 1:2597a6165252 525 * @param[out] none
brdirais 1:2597a6165252 526 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
brdirais 1:2597a6165252 527 * @retval none
brdirais 1:2597a6165252 528 */
brdirais 1:2597a6165252 529 void L6206_OutVal( uint8_t bridgeId, uint8_t val)
brdirais 1:2597a6165252 530 {
brdirais 1:2597a6165252 531 if( bridgeId == BRIDGE_A)
brdirais 1:2597a6165252 532 {
brdirais 1:2597a6165252 533 EN_flag_A.output();
brdirais 1:2597a6165252 534 EN_flag_A.mode(PullNone);
brdirais 1:2597a6165252 535 EN_flag_A.write(val);
brdirais 1:2597a6165252 536 }
brdirais 1:2597a6165252 537 else
brdirais 1:2597a6165252 538 {
brdirais 1:2597a6165252 539 EN_flag_B.output();
brdirais 1:2597a6165252 540 EN_flag_B.mode(PullNone);
brdirais 1:2597a6165252 541 EN_flag_B.write(val);
brdirais 1:2597a6165252 542 }
brdirais 1:2597a6165252 543 }
brdirais 1:2597a6165252 544
brdirais 1:2597a6165252 545 /**
brdirais 1:2597a6165252 546 * @brief Making the CPU wait.
brdirais 1:2597a6165252 547 * @param None.
brdirais 1:2597a6165252 548 * @retval None.
brdirais 1:2597a6165252 549 */
brdirais 0:2cb6ce8e07bd 550 void L6206_Board_Delay(uint32_t delay)
brdirais 0:2cb6ce8e07bd 551 {
brdirais 0:2cb6ce8e07bd 552 wait_ms(delay);
brdirais 0:2cb6ce8e07bd 553 }
brdirais 0:2cb6ce8e07bd 554
brdirais 1:2597a6165252 555 /**
brdirais 1:2597a6165252 556 * @brief Disable the specified bridge
brdirais 1:2597a6165252 557 * @param[in] bridgeId (from 0 for bridge A to 1 for bridge B)
brdirais 1:2597a6165252 558 * @retval None
brdirais 1:2597a6165252 559 * @note When input of different brigdes are parallelized
brdirais 1:2597a6165252 560 * together, the disabling of one bridge leads to the disabling
brdirais 1:2597a6165252 561 * of the second one
brdirais 1:2597a6165252 562 */
brdirais 0:2cb6ce8e07bd 563 void L6206_Board_DisableBridge(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 564 {
brdirais 0:2cb6ce8e07bd 565 DisableFlagIRQ(BRIDGE_A);
brdirais 0:2cb6ce8e07bd 566 DisableFlagIRQ(BRIDGE_B);
brdirais 0:2cb6ce8e07bd 567
brdirais 0:2cb6ce8e07bd 568 __disable_irq();
brdirais 1:2597a6165252 569 L6206_OutVal( bridgeId, 0);
brdirais 0:2cb6ce8e07bd 570 __enable_irq();
brdirais 0:2cb6ce8e07bd 571 }
brdirais 0:2cb6ce8e07bd 572
brdirais 1:2597a6165252 573 /**
brdirais 1:2597a6165252 574 * @brief Enable the specified bridge
brdirais 1:2597a6165252 575 * @param[in] bridgeId (from 0 for bridge A to 1 for bridge B)
brdirais 1:2597a6165252 576 * @retval None
brdirais 1:2597a6165252 577 * @note When input of different brigdes are parallelized
brdirais 1:2597a6165252 578 * together, the enabling of one bridge leads to the enabling
brdirais 1:2597a6165252 579 * of the second one
brdirais 1:2597a6165252 580 */
brdirais 0:2cb6ce8e07bd 581 void L6206_Board_EnableBridge(uint8_t bridgeId, uint8_t addDelay)
brdirais 0:2cb6ce8e07bd 582 {
brdirais 1:2597a6165252 583 L6206_OutVal( bridgeId, 1);
brdirais 0:2cb6ce8e07bd 584
brdirais 0:2cb6ce8e07bd 585 if (addDelay != 0)
brdirais 0:2cb6ce8e07bd 586 {
brdirais 0:2cb6ce8e07bd 587 wait_ms(BSP_MOTOR_CONTROL_BOARD_BRIDGE_TURN_ON_DELAY);
brdirais 0:2cb6ce8e07bd 588 }
brdirais 0:2cb6ce8e07bd 589
brdirais 0:2cb6ce8e07bd 590 EnableFlagIRQ( bridgeId);
brdirais 0:2cb6ce8e07bd 591 }
brdirais 0:2cb6ce8e07bd 592
brdirais 1:2597a6165252 593 /**
brdirais 1:2597a6165252 594 * @brief Returns the FLAG pin state.
brdirais 1:2597a6165252 595 * @param[in] bridgeId (from 0 for bridge A to 1 for bridge B)
brdirais 1:2597a6165252 596 * @retval The FLAG pin value.
brdirais 1:2597a6165252 597 */
brdirais 0:2cb6ce8e07bd 598 uint32_t L6206_Board_GetFlagPinState(uint8_t bridgeId)
brdirais 0:2cb6ce8e07bd 599 {
brdirais 0:2cb6ce8e07bd 600 if (bridgeId == 0)
brdirais 0:2cb6ce8e07bd 601 {
brdirais 0:2cb6ce8e07bd 602 EN_flag_A.input();
brdirais 0:2cb6ce8e07bd 603 return EN_flag_A.read();
brdirais 0:2cb6ce8e07bd 604 }
brdirais 0:2cb6ce8e07bd 605 else
brdirais 0:2cb6ce8e07bd 606 {
brdirais 0:2cb6ce8e07bd 607 EN_flag_B.input();
brdirais 0:2cb6ce8e07bd 608 return EN_flag_B.read();
brdirais 0:2cb6ce8e07bd 609 }
brdirais 0:2cb6ce8e07bd 610 }
brdirais 0:2cb6ce8e07bd 611
brdirais 1:2597a6165252 612 /**
brdirais 1:2597a6165252 613 * @brief Initiliases the GPIOs used by the L6206s
brdirais 1:2597a6165252 614 * @retval None
brdirais 1:2597a6165252 615 */
brdirais 0:2cb6ce8e07bd 616 void L6206_Board_GpioInit(void)
brdirais 0:2cb6ce8e07bd 617 {
brdirais 0:2cb6ce8e07bd 618 /* Init bridge Enable */
brdirais 0:2cb6ce8e07bd 619 EN_flag_A.output();
brdirais 0:2cb6ce8e07bd 620 EN_flag_A.write(0);
brdirais 0:2cb6ce8e07bd 621 EN_flag_A.input();
brdirais 0:2cb6ce8e07bd 622
brdirais 0:2cb6ce8e07bd 623 EN_flag_B.output();
brdirais 0:2cb6ce8e07bd 624 EN_flag_B.write(0);
brdirais 0:2cb6ce8e07bd 625 EN_flag_B.input();
brdirais 0:2cb6ce8e07bd 626
brdirais 0:2cb6ce8e07bd 627
brdirais 0:2cb6ce8e07bd 628 /* Init flag Irq */
brdirais 0:2cb6ce8e07bd 629 DisableFlagIRQ(BRIDGE_A);
brdirais 0:2cb6ce8e07bd 630 DisableFlagIRQ(BRIDGE_B);
brdirais 0:2cb6ce8e07bd 631
brdirais 0:2cb6ce8e07bd 632 }
brdirais 0:2cb6ce8e07bd 633
brdirais 1:2597a6165252 634 /**
brdirais 1:2597a6165252 635 * @brief Sets the frequency of PWM used for bridges inputs
brdirais 1:2597a6165252 636 * @param[in] bridgeInput 0 for input 1A, 1 for input 2A,
brdirais 1:2597a6165252 637 * 2 for input 1B, 3 for input 2B
brdirais 1:2597a6165252 638 * @param[in] newFreq in Hz
brdirais 1:2597a6165252 639 * @param[in] duty Duty cycle
brdirais 1:2597a6165252 640 * @retval None
brdirais 1:2597a6165252 641 * @note The frequency is directly the current speed of the device
brdirais 1:2597a6165252 642 */
brdirais 0:2cb6ce8e07bd 643 void L6206_Board_PwmSetFreq(uint8_t bridgeInput, uint32_t newFreq, uint8_t duty)
brdirais 0:2cb6ce8e07bd 644 {
brdirais 0:2cb6ce8e07bd 645 /* Computing the period of PWM. */
brdirais 0:2cb6ce8e07bd 646 float period = 1.0f / newFreq;
brdirais 0:2cb6ce8e07bd 647 float duty_cycle;
brdirais 2:65057305b86e 648 int period_us = (int)(period * 1000000);
brdirais 0:2cb6ce8e07bd 649
brdirais 0:2cb6ce8e07bd 650 if (duty > 100) duty = 100;
brdirais 0:2cb6ce8e07bd 651 duty_cycle = (float)duty / 100.0f;
brdirais 0:2cb6ce8e07bd 652
brdirais 0:2cb6ce8e07bd 653 switch (bridgeInput)
brdirais 0:2cb6ce8e07bd 654 {
brdirais 0:2cb6ce8e07bd 655 case 0:
brdirais 0:2cb6ce8e07bd 656 default:
brdirais 0:2cb6ce8e07bd 657 /* Setting the period and the duty-cycle of PWM. */
brdirais 0:2cb6ce8e07bd 658 pwm_1A.period_us(period_us);
brdirais 0:2cb6ce8e07bd 659 pwm_1A.write(duty_cycle);
brdirais 0:2cb6ce8e07bd 660 break;
brdirais 0:2cb6ce8e07bd 661
brdirais 0:2cb6ce8e07bd 662 case 1:
brdirais 0:2cb6ce8e07bd 663 /* Setting the period and the duty-cycle of PWM. */
brdirais 0:2cb6ce8e07bd 664 pwm_2A.period_us(period_us);
brdirais 0:2cb6ce8e07bd 665 pwm_2A.write(duty_cycle);
brdirais 0:2cb6ce8e07bd 666 break;
brdirais 0:2cb6ce8e07bd 667
brdirais 0:2cb6ce8e07bd 668 case 2:
brdirais 0:2cb6ce8e07bd 669 /* Setting the period and the duty-cycle of PWM. */
brdirais 0:2cb6ce8e07bd 670 pwm_1B.period_us(period_us);
brdirais 0:2cb6ce8e07bd 671 pwm_1B.write(duty_cycle);
brdirais 0:2cb6ce8e07bd 672 break;
brdirais 0:2cb6ce8e07bd 673
brdirais 0:2cb6ce8e07bd 674 case 3:
brdirais 0:2cb6ce8e07bd 675 /* Setting the period and the duty-cycle of PWM. */
brdirais 0:2cb6ce8e07bd 676 pwm_2B.period_us(period_us);
brdirais 0:2cb6ce8e07bd 677 pwm_2B.write(duty_cycle);
brdirais 0:2cb6ce8e07bd 678 break;
brdirais 0:2cb6ce8e07bd 679 }
brdirais 0:2cb6ce8e07bd 680 }
brdirais 0:2cb6ce8e07bd 681
brdirais 1:2597a6165252 682 /**
brdirais 1:2597a6165252 683 * @brief Reset the PWM for the specified brigde input
brdirais 1:2597a6165252 684 * @param[in] bridgeInput 0 for input 1A, 1 for input 2A,
brdirais 1:2597a6165252 685 * 2 for input 1B, 3 for input 2B
brdirais 1:2597a6165252 686 * @retval None
brdirais 1:2597a6165252 687 */
brdirais 0:2cb6ce8e07bd 688 void L6206_Board_PwmDeInit(uint8_t bridgeInput)
brdirais 0:2cb6ce8e07bd 689 {
brdirais 0:2cb6ce8e07bd 690 switch (bridgeInput)
brdirais 0:2cb6ce8e07bd 691 {
brdirais 0:2cb6ce8e07bd 692 case 0:
brdirais 0:2cb6ce8e07bd 693 default:
brdirais 0:2cb6ce8e07bd 694 //timer_pwm_1A.detach();
brdirais 0:2cb6ce8e07bd 695 break;
brdirais 0:2cb6ce8e07bd 696
brdirais 0:2cb6ce8e07bd 697 case 1:
brdirais 0:2cb6ce8e07bd 698 //timer_pwm_2A.detach();
brdirais 0:2cb6ce8e07bd 699 break;
brdirais 0:2cb6ce8e07bd 700
brdirais 0:2cb6ce8e07bd 701 case 2:
brdirais 0:2cb6ce8e07bd 702 //timer_pwm_1B.detach();
brdirais 0:2cb6ce8e07bd 703 break;
brdirais 0:2cb6ce8e07bd 704
brdirais 0:2cb6ce8e07bd 705 case 3:
brdirais 0:2cb6ce8e07bd 706 //timer_pwm_2B.detach();
brdirais 0:2cb6ce8e07bd 707 break;
brdirais 0:2cb6ce8e07bd 708 }
brdirais 0:2cb6ce8e07bd 709 }
brdirais 0:2cb6ce8e07bd 710
brdirais 1:2597a6165252 711 /**
brdirais 1:2597a6165252 712 * @brief Set the PWM frequency the for the specified bridge input
brdirais 1:2597a6165252 713 * @param[in] bridgeInput 0 for input 1A, 1 for input 2A,
brdirais 1:2597a6165252 714 * 2 for input 1B, 3 for input 2B
brdirais 1:2597a6165252 715 * @retval None
brdirais 1:2597a6165252 716 */
brdirais 0:2cb6ce8e07bd 717 void L6206_Board_PwmInit(uint8_t bridgeInput)
brdirais 0:2cb6ce8e07bd 718 {
brdirais 0:2cb6ce8e07bd 719 }
brdirais 0:2cb6ce8e07bd 720
brdirais 1:2597a6165252 721 /**
brdirais 1:2597a6165252 722 * @brief Stops the PWM uses for the specified brige input
brdirais 1:2597a6165252 723 * @param[in] bridgeInput 0 for input 1A, 1 for input 2A,
brdirais 1:2597a6165252 724 * 2 for input 1B, 3 for input 2B
brdirais 1:2597a6165252 725 * @retval None
brdirais 1:2597a6165252 726 */
brdirais 0:2cb6ce8e07bd 727 void L6206_Board_PwmStop(uint8_t bridgeInput)
brdirais 0:2cb6ce8e07bd 728 {
brdirais 0:2cb6ce8e07bd 729 switch (bridgeInput)
brdirais 0:2cb6ce8e07bd 730 {
brdirais 0:2cb6ce8e07bd 731 case 0:
brdirais 0:2cb6ce8e07bd 732 default:
brdirais 0:2cb6ce8e07bd 733 pwm_1A.write(0.0);
brdirais 0:2cb6ce8e07bd 734 break;
brdirais 0:2cb6ce8e07bd 735
brdirais 0:2cb6ce8e07bd 736 case 1:
brdirais 0:2cb6ce8e07bd 737 pwm_2A.write(0.0);
brdirais 0:2cb6ce8e07bd 738 break;
brdirais 0:2cb6ce8e07bd 739
brdirais 0:2cb6ce8e07bd 740 case 2:
brdirais 0:2cb6ce8e07bd 741 pwm_1B.write(0.0);
brdirais 0:2cb6ce8e07bd 742 break;
brdirais 0:2cb6ce8e07bd 743
brdirais 0:2cb6ce8e07bd 744 case 3:
brdirais 0:2cb6ce8e07bd 745 pwm_2B.write(0.0);
brdirais 0:2cb6ce8e07bd 746 break;
brdirais 0:2cb6ce8e07bd 747 }
brdirais 0:2cb6ce8e07bd 748 }
brdirais 0:2cb6ce8e07bd 749
brdirais 0:2cb6ce8e07bd 750
brdirais 0:2cb6ce8e07bd 751 /*** Component's Instance Variables ***/
brdirais 0:2cb6ce8e07bd 752
brdirais 0:2cb6ce8e07bd 753 /* ACTION 9 --------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 754 * Declare here interrupt related variables, if needed. *
brdirais 0:2cb6ce8e07bd 755 * Note that interrupt handling is platform dependent, see *
brdirais 0:2cb6ce8e07bd 756 * "Interrupt Related Methods" above. *
brdirais 0:2cb6ce8e07bd 757 * *
brdirais 0:2cb6ce8e07bd 758 * Example: *
brdirais 0:2cb6ce8e07bd 759 * + mbed: *
brdirais 0:2cb6ce8e07bd 760 * InterruptIn feature_irq; *
brdirais 0:2cb6ce8e07bd 761 *------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 762
brdirais 0:2cb6ce8e07bd 763 /* Flag Interrupt. */
brdirais 0:2cb6ce8e07bd 764 InterruptIn flag_A_irq;
brdirais 0:2cb6ce8e07bd 765 InterruptIn flag_B_irq;
brdirais 0:2cb6ce8e07bd 766
brdirais 0:2cb6ce8e07bd 767 /* ACTION 10 -------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 768 * Declare here other pin related variables, if needed. *
brdirais 0:2cb6ce8e07bd 769 * *
brdirais 0:2cb6ce8e07bd 770 * Example: *
brdirais 0:2cb6ce8e07bd 771 * + mbed: *
brdirais 0:2cb6ce8e07bd 772 * DigitalOut standby_reset; *
brdirais 0:2cb6ce8e07bd 773 *------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 774
brdirais 0:2cb6ce8e07bd 775 /* Digital In/Out for Flag EN pin */
brdirais 0:2cb6ce8e07bd 776 DigitalInOut EN_flag_A;
brdirais 0:2cb6ce8e07bd 777 DigitalInOut EN_flag_B;
brdirais 0:2cb6ce8e07bd 778
brdirais 0:2cb6ce8e07bd 779 /* PWM Out pin */
brdirais 0:2cb6ce8e07bd 780 PwmOut pwm_1A;
brdirais 0:2cb6ce8e07bd 781 PwmOut pwm_2A;
brdirais 0:2cb6ce8e07bd 782 PwmOut pwm_1B;
brdirais 0:2cb6ce8e07bd 783 PwmOut pwm_2B;
brdirais 0:2cb6ce8e07bd 784
brdirais 0:2cb6ce8e07bd 785 /* ACTION 11 -------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 786 * Declare here communication related variables, if needed. *
brdirais 0:2cb6ce8e07bd 787 * *
brdirais 0:2cb6ce8e07bd 788 * Example: *
brdirais 0:2cb6ce8e07bd 789 * + mbed: *
brdirais 0:2cb6ce8e07bd 790 * DigitalOut address; *
brdirais 0:2cb6ce8e07bd 791 * DevI2C &dev_i2c; *
brdirais 0:2cb6ce8e07bd 792 *------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 793
brdirais 0:2cb6ce8e07bd 794 /* ACTION 12 -------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 795 * Declare here identity related variables, if needed. *
brdirais 0:2cb6ce8e07bd 796 * Note that there should be only a unique identifier for each component, *
brdirais 0:2cb6ce8e07bd 797 * which should be the "who_am_i" parameter. *
brdirais 0:2cb6ce8e07bd 798 *------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 799 /* Identity */
brdirais 0:2cb6ce8e07bd 800 uint8_t who_am_i;
brdirais 0:2cb6ce8e07bd 801
brdirais 0:2cb6ce8e07bd 802 /* ACTION 13 -------------------------------------------------------------*
brdirais 0:2cb6ce8e07bd 803 * Declare here the component's static and non-static data, one variable *
brdirais 0:2cb6ce8e07bd 804 * per line. *
brdirais 0:2cb6ce8e07bd 805 * *
brdirais 0:2cb6ce8e07bd 806 * Example: *
brdirais 0:2cb6ce8e07bd 807 * float measure; *
brdirais 0:2cb6ce8e07bd 808 * int instance_id; *
brdirais 0:2cb6ce8e07bd 809 * static int number_of_instances; *
brdirais 0:2cb6ce8e07bd 810 *------------------------------------------------------------------------*/
brdirais 0:2cb6ce8e07bd 811 void (*flagInterruptCallback)(void);
brdirais 0:2cb6ce8e07bd 812
brdirais 0:2cb6ce8e07bd 813 void (*errorHandlerCallback)(uint16_t error);
brdirais 0:2cb6ce8e07bd 814
brdirais 0:2cb6ce8e07bd 815 uint8_t numberOfDevices;
brdirais 0:2cb6ce8e07bd 816
brdirais 0:2cb6ce8e07bd 817 uint8_t deviceInstance;
brdirais 0:2cb6ce8e07bd 818
brdirais 0:2cb6ce8e07bd 819 deviceParams_t devicePrm;
brdirais 0:2cb6ce8e07bd 820
brdirais 0:2cb6ce8e07bd 821
brdirais 0:2cb6ce8e07bd 822 /** PWM timer variables */
brdirais 0:2cb6ce8e07bd 823
brdirais 0:2cb6ce8e07bd 824 bool pwm_1A_activated;
brdirais 0:2cb6ce8e07bd 825 bool pwm_2A_activated;
brdirais 0:2cb6ce8e07bd 826 bool pwm_1B_activated;
brdirais 0:2cb6ce8e07bd 827 bool pwm_2B_activated;
brdirais 0:2cb6ce8e07bd 828 };
brdirais 0:2cb6ce8e07bd 829
brdirais 0:2cb6ce8e07bd 830 #endif /* __L6206_CLASS_H */
brdirais 0:2cb6ce8e07bd 831
brdirais 0:2cb6ce8e07bd 832 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
brdirais 0:2cb6ce8e07bd 833
brdirais 0:2cb6ce8e07bd 834
brdirais 0:2cb6ce8e07bd 835