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:
Thu Aug 03 16:32:32 2017 +0000
Revision:
6:d16ad1d58ea1
Parent:
5:51ad3c4b904c
Aligning to ARM mbed coding style.

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 }
Davidroid 6:d16ad1d58ea1 233 else
davide.aliprandi@st.com 4:24158c44f02e 234 {
Davidroid 6:d16ad1d58ea1 235 if (devicePrm.motionState[motorId] != INACTIVE)
Davidroid 6:d16ad1d58ea1 236 {
Davidroid 6:d16ad1d58ea1 237 speed = devicePrm.speed[motorId];
Davidroid 6:d16ad1d58ea1 238 }
davide.aliprandi@st.com 4:24158c44f02e 239 }
davide.aliprandi@st.com 4:24158c44f02e 240
davide.aliprandi@st.com 4:24158c44f02e 241 return (speed);
davide.aliprandi@st.com 4:24158c44f02e 242 }
davide.aliprandi@st.com 4:24158c44f02e 243
davide.aliprandi@st.com 4:24158c44f02e 244 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 245 * @brief Returns the device state
davide.aliprandi@st.com 4:24158c44f02e 246 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 247 * @retval State (STEADY or INACTIVE)
davide.aliprandi@st.com 4:24158c44f02e 248 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 249 motorState_t L6206::L6206_get_device_state(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 250 {
davide.aliprandi@st.com 4:24158c44f02e 251 motorState_t state = INACTIVE;
davide.aliprandi@st.com 4:24158c44f02e 252
davide.aliprandi@st.com 4:24158c44f02e 253 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
davide.aliprandi@st.com 4:24158c44f02e 254 {
davide.aliprandi@st.com 4:24158c44f02e 255 L6206_ErrorHandler(L6206_ERROR_1);
davide.aliprandi@st.com 4:24158c44f02e 256 }
davide.aliprandi@st.com 4:24158c44f02e 257 else
davide.aliprandi@st.com 4:24158c44f02e 258 {
davide.aliprandi@st.com 4:24158c44f02e 259 state = devicePrm.motionState[motorId];
davide.aliprandi@st.com 4:24158c44f02e 260 }
davide.aliprandi@st.com 4:24158c44f02e 261 return (state);
davide.aliprandi@st.com 4:24158c44f02e 262 }
davide.aliprandi@st.com 4:24158c44f02e 263
davide.aliprandi@st.com 4:24158c44f02e 264 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 265 * @brief Returns the FW version of the library
davide.aliprandi@st.com 4:24158c44f02e 266 * @retval L6206_FW_VERSION
davide.aliprandi@st.com 4:24158c44f02e 267 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 268 uint8_t L6206::L6206_GetFwVersion(void)
davide.aliprandi@st.com 4:24158c44f02e 269 {
davide.aliprandi@st.com 4:24158c44f02e 270 return (L6206_FW_VERSION);
davide.aliprandi@st.com 4:24158c44f02e 271 }
davide.aliprandi@st.com 4:24158c44f02e 272
davide.aliprandi@st.com 4:24158c44f02e 273 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 274 * @brief Returns the max speed of the specified motor
davide.aliprandi@st.com 4:24158c44f02e 275 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 276 * @retval maxSpeed in % from 0 to 100
davide.aliprandi@st.com 4:24158c44f02e 277 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 278 uint16_t L6206::L6206_GetMaxSpeed(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 279 {
Davidroid 6:d16ad1d58ea1 280 uint16_t speed = 0;
davide.aliprandi@st.com 4:24158c44f02e 281 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
davide.aliprandi@st.com 4:24158c44f02e 282 {
davide.aliprandi@st.com 4:24158c44f02e 283 L6206_ErrorHandler(L6206_ERROR_1);
davide.aliprandi@st.com 4:24158c44f02e 284 }
davide.aliprandi@st.com 4:24158c44f02e 285 else
davide.aliprandi@st.com 4:24158c44f02e 286 {
davide.aliprandi@st.com 4:24158c44f02e 287 speed = devicePrm.speed[motorId];
davide.aliprandi@st.com 4:24158c44f02e 288 }
davide.aliprandi@st.com 4:24158c44f02e 289 return (speed);
davide.aliprandi@st.com 4:24158c44f02e 290 }
davide.aliprandi@st.com 4:24158c44f02e 291
davide.aliprandi@st.com 4:24158c44f02e 292
davide.aliprandi@st.com 4:24158c44f02e 293 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 294 * @brief Get the status of the bridge enabling of the corresponding bridge
davide.aliprandi@st.com 4:24158c44f02e 295 * @param[in] bridgeId from 0 for bridge A to 1 for bridge B
davide.aliprandi@st.com 4:24158c44f02e 296 * @retval State of the Enable&Flag pin of the corresponding bridge (1 set, 0 for reset)
davide.aliprandi@st.com 4:24158c44f02e 297 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 298 uint16_t L6206::L6206_GetBridgeStatus(uint8_t bridgeId)
davide.aliprandi@st.com 4:24158c44f02e 299 {
davide.aliprandi@st.com 4:24158c44f02e 300 uint16_t status = L6206_Board_GetFlagPinState(bridgeId);
davide.aliprandi@st.com 4:24158c44f02e 301
davide.aliprandi@st.com 4:24158c44f02e 302 return (status);
davide.aliprandi@st.com 4:24158c44f02e 303 }
davide.aliprandi@st.com 4:24158c44f02e 304
davide.aliprandi@st.com 4:24158c44f02e 305 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 306 * @brief Immediatly stops the motor and disable the power bridge
davide.aliprandi@st.com 4:24158c44f02e 307 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 308 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 309 * @note if two motors uses the same power bridge, the
davide.aliprandi@st.com 4:24158c44f02e 310 * power bridge will be disable only if the two motors are
davide.aliprandi@st.com 4:24158c44f02e 311 * stopped
davide.aliprandi@st.com 4:24158c44f02e 312 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 313 void L6206::L6206_HardHiz(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 314 {
Davidroid 6:d16ad1d58ea1 315 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
davide.aliprandi@st.com 4:24158c44f02e 316 {
davide.aliprandi@st.com 4:24158c44f02e 317 L6206_ErrorHandler(L6206_ERROR_1);
davide.aliprandi@st.com 4:24158c44f02e 318 }
davide.aliprandi@st.com 4:24158c44f02e 319 else
davide.aliprandi@st.com 4:24158c44f02e 320 {
davide.aliprandi@st.com 4:24158c44f02e 321 /* Get bridge Id of the corresponding motor */
davide.aliprandi@st.com 4:24158c44f02e 322 uint8_t bridgeId = L6206_GetBridgeIdUsedByMotorId(motorId);
davide.aliprandi@st.com 4:24158c44f02e 323
davide.aliprandi@st.com 4:24158c44f02e 324 if (devicePrm.bridgeEnabled[bridgeId] != FALSE)
davide.aliprandi@st.com 4:24158c44f02e 325 {
davide.aliprandi@st.com 4:24158c44f02e 326 bool skip = FALSE;
davide.aliprandi@st.com 4:24158c44f02e 327
davide.aliprandi@st.com 4:24158c44f02e 328 /* Check if another motor is currently running by using the same bridge */
davide.aliprandi@st.com 4:24158c44f02e 329 switch (devicePrm.config)
davide.aliprandi@st.com 4:24158c44f02e 330 {
davide.aliprandi@st.com 4:24158c44f02e 331 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 332 if ((motorId > 0) && (devicePrm.motionState[1] == STEADY) && (devicePrm.motionState[2] == STEADY))
davide.aliprandi@st.com 4:24158c44f02e 333 {
davide.aliprandi@st.com 4:24158c44f02e 334 skip = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 335 }
davide.aliprandi@st.com 4:24158c44f02e 336 break;
davide.aliprandi@st.com 4:24158c44f02e 337 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 338 if ((motorId < 2) && (devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))
davide.aliprandi@st.com 4:24158c44f02e 339 {
davide.aliprandi@st.com 4:24158c44f02e 340 skip = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 341 }
davide.aliprandi@st.com 4:24158c44f02e 342 break;
davide.aliprandi@st.com 4:24158c44f02e 343 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 344 if (((motorId < 2) && (devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))||
davide.aliprandi@st.com 4:24158c44f02e 345 ((motorId > 1) && (devicePrm.motionState[2] == STEADY) && (devicePrm.motionState[3] == STEADY)))
davide.aliprandi@st.com 4:24158c44f02e 346 {
davide.aliprandi@st.com 4:24158c44f02e 347 skip = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 348 }
davide.aliprandi@st.com 4:24158c44f02e 349 break;
davide.aliprandi@st.com 4:24158c44f02e 350 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 351 if ((motorId > 0) && (devicePrm.motionState[1] == STEADY) && (devicePrm.motionState[2] == STEADY))
davide.aliprandi@st.com 4:24158c44f02e 352 {
davide.aliprandi@st.com 4:24158c44f02e 353 skip = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 354 }
davide.aliprandi@st.com 4:24158c44f02e 355 break;
davide.aliprandi@st.com 4:24158c44f02e 356 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 357 if ((motorId < 2) && (devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))
davide.aliprandi@st.com 4:24158c44f02e 358 {
davide.aliprandi@st.com 4:24158c44f02e 359 skip = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 360 }
davide.aliprandi@st.com 4:24158c44f02e 361 break;
davide.aliprandi@st.com 4:24158c44f02e 362 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
davide.aliprandi@st.com 4:24158c44f02e 363 if ((devicePrm.motionState[0] == STEADY) && (devicePrm.motionState[1] == STEADY))
davide.aliprandi@st.com 4:24158c44f02e 364 {
davide.aliprandi@st.com 4:24158c44f02e 365 skip = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 366 }
davide.aliprandi@st.com 4:24158c44f02e 367 break;
davide.aliprandi@st.com 4:24158c44f02e 368 default:
davide.aliprandi@st.com 4:24158c44f02e 369 break;
davide.aliprandi@st.com 4:24158c44f02e 370 }
davide.aliprandi@st.com 4:24158c44f02e 371
davide.aliprandi@st.com 4:24158c44f02e 372 if (skip == FALSE)
davide.aliprandi@st.com 4:24158c44f02e 373 {
davide.aliprandi@st.com 4:24158c44f02e 374 /* Disable the bridge */
davide.aliprandi@st.com 4:24158c44f02e 375 L6206_DisableBridge(bridgeId);
davide.aliprandi@st.com 4:24158c44f02e 376 }
davide.aliprandi@st.com 4:24158c44f02e 377 }
davide.aliprandi@st.com 4:24158c44f02e 378 /* Disable the PWM */
davide.aliprandi@st.com 4:24158c44f02e 379 L6206_HardStop(motorId);
davide.aliprandi@st.com 4:24158c44f02e 380 }
davide.aliprandi@st.com 4:24158c44f02e 381 }
davide.aliprandi@st.com 4:24158c44f02e 382
davide.aliprandi@st.com 4:24158c44f02e 383 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 384 * @brief Stops the motor without disabling the bridge
davide.aliprandi@st.com 4:24158c44f02e 385 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 386 * @retval none
davide.aliprandi@st.com 4:24158c44f02e 387 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 388 void L6206::L6206_HardStop(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 389 {
davide.aliprandi@st.com 4:24158c44f02e 390 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
davide.aliprandi@st.com 4:24158c44f02e 391 {
davide.aliprandi@st.com 4:24158c44f02e 392 L6206_ErrorHandler(L6206_ERROR_1);
davide.aliprandi@st.com 4:24158c44f02e 393 }
Davidroid 6:d16ad1d58ea1 394 else
davide.aliprandi@st.com 4:24158c44f02e 395 {
Davidroid 6:d16ad1d58ea1 396 if (devicePrm.motionState[motorId] != INACTIVE)
Davidroid 6:d16ad1d58ea1 397 {
Davidroid 6:d16ad1d58ea1 398 uint8_t bridgeInput;
davide.aliprandi@st.com 4:24158c44f02e 399
Davidroid 6:d16ad1d58ea1 400 /* Get bridge input of the corresponding motor */
Davidroid 6:d16ad1d58ea1 401 bridgeInput = L6206_GetBridgeInputUsedByMotorId(motorId);
davide.aliprandi@st.com 4:24158c44f02e 402
Davidroid 6:d16ad1d58ea1 403 /* Disable corresponding PWM */
Davidroid 6:d16ad1d58ea1 404 L6206_Board_PwmStop(bridgeInput);
davide.aliprandi@st.com 4:24158c44f02e 405
Davidroid 6:d16ad1d58ea1 406 /* for bidirectionnal motor, disable second PWM*/
Davidroid 6:d16ad1d58ea1 407 if (L6206_IsBidirectionnalMotor(motorId))
Davidroid 6:d16ad1d58ea1 408 {
Davidroid 6:d16ad1d58ea1 409 bridgeInput = L6206_GetSecondBridgeInputUsedByMotorId(motorId);
Davidroid 6:d16ad1d58ea1 410 L6206_Board_PwmStop(bridgeInput);
Davidroid 6:d16ad1d58ea1 411 }
Davidroid 6:d16ad1d58ea1 412 /* Set inactive state */
Davidroid 6:d16ad1d58ea1 413 devicePrm.motionState[motorId] = INACTIVE;
davide.aliprandi@st.com 4:24158c44f02e 414 }
davide.aliprandi@st.com 4:24158c44f02e 415 }
davide.aliprandi@st.com 4:24158c44f02e 416 }
davide.aliprandi@st.com 4:24158c44f02e 417
davide.aliprandi@st.com 4:24158c44f02e 418 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 419 * @brief Read id
davide.aliprandi@st.com 4:24158c44f02e 420 * @retval Id of the l6206 Driver Instance
davide.aliprandi@st.com 4:24158c44f02e 421 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 422 status_t L6206::L6206_ReadId(uint8_t *id)
davide.aliprandi@st.com 4:24158c44f02e 423 {
davide.aliprandi@st.com 4:24158c44f02e 424 *id = deviceInstance;
davide.aliprandi@st.com 4:24158c44f02e 425
davide.aliprandi@st.com 4:24158c44f02e 426 return COMPONENT_OK;
davide.aliprandi@st.com 4:24158c44f02e 427 }
davide.aliprandi@st.com 4:24158c44f02e 428
davide.aliprandi@st.com 4:24158c44f02e 429 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 430 * @brief Runs the motor
davide.aliprandi@st.com 4:24158c44f02e 431 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 432 * @param[in] direction FORWARD or BACKWARD
davide.aliprandi@st.com 4:24158c44f02e 433 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 434 * @note For unidirectionnal motor, direction parameter has
davide.aliprandi@st.com 4:24158c44f02e 435 * no effect
davide.aliprandi@st.com 4:24158c44f02e 436 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 437 void L6206::L6206_Run(uint8_t motorId, motorDir_t direction)
davide.aliprandi@st.com 4:24158c44f02e 438 {
Davidroid 6:d16ad1d58ea1 439 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
davide.aliprandi@st.com 4:24158c44f02e 440 {
davide.aliprandi@st.com 4:24158c44f02e 441 L6206_ErrorHandler(L6206_ERROR_1);
davide.aliprandi@st.com 4:24158c44f02e 442 }
Davidroid 6:d16ad1d58ea1 443 else
davide.aliprandi@st.com 4:24158c44f02e 444 {
Davidroid 6:d16ad1d58ea1 445 if ((devicePrm.motionState[motorId] == INACTIVE) ||
Davidroid 6:d16ad1d58ea1 446 (devicePrm.direction[motorId] != direction))
davide.aliprandi@st.com 4:24158c44f02e 447 {
Davidroid 6:d16ad1d58ea1 448 uint8_t bridgeId;
Davidroid 6:d16ad1d58ea1 449 uint8_t bridgeInput;
Davidroid 6:d16ad1d58ea1 450
Davidroid 6:d16ad1d58ea1 451 /* Eventually deactivate motor */
Davidroid 6:d16ad1d58ea1 452 if (devicePrm.motionState[motorId] != INACTIVE)
Davidroid 6:d16ad1d58ea1 453 {
Davidroid 6:d16ad1d58ea1 454 L6206_HardStop(motorId);
Davidroid 6:d16ad1d58ea1 455 }
davide.aliprandi@st.com 4:24158c44f02e 456
Davidroid 6:d16ad1d58ea1 457 /* Store new direction */
Davidroid 6:d16ad1d58ea1 458 devicePrm.direction[motorId] = direction;
davide.aliprandi@st.com 4:24158c44f02e 459
Davidroid 6:d16ad1d58ea1 460 /* Switch to steady state */
Davidroid 6:d16ad1d58ea1 461 devicePrm.motionState[motorId] = STEADY;
davide.aliprandi@st.com 4:24158c44f02e 462
Davidroid 6:d16ad1d58ea1 463 /* Get bridge Id of the corresponding motor */
Davidroid 6:d16ad1d58ea1 464 bridgeId = L6206_GetBridgeIdUsedByMotorId(motorId);
davide.aliprandi@st.com 4:24158c44f02e 465
Davidroid 6:d16ad1d58ea1 466 /* Get bridge input of the corresponding motor */
Davidroid 6:d16ad1d58ea1 467 bridgeInput = L6206_GetBridgeInputUsedByMotorId(motorId);
davide.aliprandi@st.com 4:24158c44f02e 468
Davidroid 6:d16ad1d58ea1 469 /* Enable bridge */
Davidroid 6:d16ad1d58ea1 470 L6206_EnableBridge(bridgeId);
davide.aliprandi@st.com 4:24158c44f02e 471
Davidroid 6:d16ad1d58ea1 472 /* Set PWM */
Davidroid 6:d16ad1d58ea1 473 if (L6206_IsBidirectionnalMotor(motorId))
Davidroid 6:d16ad1d58ea1 474 {
Davidroid 6:d16ad1d58ea1 475 /* for bidirectionnal motor */
Davidroid 6:d16ad1d58ea1 476 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],(100 - devicePrm.speed[motorId]));
Davidroid 6:d16ad1d58ea1 477 bridgeInput = L6206_GetSecondBridgeInputUsedByMotorId(motorId);
Davidroid 6:d16ad1d58ea1 478 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],100);
Davidroid 6:d16ad1d58ea1 479 }
Davidroid 6:d16ad1d58ea1 480 else
Davidroid 6:d16ad1d58ea1 481 {
Davidroid 6:d16ad1d58ea1 482 /* for unidirectionnal motor */
Davidroid 6:d16ad1d58ea1 483 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],devicePrm.speed[motorId]);
Davidroid 6:d16ad1d58ea1 484 }
davide.aliprandi@st.com 4:24158c44f02e 485 }
davide.aliprandi@st.com 4:24158c44f02e 486 }
davide.aliprandi@st.com 4:24158c44f02e 487 }
davide.aliprandi@st.com 4:24158c44f02e 488 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 489 * @brief Set dual full bridge parallelling configuration
davide.aliprandi@st.com 4:24158c44f02e 490 * @param[in] newConfig bridge configuration to apply from
davide.aliprandi@st.com 4:24158c44f02e 491 * dualFullBridgeConfig_t enum
davide.aliprandi@st.com 4:24158c44f02e 492 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 493 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 494 void L6206::L6206_SetDualFullBridgeConfig(uint8_t newConfig)
davide.aliprandi@st.com 4:24158c44f02e 495 {
Davidroid 6:d16ad1d58ea1 496 devicePrm.config = (dualFullBridgeConfig_t)newConfig;
davide.aliprandi@st.com 4:24158c44f02e 497
davide.aliprandi@st.com 4:24158c44f02e 498 /* Start to reset all else if several inits are used successively */
davide.aliprandi@st.com 4:24158c44f02e 499 /* they will fail */
davide.aliprandi@st.com 4:24158c44f02e 500 L6206_Board_PwmDeInit(INPUT_1A);
davide.aliprandi@st.com 4:24158c44f02e 501 L6206_Board_PwmDeInit(INPUT_2A);
davide.aliprandi@st.com 4:24158c44f02e 502 L6206_Board_PwmDeInit(INPUT_1B);
davide.aliprandi@st.com 4:24158c44f02e 503 L6206_Board_PwmDeInit(INPUT_2B);
davide.aliprandi@st.com 4:24158c44f02e 504
davide.aliprandi@st.com 4:24158c44f02e 505
davide.aliprandi@st.com 4:24158c44f02e 506 /* Initialise the bridges inputs PWMs --------------------------------------*/
davide.aliprandi@st.com 4:24158c44f02e 507 switch (devicePrm.config)
davide.aliprandi@st.com 4:24158c44f02e 508 {
davide.aliprandi@st.com 4:24158c44f02e 509 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 510 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 511 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 512 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 513 L6206_Board_PwmInit(INPUT_1A);
davide.aliprandi@st.com 4:24158c44f02e 514 L6206_Board_PwmInit(INPUT_2A);
davide.aliprandi@st.com 4:24158c44f02e 515 L6206_Board_PwmInit(INPUT_1B);
davide.aliprandi@st.com 4:24158c44f02e 516 L6206_Board_PwmInit(INPUT_2B);
davide.aliprandi@st.com 4:24158c44f02e 517 break;
davide.aliprandi@st.com 4:24158c44f02e 518 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 519 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 520 L6206_Board_PwmDeInit(INPUT_2A);
davide.aliprandi@st.com 4:24158c44f02e 521 L6206_Board_PwmInit(INPUT_1A);
davide.aliprandi@st.com 4:24158c44f02e 522 L6206_Board_PwmInit(INPUT_1B);
davide.aliprandi@st.com 4:24158c44f02e 523 L6206_Board_PwmInit(INPUT_2B);
davide.aliprandi@st.com 4:24158c44f02e 524 break;
davide.aliprandi@st.com 4:24158c44f02e 525 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 526 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 527 L6206_Board_PwmDeInit(INPUT_2B);
davide.aliprandi@st.com 4:24158c44f02e 528 L6206_Board_PwmInit(INPUT_1A);
davide.aliprandi@st.com 4:24158c44f02e 529 L6206_Board_PwmInit(INPUT_2A);
davide.aliprandi@st.com 4:24158c44f02e 530 L6206_Board_PwmInit(INPUT_1B);
davide.aliprandi@st.com 4:24158c44f02e 531 break;
davide.aliprandi@st.com 4:24158c44f02e 532 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 533 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 534 L6206_Board_PwmDeInit(INPUT_2A);
davide.aliprandi@st.com 4:24158c44f02e 535 L6206_Board_PwmDeInit(INPUT_2B);
davide.aliprandi@st.com 4:24158c44f02e 536 L6206_Board_PwmInit(INPUT_1A);
davide.aliprandi@st.com 4:24158c44f02e 537 L6206_Board_PwmInit(INPUT_1B);
davide.aliprandi@st.com 4:24158c44f02e 538 break;
davide.aliprandi@st.com 4:24158c44f02e 539 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
davide.aliprandi@st.com 4:24158c44f02e 540 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 541 L6206_Board_PwmDeInit(INPUT_1B);
davide.aliprandi@st.com 4:24158c44f02e 542 L6206_Board_PwmDeInit(INPUT_2B);
davide.aliprandi@st.com 4:24158c44f02e 543 L6206_Board_PwmInit(INPUT_1A);
davide.aliprandi@st.com 4:24158c44f02e 544 L6206_Board_PwmInit(INPUT_2A);
davide.aliprandi@st.com 4:24158c44f02e 545 break;
davide.aliprandi@st.com 4:24158c44f02e 546 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 547 L6206_Board_PwmDeInit(INPUT_2A);
davide.aliprandi@st.com 4:24158c44f02e 548 L6206_Board_PwmDeInit(INPUT_1B);
davide.aliprandi@st.com 4:24158c44f02e 549 L6206_Board_PwmDeInit(INPUT_2B);
davide.aliprandi@st.com 4:24158c44f02e 550 L6206_Board_PwmInit(INPUT_1A);
davide.aliprandi@st.com 4:24158c44f02e 551 break;
davide.aliprandi@st.com 4:24158c44f02e 552 default:
davide.aliprandi@st.com 4:24158c44f02e 553 break;
davide.aliprandi@st.com 4:24158c44f02e 554 }
davide.aliprandi@st.com 4:24158c44f02e 555 }
davide.aliprandi@st.com 4:24158c44f02e 556 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 557 * @brief Changes the max speed of the specified device
davide.aliprandi@st.com 4:24158c44f02e 558 * @param[in] motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 559 * @param[in] newMaxSpeed in % from 0 to 100
davide.aliprandi@st.com 4:24158c44f02e 560 * @retval true if the command is successfully executed, else false
davide.aliprandi@st.com 4:24158c44f02e 561 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 562 bool L6206::L6206_SetMaxSpeed(uint8_t motorId, uint16_t newMaxSpeed)
davide.aliprandi@st.com 4:24158c44f02e 563 {
Davidroid 6:d16ad1d58ea1 564 bool cmdExecuted = FALSE;
davide.aliprandi@st.com 4:24158c44f02e 565
davide.aliprandi@st.com 4:24158c44f02e 566 if (motorId > l6206ArrayNbMaxMotorsByConfig[devicePrm.config])
davide.aliprandi@st.com 4:24158c44f02e 567 {
davide.aliprandi@st.com 4:24158c44f02e 568 L6206_ErrorHandler(L6206_ERROR_1);
davide.aliprandi@st.com 4:24158c44f02e 569 }
davide.aliprandi@st.com 4:24158c44f02e 570 else
davide.aliprandi@st.com 4:24158c44f02e 571 {
davide.aliprandi@st.com 4:24158c44f02e 572 devicePrm.speed[motorId] = newMaxSpeed;
davide.aliprandi@st.com 4:24158c44f02e 573 if (devicePrm.motionState[motorId] != INACTIVE)
davide.aliprandi@st.com 4:24158c44f02e 574 {
davide.aliprandi@st.com 4:24158c44f02e 575 uint8_t bridgeInput;
davide.aliprandi@st.com 4:24158c44f02e 576
davide.aliprandi@st.com 4:24158c44f02e 577 /* Get Bridge input of the corresponding motor */
davide.aliprandi@st.com 4:24158c44f02e 578 bridgeInput = L6206_GetBridgeInputUsedByMotorId(motorId);
davide.aliprandi@st.com 4:24158c44f02e 579
davide.aliprandi@st.com 4:24158c44f02e 580 /* Set PWM frequency*/
davide.aliprandi@st.com 4:24158c44f02e 581 if (L6206_IsBidirectionnalMotor(motorId))
davide.aliprandi@st.com 4:24158c44f02e 582 {
davide.aliprandi@st.com 4:24158c44f02e 583 /* for bidirectionnal motor */
davide.aliprandi@st.com 4:24158c44f02e 584 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],(100 - devicePrm.speed[motorId]));
davide.aliprandi@st.com 4:24158c44f02e 585 }
davide.aliprandi@st.com 4:24158c44f02e 586 else
davide.aliprandi@st.com 4:24158c44f02e 587 {
davide.aliprandi@st.com 4:24158c44f02e 588 /* for unidirectionnal motor */
davide.aliprandi@st.com 4:24158c44f02e 589 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],devicePrm.speed[motorId]);
davide.aliprandi@st.com 4:24158c44f02e 590 }
davide.aliprandi@st.com 4:24158c44f02e 591 }
davide.aliprandi@st.com 4:24158c44f02e 592 cmdExecuted = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 593 }
davide.aliprandi@st.com 4:24158c44f02e 594 return cmdExecuted;
davide.aliprandi@st.com 4:24158c44f02e 595 }
davide.aliprandi@st.com 4:24158c44f02e 596
davide.aliprandi@st.com 4:24158c44f02e 597 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 598 * @brief Changes the PWM frequency of the bridge input
davide.aliprandi@st.com 4:24158c44f02e 599 * @param[in] bridgeId 0 for bridge A, 1 for bridge B
davide.aliprandi@st.com 4:24158c44f02e 600 * @param[in] newFreq in Hz
davide.aliprandi@st.com 4:24158c44f02e 601 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 602 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 603 void L6206::L6206_SetBridgeInputPwmFreq(uint8_t bridgeId, uint32_t newFreq)
davide.aliprandi@st.com 4:24158c44f02e 604 {
Davidroid 6:d16ad1d58ea1 605 uint8_t loop;
davide.aliprandi@st.com 4:24158c44f02e 606
davide.aliprandi@st.com 4:24158c44f02e 607 if (newFreq > L6206_MAX_PWM_FREQ)
davide.aliprandi@st.com 4:24158c44f02e 608 {
davide.aliprandi@st.com 4:24158c44f02e 609 newFreq = L6206_MAX_PWM_FREQ;
davide.aliprandi@st.com 4:24158c44f02e 610 }
davide.aliprandi@st.com 4:24158c44f02e 611 for (loop = 0; loop < 2;loop ++)
davide.aliprandi@st.com 4:24158c44f02e 612 {
davide.aliprandi@st.com 4:24158c44f02e 613 uint8_t motorId;
davide.aliprandi@st.com 4:24158c44f02e 614 uint8_t bridgeInput = (bridgeId << 1) + loop;
davide.aliprandi@st.com 4:24158c44f02e 615 devicePrm.pwmFreq[bridgeInput] = newFreq;
davide.aliprandi@st.com 4:24158c44f02e 616
davide.aliprandi@st.com 4:24158c44f02e 617 /* Get motor Id using this bridge */
davide.aliprandi@st.com 4:24158c44f02e 618 motorId = L6206_GetMotorIdUsingbridgeInput(bridgeInput);
davide.aliprandi@st.com 4:24158c44f02e 619
davide.aliprandi@st.com 4:24158c44f02e 620 /* Immediatly update frequency if motor is running */
davide.aliprandi@st.com 4:24158c44f02e 621 if (devicePrm.motionState[motorId] != INACTIVE)
davide.aliprandi@st.com 4:24158c44f02e 622 {
davide.aliprandi@st.com 4:24158c44f02e 623 /* Test if motor is bidir */
davide.aliprandi@st.com 4:24158c44f02e 624 if (L6206_IsBidirectionnalMotor(motorId))
davide.aliprandi@st.com 4:24158c44f02e 625 {
davide.aliprandi@st.com 4:24158c44f02e 626 if (bridgeInput != L6206_GetSecondBridgeInputUsedByMotorId(motorId))
davide.aliprandi@st.com 4:24158c44f02e 627 {
Davidroid 6:d16ad1d58ea1 628 /* Set PWM frequency for bidirectionnal motor of the first bridge*/
Davidroid 6:d16ad1d58ea1 629 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],(100 - devicePrm.speed[motorId]));
davide.aliprandi@st.com 4:24158c44f02e 630 }
davide.aliprandi@st.com 4:24158c44f02e 631 else
davide.aliprandi@st.com 4:24158c44f02e 632 {
davide.aliprandi@st.com 4:24158c44f02e 633 /* Set PWM frequency for bidirectionnal motor of the second bridge */
davide.aliprandi@st.com 4:24158c44f02e 634 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],100);
davide.aliprandi@st.com 4:24158c44f02e 635 }
davide.aliprandi@st.com 4:24158c44f02e 636 }
davide.aliprandi@st.com 4:24158c44f02e 637 else
davide.aliprandi@st.com 4:24158c44f02e 638 {
davide.aliprandi@st.com 4:24158c44f02e 639 /* Set PWM frequency for unidirectionnal motor */
davide.aliprandi@st.com 4:24158c44f02e 640 L6206_Board_PwmSetFreq(bridgeInput, devicePrm.pwmFreq[bridgeInput],devicePrm.speed[motorId]);
davide.aliprandi@st.com 4:24158c44f02e 641 }
davide.aliprandi@st.com 4:24158c44f02e 642 }
davide.aliprandi@st.com 4:24158c44f02e 643 }
davide.aliprandi@st.com 4:24158c44f02e 644 }
davide.aliprandi@st.com 4:24158c44f02e 645 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 646 * @brief Sets the number of devices to be used
davide.aliprandi@st.com 4:24158c44f02e 647 * @param[in] nbDevices (from 1 to MAX_NUMBER_OF_DEVICES)
davide.aliprandi@st.com 4:24158c44f02e 648 * @retval TRUE if successfull, FALSE if failure, attempt to set a number of
davide.aliprandi@st.com 4:24158c44f02e 649 * devices greater than MAX_NUMBER_OF_DEVICES
davide.aliprandi@st.com 4:24158c44f02e 650 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 651 bool L6206::L6206_SetNbDevices(uint8_t nbDevices)
davide.aliprandi@st.com 4:24158c44f02e 652 {
davide.aliprandi@st.com 4:24158c44f02e 653 if (nbDevices <= MAX_NUMBER_OF_DEVICES)
davide.aliprandi@st.com 4:24158c44f02e 654 {
davide.aliprandi@st.com 4:24158c44f02e 655 return TRUE;
davide.aliprandi@st.com 4:24158c44f02e 656 }
davide.aliprandi@st.com 4:24158c44f02e 657 else
davide.aliprandi@st.com 4:24158c44f02e 658 {
davide.aliprandi@st.com 4:24158c44f02e 659 return FALSE;
davide.aliprandi@st.com 4:24158c44f02e 660 }
davide.aliprandi@st.com 4:24158c44f02e 661 }
davide.aliprandi@st.com 4:24158c44f02e 662
davide.aliprandi@st.com 4:24158c44f02e 663
davide.aliprandi@st.com 4:24158c44f02e 664 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 665 * @brief Error handler which calls the user callback (if defined)
davide.aliprandi@st.com 4:24158c44f02e 666 * @param[in] error Number of the error
davide.aliprandi@st.com 4:24158c44f02e 667 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 668 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 669 void L6206::L6206_ErrorHandler(uint16_t error)
davide.aliprandi@st.com 4:24158c44f02e 670 {
Davidroid 6:d16ad1d58ea1 671 if (errorHandlerCallback != 0)
davide.aliprandi@st.com 4:24158c44f02e 672 {
davide.aliprandi@st.com 4:24158c44f02e 673 (void) errorHandlerCallback(error);
davide.aliprandi@st.com 4:24158c44f02e 674 }
davide.aliprandi@st.com 4:24158c44f02e 675 else
davide.aliprandi@st.com 4:24158c44f02e 676 {
davide.aliprandi@st.com 4:24158c44f02e 677 while(1)
davide.aliprandi@st.com 4:24158c44f02e 678 {
davide.aliprandi@st.com 4:24158c44f02e 679 /* Infinite loop */
davide.aliprandi@st.com 4:24158c44f02e 680 }
davide.aliprandi@st.com 4:24158c44f02e 681 }
davide.aliprandi@st.com 4:24158c44f02e 682 }
davide.aliprandi@st.com 4:24158c44f02e 683
davide.aliprandi@st.com 4:24158c44f02e 684 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 685 * @brief Handlers of the flag interrupt which calls the user callback (if defined)
davide.aliprandi@st.com 4:24158c44f02e 686 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 687 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 688 void L6206::L6206_FlagInterruptHandler(void)
davide.aliprandi@st.com 4:24158c44f02e 689 {
Davidroid 6:d16ad1d58ea1 690 bool status;
davide.aliprandi@st.com 4:24158c44f02e 691
davide.aliprandi@st.com 4:24158c44f02e 692 status = L6206_GetBridgeStatus(BRIDGE_A);
davide.aliprandi@st.com 4:24158c44f02e 693 if (status != devicePrm.bridgeEnabled[BRIDGE_A])
davide.aliprandi@st.com 4:24158c44f02e 694 {
davide.aliprandi@st.com 4:24158c44f02e 695 devicePrm.bridgeEnabled[BRIDGE_A] = status;
davide.aliprandi@st.com 4:24158c44f02e 696 }
davide.aliprandi@st.com 4:24158c44f02e 697
davide.aliprandi@st.com 4:24158c44f02e 698 status = L6206_GetBridgeStatus(BRIDGE_B);
davide.aliprandi@st.com 4:24158c44f02e 699 if (status != devicePrm.bridgeEnabled[BRIDGE_B])
davide.aliprandi@st.com 4:24158c44f02e 700 {
davide.aliprandi@st.com 4:24158c44f02e 701 devicePrm.bridgeEnabled[BRIDGE_B] = status;
davide.aliprandi@st.com 4:24158c44f02e 702 }
davide.aliprandi@st.com 4:24158c44f02e 703
davide.aliprandi@st.com 4:24158c44f02e 704 if (flagInterruptCallback != 0)
davide.aliprandi@st.com 4:24158c44f02e 705 {
davide.aliprandi@st.com 4:24158c44f02e 706 flagInterruptCallback();
davide.aliprandi@st.com 4:24158c44f02e 707 }
davide.aliprandi@st.com 4:24158c44f02e 708 }
davide.aliprandi@st.com 4:24158c44f02e 709
davide.aliprandi@st.com 4:24158c44f02e 710 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 711 * @brief Get the bridges Id used by a given motor
davide.aliprandi@st.com 4:24158c44f02e 712 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 713 * @retval bridgeId 0 for bridge A , 1 for bridge B
davide.aliprandi@st.com 4:24158c44f02e 714 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 715 uint8_t L6206::L6206_GetBridgeIdUsedByMotorId(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 716 {
davide.aliprandi@st.com 4:24158c44f02e 717 uint8_t bridgeId;
davide.aliprandi@st.com 4:24158c44f02e 718
davide.aliprandi@st.com 4:24158c44f02e 719 switch (devicePrm.config)
davide.aliprandi@st.com 4:24158c44f02e 720 {
davide.aliprandi@st.com 4:24158c44f02e 721 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 722 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 723 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 724 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 725 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 726 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 727 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 728 {
davide.aliprandi@st.com 4:24158c44f02e 729 bridgeId = 0;
davide.aliprandi@st.com 4:24158c44f02e 730 }
davide.aliprandi@st.com 4:24158c44f02e 731 else
davide.aliprandi@st.com 4:24158c44f02e 732 {
davide.aliprandi@st.com 4:24158c44f02e 733 bridgeId = 1;
davide.aliprandi@st.com 4:24158c44f02e 734 }
davide.aliprandi@st.com 4:24158c44f02e 735 break;
davide.aliprandi@st.com 4:24158c44f02e 736 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 737 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 738 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 739 if (motorId < 2)
davide.aliprandi@st.com 4:24158c44f02e 740 {
davide.aliprandi@st.com 4:24158c44f02e 741 bridgeId = 0;
davide.aliprandi@st.com 4:24158c44f02e 742 }
davide.aliprandi@st.com 4:24158c44f02e 743 else
davide.aliprandi@st.com 4:24158c44f02e 744 {
davide.aliprandi@st.com 4:24158c44f02e 745 bridgeId = 1;
davide.aliprandi@st.com 4:24158c44f02e 746 }
davide.aliprandi@st.com 4:24158c44f02e 747 break;
davide.aliprandi@st.com 4:24158c44f02e 748 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 749 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
davide.aliprandi@st.com 4:24158c44f02e 750 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 751 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 752 default:
davide.aliprandi@st.com 4:24158c44f02e 753 bridgeId = 0;
davide.aliprandi@st.com 4:24158c44f02e 754 break;
davide.aliprandi@st.com 4:24158c44f02e 755 }
davide.aliprandi@st.com 4:24158c44f02e 756 return (bridgeId);
davide.aliprandi@st.com 4:24158c44f02e 757 }
davide.aliprandi@st.com 4:24158c44f02e 758
davide.aliprandi@st.com 4:24158c44f02e 759 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 760 * @brief Get the motor Id which is using the specified bridge input
davide.aliprandi@st.com 4:24158c44f02e 761 * @param bridgeInput 0 for bridgeInput 1A, 1 for 2A, 2 for 1B, 3 for 3B
davide.aliprandi@st.com 4:24158c44f02e 762 * @retval bridgeId 0 for bridge A , 1 for bridge B
davide.aliprandi@st.com 4:24158c44f02e 763 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 764 uint8_t L6206::L6206_GetMotorIdUsingbridgeInput(uint8_t bridgeInput)
davide.aliprandi@st.com 4:24158c44f02e 765 {
davide.aliprandi@st.com 4:24158c44f02e 766 uint8_t motorId;
davide.aliprandi@st.com 4:24158c44f02e 767
davide.aliprandi@st.com 4:24158c44f02e 768 switch (devicePrm.config)
davide.aliprandi@st.com 4:24158c44f02e 769 {
davide.aliprandi@st.com 4:24158c44f02e 770 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 771 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 772 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 773 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 774 if (bridgeInput >= INPUT_1B)
davide.aliprandi@st.com 4:24158c44f02e 775 {
davide.aliprandi@st.com 4:24158c44f02e 776 motorId = 1;
davide.aliprandi@st.com 4:24158c44f02e 777 }
davide.aliprandi@st.com 4:24158c44f02e 778 else
davide.aliprandi@st.com 4:24158c44f02e 779 {
davide.aliprandi@st.com 4:24158c44f02e 780 motorId = 0;
davide.aliprandi@st.com 4:24158c44f02e 781 }
davide.aliprandi@st.com 4:24158c44f02e 782 break;
davide.aliprandi@st.com 4:24158c44f02e 783 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 784 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 785 if (bridgeInput == INPUT_2B)
davide.aliprandi@st.com 4:24158c44f02e 786 {
davide.aliprandi@st.com 4:24158c44f02e 787 motorId = 2;
davide.aliprandi@st.com 4:24158c44f02e 788 }
davide.aliprandi@st.com 4:24158c44f02e 789 else
davide.aliprandi@st.com 4:24158c44f02e 790 {
Davidroid 6:d16ad1d58ea1 791 if (bridgeInput == INPUT_1B)
Davidroid 6:d16ad1d58ea1 792 {
Davidroid 6:d16ad1d58ea1 793 motorId = 1;
Davidroid 6:d16ad1d58ea1 794 }
Davidroid 6:d16ad1d58ea1 795 else
Davidroid 6:d16ad1d58ea1 796 {
Davidroid 6:d16ad1d58ea1 797 motorId = 0;
Davidroid 6:d16ad1d58ea1 798 }
Davidroid 6:d16ad1d58ea1 799 }
davide.aliprandi@st.com 4:24158c44f02e 800 break;
davide.aliprandi@st.com 4:24158c44f02e 801 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 802 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 803 if (bridgeInput >= INPUT_1B)
davide.aliprandi@st.com 4:24158c44f02e 804 {
davide.aliprandi@st.com 4:24158c44f02e 805 motorId = 2;
davide.aliprandi@st.com 4:24158c44f02e 806 }
davide.aliprandi@st.com 4:24158c44f02e 807 else
davide.aliprandi@st.com 4:24158c44f02e 808 {
Davidroid 6:d16ad1d58ea1 809 if (bridgeInput == INPUT_2A)
Davidroid 6:d16ad1d58ea1 810 {
Davidroid 6:d16ad1d58ea1 811 motorId = 1;
Davidroid 6:d16ad1d58ea1 812 }
Davidroid 6:d16ad1d58ea1 813 else
Davidroid 6:d16ad1d58ea1 814 {
Davidroid 6:d16ad1d58ea1 815 motorId = 0;
Davidroid 6:d16ad1d58ea1 816 }
Davidroid 6:d16ad1d58ea1 817 }
davide.aliprandi@st.com 4:24158c44f02e 818 break;
davide.aliprandi@st.com 4:24158c44f02e 819 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 820 if (bridgeInput == INPUT_2B)
davide.aliprandi@st.com 4:24158c44f02e 821 {
davide.aliprandi@st.com 4:24158c44f02e 822 motorId = 3;
davide.aliprandi@st.com 4:24158c44f02e 823 }
davide.aliprandi@st.com 4:24158c44f02e 824 else
davide.aliprandi@st.com 4:24158c44f02e 825 {
Davidroid 6:d16ad1d58ea1 826 if (bridgeInput == INPUT_1B)
Davidroid 6:d16ad1d58ea1 827 {
Davidroid 6:d16ad1d58ea1 828 motorId = 2;
Davidroid 6:d16ad1d58ea1 829 }
Davidroid 6:d16ad1d58ea1 830 else
Davidroid 6:d16ad1d58ea1 831 {
Davidroid 6:d16ad1d58ea1 832 if (bridgeInput == INPUT_2A)
Davidroid 6:d16ad1d58ea1 833 {
Davidroid 6:d16ad1d58ea1 834 motorId = 1;
Davidroid 6:d16ad1d58ea1 835 }
Davidroid 6:d16ad1d58ea1 836 else
Davidroid 6:d16ad1d58ea1 837 {
Davidroid 6:d16ad1d58ea1 838 motorId = 0;
Davidroid 6:d16ad1d58ea1 839 }
Davidroid 6:d16ad1d58ea1 840 }
Davidroid 6:d16ad1d58ea1 841 }
davide.aliprandi@st.com 4:24158c44f02e 842 break;
davide.aliprandi@st.com 4:24158c44f02e 843 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
davide.aliprandi@st.com 4:24158c44f02e 844 if ((bridgeInput == INPUT_2A) || (bridgeInput == INPUT_2B))
davide.aliprandi@st.com 4:24158c44f02e 845 {
davide.aliprandi@st.com 4:24158c44f02e 846 motorId = 1;
davide.aliprandi@st.com 4:24158c44f02e 847 }
davide.aliprandi@st.com 4:24158c44f02e 848 else
davide.aliprandi@st.com 4:24158c44f02e 849 {
davide.aliprandi@st.com 4:24158c44f02e 850 motorId = 0;
davide.aliprandi@st.com 4:24158c44f02e 851 }
davide.aliprandi@st.com 4:24158c44f02e 852 break;
davide.aliprandi@st.com 4:24158c44f02e 853 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 854 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 855 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 856 default:
davide.aliprandi@st.com 4:24158c44f02e 857 motorId = 0;
davide.aliprandi@st.com 4:24158c44f02e 858 break;
davide.aliprandi@st.com 4:24158c44f02e 859 }
davide.aliprandi@st.com 4:24158c44f02e 860
davide.aliprandi@st.com 4:24158c44f02e 861 return (motorId);
davide.aliprandi@st.com 4:24158c44f02e 862 }
davide.aliprandi@st.com 4:24158c44f02e 863 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 864 * @brief Get the PWM input used by a given motor
davide.aliprandi@st.com 4:24158c44f02e 865 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 866 * @retval PWM input 0 for 1A, 1 for 2A, 2 for 1B, 3 for 3B
davide.aliprandi@st.com 4:24158c44f02e 867 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 868 uint8_t L6206::L6206_GetBridgeInputUsedByMotorId(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 869 {
davide.aliprandi@st.com 4:24158c44f02e 870 uint8_t bridgeInput;
davide.aliprandi@st.com 4:24158c44f02e 871
davide.aliprandi@st.com 4:24158c44f02e 872 switch (devicePrm.config)
davide.aliprandi@st.com 4:24158c44f02e 873 {
davide.aliprandi@st.com 4:24158c44f02e 874 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 875 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 876 {
davide.aliprandi@st.com 4:24158c44f02e 877 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 878 {
davide.aliprandi@st.com 4:24158c44f02e 879 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 880 }
davide.aliprandi@st.com 4:24158c44f02e 881 else
davide.aliprandi@st.com 4:24158c44f02e 882 {
davide.aliprandi@st.com 4:24158c44f02e 883 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 884 }
davide.aliprandi@st.com 4:24158c44f02e 885 }
davide.aliprandi@st.com 4:24158c44f02e 886 else
davide.aliprandi@st.com 4:24158c44f02e 887 {
davide.aliprandi@st.com 4:24158c44f02e 888 if (devicePrm.direction[1] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 889 {
davide.aliprandi@st.com 4:24158c44f02e 890 bridgeInput = INPUT_1B;
davide.aliprandi@st.com 4:24158c44f02e 891 }
davide.aliprandi@st.com 4:24158c44f02e 892 else
davide.aliprandi@st.com 4:24158c44f02e 893 {
davide.aliprandi@st.com 4:24158c44f02e 894 bridgeInput = INPUT_2B;
davide.aliprandi@st.com 4:24158c44f02e 895 }
davide.aliprandi@st.com 4:24158c44f02e 896 }
davide.aliprandi@st.com 4:24158c44f02e 897 break;
davide.aliprandi@st.com 4:24158c44f02e 898 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 899 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 900 {
davide.aliprandi@st.com 4:24158c44f02e 901 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 902 {
davide.aliprandi@st.com 4:24158c44f02e 903 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 904 }
davide.aliprandi@st.com 4:24158c44f02e 905 else
davide.aliprandi@st.com 4:24158c44f02e 906 {
davide.aliprandi@st.com 4:24158c44f02e 907 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 908 }
davide.aliprandi@st.com 4:24158c44f02e 909 }
davide.aliprandi@st.com 4:24158c44f02e 910 else
davide.aliprandi@st.com 4:24158c44f02e 911 {
Davidroid 6:d16ad1d58ea1 912 if (motorId == 1)
Davidroid 6:d16ad1d58ea1 913 {
Davidroid 6:d16ad1d58ea1 914 bridgeInput = INPUT_1B;
Davidroid 6:d16ad1d58ea1 915 }
Davidroid 6:d16ad1d58ea1 916 else
Davidroid 6:d16ad1d58ea1 917 {
Davidroid 6:d16ad1d58ea1 918 bridgeInput = INPUT_2B;
Davidroid 6:d16ad1d58ea1 919 }
davide.aliprandi@st.com 4:24158c44f02e 920 }
davide.aliprandi@st.com 4:24158c44f02e 921 break;
davide.aliprandi@st.com 4:24158c44f02e 922 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 923 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 924 {
davide.aliprandi@st.com 4:24158c44f02e 925 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 926 }
Davidroid 6:d16ad1d58ea1 927 else
Davidroid 6:d16ad1d58ea1 928 {
Davidroid 6:d16ad1d58ea1 929 if (motorId == 1)
Davidroid 6:d16ad1d58ea1 930 {
Davidroid 6:d16ad1d58ea1 931 bridgeInput = INPUT_2A;
Davidroid 6:d16ad1d58ea1 932 }
Davidroid 6:d16ad1d58ea1 933 else
Davidroid 6:d16ad1d58ea1 934 {
Davidroid 6:d16ad1d58ea1 935 if (devicePrm.direction[2] == FORWARD)
Davidroid 6:d16ad1d58ea1 936 {
Davidroid 6:d16ad1d58ea1 937 bridgeInput = INPUT_1B;
Davidroid 6:d16ad1d58ea1 938 }
Davidroid 6:d16ad1d58ea1 939 else
Davidroid 6:d16ad1d58ea1 940 {
Davidroid 6:d16ad1d58ea1 941 bridgeInput = INPUT_2B;
Davidroid 6:d16ad1d58ea1 942 }
Davidroid 6:d16ad1d58ea1 943 }
davide.aliprandi@st.com 4:24158c44f02e 944 }
davide.aliprandi@st.com 4:24158c44f02e 945 break;
davide.aliprandi@st.com 4:24158c44f02e 946 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 947 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 948 {
davide.aliprandi@st.com 4:24158c44f02e 949 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 950 }
davide.aliprandi@st.com 4:24158c44f02e 951 else
davide.aliprandi@st.com 4:24158c44f02e 952 {
Davidroid 6:d16ad1d58ea1 953 if (motorId == 1)
Davidroid 6:d16ad1d58ea1 954 {
Davidroid 6:d16ad1d58ea1 955 bridgeInput = INPUT_2A;
Davidroid 6:d16ad1d58ea1 956 }
Davidroid 6:d16ad1d58ea1 957 else
Davidroid 6:d16ad1d58ea1 958 {
Davidroid 6:d16ad1d58ea1 959 if (motorId == 2)
Davidroid 6:d16ad1d58ea1 960 {
Davidroid 6:d16ad1d58ea1 961 bridgeInput = INPUT_1B;
Davidroid 6:d16ad1d58ea1 962 }
Davidroid 6:d16ad1d58ea1 963 else
Davidroid 6:d16ad1d58ea1 964 {
Davidroid 6:d16ad1d58ea1 965 bridgeInput = INPUT_2B;
Davidroid 6:d16ad1d58ea1 966 }
Davidroid 6:d16ad1d58ea1 967 }
Davidroid 6:d16ad1d58ea1 968 }
davide.aliprandi@st.com 4:24158c44f02e 969 break;
davide.aliprandi@st.com 4:24158c44f02e 970 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 971 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 972 {
davide.aliprandi@st.com 4:24158c44f02e 973 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 974 }
davide.aliprandi@st.com 4:24158c44f02e 975 else
davide.aliprandi@st.com 4:24158c44f02e 976 {
Davidroid 6:d16ad1d58ea1 977 if (devicePrm.direction[1] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 978 {
davide.aliprandi@st.com 4:24158c44f02e 979 bridgeInput = INPUT_1B;
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_2B;
davide.aliprandi@st.com 4:24158c44f02e 984 }
davide.aliprandi@st.com 4:24158c44f02e 985 }
davide.aliprandi@st.com 4:24158c44f02e 986 break;
davide.aliprandi@st.com 4:24158c44f02e 987 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 988 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 989 {
davide.aliprandi@st.com 4:24158c44f02e 990 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 991 }
Davidroid 6:d16ad1d58ea1 992 else
Davidroid 6:d16ad1d58ea1 993 {
Davidroid 6:d16ad1d58ea1 994 if (motorId == 1)
Davidroid 6:d16ad1d58ea1 995 {
Davidroid 6:d16ad1d58ea1 996 bridgeInput = INPUT_1B;
Davidroid 6:d16ad1d58ea1 997 }
Davidroid 6:d16ad1d58ea1 998 else
Davidroid 6:d16ad1d58ea1 999 {
Davidroid 6:d16ad1d58ea1 1000 bridgeInput = INPUT_2B;
Davidroid 6:d16ad1d58ea1 1001 }
davide.aliprandi@st.com 4:24158c44f02e 1002 }
Davidroid 6:d16ad1d58ea1 1003 break;
davide.aliprandi@st.com 4:24158c44f02e 1004 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1005 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1006 {
davide.aliprandi@st.com 4:24158c44f02e 1007 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1008 {
davide.aliprandi@st.com 4:24158c44f02e 1009 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1010 }
davide.aliprandi@st.com 4:24158c44f02e 1011 else
davide.aliprandi@st.com 4:24158c44f02e 1012 {
davide.aliprandi@st.com 4:24158c44f02e 1013 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 1014 }
davide.aliprandi@st.com 4:24158c44f02e 1015 }
davide.aliprandi@st.com 4:24158c44f02e 1016 else
davide.aliprandi@st.com 4:24158c44f02e 1017 {
davide.aliprandi@st.com 4:24158c44f02e 1018 bridgeInput = INPUT_1B;
davide.aliprandi@st.com 4:24158c44f02e 1019 }
davide.aliprandi@st.com 4:24158c44f02e 1020 break;
davide.aliprandi@st.com 4:24158c44f02e 1021 case PARALLELING_IN1B_IN2B__2_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1022 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1023 {
davide.aliprandi@st.com 4:24158c44f02e 1024 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1025 }
davide.aliprandi@st.com 4:24158c44f02e 1026 else
davide.aliprandi@st.com 4:24158c44f02e 1027 {
Davidroid 6:d16ad1d58ea1 1028 if (motorId == 1)
Davidroid 6:d16ad1d58ea1 1029 {
Davidroid 6:d16ad1d58ea1 1030 bridgeInput = INPUT_2A;
Davidroid 6:d16ad1d58ea1 1031 }
Davidroid 6:d16ad1d58ea1 1032 else
Davidroid 6:d16ad1d58ea1 1033 {
Davidroid 6:d16ad1d58ea1 1034 bridgeInput = INPUT_1B;
Davidroid 6:d16ad1d58ea1 1035 }
davide.aliprandi@st.com 4:24158c44f02e 1036 }
Davidroid 6:d16ad1d58ea1 1037 break;
davide.aliprandi@st.com 4:24158c44f02e 1038 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_UNDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1039 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1040 {
davide.aliprandi@st.com 4:24158c44f02e 1041 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1042 }
davide.aliprandi@st.com 4:24158c44f02e 1043 else
davide.aliprandi@st.com 4:24158c44f02e 1044 {
davide.aliprandi@st.com 4:24158c44f02e 1045 bridgeInput = INPUT_1B;
davide.aliprandi@st.com 4:24158c44f02e 1046 }
davide.aliprandi@st.com 4:24158c44f02e 1047 break;
davide.aliprandi@st.com 4:24158c44f02e 1048 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 1049 if (devicePrm.direction[0] == FORWARD)
Davidroid 6:d16ad1d58ea1 1050 {
Davidroid 6:d16ad1d58ea1 1051 bridgeInput = INPUT_1A;
Davidroid 6:d16ad1d58ea1 1052 }
Davidroid 6:d16ad1d58ea1 1053 else
Davidroid 6:d16ad1d58ea1 1054 {
Davidroid 6:d16ad1d58ea1 1055 bridgeInput = INPUT_1B;
Davidroid 6:d16ad1d58ea1 1056 }
davide.aliprandi@st.com 4:24158c44f02e 1057 break;
davide.aliprandi@st.com 4:24158c44f02e 1058 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_UNDIR_MOTOR_BRIDGE_1A__1_UNDIR_MOTOR_BRIDGE_2A:
davide.aliprandi@st.com 4:24158c44f02e 1059 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1060 {
davide.aliprandi@st.com 4:24158c44f02e 1061 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1062 }
davide.aliprandi@st.com 4:24158c44f02e 1063 else
davide.aliprandi@st.com 4:24158c44f02e 1064 {
davide.aliprandi@st.com 4:24158c44f02e 1065 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 1066 }
davide.aliprandi@st.com 4:24158c44f02e 1067 break;
davide.aliprandi@st.com 4:24158c44f02e 1068 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 1069 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1070 {
davide.aliprandi@st.com 4:24158c44f02e 1071 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1072 }
davide.aliprandi@st.com 4:24158c44f02e 1073 else
davide.aliprandi@st.com 4:24158c44f02e 1074 {
davide.aliprandi@st.com 4:24158c44f02e 1075 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 1076 }
davide.aliprandi@st.com 4:24158c44f02e 1077 break;
davide.aliprandi@st.com 4:24158c44f02e 1078 case PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 1079 default:
davide.aliprandi@st.com 4:24158c44f02e 1080 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1081 break;
davide.aliprandi@st.com 4:24158c44f02e 1082 }
davide.aliprandi@st.com 4:24158c44f02e 1083 return (bridgeInput);
davide.aliprandi@st.com 4:24158c44f02e 1084 }
davide.aliprandi@st.com 4:24158c44f02e 1085
davide.aliprandi@st.com 4:24158c44f02e 1086 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 1087 * @brief Get the second PWM input used by a given bidirectionnal motor
davide.aliprandi@st.com 4:24158c44f02e 1088 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 1089 * @retval PWM input 0 for 1A, 1 for 2A, 2 for 1B, 3 for 3B
davide.aliprandi@st.com 4:24158c44f02e 1090 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 1091 uint8_t L6206::L6206_GetSecondBridgeInputUsedByMotorId(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 1092 {
Davidroid 6:d16ad1d58ea1 1093 uint8_t bridgeInput = 0xFF;
davide.aliprandi@st.com 4:24158c44f02e 1094
davide.aliprandi@st.com 4:24158c44f02e 1095 switch (devicePrm.config)
davide.aliprandi@st.com 4:24158c44f02e 1096 {
davide.aliprandi@st.com 4:24158c44f02e 1097 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1098 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1099 {
davide.aliprandi@st.com 4:24158c44f02e 1100 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1101 {
davide.aliprandi@st.com 4:24158c44f02e 1102 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 1103 }
davide.aliprandi@st.com 4:24158c44f02e 1104 else
davide.aliprandi@st.com 4:24158c44f02e 1105 {
davide.aliprandi@st.com 4:24158c44f02e 1106 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1107 }
davide.aliprandi@st.com 4:24158c44f02e 1108 }
davide.aliprandi@st.com 4:24158c44f02e 1109 else
davide.aliprandi@st.com 4:24158c44f02e 1110 {
davide.aliprandi@st.com 4:24158c44f02e 1111 if (devicePrm.direction[1] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1112 {
davide.aliprandi@st.com 4:24158c44f02e 1113 bridgeInput = INPUT_2B;
davide.aliprandi@st.com 4:24158c44f02e 1114 }
davide.aliprandi@st.com 4:24158c44f02e 1115 else
davide.aliprandi@st.com 4:24158c44f02e 1116 {
davide.aliprandi@st.com 4:24158c44f02e 1117 bridgeInput = INPUT_1B;
davide.aliprandi@st.com 4:24158c44f02e 1118 }
davide.aliprandi@st.com 4:24158c44f02e 1119 }
davide.aliprandi@st.com 4:24158c44f02e 1120 break;
davide.aliprandi@st.com 4:24158c44f02e 1121 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1122 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1123 {
davide.aliprandi@st.com 4:24158c44f02e 1124 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1125 {
davide.aliprandi@st.com 4:24158c44f02e 1126 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 1127 }
davide.aliprandi@st.com 4:24158c44f02e 1128 else
davide.aliprandi@st.com 4:24158c44f02e 1129 {
davide.aliprandi@st.com 4:24158c44f02e 1130 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1131 }
davide.aliprandi@st.com 4:24158c44f02e 1132 }
davide.aliprandi@st.com 4:24158c44f02e 1133 break;
davide.aliprandi@st.com 4:24158c44f02e 1134 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1135 if (motorId == 2)
davide.aliprandi@st.com 4:24158c44f02e 1136 {
davide.aliprandi@st.com 4:24158c44f02e 1137 if (devicePrm.direction[2] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1138 {
davide.aliprandi@st.com 4:24158c44f02e 1139 bridgeInput = INPUT_2B;
davide.aliprandi@st.com 4:24158c44f02e 1140 }
davide.aliprandi@st.com 4:24158c44f02e 1141 else
davide.aliprandi@st.com 4:24158c44f02e 1142 {
davide.aliprandi@st.com 4:24158c44f02e 1143 bridgeInput = INPUT_1B;
davide.aliprandi@st.com 4:24158c44f02e 1144 }
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_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1149 if (motorId == 1)
davide.aliprandi@st.com 4:24158c44f02e 1150 {
Davidroid 6:d16ad1d58ea1 1151 if (devicePrm.direction[1] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1152 {
davide.aliprandi@st.com 4:24158c44f02e 1153 bridgeInput = INPUT_2B;
davide.aliprandi@st.com 4:24158c44f02e 1154 }
davide.aliprandi@st.com 4:24158c44f02e 1155 else
davide.aliprandi@st.com 4:24158c44f02e 1156 {
davide.aliprandi@st.com 4:24158c44f02e 1157 bridgeInput = INPUT_1B;
davide.aliprandi@st.com 4:24158c44f02e 1158 }
davide.aliprandi@st.com 4:24158c44f02e 1159 }
davide.aliprandi@st.com 4:24158c44f02e 1160 break;
davide.aliprandi@st.com 4:24158c44f02e 1161
davide.aliprandi@st.com 4:24158c44f02e 1162 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1163 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1164 {
davide.aliprandi@st.com 4:24158c44f02e 1165 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1166 {
davide.aliprandi@st.com 4:24158c44f02e 1167 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 1168 }
davide.aliprandi@st.com 4:24158c44f02e 1169 else
davide.aliprandi@st.com 4:24158c44f02e 1170 {
davide.aliprandi@st.com 4:24158c44f02e 1171 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1172 }
davide.aliprandi@st.com 4:24158c44f02e 1173 }
davide.aliprandi@st.com 4:24158c44f02e 1174 break;
davide.aliprandi@st.com 4:24158c44f02e 1175 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 1176 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1177 {
davide.aliprandi@st.com 4:24158c44f02e 1178 bridgeInput = INPUT_1B;
davide.aliprandi@st.com 4:24158c44f02e 1179 }
davide.aliprandi@st.com 4:24158c44f02e 1180 else
davide.aliprandi@st.com 4:24158c44f02e 1181 {
davide.aliprandi@st.com 4:24158c44f02e 1182 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1183 }
davide.aliprandi@st.com 4:24158c44f02e 1184 break;
davide.aliprandi@st.com 4:24158c44f02e 1185
davide.aliprandi@st.com 4:24158c44f02e 1186 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 1187 if (devicePrm.direction[0] == FORWARD)
davide.aliprandi@st.com 4:24158c44f02e 1188 {
davide.aliprandi@st.com 4:24158c44f02e 1189 bridgeInput = INPUT_2A;
davide.aliprandi@st.com 4:24158c44f02e 1190 }
davide.aliprandi@st.com 4:24158c44f02e 1191 else
davide.aliprandi@st.com 4:24158c44f02e 1192 {
davide.aliprandi@st.com 4:24158c44f02e 1193 bridgeInput = INPUT_1A;
davide.aliprandi@st.com 4:24158c44f02e 1194 }
davide.aliprandi@st.com 4:24158c44f02e 1195 break;
davide.aliprandi@st.com 4:24158c44f02e 1196 default:
davide.aliprandi@st.com 4:24158c44f02e 1197 bridgeInput = 0XFF;
davide.aliprandi@st.com 4:24158c44f02e 1198 break;
davide.aliprandi@st.com 4:24158c44f02e 1199 }
davide.aliprandi@st.com 4:24158c44f02e 1200 if (bridgeInput == 0XFF)
davide.aliprandi@st.com 4:24158c44f02e 1201 {
davide.aliprandi@st.com 4:24158c44f02e 1202 L6206_ErrorHandler(L6206_ERROR_2);
davide.aliprandi@st.com 4:24158c44f02e 1203 }
davide.aliprandi@st.com 4:24158c44f02e 1204
davide.aliprandi@st.com 4:24158c44f02e 1205 return (bridgeInput);
davide.aliprandi@st.com 4:24158c44f02e 1206 }
davide.aliprandi@st.com 4:24158c44f02e 1207
davide.aliprandi@st.com 4:24158c44f02e 1208 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 1209 * @brief Test if motor is bidirectionnal
davide.aliprandi@st.com 4:24158c44f02e 1210 * @param motorId from 0 to MAX_NUMBER_OF_BRUSH_DC_MOTORS
davide.aliprandi@st.com 4:24158c44f02e 1211 * @retval True if motor is bidirectionnal, else false
davide.aliprandi@st.com 4:24158c44f02e 1212 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 1213 bool L6206::L6206_IsBidirectionnalMotor(uint8_t motorId)
davide.aliprandi@st.com 4:24158c44f02e 1214 {
Davidroid 6:d16ad1d58ea1 1215 bool isBiDir = FALSE;
davide.aliprandi@st.com 4:24158c44f02e 1216
davide.aliprandi@st.com 4:24158c44f02e 1217 switch (devicePrm.config)
davide.aliprandi@st.com 4:24158c44f02e 1218 {
davide.aliprandi@st.com 4:24158c44f02e 1219 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1220 case PARALLELING_IN1A_IN2A__IN1B_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 1221 case PARALLELING_IN1A_IN1B__IN2A_IN2B__1_BIDIR_MOTOR:
davide.aliprandi@st.com 4:24158c44f02e 1222 isBiDir = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 1223 break;
davide.aliprandi@st.com 4:24158c44f02e 1224
davide.aliprandi@st.com 4:24158c44f02e 1225 case PARALLELING_NONE___1_BIDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1226 case PARALLELING_IN1B_IN2B__1_BIDIR_MOTOR_BRIDGE_A__1_UNDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1227 if (motorId == 0)
davide.aliprandi@st.com 4:24158c44f02e 1228 {
davide.aliprandi@st.com 4:24158c44f02e 1229 isBiDir = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 1230 }
davide.aliprandi@st.com 4:24158c44f02e 1231 break;
davide.aliprandi@st.com 4:24158c44f02e 1232 case PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1233 if (motorId == 2)
davide.aliprandi@st.com 4:24158c44f02e 1234 {
davide.aliprandi@st.com 4:24158c44f02e 1235 isBiDir = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 1236 }
davide.aliprandi@st.com 4:24158c44f02e 1237 break;
davide.aliprandi@st.com 4:24158c44f02e 1238 case PARALLELING_IN1A_IN2A__1_UNDIR_MOTOR_BRIDGE_A__1_BIDIR_MOTOR_BRIDGE_B:
davide.aliprandi@st.com 4:24158c44f02e 1239 if (motorId == 1)
davide.aliprandi@st.com 4:24158c44f02e 1240 {
davide.aliprandi@st.com 4:24158c44f02e 1241 isBiDir = TRUE;
davide.aliprandi@st.com 4:24158c44f02e 1242 }
davide.aliprandi@st.com 4:24158c44f02e 1243 break;
davide.aliprandi@st.com 4:24158c44f02e 1244
davide.aliprandi@st.com 4:24158c44f02e 1245 default:
davide.aliprandi@st.com 4:24158c44f02e 1246 break;
davide.aliprandi@st.com 4:24158c44f02e 1247 }
davide.aliprandi@st.com 4:24158c44f02e 1248
davide.aliprandi@st.com 4:24158c44f02e 1249 return (isBiDir);
davide.aliprandi@st.com 4:24158c44f02e 1250 }
davide.aliprandi@st.com 4:24158c44f02e 1251
davide.aliprandi@st.com 4:24158c44f02e 1252
davide.aliprandi@st.com 4:24158c44f02e 1253 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 1254 * @brief Sets the parameters of the device to predefined values
davide.aliprandi@st.com 4:24158c44f02e 1255 * from l6206_target_config.h
davide.aliprandi@st.com 4:24158c44f02e 1256 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 1257 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 1258 void L6206::L6206_SetDeviceParamsToPredefinedValues(void)
davide.aliprandi@st.com 4:24158c44f02e 1259 {
Davidroid 6:d16ad1d58ea1 1260 uint32_t i;
davide.aliprandi@st.com 4:24158c44f02e 1261
davide.aliprandi@st.com 4:24158c44f02e 1262 memset(&devicePrm, 0, sizeof(devicePrm));
davide.aliprandi@st.com 4:24158c44f02e 1263
davide.aliprandi@st.com 4:24158c44f02e 1264 devicePrm.config = L6206_CONF_PARAM_PARALLE_BRIDGES;
davide.aliprandi@st.com 4:24158c44f02e 1265
davide.aliprandi@st.com 4:24158c44f02e 1266 devicePrm.pwmFreq[INPUT_1A] = L6206_CONF_PARAM_FREQ_PWM1A;
davide.aliprandi@st.com 4:24158c44f02e 1267 devicePrm.pwmFreq[INPUT_2A] = L6206_CONF_PARAM_FREQ_PWM2A;
davide.aliprandi@st.com 4:24158c44f02e 1268 devicePrm.pwmFreq[INPUT_1B] = L6206_CONF_PARAM_FREQ_PWM1B;
davide.aliprandi@st.com 4:24158c44f02e 1269 devicePrm.pwmFreq[INPUT_2B] = L6206_CONF_PARAM_FREQ_PWM2B;
davide.aliprandi@st.com 4:24158c44f02e 1270
davide.aliprandi@st.com 4:24158c44f02e 1271 for (i = 0; i < MAX_NUMBER_OF_BRUSH_DC_MOTORS; i++)
davide.aliprandi@st.com 4:24158c44f02e 1272 {
davide.aliprandi@st.com 4:24158c44f02e 1273 devicePrm.speed[i] = 100;
davide.aliprandi@st.com 4:24158c44f02e 1274 devicePrm.direction[i] = FORWARD;
davide.aliprandi@st.com 4:24158c44f02e 1275 devicePrm.motionState[i] = INACTIVE;
davide.aliprandi@st.com 4:24158c44f02e 1276 }
davide.aliprandi@st.com 4:24158c44f02e 1277 for (i = 0; i < L6206_NB_MAX_BRIDGES; i++)
davide.aliprandi@st.com 4:24158c44f02e 1278 {
davide.aliprandi@st.com 4:24158c44f02e 1279 devicePrm.bridgeEnabled[i] = FALSE;
davide.aliprandi@st.com 4:24158c44f02e 1280 }
davide.aliprandi@st.com 4:24158c44f02e 1281 }
davide.aliprandi@st.com 4:24158c44f02e 1282
davide.aliprandi@st.com 4:24158c44f02e 1283
davide.aliprandi@st.com 4:24158c44f02e 1284 /******************************************************//**
davide.aliprandi@st.com 4:24158c44f02e 1285 * @brief Set the parameters of the device to values of initDevicePrm structure
davide.aliprandi@st.com 4:24158c44f02e 1286 * Set GPIO according to these values
davide.aliprandi@st.com 4:24158c44f02e 1287 * @param initDevicePrm structure containing values to initialize the device
davide.aliprandi@st.com 4:24158c44f02e 1288 * parameters
davide.aliprandi@st.com 4:24158c44f02e 1289 * @retval None
davide.aliprandi@st.com 4:24158c44f02e 1290 **********************************************************/
davide.aliprandi@st.com 4:24158c44f02e 1291 void L6206::L6206_SetDeviceParamsToGivenValues(L6206_init_t* initDevicePrm)
davide.aliprandi@st.com 4:24158c44f02e 1292 {
davide.aliprandi@st.com 4:24158c44f02e 1293 memcpy(&devicePrm, initDevicePrm, sizeof(devicePrm));
davide.aliprandi@st.com 4:24158c44f02e 1294 }
davide.aliprandi@st.com 4:24158c44f02e 1295
davide.aliprandi@st.com 4:24158c44f02e 1296 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/