Use BDCMotor_class.h instead of motor_class.h

Dependents:   HelloWorld_IHM04A1

Fork of X_NUCLEO_IHM04A1 by ST

Committer:
Manu_L
Date:
Tue Jun 14 12:14:28 2016 +0000
Revision:
3:b06e38d365d7
Parent:
1:2597a6165252
Use BDCMotor_class.h instead of Motor_class.h

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