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

Dependencies:   ST_INTERFACES

Dependents:   HelloWorld_IHM04A1 RoboCane_Motore arm_dcmotor_can arm_linear_can_2 ... more

Fork of X_NUCLEO_IHM04A1 by ST Expansion SW Team

Motor Control Library

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

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

The key features of the library are :

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

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

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

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

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

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

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

A motion command can be stopped at any moment:

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

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

Arduino Connector Compatibility Warning

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

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


Board configuration for HelloWorld_IHM04A1 example

/media/uploads/brdirais/drive4brushdcmotor_ihm04a1.png

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

Who changed what in which revision?

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