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 09:45:13 2016 +0000
Revision:
1:2597a6165252
Parent:
0:2cb6ce8e07bd
- Add of Doxygen comments to all functions where missing.; - Suppression of non-used library X-NUCLEO-COMMON; - Update of MBed SDK; - Update of comments in source code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brdirais 1:2597a6165252 1 /**
brdirais 1:2597a6165252 2 ******************************************************************************
brdirais 1:2597a6165252 3 * @file l6206_class.cpp
brdirais 1:2597a6165252 4 * @author IPC Rennes
brdirais 1:2597a6165252 5 * @version V1.1.0
brdirais 1:2597a6165252 6 * @date March 02, 2016
brdirais 1:2597a6165252 7 * @brief L6206 driver (dual full bridge driver)
brdirais 1:2597a6165252 8 * @note (C) COPYRIGHT 2015 STMicroelectronics
brdirais 1:2597a6165252 9 ******************************************************************************
brdirais 1:2597a6165252 10 * @attention
brdirais 1:2597a6165252 11 *
brdirais 1:2597a6165252 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
brdirais 1:2597a6165252 13 *
brdirais 1:2597a6165252 14 * Redistribution and use in source and binary forms, with or without modification,
brdirais 1:2597a6165252 15 * are permitted provided that the following conditions are met:
brdirais 1:2597a6165252 16 * 1. Redistributions of source code must retain the above copyright notice,
brdirais 1:2597a6165252 17 * this list of conditions and the following disclaimer.
brdirais 1:2597a6165252 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
brdirais 1:2597a6165252 19 * this list of conditions and the following disclaimer in the documentation
brdirais 1:2597a6165252 20 * and/or other materials provided with the distribution.
brdirais 1:2597a6165252 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
brdirais 1:2597a6165252 22 * may be used to endorse or promote products derived from this software
brdirais 1:2597a6165252 23 * without specific prior written permission.
brdirais 1:2597a6165252 24 *
brdirais 1:2597a6165252 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
brdirais 1:2597a6165252 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
brdirais 1:2597a6165252 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
brdirais 1:2597a6165252 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
brdirais 1:2597a6165252 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
brdirais 1:2597a6165252 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
brdirais 1:2597a6165252 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
brdirais 1:2597a6165252 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
brdirais 1:2597a6165252 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
brdirais 1:2597a6165252 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
brdirais 1:2597a6165252 35 *
brdirais 1:2597a6165252 36 ******************************************************************************
brdirais 1:2597a6165252 37 */
brdirais 1:2597a6165252 38
brdirais 1:2597a6165252 39
brdirais 1:2597a6165252 40 /* Generated with STM32CubeTOO -----------------------------------------------*/
brdirais 1:2597a6165252 41
brdirais 1:2597a6165252 42
brdirais 1:2597a6165252 43 /* Revision ------------------------------------------------------------------*/
brdirais 1:2597a6165252 44 /*
brdirais 1:2597a6165252 45 Repository: http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
brdirais 1:2597a6165252 46 Branch/Trunk/Tag: trunk
brdirais 1:2597a6165252 47 Based on: X-CUBE-SPN4/trunk/Drivers/BSP/Components/l6206/l6206.c
brdirais 1:2597a6165252 48 Revision: 0
brdirais 1:2597a6165252 49 */
brdirais 1:2597a6165252 50
brdirais 1:2597a6165252 51 /* Includes ------------------------------------------------------------------*/
brdirais 1:2597a6165252 52 #include "l6206_class.h"
brdirais 1:2597a6165252 53 #include "l6206.h"
brdirais 1:2597a6165252 54 #include "string.h"
brdirais 1:2597a6165252 55
brdirais 1:2597a6165252 56
brdirais 1:2597a6165252 57 /** @addtogroup BSP
brdirais 1:2597a6165252 58 * @{
brdirais 1:2597a6165252 59 */
brdirais 1:2597a6165252 60
brdirais 1:2597a6165252 61 /** @addtogroup Components
brdirais 1:2597a6165252 62 * @{
brdirais 1:2597a6165252 63 */
brdirais 1:2597a6165252 64
brdirais 1:2597a6165252 65 /** @addtogroup L6206
brdirais 1:2597a6165252 66 * @{
brdirais 1:2597a6165252 67 */
brdirais 1:2597a6165252 68
brdirais 1:2597a6165252 69 /* Private constants ---------------------------------------------------------*/
brdirais 1:2597a6165252 70
brdirais 1:2597a6165252 71
brdirais 1:2597a6165252 72 /* Private variables ---------------------------------------------------------*/
brdirais 1:2597a6165252 73
brdirais 1:2597a6165252 74 /** @defgroup L6206_Private_Variables L6206 Private Variables
brdirais 1:2597a6165252 75 * @{
brdirais 1:2597a6165252 76 */
brdirais 1:2597a6165252 77 static uint8_t l6206ArrayNbMaxMotorsByConfig[PARALLELING_END_ENUM] = {2,3,3,4,2,3,2,3,2,1,2,1,1};
brdirais 1:2597a6165252 78 /**
brdirais 1:2597a6165252 79 * @}
brdirais 1:2597a6165252 80 */
brdirais 1:2597a6165252 81
brdirais 1:2597a6165252 82 /* Private constant ---------------------------------------------------------*/
brdirais 1:2597a6165252 83
brdirais 1:2597a6165252 84
brdirais 1:2597a6165252 85 /* Public Function prototypes -----------------------------------------------*/
brdirais 0:2cb6ce8e07bd 86
brdirais 0:2cb6ce8e07bd 87
brdirais 0:2cb6ce8e07bd 88
brdirais 1:2597a6165252 89 /* Private function prototypes -----------------------------------------------*/
brdirais 1:2597a6165252 90
brdirais 1:2597a6165252 91 /** @defgroup L6206_Private_functions L6206 Private functions
brdirais 1:2597a6165252 92 * @{
brdirais 1:2597a6165252 93 */
brdirais 1:2597a6165252 94
brdirais 1:2597a6165252 95
brdirais 1:2597a6165252 96 /******************************************************//**
brdirais 1:2597a6165252 97 * @brief Attaches a user callback to the error Handler.
brdirais 1:2597a6165252 98 * The call back will be then called each time the library
brdirais 1:2597a6165252 99 * detects an error
brdirais 1:2597a6165252 100 * @param[in] callback Name of the callback to attach
brdirais 1:2597a6165252 101 * to the error Hanlder
brdirais 1:2597a6165252 102 * @retval None
brdirais 1:2597a6165252 103 **********************************************************/
brdirais 1:2597a6165252 104 void L6206::L6206_AttachErrorHandler(void (*callback)(uint16_t error))
brdirais 1:2597a6165252 105 {
brdirais 1:2597a6165252 106 errorHandlerCallback = (void (*)(uint16_t error)) callback;
brdirais 1:2597a6165252 107 }
brdirais 1:2597a6165252 108
brdirais 1:2597a6165252 109 /******************************************************//**
brdirais 1:2597a6165252 110 * @brief Attaches a user callback to the flag Interrupt
brdirais 1:2597a6165252 111 * The call back will be then called each time the status
brdirais 1:2597a6165252 112 * flag pin will be pulled down due to the occurrence of
brdirais 1:2597a6165252 113 * a programmed alarms ( OCD, thermal alert)
brdirais 1:2597a6165252 114 * @param[in] callback Name of the callback to attach
brdirais 1:2597a6165252 115 * to the Flag Interrupt
brdirais 1:2597a6165252 116 * @retval None
brdirais 1:2597a6165252 117 **********************************************************/
brdirais 1:2597a6165252 118 void L6206::L6206_AttachFlagInterrupt(void (*callback)(void))
brdirais 1:2597a6165252 119 {
brdirais 1:2597a6165252 120 flagInterruptCallback = (void (*)(void))callback;
brdirais 1:2597a6165252 121 }
brdirais 1:2597a6165252 122
brdirais 1:2597a6165252 123 /******************************************************//**
brdirais 1:2597a6165252 124 * @brief Disable the specified bridge
brdirais 1:2597a6165252 125 * @param[in] bridgeId (from 0 for bridge A to 1 for bridge B)
brdirais 1:2597a6165252 126 * @retval None
brdirais 1:2597a6165252 127 * @note When input of different brigdes are parallelized
brdirais 1:2597a6165252 128 * together, the disabling of one bridge leads to the disabling
brdirais 1:2597a6165252 129 * of the second one
brdirais 1:2597a6165252 130 **********************************************************/
brdirais 1:2597a6165252 131 void L6206::L6206_DisableBridge(uint8_t bridgeId)
brdirais 1:2597a6165252 132 {
brdirais 1:2597a6165252 133 L6206_Board_DisableBridge(bridgeId);
brdirais 1:2597a6165252 134
brdirais 1:2597a6165252 135 devicePrm.bridgeEnabled[bridgeId] = FALSE;
brdirais 1:2597a6165252 136 if (devicePrm.config >= PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR)
brdirais 1:2597a6165252 137 {
brdirais 1:2597a6165252 138 if (bridgeId == BRIDGE_A)
brdirais 1:2597a6165252 139 {
brdirais 1:2597a6165252 140 L6206_Board_DisableBridge(BRIDGE_B);
brdirais 1:2597a6165252 141 devicePrm.bridgeEnabled[BRIDGE_B] = FALSE;
brdirais 1:2597a6165252 142 }
brdirais 1:2597a6165252 143 else
brdirais 1:2597a6165252 144 {
brdirais 1:2597a6165252 145 L6206_Board_DisableBridge(BRIDGE_A);
brdirais 1:2597a6165252 146 devicePrm.bridgeEnabled[BRIDGE_A] = FALSE;
brdirais 1:2597a6165252 147 }
brdirais 1:2597a6165252 148 }
brdirais 1:2597a6165252 149 }
brdirais 1:2597a6165252 150
brdirais 1:2597a6165252 151 /******************************************************//**
brdirais 1:2597a6165252 152 * @brief Enable the specified bridge
brdirais 1:2597a6165252 153 * @param[in] bridgeId (from 0 for bridge A to 1 for bridge B)
brdirais 1:2597a6165252 154 * @retval None
brdirais 1:2597a6165252 155 * @note When input of different brigdes are parallelized
brdirais 1:2597a6165252 156 * together, the enabling of one bridge leads to the enabling
brdirais 1:2597a6165252 157 * of the second one
brdirais 1:2597a6165252 158 **********************************************************/
brdirais 1:2597a6165252 159 void L6206::L6206_EnableBridge(uint8_t bridgeId)
brdirais 1:2597a6165252 160 {
brdirais 1:2597a6165252 161 devicePrm.bridgeEnabled[bridgeId] = TRUE;
brdirais 1:2597a6165252 162 if (devicePrm.config >= PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR)
brdirais 1:2597a6165252 163 {
brdirais 1:2597a6165252 164 L6206_Board_EnableBridge(bridgeId, 0);
brdirais 1:2597a6165252 165 if (bridgeId == BRIDGE_A)
brdirais 1:2597a6165252 166 {
brdirais 1:2597a6165252 167 L6206_Board_EnableBridge(BRIDGE_B, 1);
brdirais 1:2597a6165252 168 devicePrm.bridgeEnabled[BRIDGE_B] = TRUE;
brdirais 1:2597a6165252 169 }
brdirais 1:2597a6165252 170 else
brdirais 1:2597a6165252 171 {
brdirais 1:2597a6165252 172 L6206_Board_EnableBridge(BRIDGE_A, 1);
brdirais 1:2597a6165252 173 devicePrm.bridgeEnabled[BRIDGE_A] = TRUE;
brdirais 1:2597a6165252 174 }
brdirais 1:2597a6165252 175 }
brdirais 1:2597a6165252 176 else
brdirais 1:2597a6165252 177 {
brdirais 1:2597a6165252 178 L6206_Board_EnableBridge(bridgeId, 1);
brdirais 1:2597a6165252 179 }
brdirais 1:2597a6165252 180 }
brdirais 1:2597a6165252 181
brdirais 1:2597a6165252 182 /******************************************************//**
brdirais 1:2597a6165252 183 * @brief Start the L6206 library
brdirais 1:2597a6165252 184 * @param[in] init pointer to the initialization data
brdirais 1:2597a6165252 185 * @retval None
brdirais 1:2597a6165252 186 **********************************************************/
brdirais 1:2597a6165252 187 Status_t L6206::L6206_Init(void *init)
brdirais 1:2597a6165252 188 {
brdirais 1:2597a6165252 189 deviceInstance++;
brdirais 1:2597a6165252 190
brdirais 1:2597a6165252 191 /* Initialise the GPIOs */
brdirais 1:2597a6165252 192 L6206_Board_GpioInit();
brdirais 1:2597a6165252 193
brdirais 1:2597a6165252 194 if (init == NULL)
brdirais 1:2597a6165252 195 {
brdirais 1:2597a6165252 196 /* Set context variables to the predefined values from l6206_target_config.h */
brdirais 1:2597a6165252 197 /* Set GPIO according to these values */
brdirais 1:2597a6165252 198 L6206_SetDeviceParamsToPredefinedValues();
brdirais 1:2597a6165252 199 }
brdirais 1:2597a6165252 200 else
brdirais 1:2597a6165252 201 {
brdirais 1:2597a6165252 202 L6206_SetDeviceParamsToGivenValues((L6206_Init_t*) init);
brdirais 1:2597a6165252 203 }
brdirais 1:2597a6165252 204
brdirais 1:2597a6165252 205 /* Initialise input bridges PWMs */
brdirais 1:2597a6165252 206 L6206_SetDualFullBridgeConfig(devicePrm.config);
brdirais 1:2597a6165252 207
brdirais 1:2597a6165252 208 return COMPONENT_OK;
brdirais 1:2597a6165252 209 }
brdirais 1:2597a6165252 210
brdirais 1:2597a6165252 211 /******************************************************//**
brdirais 1:2597a6165252 212 * @brief Get the PWM frequency of the specified bridge
brdirais 1:2597a6165252 213 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
brdirais 1:2597a6165252 214 * @retval Freq in Hz
brdirais 1:2597a6165252 215 **********************************************************/
brdirais 1:2597a6165252 216 uint32_t L6206::L6206_GetBridgeInputPwmFreq(uint8_t bridgeId)
brdirais 1:2597a6165252 217 {
brdirais 1:2597a6165252 218 return (devicePrm.pwmFreq[(bridgeId << 1)]);
brdirais 1:2597a6165252 219 }
brdirais 1:2597a6165252 220
brdirais 1:2597a6165252 221 /******************************************************//**
brdirais 1:2597a6165252 222 * @brief Returns the current speed of the specified motor
brdirais 1:2597a6165252 223 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 224 * @retval current speed in % from 0 to 100
brdirais 1:2597a6165252 225 **********************************************************/
brdirais 1:2597a6165252 226 uint16_t L6206::L6206_GetCurrentSpeed(uint8_t motorId)
brdirais 1:2597a6165252 227 {
brdirais 1:2597a6165252 228 uint16_t speed = 0;
brdirais 1:2597a6165252 229
brdirais 1:2597a6165252 230 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
brdirais 1:2597a6165252 231 {
brdirais 1:2597a6165252 232 L6206_ErrorHandler(L6206_ERROR_1);
brdirais 1:2597a6165252 233 }
brdirais 1:2597a6165252 234 else if (devicePrm.motionState[motorId] != INACTIVE)
brdirais 1:2597a6165252 235 {
brdirais 1:2597a6165252 236 speed = devicePrm.speed[motorId];
brdirais 1:2597a6165252 237 }
brdirais 1:2597a6165252 238
brdirais 1:2597a6165252 239 return (speed);
brdirais 1:2597a6165252 240 }
brdirais 1:2597a6165252 241
brdirais 1:2597a6165252 242 /******************************************************//**
brdirais 1:2597a6165252 243 * @brief Returns the device state
brdirais 1:2597a6165252 244 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 245 * @retval State (STEADY or INACTIVE)
brdirais 1:2597a6165252 246 **********************************************************/
brdirais 1:2597a6165252 247 motorState_t L6206::L6206_GetDeviceState(uint8_t motorId)
brdirais 1:2597a6165252 248 {
brdirais 1:2597a6165252 249 motorState_t state = INACTIVE;
brdirais 1:2597a6165252 250
brdirais 1:2597a6165252 251 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
brdirais 1:2597a6165252 252 {
brdirais 1:2597a6165252 253 L6206_ErrorHandler(L6206_ERROR_1);
brdirais 1:2597a6165252 254 }
brdirais 1:2597a6165252 255 else
brdirais 1:2597a6165252 256 {
brdirais 1:2597a6165252 257 state = devicePrm.motionState[motorId];
brdirais 1:2597a6165252 258 }
brdirais 1:2597a6165252 259 return (state);
brdirais 1:2597a6165252 260 }
brdirais 1:2597a6165252 261
brdirais 1:2597a6165252 262 /******************************************************//**
brdirais 1:2597a6165252 263 * @brief Returns the FW version of the library
brdirais 1:2597a6165252 264 * @retval L6206_FW_VERSION
brdirais 1:2597a6165252 265 **********************************************************/
brdirais 1:2597a6165252 266 uint8_t L6206::L6206_GetFwVersion(void)
brdirais 1:2597a6165252 267 {
brdirais 1:2597a6165252 268 return (L6206_FW_VERSION);
brdirais 1:2597a6165252 269 }
brdirais 1:2597a6165252 270
brdirais 1:2597a6165252 271 /******************************************************//**
brdirais 1:2597a6165252 272 * @brief Returns the max speed of the specified motor
brdirais 1:2597a6165252 273 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 274 * @retval maxSpeed in % from 0 to 100
brdirais 1:2597a6165252 275 **********************************************************/
brdirais 1:2597a6165252 276 uint16_t L6206::L6206_GetMaxSpeed(uint8_t motorId)
brdirais 1:2597a6165252 277 {
brdirais 1:2597a6165252 278 uint16_t speed = 0;
brdirais 1:2597a6165252 279 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
brdirais 1:2597a6165252 280 {
brdirais 1:2597a6165252 281 L6206_ErrorHandler(L6206_ERROR_1);
brdirais 1:2597a6165252 282 }
brdirais 1:2597a6165252 283 else
brdirais 1:2597a6165252 284 {
brdirais 1:2597a6165252 285 speed = devicePrm.speed[motorId];
brdirais 1:2597a6165252 286 }
brdirais 1:2597a6165252 287 return (speed);
brdirais 1:2597a6165252 288 }
brdirais 1:2597a6165252 289
brdirais 1:2597a6165252 290
brdirais 1:2597a6165252 291 /******************************************************//**
brdirais 1:2597a6165252 292 * @brief Get the status of the bridge enabling of the corresponding bridge
brdirais 1:2597a6165252 293 * @param[in] bridgeId from 0 for bridge A to 1 for bridge B
brdirais 1:2597a6165252 294 * @retval State of the Enable&Flag pin of the corresponding bridge (1 set, 0 for reset)
brdirais 1:2597a6165252 295 **********************************************************/
brdirais 1:2597a6165252 296 uint16_t L6206::L6206_GetBridgeStatus(uint8_t bridgeId)
brdirais 1:2597a6165252 297 {
brdirais 1:2597a6165252 298 uint16_t status = L6206_Board_GetFlagPinState(bridgeId);
brdirais 1:2597a6165252 299
brdirais 1:2597a6165252 300 return (status);
brdirais 1:2597a6165252 301 }
brdirais 1:2597a6165252 302
brdirais 1:2597a6165252 303 /******************************************************//**
brdirais 1:2597a6165252 304 * @brief Immediatly stops the motor and disable the power bridge
brdirais 1:2597a6165252 305 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 306 * @retval None
brdirais 1:2597a6165252 307 * @note if two motors uses the same power bridge, the
brdirais 1:2597a6165252 308 * power bridge will be disable only if the two motors are
brdirais 1:2597a6165252 309 * stopped
brdirais 1:2597a6165252 310 **********************************************************/
brdirais 1:2597a6165252 311 void L6206::L6206_HardHiz(uint8_t motorId)
brdirais 1:2597a6165252 312 {
brdirais 1:2597a6165252 313 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
brdirais 1:2597a6165252 314 {
brdirais 1:2597a6165252 315 L6206_ErrorHandler(L6206_ERROR_1);
brdirais 1:2597a6165252 316 }
brdirais 1:2597a6165252 317 else
brdirais 1:2597a6165252 318 {
brdirais 1:2597a6165252 319 /* Get bridge Id of the corresponding motor */
brdirais 1:2597a6165252 320 uint8_t bridgeId = L6206_GetBridgeIdUsedByMotorId(motorId);
brdirais 1:2597a6165252 321
brdirais 1:2597a6165252 322 if (devicePrm.bridgeEnabled[bridgeId] != FALSE)
brdirais 1:2597a6165252 323 {
brdirais 1:2597a6165252 324 bool skip = FALSE;
brdirais 1:2597a6165252 325
brdirais 1:2597a6165252 326 /* Check if another motor is currently running by using the same bridge */
brdirais 1:2597a6165252 327 switch (devicePrm.config)
brdirais 1:2597a6165252 328 {
brdirais 1:2597a6165252 329 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 330 if ((motorId > 0) && (devicePrm.motionState[1] == STEADY) && (devicePrm.motionState[2] == STEADY))
brdirais 1:2597a6165252 331 {
brdirais 1:2597a6165252 332 skip = TRUE;
brdirais 1:2597a6165252 333 }
brdirais 1:2597a6165252 334 break;
brdirais 1:2597a6165252 335 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 336 if ((motorId < 2) && (devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))
brdirais 1:2597a6165252 337 {
brdirais 1:2597a6165252 338 skip = TRUE;
brdirais 1:2597a6165252 339 }
brdirais 1:2597a6165252 340 break;
brdirais 1:2597a6165252 341 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 342 if (((motorId < 2) && (devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))||
brdirais 1:2597a6165252 343 ((motorId > 1) && (devicePrm.motionState[2] == STEADY) && (devicePrm.motionState[3] == STEADY)))
brdirais 1:2597a6165252 344 {
brdirais 1:2597a6165252 345 skip = TRUE;
brdirais 1:2597a6165252 346 }
brdirais 1:2597a6165252 347 break;
brdirais 1:2597a6165252 348 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 349 if ((motorId > 0) && (devicePrm.motionState[1] == STEADY) && (devicePrm.motionState[2] == STEADY))
brdirais 1:2597a6165252 350 {
brdirais 1:2597a6165252 351 skip = TRUE;
brdirais 1:2597a6165252 352 }
brdirais 1:2597a6165252 353 break;
brdirais 1:2597a6165252 354 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 355 if ((motorId < 2) && (devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))
brdirais 1:2597a6165252 356 {
brdirais 1:2597a6165252 357 skip = TRUE;
brdirais 1:2597a6165252 358 }
brdirais 1:2597a6165252 359 break;
brdirais 1:2597a6165252 360 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
brdirais 1:2597a6165252 361 if ((devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))
brdirais 1:2597a6165252 362 {
brdirais 1:2597a6165252 363 skip = TRUE;
brdirais 1:2597a6165252 364 }
brdirais 1:2597a6165252 365 break;
brdirais 1:2597a6165252 366 default:
brdirais 1:2597a6165252 367 break;
brdirais 1:2597a6165252 368 }
brdirais 1:2597a6165252 369
brdirais 1:2597a6165252 370 if (skip == FALSE)
brdirais 1:2597a6165252 371 {
brdirais 1:2597a6165252 372 /* Disable the bridge */
brdirais 1:2597a6165252 373 L6206_DisableBridge(bridgeId);
brdirais 1:2597a6165252 374 }
brdirais 1:2597a6165252 375 }
brdirais 1:2597a6165252 376 /* Disable the PWM */
brdirais 1:2597a6165252 377 L6206_HardStop(motorId);
brdirais 1:2597a6165252 378 }
brdirais 1:2597a6165252 379 }
brdirais 1:2597a6165252 380
brdirais 1:2597a6165252 381 /******************************************************//**
brdirais 1:2597a6165252 382 * @brief Stops the motor without disabling the bridge
brdirais 1:2597a6165252 383 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 384 * @retval none
brdirais 1:2597a6165252 385 **********************************************************/
brdirais 1:2597a6165252 386 void L6206::L6206_HardStop(uint8_t motorId)
brdirais 1:2597a6165252 387 {
brdirais 1:2597a6165252 388 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
brdirais 1:2597a6165252 389 {
brdirais 1:2597a6165252 390 L6206_ErrorHandler(L6206_ERROR_1);
brdirais 1:2597a6165252 391 }
brdirais 1:2597a6165252 392 else if (devicePrm.motionState[motorId] != INACTIVE)
brdirais 1:2597a6165252 393 {
brdirais 1:2597a6165252 394 uint8_t bridgeInput;
brdirais 1:2597a6165252 395
brdirais 1:2597a6165252 396 /* Get bridge input of the corresponding motor */
brdirais 1:2597a6165252 397 bridgeInput = L6206_GetBridgeInputUsedByMotorId(motorId);
brdirais 1:2597a6165252 398
brdirais 1:2597a6165252 399 /* Disable corresponding PWM */
brdirais 1:2597a6165252 400 L6206_Board_PwmStop(bridgeInput);
brdirais 1:2597a6165252 401
brdirais 1:2597a6165252 402 /* for bidirectionnal motor, disable second PWM*/
brdirais 1:2597a6165252 403 if (L6206_IsBidirectionnalMotor(motorId))
brdirais 1:2597a6165252 404 {
brdirais 1:2597a6165252 405 bridgeInput = L6206_GetSecondBridgeInputUsedByMotorId(motorId);
brdirais 1:2597a6165252 406 L6206_Board_PwmStop(bridgeInput);
brdirais 1:2597a6165252 407 }
brdirais 1:2597a6165252 408 /* Set inactive state */
brdirais 1:2597a6165252 409 devicePrm.motionState[motorId] = INACTIVE;
brdirais 1:2597a6165252 410 }
brdirais 1:2597a6165252 411 }
brdirais 1:2597a6165252 412
brdirais 1:2597a6165252 413 /******************************************************//**
brdirais 1:2597a6165252 414 * @brief Read id
brdirais 1:2597a6165252 415 * @retval Id of the l6206 Driver Instance
brdirais 1:2597a6165252 416 **********************************************************/
brdirais 1:2597a6165252 417 Status_t L6206::L6206_ReadId(uint8_t *id)
brdirais 1:2597a6165252 418 {
brdirais 1:2597a6165252 419 *id = deviceInstance;
brdirais 1:2597a6165252 420
brdirais 1:2597a6165252 421 return COMPONENT_OK;
brdirais 1:2597a6165252 422 }
brdirais 1:2597a6165252 423
brdirais 1:2597a6165252 424 /******************************************************//**
brdirais 1:2597a6165252 425 * @brief Runs the motor
brdirais 1:2597a6165252 426 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 427 * @param[in] direction FORWARD or BACKWARD
brdirais 1:2597a6165252 428 * @retval None
brdirais 1:2597a6165252 429 * @note For unidirectionnal motor, direction parameter has
brdirais 1:2597a6165252 430 * no effect
brdirais 1:2597a6165252 431 **********************************************************/
brdirais 1:2597a6165252 432 void L6206::L6206_Run(uint8_t motorId, motorDir_t direction)
brdirais 1:2597a6165252 433 {
brdirais 1:2597a6165252 434 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
brdirais 1:2597a6165252 435 {
brdirais 1:2597a6165252 436 L6206_ErrorHandler(L6206_ERROR_1);
brdirais 1:2597a6165252 437 }
brdirais 1:2597a6165252 438 else if ((devicePrm.motionState[motorId] == INACTIVE) ||
brdirais 1:2597a6165252 439 (devicePrm.direction[motorId] != direction))
brdirais 1:2597a6165252 440 {
brdirais 1:2597a6165252 441 uint8_t bridgeId;
brdirais 1:2597a6165252 442 uint8_t bridgeInput;
brdirais 1:2597a6165252 443
brdirais 1:2597a6165252 444 /* Eventually deactivate motor */
brdirais 1:2597a6165252 445 if (devicePrm.motionState[motorId] != INACTIVE)
brdirais 1:2597a6165252 446 {
brdirais 1:2597a6165252 447 L6206_HardStop(motorId);
brdirais 1:2597a6165252 448 }
brdirais 1:2597a6165252 449
brdirais 1:2597a6165252 450 /* Store new direction */
brdirais 1:2597a6165252 451 devicePrm.direction[motorId] = direction;
brdirais 1:2597a6165252 452
brdirais 1:2597a6165252 453 /* Switch to steady state */
brdirais 1:2597a6165252 454 devicePrm.motionState[motorId] = STEADY;
brdirais 1:2597a6165252 455
brdirais 1:2597a6165252 456 /* Get bridge Id of the corresponding motor */
brdirais 1:2597a6165252 457 bridgeId = L6206_GetBridgeIdUsedByMotorId(motorId);
brdirais 1:2597a6165252 458
brdirais 1:2597a6165252 459 /* Get bridge input of the corresponding motor */
brdirais 1:2597a6165252 460 bridgeInput = L6206_GetBridgeInputUsedByMotorId(motorId);
brdirais 1:2597a6165252 461
brdirais 1:2597a6165252 462 /* Enable bridge */
brdirais 1:2597a6165252 463 L6206_EnableBridge(bridgeId);
brdirais 1:2597a6165252 464
brdirais 1:2597a6165252 465 /* Set PWM */
brdirais 1:2597a6165252 466 if (L6206_IsBidirectionnalMotor(motorId))
brdirais 1:2597a6165252 467 {
brdirais 1:2597a6165252 468 /* for bidirectionnal motor */
brdirais 1:2597a6165252 469 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],(100 - devicePrm.speed[motorId]));
brdirais 1:2597a6165252 470 bridgeInput = L6206_GetSecondBridgeInputUsedByMotorId(motorId);
brdirais 1:2597a6165252 471 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],100);
brdirais 1:2597a6165252 472 }
brdirais 1:2597a6165252 473 else
brdirais 1:2597a6165252 474 {
brdirais 1:2597a6165252 475 /* for unidirectionnal motor */
brdirais 1:2597a6165252 476 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],devicePrm.speed[motorId]);
brdirais 1:2597a6165252 477 }
brdirais 1:2597a6165252 478 }
brdirais 1:2597a6165252 479 }
brdirais 1:2597a6165252 480 /******************************************************//**
brdirais 1:2597a6165252 481 * @brief Set dual full bridge parallelling configuration
brdirais 1:2597a6165252 482 * @param[in] newConfig bridge configuration to apply from
brdirais 1:2597a6165252 483 * dualFullBridgeConfig_t enum
brdirais 1:2597a6165252 484 * @retval None
brdirais 1:2597a6165252 485 **********************************************************/
brdirais 1:2597a6165252 486 void L6206::L6206_SetDualFullBridgeConfig(uint8_t newConfig)
brdirais 1:2597a6165252 487 {
brdirais 1:2597a6165252 488 devicePrm.config = (dualFullBridgeConfig_t)newConfig;
brdirais 1:2597a6165252 489
brdirais 1:2597a6165252 490 /* Start to reset all else if several inits are used successively */
brdirais 1:2597a6165252 491 /* they will fail */
brdirais 1:2597a6165252 492 L6206_Board_PwmDeInit(INPUT_1A);
brdirais 1:2597a6165252 493 L6206_Board_PwmDeInit(INPUT_2A);
brdirais 1:2597a6165252 494 L6206_Board_PwmDeInit(INPUT_1B);
brdirais 1:2597a6165252 495 L6206_Board_PwmDeInit(INPUT_2B);
brdirais 1:2597a6165252 496
brdirais 1:2597a6165252 497
brdirais 1:2597a6165252 498 /* Initialise the bridges inputs PWMs --------------------------------------*/
brdirais 1:2597a6165252 499 switch (devicePrm.config)
brdirais 1:2597a6165252 500 {
brdirais 1:2597a6165252 501 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 502 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 503 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 504 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 505 L6206_Board_PwmInit(INPUT_1A);
brdirais 1:2597a6165252 506 L6206_Board_PwmInit(INPUT_2A);
brdirais 1:2597a6165252 507 L6206_Board_PwmInit(INPUT_1B);
brdirais 1:2597a6165252 508 L6206_Board_PwmInit(INPUT_2B);
brdirais 1:2597a6165252 509 break;
brdirais 1:2597a6165252 510 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 511 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 512 L6206_Board_PwmDeInit(INPUT_2A);
brdirais 1:2597a6165252 513 L6206_Board_PwmInit(INPUT_1A);
brdirais 1:2597a6165252 514 L6206_Board_PwmInit(INPUT_1B);
brdirais 1:2597a6165252 515 L6206_Board_PwmInit(INPUT_2B);
brdirais 1:2597a6165252 516 break;
brdirais 1:2597a6165252 517 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 518 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 519 L6206_Board_PwmDeInit(INPUT_2B);
brdirais 1:2597a6165252 520 L6206_Board_PwmInit(INPUT_1A);
brdirais 1:2597a6165252 521 L6206_Board_PwmInit(INPUT_2A);
brdirais 1:2597a6165252 522 L6206_Board_PwmInit(INPUT_1B);
brdirais 1:2597a6165252 523 break;
brdirais 1:2597a6165252 524 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 525 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 526 L6206_Board_PwmDeInit(INPUT_2A);
brdirais 1:2597a6165252 527 L6206_Board_PwmDeInit(INPUT_2B);
brdirais 1:2597a6165252 528 L6206_Board_PwmInit(INPUT_1A);
brdirais 1:2597a6165252 529 L6206_Board_PwmInit(INPUT_1B);
brdirais 1:2597a6165252 530 break;
brdirais 1:2597a6165252 531 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
brdirais 1:2597a6165252 532 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 533 L6206_Board_PwmDeInit(INPUT_1B);
brdirais 1:2597a6165252 534 L6206_Board_PwmDeInit(INPUT_2B);
brdirais 1:2597a6165252 535 L6206_Board_PwmInit(INPUT_1A);
brdirais 1:2597a6165252 536 L6206_Board_PwmInit(INPUT_2A);
brdirais 1:2597a6165252 537 break;
brdirais 1:2597a6165252 538 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
brdirais 1:2597a6165252 539 L6206_Board_PwmDeInit(INPUT_2A);
brdirais 1:2597a6165252 540 L6206_Board_PwmDeInit(INPUT_1B);
brdirais 1:2597a6165252 541 L6206_Board_PwmDeInit(INPUT_2B);
brdirais 1:2597a6165252 542 L6206_Board_PwmInit(INPUT_1A);
brdirais 1:2597a6165252 543 break;
brdirais 1:2597a6165252 544 default:
brdirais 1:2597a6165252 545 break;
brdirais 1:2597a6165252 546 }
brdirais 1:2597a6165252 547 }
brdirais 1:2597a6165252 548 /******************************************************//**
brdirais 1:2597a6165252 549 * @brief Changes the max speed of the specified device
brdirais 1:2597a6165252 550 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 551 * @param[in] newMaxSpeed in % from 0 to 100
brdirais 1:2597a6165252 552 * @retval true if the command is successfully executed, else false
brdirais 1:2597a6165252 553 **********************************************************/
brdirais 1:2597a6165252 554 bool L6206::L6206_SetMaxSpeed(uint8_t motorId, uint16_t newMaxSpeed)
brdirais 1:2597a6165252 555 {
brdirais 1:2597a6165252 556 bool cmdExecuted = FALSE;
brdirais 1:2597a6165252 557
brdirais 1:2597a6165252 558 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
brdirais 1:2597a6165252 559 {
brdirais 1:2597a6165252 560 L6206_ErrorHandler(L6206_ERROR_1);
brdirais 1:2597a6165252 561 }
brdirais 1:2597a6165252 562 else
brdirais 1:2597a6165252 563 {
brdirais 1:2597a6165252 564 devicePrm.speed[motorId] = newMaxSpeed;
brdirais 1:2597a6165252 565 if (devicePrm.motionState[motorId] != INACTIVE)
brdirais 1:2597a6165252 566 {
brdirais 1:2597a6165252 567 uint8_t bridgeInput;
brdirais 1:2597a6165252 568
brdirais 1:2597a6165252 569 /* Get Bridge input of the corresponding motor */
brdirais 1:2597a6165252 570 bridgeInput = L6206_GetBridgeInputUsedByMotorId(motorId);
brdirais 1:2597a6165252 571
brdirais 1:2597a6165252 572 /* Set PWM frequency*/
brdirais 1:2597a6165252 573 if (L6206_IsBidirectionnalMotor(motorId))
brdirais 1:2597a6165252 574 {
brdirais 1:2597a6165252 575 /* for bidirectionnal motor */
brdirais 1:2597a6165252 576 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],(100 - devicePrm.speed[motorId]));
brdirais 1:2597a6165252 577 }
brdirais 1:2597a6165252 578 else
brdirais 1:2597a6165252 579 {
brdirais 1:2597a6165252 580 /* for unidirectionnal motor */
brdirais 1:2597a6165252 581 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],devicePrm.speed[motorId]);
brdirais 1:2597a6165252 582 }
brdirais 1:2597a6165252 583 }
brdirais 1:2597a6165252 584 cmdExecuted = TRUE;
brdirais 1:2597a6165252 585 }
brdirais 1:2597a6165252 586 return cmdExecuted;
brdirais 1:2597a6165252 587 }
brdirais 1:2597a6165252 588
brdirais 1:2597a6165252 589 /******************************************************//**
brdirais 1:2597a6165252 590 * @brief Changes the PWM frequency of the bridge input
brdirais 1:2597a6165252 591 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
brdirais 1:2597a6165252 592 * @param[in] newFreq in Hz
brdirais 1:2597a6165252 593 * @retval None
brdirais 1:2597a6165252 594 **********************************************************/
brdirais 1:2597a6165252 595 void L6206::L6206_SetBridgeInputPwmFreq(uint8_t bridgeId, uint32_t newFreq)
brdirais 1:2597a6165252 596 {
brdirais 1:2597a6165252 597 uint8_t loop;
brdirais 1:2597a6165252 598
brdirais 1:2597a6165252 599 if (newFreq > L6206_MAX_PWM_FREQ)
brdirais 1:2597a6165252 600 {
brdirais 1:2597a6165252 601 newFreq = L6206_MAX_PWM_FREQ;
brdirais 1:2597a6165252 602 }
brdirais 1:2597a6165252 603 for (loop = 0; loop < 2;loop ++)
brdirais 1:2597a6165252 604 {
brdirais 1:2597a6165252 605 uint8_t motorId;
brdirais 1:2597a6165252 606 uint8_t bridgeInput = (bridgeId << 1) + loop;
brdirais 1:2597a6165252 607 devicePrm.pwmFreq[bridgeInput] = newFreq;
brdirais 1:2597a6165252 608
brdirais 1:2597a6165252 609 /* Get motor Id using this bridge */
brdirais 1:2597a6165252 610 motorId = L6206_GetMotorIdUsingbridgeInput(bridgeInput);
brdirais 1:2597a6165252 611
brdirais 1:2597a6165252 612 /* Immediatly update frequency if motor is running */
brdirais 1:2597a6165252 613 if (devicePrm.motionState[motorId] != INACTIVE)
brdirais 1:2597a6165252 614 {
brdirais 1:2597a6165252 615 /* Test if motor is bidir */
brdirais 1:2597a6165252 616 if (L6206_IsBidirectionnalMotor(motorId))
brdirais 1:2597a6165252 617 {
brdirais 1:2597a6165252 618 if (bridgeInput != L6206_GetSecondBridgeInputUsedByMotorId(motorId))
brdirais 1:2597a6165252 619 {
brdirais 1:2597a6165252 620 /* Set PWM frequency for bidirectionnal motor of the first bridge*/
brdirais 1:2597a6165252 621 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],(100 - devicePrm.speed[motorId]));
brdirais 1:2597a6165252 622 }
brdirais 1:2597a6165252 623 else
brdirais 1:2597a6165252 624 {
brdirais 1:2597a6165252 625 /* Set PWM frequency for bidirectionnal motor of the second bridge */
brdirais 1:2597a6165252 626 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],100);
brdirais 1:2597a6165252 627 }
brdirais 1:2597a6165252 628 }
brdirais 1:2597a6165252 629 else
brdirais 1:2597a6165252 630 {
brdirais 1:2597a6165252 631 /* Set PWM frequency for unidirectionnal motor */
brdirais 1:2597a6165252 632 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],devicePrm.speed[motorId]);
brdirais 1:2597a6165252 633 }
brdirais 1:2597a6165252 634 }
brdirais 1:2597a6165252 635 }
brdirais 1:2597a6165252 636 }
brdirais 1:2597a6165252 637 /******************************************************//**
brdirais 1:2597a6165252 638 * @brief Sets the number of devices to be used
brdirais 1:2597a6165252 639 * @param[in] nbDevices (from 1 to MAX_NUMBER_OF_DEVICES)
brdirais 1:2597a6165252 640 * @retval TRUE if successfull, FALSE if failure, attempt to set a number of
brdirais 1:2597a6165252 641 * devices greater than MAX_NUMBER_OF_DEVICES
brdirais 1:2597a6165252 642 **********************************************************/
brdirais 1:2597a6165252 643 bool L6206::L6206_SetNbDevices(uint8_t nbDevices)
brdirais 1:2597a6165252 644 {
brdirais 1:2597a6165252 645 if (nbDevices <= MAX_NUMBER_OF_DEVICES)
brdirais 1:2597a6165252 646 {
brdirais 1:2597a6165252 647 return TRUE;
brdirais 1:2597a6165252 648 }
brdirais 1:2597a6165252 649 else
brdirais 1:2597a6165252 650 {
brdirais 1:2597a6165252 651 return FALSE;
brdirais 1:2597a6165252 652 }
brdirais 1:2597a6165252 653 }
brdirais 1:2597a6165252 654
brdirais 1:2597a6165252 655
brdirais 1:2597a6165252 656 /******************************************************//**
brdirais 1:2597a6165252 657 * @brief Error handler which calls the user callback (if defined)
brdirais 1:2597a6165252 658 * @param[in] error Number of the error
brdirais 1:2597a6165252 659 * @retval None
brdirais 1:2597a6165252 660 **********************************************************/
brdirais 1:2597a6165252 661 void L6206::L6206_ErrorHandler(uint16_t error)
brdirais 1:2597a6165252 662 {
brdirais 1:2597a6165252 663 if (errorHandlerCallback != 0)
brdirais 1:2597a6165252 664 {
brdirais 1:2597a6165252 665 (void) errorHandlerCallback(error);
brdirais 1:2597a6165252 666 }
brdirais 1:2597a6165252 667 else
brdirais 1:2597a6165252 668 {
brdirais 1:2597a6165252 669 while(1)
brdirais 1:2597a6165252 670 {
brdirais 1:2597a6165252 671 /* Infinite loop */
brdirais 1:2597a6165252 672 }
brdirais 1:2597a6165252 673 }
brdirais 1:2597a6165252 674 }
brdirais 1:2597a6165252 675
brdirais 1:2597a6165252 676 /******************************************************//**
brdirais 1:2597a6165252 677 * @brief Handlers of the flag interrupt which calls the user callback (if defined)
brdirais 1:2597a6165252 678 * @retval None
brdirais 1:2597a6165252 679 **********************************************************/
brdirais 1:2597a6165252 680 void L6206::L6206_FlagInterruptHandler(void)
brdirais 1:2597a6165252 681 {
brdirais 1:2597a6165252 682 bool status;
brdirais 1:2597a6165252 683
brdirais 1:2597a6165252 684 status = L6206_GetBridgeStatus(BRIDGE_A);
brdirais 1:2597a6165252 685 if (status != devicePrm.bridgeEnabled[BRIDGE_A])
brdirais 1:2597a6165252 686 {
brdirais 1:2597a6165252 687 devicePrm.bridgeEnabled[BRIDGE_A] = status;
brdirais 1:2597a6165252 688 }
brdirais 1:2597a6165252 689
brdirais 1:2597a6165252 690 status = L6206_GetBridgeStatus(BRIDGE_B);
brdirais 1:2597a6165252 691 if (status != devicePrm.bridgeEnabled[BRIDGE_B])
brdirais 1:2597a6165252 692 {
brdirais 1:2597a6165252 693 devicePrm.bridgeEnabled[BRIDGE_B] = status;
brdirais 1:2597a6165252 694 }
brdirais 1:2597a6165252 695
brdirais 1:2597a6165252 696 if (flagInterruptCallback != 0)
brdirais 1:2597a6165252 697 {
brdirais 1:2597a6165252 698 flagInterruptCallback();
brdirais 1:2597a6165252 699 }
brdirais 1:2597a6165252 700 }
brdirais 1:2597a6165252 701
brdirais 1:2597a6165252 702 /******************************************************//**
brdirais 1:2597a6165252 703 * @brief Get the bridges Id used by a given motor
brdirais 1:2597a6165252 704 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 705 * @retval bridgeId 0 for bridge A , 1 for bridge B
brdirais 1:2597a6165252 706 **********************************************************/
brdirais 1:2597a6165252 707 uint8_t L6206::L6206_GetBridgeIdUsedByMotorId(uint8_t motorId)
brdirais 1:2597a6165252 708 {
brdirais 1:2597a6165252 709 uint8_t bridgeId;
brdirais 1:2597a6165252 710
brdirais 1:2597a6165252 711 switch (devicePrm.config)
brdirais 1:2597a6165252 712 {
brdirais 1:2597a6165252 713 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 714 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 715 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 716 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 717 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 718 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 719 if (motorId == 0)
brdirais 1:2597a6165252 720 {
brdirais 1:2597a6165252 721 bridgeId = 0;
brdirais 1:2597a6165252 722 }
brdirais 1:2597a6165252 723 else
brdirais 1:2597a6165252 724 {
brdirais 1:2597a6165252 725 bridgeId = 1;
brdirais 1:2597a6165252 726 }
brdirais 1:2597a6165252 727 break;
brdirais 1:2597a6165252 728 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 729 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 730 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 731 if (motorId < 2)
brdirais 1:2597a6165252 732 {
brdirais 1:2597a6165252 733 bridgeId = 0;
brdirais 1:2597a6165252 734 }
brdirais 1:2597a6165252 735 else
brdirais 1:2597a6165252 736 {
brdirais 1:2597a6165252 737 bridgeId = 1;
brdirais 1:2597a6165252 738 }
brdirais 1:2597a6165252 739 break;
brdirais 1:2597a6165252 740 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 741 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
brdirais 1:2597a6165252 742 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 743 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
brdirais 1:2597a6165252 744 default:
brdirais 1:2597a6165252 745 bridgeId = 0;
brdirais 1:2597a6165252 746 break;
brdirais 1:2597a6165252 747 }
brdirais 1:2597a6165252 748 return (bridgeId);
brdirais 1:2597a6165252 749 }
brdirais 1:2597a6165252 750
brdirais 1:2597a6165252 751 /******************************************************//**
brdirais 1:2597a6165252 752 * @brief Get the motor Id which is using the specified bridge input
brdirais 1:2597a6165252 753 * @param bridgeInput 0 for bridgeInput 1A, 1 for 2A, 2 for 1B, 3 for 3B
brdirais 1:2597a6165252 754 * @retval bridgeId 0 for bridge A , 1 for bridge B
brdirais 1:2597a6165252 755 **********************************************************/
brdirais 1:2597a6165252 756 uint8_t L6206::L6206_GetMotorIdUsingbridgeInput(uint8_t bridgeInput)
brdirais 1:2597a6165252 757 {
brdirais 1:2597a6165252 758 uint8_t motorId;
brdirais 1:2597a6165252 759
brdirais 1:2597a6165252 760 switch (devicePrm.config)
brdirais 1:2597a6165252 761 {
brdirais 1:2597a6165252 762 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 763 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 764 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 765 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 766 if (bridgeInput >= INPUT_1B)
brdirais 1:2597a6165252 767 {
brdirais 1:2597a6165252 768 motorId = 1;
brdirais 1:2597a6165252 769 }
brdirais 1:2597a6165252 770 else
brdirais 1:2597a6165252 771 {
brdirais 1:2597a6165252 772 motorId = 0;
brdirais 1:2597a6165252 773 }
brdirais 1:2597a6165252 774 break;
brdirais 1:2597a6165252 775 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 776 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 777 if (bridgeInput == INPUT_2B)
brdirais 1:2597a6165252 778 {
brdirais 1:2597a6165252 779 motorId = 2;
brdirais 1:2597a6165252 780 }
brdirais 1:2597a6165252 781 else if (bridgeInput == INPUT_1B)
brdirais 1:2597a6165252 782 {
brdirais 1:2597a6165252 783 motorId = 1;
brdirais 1:2597a6165252 784 }
brdirais 1:2597a6165252 785 else
brdirais 1:2597a6165252 786 {
brdirais 1:2597a6165252 787 motorId = 0;
brdirais 1:2597a6165252 788 }
brdirais 1:2597a6165252 789 break;
brdirais 1:2597a6165252 790 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 791 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 792 if (bridgeInput >= INPUT_1B)
brdirais 1:2597a6165252 793 {
brdirais 1:2597a6165252 794 motorId = 2;
brdirais 1:2597a6165252 795 }
brdirais 1:2597a6165252 796 else if (bridgeInput == INPUT_2A)
brdirais 1:2597a6165252 797 {
brdirais 1:2597a6165252 798 motorId = 1;
brdirais 1:2597a6165252 799 }
brdirais 1:2597a6165252 800 else
brdirais 1:2597a6165252 801 {
brdirais 1:2597a6165252 802 motorId = 0;
brdirais 1:2597a6165252 803 }
brdirais 1:2597a6165252 804 break;
brdirais 1:2597a6165252 805 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 806 if (bridgeInput == INPUT_2B)
brdirais 1:2597a6165252 807 {
brdirais 1:2597a6165252 808 motorId = 3;
brdirais 1:2597a6165252 809 }
brdirais 1:2597a6165252 810 else if (bridgeInput == INPUT_1B)
brdirais 1:2597a6165252 811 {
brdirais 1:2597a6165252 812 motorId = 2;
brdirais 1:2597a6165252 813 }
brdirais 1:2597a6165252 814 else if (bridgeInput == INPUT_2A)
brdirais 1:2597a6165252 815 {
brdirais 1:2597a6165252 816 motorId = 1;
brdirais 1:2597a6165252 817 }
brdirais 1:2597a6165252 818 else
brdirais 1:2597a6165252 819 {
brdirais 1:2597a6165252 820 motorId = 0;
brdirais 1:2597a6165252 821 }
brdirais 1:2597a6165252 822 break;
brdirais 1:2597a6165252 823 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
brdirais 1:2597a6165252 824 if ((bridgeInput == INPUT_2A) || (bridgeInput == INPUT_2B))
brdirais 1:2597a6165252 825 {
brdirais 1:2597a6165252 826 motorId = 1;
brdirais 1:2597a6165252 827 }
brdirais 1:2597a6165252 828 else
brdirais 1:2597a6165252 829 {
brdirais 1:2597a6165252 830 motorId = 0;
brdirais 1:2597a6165252 831 }
brdirais 1:2597a6165252 832 break;
brdirais 1:2597a6165252 833 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 834 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 835 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
brdirais 1:2597a6165252 836 default:
brdirais 1:2597a6165252 837 motorId = 0;
brdirais 1:2597a6165252 838 break;
brdirais 1:2597a6165252 839 }
brdirais 1:2597a6165252 840
brdirais 1:2597a6165252 841 return (motorId);
brdirais 1:2597a6165252 842 }
brdirais 1:2597a6165252 843 /******************************************************//**
brdirais 1:2597a6165252 844 * @brief Get the PWM input used by a given motor
brdirais 1:2597a6165252 845 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 846 * @retval PWM input 0 for 1A, 1 for 2A, 2 for 1B, 3 for 3B
brdirais 1:2597a6165252 847 **********************************************************/
brdirais 1:2597a6165252 848 uint8_t L6206::L6206_GetBridgeInputUsedByMotorId(uint8_t motorId)
brdirais 1:2597a6165252 849 {
brdirais 1:2597a6165252 850 uint8_t bridgeInput;
brdirais 1:2597a6165252 851
brdirais 1:2597a6165252 852 switch (devicePrm.config)
brdirais 1:2597a6165252 853 {
brdirais 1:2597a6165252 854 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 855 if (motorId == 0)
brdirais 1:2597a6165252 856 {
brdirais 1:2597a6165252 857 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 858 {
brdirais 1:2597a6165252 859 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 860 }
brdirais 1:2597a6165252 861 else
brdirais 1:2597a6165252 862 {
brdirais 1:2597a6165252 863 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 864 }
brdirais 1:2597a6165252 865 }
brdirais 1:2597a6165252 866 else
brdirais 1:2597a6165252 867 {
brdirais 1:2597a6165252 868 if (devicePrm.direction[1] == FORWARD)
brdirais 1:2597a6165252 869 {
brdirais 1:2597a6165252 870 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 871 }
brdirais 1:2597a6165252 872 else
brdirais 1:2597a6165252 873 {
brdirais 1:2597a6165252 874 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 875 }
brdirais 1:2597a6165252 876 }
brdirais 1:2597a6165252 877 break;
brdirais 1:2597a6165252 878 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 879 if (motorId == 0)
brdirais 1:2597a6165252 880 {
brdirais 1:2597a6165252 881 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 882 {
brdirais 1:2597a6165252 883 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 884 }
brdirais 1:2597a6165252 885 else
brdirais 1:2597a6165252 886 {
brdirais 1:2597a6165252 887 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 888 }
brdirais 1:2597a6165252 889 }
brdirais 1:2597a6165252 890 else if (motorId == 1)
brdirais 1:2597a6165252 891 {
brdirais 1:2597a6165252 892
brdirais 1:2597a6165252 893 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 894 }
brdirais 1:2597a6165252 895 else
brdirais 1:2597a6165252 896 {
brdirais 1:2597a6165252 897 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 898 }
brdirais 1:2597a6165252 899 break;
brdirais 1:2597a6165252 900 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 901 if (motorId == 0)
brdirais 1:2597a6165252 902 {
brdirais 1:2597a6165252 903 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 904 }
brdirais 1:2597a6165252 905 else if (motorId == 1)
brdirais 1:2597a6165252 906 {
brdirais 1:2597a6165252 907 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 908 }
brdirais 1:2597a6165252 909 else
brdirais 1:2597a6165252 910 {
brdirais 1:2597a6165252 911 if (devicePrm.direction[2] == FORWARD)
brdirais 1:2597a6165252 912 {
brdirais 1:2597a6165252 913 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 914 }
brdirais 1:2597a6165252 915 else
brdirais 1:2597a6165252 916 {
brdirais 1:2597a6165252 917 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 918 }
brdirais 1:2597a6165252 919 }
brdirais 1:2597a6165252 920 break;
brdirais 1:2597a6165252 921 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 922 if (motorId == 0)
brdirais 1:2597a6165252 923 {
brdirais 1:2597a6165252 924 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 925 }
brdirais 1:2597a6165252 926 else if (motorId == 1)
brdirais 1:2597a6165252 927 {
brdirais 1:2597a6165252 928 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 929 }
brdirais 1:2597a6165252 930 else if (motorId == 2)
brdirais 1:2597a6165252 931 {
brdirais 1:2597a6165252 932 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 933 }
brdirais 1:2597a6165252 934 else
brdirais 1:2597a6165252 935 {
brdirais 1:2597a6165252 936 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 937 }
brdirais 1:2597a6165252 938 break;
brdirais 1:2597a6165252 939 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 940 if (motorId == 0)
brdirais 1:2597a6165252 941 {
brdirais 1:2597a6165252 942 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 943 }
brdirais 1:2597a6165252 944 else
brdirais 1:2597a6165252 945 {
brdirais 1:2597a6165252 946 if (devicePrm.direction[1] == FORWARD)
brdirais 1:2597a6165252 947 {
brdirais 1:2597a6165252 948 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 949 }
brdirais 1:2597a6165252 950 else
brdirais 1:2597a6165252 951 {
brdirais 1:2597a6165252 952 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 953 }
brdirais 1:2597a6165252 954 }
brdirais 1:2597a6165252 955 break;
brdirais 1:2597a6165252 956 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 957 if (motorId == 0)
brdirais 1:2597a6165252 958 {
brdirais 1:2597a6165252 959 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 960 }
brdirais 1:2597a6165252 961 else if (motorId == 1)
brdirais 1:2597a6165252 962 {
brdirais 1:2597a6165252 963 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 964 }
brdirais 1:2597a6165252 965 else
brdirais 1:2597a6165252 966 {
brdirais 1:2597a6165252 967 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 968 }
brdirais 1:2597a6165252 969 break;
brdirais 1:2597a6165252 970 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 971 if (motorId == 0)
brdirais 1:2597a6165252 972 {
brdirais 1:2597a6165252 973 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 974 {
brdirais 1:2597a6165252 975 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 976 }
brdirais 1:2597a6165252 977 else
brdirais 1:2597a6165252 978 {
brdirais 1:2597a6165252 979 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 980 }
brdirais 1:2597a6165252 981 }
brdirais 1:2597a6165252 982 else
brdirais 1:2597a6165252 983 {
brdirais 1:2597a6165252 984 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 985 }
brdirais 1:2597a6165252 986 break;
brdirais 1:2597a6165252 987 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 988 if (motorId == 0)
brdirais 1:2597a6165252 989 {
brdirais 1:2597a6165252 990 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 991 }
brdirais 1:2597a6165252 992 else if (motorId == 1)
brdirais 1:2597a6165252 993 {
brdirais 1:2597a6165252 994 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 995 }
brdirais 1:2597a6165252 996 else
brdirais 1:2597a6165252 997 {
brdirais 1:2597a6165252 998 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 999 }
brdirais 1:2597a6165252 1000 break;
brdirais 1:2597a6165252 1001 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1002 if (motorId == 0)
brdirais 1:2597a6165252 1003 {
brdirais 1:2597a6165252 1004 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1005 }
brdirais 1:2597a6165252 1006 else
brdirais 1:2597a6165252 1007 {
brdirais 1:2597a6165252 1008 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 1009 }
brdirais 1:2597a6165252 1010 break;
brdirais 1:2597a6165252 1011 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 1012 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 1013 {
brdirais 1:2597a6165252 1014 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1015 }
brdirais 1:2597a6165252 1016 else
brdirais 1:2597a6165252 1017 {
brdirais 1:2597a6165252 1018 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 1019 }
brdirais 1:2597a6165252 1020 break;
brdirais 1:2597a6165252 1021 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
brdirais 1:2597a6165252 1022 if (motorId == 0)
brdirais 1:2597a6165252 1023 {
brdirais 1:2597a6165252 1024 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1025 }
brdirais 1:2597a6165252 1026 else
brdirais 1:2597a6165252 1027 {
brdirais 1:2597a6165252 1028 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 1029 }
brdirais 1:2597a6165252 1030 break;
brdirais 1:2597a6165252 1031 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 1032 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 1033 {
brdirais 1:2597a6165252 1034 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1035 }
brdirais 1:2597a6165252 1036 else
brdirais 1:2597a6165252 1037 {
brdirais 1:2597a6165252 1038 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 1039 }
brdirais 1:2597a6165252 1040 break;
brdirais 1:2597a6165252 1041 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
brdirais 1:2597a6165252 1042 default:
brdirais 1:2597a6165252 1043 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1044 break;
brdirais 1:2597a6165252 1045 }
brdirais 1:2597a6165252 1046 return (bridgeInput);
brdirais 1:2597a6165252 1047 }
brdirais 1:2597a6165252 1048
brdirais 1:2597a6165252 1049 /******************************************************//**
brdirais 1:2597a6165252 1050 * @brief Get the second PWM input used by a given bidirectionnal motor
brdirais 1:2597a6165252 1051 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 1052 * @retval PWM input 0 for 1A, 1 for 2A, 2 for 1B, 3 for 3B
brdirais 1:2597a6165252 1053 **********************************************************/
brdirais 1:2597a6165252 1054 uint8_t L6206::L6206_GetSecondBridgeInputUsedByMotorId(uint8_t motorId)
brdirais 1:2597a6165252 1055 {
brdirais 1:2597a6165252 1056 uint8_t bridgeInput = 0xFF;
brdirais 1:2597a6165252 1057
brdirais 1:2597a6165252 1058 switch (devicePrm.config)
brdirais 1:2597a6165252 1059 {
brdirais 1:2597a6165252 1060 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1061 if (motorId == 0)
brdirais 1:2597a6165252 1062 {
brdirais 1:2597a6165252 1063 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 1064 {
brdirais 1:2597a6165252 1065 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 1066 }
brdirais 1:2597a6165252 1067 else
brdirais 1:2597a6165252 1068 {
brdirais 1:2597a6165252 1069 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1070 }
brdirais 1:2597a6165252 1071 }
brdirais 1:2597a6165252 1072 else
brdirais 1:2597a6165252 1073 {
brdirais 1:2597a6165252 1074 if (devicePrm.direction[1] == FORWARD)
brdirais 1:2597a6165252 1075 {
brdirais 1:2597a6165252 1076 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 1077 }
brdirais 1:2597a6165252 1078 else
brdirais 1:2597a6165252 1079 {
brdirais 1:2597a6165252 1080 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 1081 }
brdirais 1:2597a6165252 1082 }
brdirais 1:2597a6165252 1083 break;
brdirais 1:2597a6165252 1084 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1085 if (motorId == 0)
brdirais 1:2597a6165252 1086 {
brdirais 1:2597a6165252 1087 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 1088 {
brdirais 1:2597a6165252 1089 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 1090 }
brdirais 1:2597a6165252 1091 else
brdirais 1:2597a6165252 1092 {
brdirais 1:2597a6165252 1093 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1094 }
brdirais 1:2597a6165252 1095 }
brdirais 1:2597a6165252 1096 break;
brdirais 1:2597a6165252 1097 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1098 if (motorId == 2)
brdirais 1:2597a6165252 1099 {
brdirais 1:2597a6165252 1100 if (devicePrm.direction[2] == FORWARD)
brdirais 1:2597a6165252 1101 {
brdirais 1:2597a6165252 1102 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 1103 }
brdirais 1:2597a6165252 1104 else
brdirais 1:2597a6165252 1105 {
brdirais 1:2597a6165252 1106 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 1107 }
brdirais 1:2597a6165252 1108 }
brdirais 1:2597a6165252 1109 break;
brdirais 1:2597a6165252 1110
brdirais 1:2597a6165252 1111 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1112 if (motorId == 1)
brdirais 1:2597a6165252 1113 {
brdirais 1:2597a6165252 1114 if (devicePrm.direction[1] == FORWARD)
brdirais 1:2597a6165252 1115 {
brdirais 1:2597a6165252 1116 bridgeInput = INPUT_2B;
brdirais 1:2597a6165252 1117 }
brdirais 1:2597a6165252 1118 else
brdirais 1:2597a6165252 1119 {
brdirais 1:2597a6165252 1120 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 1121 }
brdirais 1:2597a6165252 1122 }
brdirais 1:2597a6165252 1123 break;
brdirais 1:2597a6165252 1124
brdirais 1:2597a6165252 1125 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1126 if (motorId == 0)
brdirais 1:2597a6165252 1127 {
brdirais 1:2597a6165252 1128 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 1129 {
brdirais 1:2597a6165252 1130 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 1131 }
brdirais 1:2597a6165252 1132 else
brdirais 1:2597a6165252 1133 {
brdirais 1:2597a6165252 1134 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1135 }
brdirais 1:2597a6165252 1136 }
brdirais 1:2597a6165252 1137 break;
brdirais 1:2597a6165252 1138 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 1139 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 1140 {
brdirais 1:2597a6165252 1141 bridgeInput = INPUT_1B;
brdirais 1:2597a6165252 1142 }
brdirais 1:2597a6165252 1143 else
brdirais 1:2597a6165252 1144 {
brdirais 1:2597a6165252 1145 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1146 }
brdirais 1:2597a6165252 1147 break;
brdirais 1:2597a6165252 1148
brdirais 1:2597a6165252 1149 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 1150 if (devicePrm.direction[0] == FORWARD)
brdirais 1:2597a6165252 1151 {
brdirais 1:2597a6165252 1152 bridgeInput = INPUT_2A;
brdirais 1:2597a6165252 1153 }
brdirais 1:2597a6165252 1154 else
brdirais 1:2597a6165252 1155 {
brdirais 1:2597a6165252 1156 bridgeInput = INPUT_1A;
brdirais 1:2597a6165252 1157 }
brdirais 1:2597a6165252 1158 break;
brdirais 1:2597a6165252 1159 default:
brdirais 1:2597a6165252 1160 bridgeInput = 0XFF;
brdirais 1:2597a6165252 1161 break;
brdirais 1:2597a6165252 1162 }
brdirais 1:2597a6165252 1163 if (bridgeInput == 0XFF)
brdirais 1:2597a6165252 1164 {
brdirais 1:2597a6165252 1165 L6206_ErrorHandler(L6206_ERROR_2);
brdirais 1:2597a6165252 1166 }
brdirais 1:2597a6165252 1167
brdirais 1:2597a6165252 1168 return (bridgeInput);
brdirais 1:2597a6165252 1169 }
brdirais 1:2597a6165252 1170
brdirais 1:2597a6165252 1171 /******************************************************//**
brdirais 1:2597a6165252 1172 * @brief Test if motor is bidirectionnal
brdirais 1:2597a6165252 1173 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
brdirais 1:2597a6165252 1174 * @retval True if motor is bidirectionnal, else false
brdirais 1:2597a6165252 1175 **********************************************************/
brdirais 1:2597a6165252 1176 bool L6206::L6206_IsBidirectionnalMotor(uint8_t motorId)
brdirais 1:2597a6165252 1177 {
brdirais 1:2597a6165252 1178 bool isBiDir = FALSE;
brdirais 1:2597a6165252 1179
brdirais 1:2597a6165252 1180 switch (devicePrm.config)
brdirais 1:2597a6165252 1181 {
brdirais 1:2597a6165252 1182 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1183 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 1184 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
brdirais 1:2597a6165252 1185 isBiDir = TRUE;
brdirais 1:2597a6165252 1186 break;
brdirais 1:2597a6165252 1187
brdirais 1:2597a6165252 1188 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1189 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1190 if (motorId == 0)
brdirais 1:2597a6165252 1191 {
brdirais 1:2597a6165252 1192 isBiDir = TRUE;
brdirais 1:2597a6165252 1193 }
brdirais 1:2597a6165252 1194 break;
brdirais 1:2597a6165252 1195 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1196 if (motorId == 2)
brdirais 1:2597a6165252 1197 {
brdirais 1:2597a6165252 1198 isBiDir = TRUE;
brdirais 1:2597a6165252 1199 }
brdirais 1:2597a6165252 1200 break;
brdirais 1:2597a6165252 1201 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
brdirais 1:2597a6165252 1202 if (motorId == 1)
brdirais 1:2597a6165252 1203 {
brdirais 1:2597a6165252 1204 isBiDir = TRUE;
brdirais 1:2597a6165252 1205 }
brdirais 1:2597a6165252 1206 break;
brdirais 1:2597a6165252 1207
brdirais 1:2597a6165252 1208 default:
brdirais 1:2597a6165252 1209 break;
brdirais 1:2597a6165252 1210 }
brdirais 1:2597a6165252 1211
brdirais 1:2597a6165252 1212 return (isBiDir);
brdirais 1:2597a6165252 1213 }
brdirais 1:2597a6165252 1214
brdirais 1:2597a6165252 1215
brdirais 1:2597a6165252 1216 /******************************************************//**
brdirais 1:2597a6165252 1217 * @brief Sets the parameters of the device to predefined values
brdirais 1:2597a6165252 1218 * from l6206_target_config.h
brdirais 1:2597a6165252 1219 * @retval None
brdirais 1:2597a6165252 1220 **********************************************************/
brdirais 1:2597a6165252 1221 void L6206::L6206_SetDeviceParamsToPredefinedValues(void)
brdirais 1:2597a6165252 1222 {
brdirais 1:2597a6165252 1223 uint32_t i;
brdirais 1:2597a6165252 1224
brdirais 1:2597a6165252 1225 memset(&devicePrm, 0, sizeof(devicePrm));
brdirais 1:2597a6165252 1226
brdirais 1:2597a6165252 1227 devicePrm.config = L6206_CONF_PARAM_PARALLE_BRIDGES;
brdirais 1:2597a6165252 1228
brdirais 1:2597a6165252 1229 devicePrm.pwmFreq[INPUT_1A] = L6206_CONF_PARAM_FREQ_PWM1A;
brdirais 1:2597a6165252 1230 devicePrm.pwmFreq[INPUT_2A] = L6206_CONF_PARAM_FREQ_PWM2A;
brdirais 1:2597a6165252 1231 devicePrm.pwmFreq[INPUT_1B] = L6206_CONF_PARAM_FREQ_PWM1B;
brdirais 1:2597a6165252 1232 devicePrm.pwmFreq[INPUT_2B] = L6206_CONF_PARAM_FREQ_PWM2B;
brdirais 1:2597a6165252 1233
brdirais 1:2597a6165252 1234 for (i = 0; i < MAX_NUMBER_OF_BRUSH_DC_MOTORS; i++)
brdirais 1:2597a6165252 1235 {
brdirais 1:2597a6165252 1236 devicePrm.speed[i] = 100;
brdirais 1:2597a6165252 1237 devicePrm.direction[i] = FORWARD;
brdirais 1:2597a6165252 1238 devicePrm.motionState[i] = INACTIVE;
brdirais 1:2597a6165252 1239 }
brdirais 1:2597a6165252 1240 for (i = 0; i < L6206_NB_MAX_BRIDGES; i++)
brdirais 1:2597a6165252 1241 {
brdirais 1:2597a6165252 1242 devicePrm.bridgeEnabled[i] = FALSE;
brdirais 1:2597a6165252 1243 }
brdirais 1:2597a6165252 1244 }
brdirais 1:2597a6165252 1245
brdirais 1:2597a6165252 1246
brdirais 1:2597a6165252 1247 /******************************************************//**
brdirais 1:2597a6165252 1248 * @brief Set the parameters of the device to values of initDevicePrm structure
brdirais 1:2597a6165252 1249 * Set GPIO according to these values
brdirais 1:2597a6165252 1250 * @param initDevicePrm structure containing values to initialize the device
brdirais 1:2597a6165252 1251 * parameters
brdirais 1:2597a6165252 1252 * @retval None
brdirais 1:2597a6165252 1253 **********************************************************/
brdirais 1:2597a6165252 1254 void L6206::L6206_SetDeviceParamsToGivenValues(L6206_Init_t* initDevicePrm)
brdirais 1:2597a6165252 1255 {
brdirais 1:2597a6165252 1256 memcpy(&devicePrm, initDevicePrm, sizeof(devicePrm));
brdirais 1:2597a6165252 1257 }
brdirais 1:2597a6165252 1258
brdirais 1:2597a6165252 1259 /**
brdirais 1:2597a6165252 1260 * @}
brdirais 1:2597a6165252 1261 */
brdirais 1:2597a6165252 1262
brdirais 1:2597a6165252 1263
brdirais 1:2597a6165252 1264
brdirais 1:2597a6165252 1265
brdirais 1:2597a6165252 1266 /**
brdirais 1:2597a6165252 1267 * @}
brdirais 1:2597a6165252 1268 */
brdirais 1:2597a6165252 1269
brdirais 1:2597a6165252 1270 /**
brdirais 1:2597a6165252 1271 * @}
brdirais 1:2597a6165252 1272 */
brdirais 1:2597a6165252 1273
brdirais 1:2597a6165252 1274 /**
brdirais 1:2597a6165252 1275 * @}
brdirais 1:2597a6165252 1276 */
brdirais 1:2597a6165252 1277
brdirais 1:2597a6165252 1278
brdirais 1:2597a6165252 1279 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
brdirais 1:2597a6165252 1280
brdirais 1:2597a6165252 1281
brdirais 1:2597a6165252 1282