ST / X_NUCLEO_IHM12A1

Dependencies:   ST_INTERFACES

Dependents:   motori prova_motore SchedamotoriIHM12A1 prova_motore_duck ... more

Fork of X-NUCLEO-IHM12A1 by ST Expansion SW Team

Brush DC Motor Control Library

Library to handle the X-NUCLEO-IHM12A1 Motor Control Expansion Board based on the STSPIN240 component.

It allows a complete management of the STSPIN240, a low voltage dual brush DC driver, by providing a complete APIs.

The key features of the library are :

  • Configuration of the STSPIN240 (bridges input and enabling signals)
  • Flag interrupt handling (overcurrent and thermal alarms reporting)
  • Handling of up to two bidirectional Brush DC motors
  • Nucleo and expansion board configuration (GPIOs, PWMs, IRQs…)

To use the STSPIN240 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 “stspin240_250_target_config.h”, in order to program the PWMs frequency of the bridges inputs, the number of brush DC motors.

Once the initialization is done, the user can modify the driver parameters by calling specific functions to change the 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-IHM12A1 expansion board with the NUCLEO-F429ZI requires adopting the following patch:

  • to connect with a wire the PB_3 Nucleo pin to the PWMB expansion board pin.


Board configuration for HelloWorld_IHM12A1 example

/media/uploads/Manu_L/x_nucleo_ihm12a1.jpg

Committer:
davide.aliprandi@st.com
Date:
Fri Mar 24 10:59:30 2017 +0100
Revision:
3:b0128df93d26
Parent:
0:13bc901c90aa
Aligning to ARM mbed coding style.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Manu_L 0:13bc901c90aa 1 /**
Manu_L 0:13bc901c90aa 2 ******************************************************************************
davide.aliprandi@st.com 3:b0128df93d26 3 * @file STSpin240_250.h
davide.aliprandi@st.com 3:b0128df93d26 4 * @author IPC Rennes
davide.aliprandi@st.com 3:b0128df93d26 5 * @version V1.0.0
davide.aliprandi@st.com 3:b0128df93d26 6 * @date April 20th, 2016
davide.aliprandi@st.com 3:b0128df93d26 7 * @brief This file contains the class of a Stspin240_250 Motor Control component.
davide.aliprandi@st.com 3:b0128df93d26 8 * @note (C) COPYRIGHT 2016 STMicroelectronics
davide.aliprandi@st.com 3:b0128df93d26 9 ******************************************************************************
davide.aliprandi@st.com 3:b0128df93d26 10 * @attention
davide.aliprandi@st.com 3:b0128df93d26 11 *
davide.aliprandi@st.com 3:b0128df93d26 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
davide.aliprandi@st.com 3:b0128df93d26 13 *
davide.aliprandi@st.com 3:b0128df93d26 14 * Redistribution and use in source and binary forms, with or without modification,
davide.aliprandi@st.com 3:b0128df93d26 15 * are permitted provided that the following conditions are met:
davide.aliprandi@st.com 3:b0128df93d26 16 * 1. Redistributions of source code must retain the above copyright notice,
davide.aliprandi@st.com 3:b0128df93d26 17 * this list of conditions and the following disclaimer.
davide.aliprandi@st.com 3:b0128df93d26 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
davide.aliprandi@st.com 3:b0128df93d26 19 * this list of conditions and the following disclaimer in the documentation
davide.aliprandi@st.com 3:b0128df93d26 20 * and/or other materials provided with the distribution.
davide.aliprandi@st.com 3:b0128df93d26 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
davide.aliprandi@st.com 3:b0128df93d26 22 * may be used to endorse or promote products derived from this software
davide.aliprandi@st.com 3:b0128df93d26 23 * without specific prior written permission.
davide.aliprandi@st.com 3:b0128df93d26 24 *
davide.aliprandi@st.com 3:b0128df93d26 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
davide.aliprandi@st.com 3:b0128df93d26 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
davide.aliprandi@st.com 3:b0128df93d26 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
davide.aliprandi@st.com 3:b0128df93d26 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
davide.aliprandi@st.com 3:b0128df93d26 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
davide.aliprandi@st.com 3:b0128df93d26 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
davide.aliprandi@st.com 3:b0128df93d26 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
davide.aliprandi@st.com 3:b0128df93d26 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
davide.aliprandi@st.com 3:b0128df93d26 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
davide.aliprandi@st.com 3:b0128df93d26 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
davide.aliprandi@st.com 3:b0128df93d26 35 *
davide.aliprandi@st.com 3:b0128df93d26 36 ******************************************************************************
davide.aliprandi@st.com 3:b0128df93d26 37 */
Manu_L 0:13bc901c90aa 38
Manu_L 0:13bc901c90aa 39 /* Define to prevent recursive inclusion -------------------------------------*/
Manu_L 0:13bc901c90aa 40
davide.aliprandi@st.com 3:b0128df93d26 41 #ifndef __STSPIN240_250_CLASS_H
davide.aliprandi@st.com 3:b0128df93d26 42 #define __STSPIN240_250_CLASS_H
Manu_L 0:13bc901c90aa 43
Manu_L 0:13bc901c90aa 44
davide.aliprandi@st.com 3:b0128df93d26 45 /* Includes ------------------------------------------------------------------*/
Manu_L 0:13bc901c90aa 46
davide.aliprandi@st.com 3:b0128df93d26 47 /* ACTION 1 ------------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 48 * Include here platform specific header files. *
davide.aliprandi@st.com 3:b0128df93d26 49 *----------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 50 #include "mbed.h"
davide.aliprandi@st.com 3:b0128df93d26 51 /* ACTION 2 ------------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 52 * Include here component specific header files. *
davide.aliprandi@st.com 3:b0128df93d26 53 *----------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 54 #include "STSpin240_250.h"
davide.aliprandi@st.com 3:b0128df93d26 55 /* ACTION 3 ------------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 56 * Include here interface specific header files. *
Manu_L 0:13bc901c90aa 57 * *
Manu_L 0:13bc901c90aa 58 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 59 * #include "HumiditySensor.h" *
davide.aliprandi@st.com 3:b0128df93d26 60 * #include "TemperatureSensor.h" *
davide.aliprandi@st.com 3:b0128df93d26 61 *----------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 62 #include "BDCMotor.h"
Manu_L 0:13bc901c90aa 63
davide.aliprandi@st.com 3:b0128df93d26 64 /* Defines -------------------------------------------------------------------*/
Manu_L 0:13bc901c90aa 65
davide.aliprandi@st.com 3:b0128df93d26 66 /* MCU wait time in ms after power bridges are enabled */
davide.aliprandi@st.com 3:b0128df93d26 67 #define BRIDGE_TURN_ON_DELAY (1)
Manu_L 0:13bc901c90aa 68
davide.aliprandi@st.com 3:b0128df93d26 69 /* MCU wait time in ms after exit standby mode */
davide.aliprandi@st.com 3:b0128df93d26 70 #define EXIT_STANDBY_MODE_DELAY (1)
davide.aliprandi@st.com 3:b0128df93d26 71
davide.aliprandi@st.com 3:b0128df93d26 72 /* Classes -------------------------------------------------------------------*/
Manu_L 0:13bc901c90aa 73
Manu_L 0:13bc901c90aa 74
Manu_L 0:13bc901c90aa 75 /**
davide.aliprandi@st.com 3:b0128df93d26 76 * @brief Class representing a Stspin240_250 component.
davide.aliprandi@st.com 3:b0128df93d26 77 */
davide.aliprandi@st.com 3:b0128df93d26 78 class STSpin240_250 : public BDCMotor
davide.aliprandi@st.com 3:b0128df93d26 79 {
davide.aliprandi@st.com 3:b0128df93d26 80 public:
davide.aliprandi@st.com 3:b0128df93d26 81
davide.aliprandi@st.com 3:b0128df93d26 82 /*** Constructor and Destructor Methods ***/
davide.aliprandi@st.com 3:b0128df93d26 83
davide.aliprandi@st.com 3:b0128df93d26 84 /**
davide.aliprandi@st.com 3:b0128df93d26 85 * @brief Constructor.
davide.aliprandi@st.com 3:b0128df93d26 86 * @param flag_and_enable_pin pin name of the EN pin of the component.
davide.aliprandi@st.com 3:b0128df93d26 87 * @param standby_reset_pin pin name of the STBY\RST pin of the component.
davide.aliprandi@st.com 3:b0128df93d26 88 * @param pwmA_pin pin name for the PWM input for bridge A
davide.aliprandi@st.com 3:b0128df93d26 89 * @param pwmB_pin pin name for the PWM input for bridge B
davide.aliprandi@st.com 3:b0128df93d26 90 * @param dirA_pin pin name for the direction pinfor bridge A
davide.aliprandi@st.com 3:b0128df93d26 91 * @param dirB_pin pin name for the direction pinfor bridge B
davide.aliprandi@st.com 3:b0128df93d26 92 */
davide.aliprandi@st.com 3:b0128df93d26 93 STSpin240_250(PinName flag_and_enable_pin, PinName standby_reset_pin, PinName dirA_pin, PinName dirB_pin, PinName pwmA_pin, PinName pwmB_pin, PinName pwmRef_pin) : BDCMotor(), flag_and_enable(flag_and_enable_pin), standby_reset(standby_reset_pin), dirA(dirA_pin), dirB(dirB_pin), pwmA(pwmA_pin), pwmB(pwmB_pin), pwmRef(pwmRef_pin)
davide.aliprandi@st.com 3:b0128df93d26 94 {
davide.aliprandi@st.com 3:b0128df93d26 95 /* Checking stackability. */
davide.aliprandi@st.com 3:b0128df93d26 96 if (!(numberOfDevices < MAX_NUMBER_OF_DEVICES))
davide.aliprandi@st.com 3:b0128df93d26 97 error("Instantiation of the Stpin240_250 component failed: it can be stacked up to %d times.\r\n", MAX_NUMBER_OF_DEVICES);
davide.aliprandi@st.com 3:b0128df93d26 98
davide.aliprandi@st.com 3:b0128df93d26 99 /* ACTION 4 ----------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 100 * Initialize here the component's member variables, one variable per *
davide.aliprandi@st.com 3:b0128df93d26 101 * line. *
davide.aliprandi@st.com 3:b0128df93d26 102 * *
davide.aliprandi@st.com 3:b0128df93d26 103 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 104 * measure = 0; *
davide.aliprandi@st.com 3:b0128df93d26 105 * instance_id = number_of_instances++; *
davide.aliprandi@st.com 3:b0128df93d26 106 *--------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 107 errorHandlerCallback = 0;
davide.aliprandi@st.com 3:b0128df93d26 108 deviceInstance = numberOfDevices++;
davide.aliprandi@st.com 3:b0128df93d26 109 }
davide.aliprandi@st.com 3:b0128df93d26 110
davide.aliprandi@st.com 3:b0128df93d26 111 /**
davide.aliprandi@st.com 3:b0128df93d26 112 * @brief Destructor.
davide.aliprandi@st.com 3:b0128df93d26 113 */
davide.aliprandi@st.com 3:b0128df93d26 114 virtual ~STSpin240_250(void) {}
davide.aliprandi@st.com 3:b0128df93d26 115
davide.aliprandi@st.com 3:b0128df93d26 116
davide.aliprandi@st.com 3:b0128df93d26 117 /*** Public Component Related Methods ***/
davide.aliprandi@st.com 3:b0128df93d26 118
davide.aliprandi@st.com 3:b0128df93d26 119 /* ACTION 5 --------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 120 * Implement here the component's public methods, as wrappers of the C *
davide.aliprandi@st.com 3:b0128df93d26 121 * component's functions. *
davide.aliprandi@st.com 3:b0128df93d26 122 * They should be: *
davide.aliprandi@st.com 3:b0128df93d26 123 * + Methods with the same name of the C component's virtual table's *
davide.aliprandi@st.com 3:b0128df93d26 124 * functions (1); *
davide.aliprandi@st.com 3:b0128df93d26 125 * + Methods with the same name of the C component's extended virtual *
davide.aliprandi@st.com 3:b0128df93d26 126 * table's functions, if any (2). *
davide.aliprandi@st.com 3:b0128df93d26 127 * *
davide.aliprandi@st.com 3:b0128df93d26 128 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 129 * virtual int GetValue(float *pData) //(1) *
davide.aliprandi@st.com 3:b0128df93d26 130 * { *
davide.aliprandi@st.com 3:b0128df93d26 131 * return COMPONENT_GetValue(float *pfData); *
davide.aliprandi@st.com 3:b0128df93d26 132 * } *
davide.aliprandi@st.com 3:b0128df93d26 133 * *
davide.aliprandi@st.com 3:b0128df93d26 134 * virtual int EnableFeature(void) //(2) *
davide.aliprandi@st.com 3:b0128df93d26 135 * { *
davide.aliprandi@st.com 3:b0128df93d26 136 * return COMPONENT_EnableFeature(); *
davide.aliprandi@st.com 3:b0128df93d26 137 * } *
davide.aliprandi@st.com 3:b0128df93d26 138 *------------------------------------------------------------------------*/
Manu_L 0:13bc901c90aa 139
davide.aliprandi@st.com 3:b0128df93d26 140 /**
davide.aliprandi@st.com 3:b0128df93d26 141 * @brief Public functions inherited from the Component Class
davide.aliprandi@st.com 3:b0128df93d26 142 */
davide.aliprandi@st.com 3:b0128df93d26 143
davide.aliprandi@st.com 3:b0128df93d26 144 /**
davide.aliprandi@st.com 3:b0128df93d26 145 * @brief Initialize the component.
davide.aliprandi@st.com 3:b0128df93d26 146 * @param init Pointer to device specific initalization structure.
davide.aliprandi@st.com 3:b0128df93d26 147 * @retval "0" in case of success, an error code otherwise.
davide.aliprandi@st.com 3:b0128df93d26 148 */
davide.aliprandi@st.com 3:b0128df93d26 149 virtual int init(void *init = NULL)
davide.aliprandi@st.com 3:b0128df93d26 150 {
davide.aliprandi@st.com 3:b0128df93d26 151 return (int) Stspin240_250_Init((void *) init);
davide.aliprandi@st.com 3:b0128df93d26 152 }
davide.aliprandi@st.com 3:b0128df93d26 153
davide.aliprandi@st.com 3:b0128df93d26 154 /**
davide.aliprandi@st.com 3:b0128df93d26 155 * @brief Getting the ID of the component.
davide.aliprandi@st.com 3:b0128df93d26 156 * @param id Pointer to an allocated variable to store the ID into.
davide.aliprandi@st.com 3:b0128df93d26 157 * @retval "0" in case of success, an error code otherwise.
davide.aliprandi@st.com 3:b0128df93d26 158 */
davide.aliprandi@st.com 3:b0128df93d26 159 virtual int read_id(uint8_t *id = NULL)
davide.aliprandi@st.com 3:b0128df93d26 160 {
davide.aliprandi@st.com 3:b0128df93d26 161 return (int) Stspin240_250_ReadId((uint8_t *) id);
davide.aliprandi@st.com 3:b0128df93d26 162 }
davide.aliprandi@st.com 3:b0128df93d26 163
davide.aliprandi@st.com 3:b0128df93d26 164 /**
davide.aliprandi@st.com 3:b0128df93d26 165 * @brief Public functions inherited from the BCDMotor Class
davide.aliprandi@st.com 3:b0128df93d26 166 */
davide.aliprandi@st.com 3:b0128df93d26 167
davide.aliprandi@st.com 3:b0128df93d26 168 /**
davide.aliprandi@st.com 3:b0128df93d26 169 * @brief Disabling the specified bridge.
davide.aliprandi@st.com 3:b0128df93d26 170 * @param bridgeId from 0 for bridge A to 1 for bridge B.
davide.aliprandi@st.com 3:b0128df93d26 171 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 172 */
davide.aliprandi@st.com 3:b0128df93d26 173 virtual void disable_bridge(unsigned int bridgeId)
davide.aliprandi@st.com 3:b0128df93d26 174 {
davide.aliprandi@st.com 3:b0128df93d26 175 Stspin240_250_DisableBridge(bridgeId);
davide.aliprandi@st.com 3:b0128df93d26 176 }
davide.aliprandi@st.com 3:b0128df93d26 177
davide.aliprandi@st.com 3:b0128df93d26 178 /**
davide.aliprandi@st.com 3:b0128df93d26 179 * @brief Enabling the specified bridge.
davide.aliprandi@st.com 3:b0128df93d26 180 * @param bridgeId from 0 for bridge A to 1 for bridge B
davide.aliprandi@st.com 3:b0128df93d26 181 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 182 */
davide.aliprandi@st.com 3:b0128df93d26 183 virtual void enable_bridge(unsigned int bridgeId)
davide.aliprandi@st.com 3:b0128df93d26 184 {
davide.aliprandi@st.com 3:b0128df93d26 185 Stspin240_250_EnableBridge(bridgeId);
davide.aliprandi@st.com 3:b0128df93d26 186 }
davide.aliprandi@st.com 3:b0128df93d26 187
davide.aliprandi@st.com 3:b0128df93d26 188 /**
davide.aliprandi@st.com 3:b0128df93d26 189 * @brief Getting the PWM frequency of the specified bridge;
davide.aliprandi@st.com 3:b0128df93d26 190 * @param bridgeId from 0 for bridge A to 1 for bridge B.
davide.aliprandi@st.com 3:b0128df93d26 191 * @retval The frequency in Hz of the specified bridge input PWM.
davide.aliprandi@st.com 3:b0128df93d26 192 */
davide.aliprandi@st.com 3:b0128df93d26 193 virtual unsigned int get_bridge_input_pwm_freq(unsigned int bridgeId)
davide.aliprandi@st.com 3:b0128df93d26 194 {
davide.aliprandi@st.com 3:b0128df93d26 195 return (unsigned int) Stspin240_250_GetBridgeInputPwmFreq(bridgeId);
davide.aliprandi@st.com 3:b0128df93d26 196 }
davide.aliprandi@st.com 3:b0128df93d26 197
davide.aliprandi@st.com 3:b0128df93d26 198 /**
davide.aliprandi@st.com 3:b0128df93d26 199 * @brief Getting the bridge status.
davide.aliprandi@st.com 3:b0128df93d26 200 * @param bridgeId from 0 for bridge A to 1 for bridge B.
davide.aliprandi@st.com 3:b0128df93d26 201 * @retval The status.
davide.aliprandi@st.com 3:b0128df93d26 202 */
davide.aliprandi@st.com 3:b0128df93d26 203 virtual unsigned int get_bridge_status(unsigned int bridgeId)
davide.aliprandi@st.com 3:b0128df93d26 204 {
davide.aliprandi@st.com 3:b0128df93d26 205 return (unsigned int) Stspin240_250_GetBridgeStatus();
davide.aliprandi@st.com 3:b0128df93d26 206 }
Manu_L 0:13bc901c90aa 207
davide.aliprandi@st.com 3:b0128df93d26 208 /**
davide.aliprandi@st.com 3:b0128df93d26 209 * @brief Getting the device State.
davide.aliprandi@st.com 3:b0128df93d26 210 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 211 * @retval The device state (STEADY or INACTIVE)
davide.aliprandi@st.com 3:b0128df93d26 212 */
davide.aliprandi@st.com 3:b0128df93d26 213 virtual motorState_t get_device_state(unsigned int motorId)
davide.aliprandi@st.com 3:b0128df93d26 214 {
davide.aliprandi@st.com 3:b0128df93d26 215 return (motorState_t) Stspin240_250_get_device_state(motorId);
davide.aliprandi@st.com 3:b0128df93d26 216 }
davide.aliprandi@st.com 3:b0128df93d26 217
davide.aliprandi@st.com 3:b0128df93d26 218 /**
davide.aliprandi@st.com 3:b0128df93d26 219 * @brief Getting the current speed in % of the specified motor.
davide.aliprandi@st.com 3:b0128df93d26 220 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 221 * @retval The current speed in %.
davide.aliprandi@st.com 3:b0128df93d26 222 */
davide.aliprandi@st.com 3:b0128df93d26 223 virtual unsigned int get_speed(unsigned int motorId)
davide.aliprandi@st.com 3:b0128df93d26 224 {
davide.aliprandi@st.com 3:b0128df93d26 225 return (unsigned int) Stspin240_250_GetCurrentSpeed(motorId);
davide.aliprandi@st.com 3:b0128df93d26 226 }
davide.aliprandi@st.com 3:b0128df93d26 227
davide.aliprandi@st.com 3:b0128df93d26 228 /**
davide.aliprandi@st.com 3:b0128df93d26 229 * @brief Stopping the motor and disabling the power bridge immediately.
davide.aliprandi@st.com 3:b0128df93d26 230 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 231 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 232 */
davide.aliprandi@st.com 3:b0128df93d26 233 virtual void hard_hiz(unsigned int motorId)
davide.aliprandi@st.com 3:b0128df93d26 234 {
davide.aliprandi@st.com 3:b0128df93d26 235 Stspin240_250_HardHiz(motorId);
davide.aliprandi@st.com 3:b0128df93d26 236 }
davide.aliprandi@st.com 3:b0128df93d26 237
davide.aliprandi@st.com 3:b0128df93d26 238 /**
davide.aliprandi@st.com 3:b0128df93d26 239 * @brief Stopping the motor immediately.
davide.aliprandi@st.com 3:b0128df93d26 240 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 241 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 242 */
davide.aliprandi@st.com 3:b0128df93d26 243 virtual void hard_stop(unsigned int motorId)
davide.aliprandi@st.com 3:b0128df93d26 244 {
davide.aliprandi@st.com 3:b0128df93d26 245 Stspin240_250_HardStop(motorId);
davide.aliprandi@st.com 3:b0128df93d26 246 }
davide.aliprandi@st.com 3:b0128df93d26 247
davide.aliprandi@st.com 3:b0128df93d26 248 /**
davide.aliprandi@st.com 3:b0128df93d26 249 * @brief Running the motor.
davide.aliprandi@st.com 3:b0128df93d26 250 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 251 * @param direction The direction of rotation.
davide.aliprandi@st.com 3:b0128df93d26 252 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 253 */
davide.aliprandi@st.com 3:b0128df93d26 254 virtual void run(unsigned int motorId, direction_t direction)
davide.aliprandi@st.com 3:b0128df93d26 255 {
davide.aliprandi@st.com 3:b0128df93d26 256 Stspin240_250_Run(motorId, (motorDir_t) direction);
davide.aliprandi@st.com 3:b0128df93d26 257 }
davide.aliprandi@st.com 3:b0128df93d26 258
davide.aliprandi@st.com 3:b0128df93d26 259 /**
davide.aliprandi@st.com 3:b0128df93d26 260 * @brief Setting the PWM frequency of the specified bridge.
davide.aliprandi@st.com 3:b0128df93d26 261 * @param bridgeId from 0 for bridge A to 1 for bridge B.
davide.aliprandi@st.com 3:b0128df93d26 262 * @param frequency of the PWM in Hz
davide.aliprandi@st.com 3:b0128df93d26 263 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 264 */
davide.aliprandi@st.com 3:b0128df93d26 265 virtual void set_bridge_input_pwm_freq(unsigned int bridgeId, unsigned int frequency)
davide.aliprandi@st.com 3:b0128df93d26 266 {
davide.aliprandi@st.com 3:b0128df93d26 267 Stspin240_250_SetBridgeInputPwmFreq(bridgeId, frequency);
davide.aliprandi@st.com 3:b0128df93d26 268 }
davide.aliprandi@st.com 3:b0128df93d26 269
davide.aliprandi@st.com 3:b0128df93d26 270 /**
davide.aliprandi@st.com 3:b0128df93d26 271 * @brief Setting the dual bridge configuration mode.
davide.aliprandi@st.com 3:b0128df93d26 272 * @param configuration. The bridge configuration.
davide.aliprandi@st.com 3:b0128df93d26 273 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 274 */
davide.aliprandi@st.com 3:b0128df93d26 275 virtual void set_dual_full_bridge_config(unsigned int configuration)
davide.aliprandi@st.com 3:b0128df93d26 276 {
davide.aliprandi@st.com 3:b0128df93d26 277 Stspin240_250_SetDualFullBridgeconfig(configuration);
davide.aliprandi@st.com 3:b0128df93d26 278 }
davide.aliprandi@st.com 3:b0128df93d26 279
davide.aliprandi@st.com 3:b0128df93d26 280 /**
davide.aliprandi@st.com 3:b0128df93d26 281 * @brief Setting the speed in %.
davide.aliprandi@st.com 3:b0128df93d26 282 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 283 * @param speed The new speed in %.
davide.aliprandi@st.com 3:b0128df93d26 284 * @retval "true" in case of success, "false" otherwise.
davide.aliprandi@st.com 3:b0128df93d26 285 */
davide.aliprandi@st.com 3:b0128df93d26 286 virtual bool set_speed(unsigned int motorId, unsigned int speed)
davide.aliprandi@st.com 3:b0128df93d26 287 {
davide.aliprandi@st.com 3:b0128df93d26 288 return (bool) Stspin240_250_SetMaxSpeed(motorId, speed);
davide.aliprandi@st.com 3:b0128df93d26 289 }
davide.aliprandi@st.com 3:b0128df93d26 290
davide.aliprandi@st.com 3:b0128df93d26 291 /**
davide.aliprandi@st.com 3:b0128df93d26 292 * @brief Public functions NOT inherited
davide.aliprandi@st.com 3:b0128df93d26 293 */
davide.aliprandi@st.com 3:b0128df93d26 294
davide.aliprandi@st.com 3:b0128df93d26 295 /**
davide.aliprandi@st.com 3:b0128df93d26 296 * @brief Attaching an error handler.
davide.aliprandi@st.com 3:b0128df93d26 297 * @param fptr An error handler.
davide.aliprandi@st.com 3:b0128df93d26 298 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 299 */
davide.aliprandi@st.com 3:b0128df93d26 300 virtual void attach_error_handler(void (*fptr)(uint16_t error))
davide.aliprandi@st.com 3:b0128df93d26 301 {
davide.aliprandi@st.com 3:b0128df93d26 302 Stspin240_250_AttachErrorHandler((void (*)(uint16_t error)) fptr);
davide.aliprandi@st.com 3:b0128df93d26 303 }
davide.aliprandi@st.com 3:b0128df93d26 304
davide.aliprandi@st.com 3:b0128df93d26 305 /**
davide.aliprandi@st.com 3:b0128df93d26 306 * @brief Getting the motor current direction.
davide.aliprandi@st.com 3:b0128df93d26 307 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 308 * @retval direction The direction of rotation.
davide.aliprandi@st.com 3:b0128df93d26 309 */
davide.aliprandi@st.com 3:b0128df93d26 310 virtual direction_t get_direction(unsigned int motorId)
davide.aliprandi@st.com 3:b0128df93d26 311 {
davide.aliprandi@st.com 3:b0128df93d26 312 return (direction_t) Stspin240_250_GetDirection(motorId);
davide.aliprandi@st.com 3:b0128df93d26 313 }
davide.aliprandi@st.com 3:b0128df93d26 314
davide.aliprandi@st.com 3:b0128df93d26 315 /**
davide.aliprandi@st.com 3:b0128df93d26 316 * @brief Getting the version of the firmware.
davide.aliprandi@st.com 3:b0128df93d26 317 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 318 * @retval The version of the firmware.
davide.aliprandi@st.com 3:b0128df93d26 319 */
davide.aliprandi@st.com 3:b0128df93d26 320 virtual unsigned int get_fw_version(void)
davide.aliprandi@st.com 3:b0128df93d26 321 {
davide.aliprandi@st.com 3:b0128df93d26 322 return (unsigned int) Stspin240_250_GetFwVersion();
davide.aliprandi@st.com 3:b0128df93d26 323 }
davide.aliprandi@st.com 3:b0128df93d26 324
davide.aliprandi@st.com 3:b0128df93d26 325 /**
davide.aliprandi@st.com 3:b0128df93d26 326 * @brief Getting the duty cycle of the PWM used for REF.
davide.aliprandi@st.com 3:b0128df93d26 327 * @param refId Id of the reference PWM signal.
davide.aliprandi@st.com 3:b0128df93d26 328 * @retval duty cycle in % (from 0 to 100)
davide.aliprandi@st.com 3:b0128df93d26 329 */
davide.aliprandi@st.com 3:b0128df93d26 330 virtual unsigned int get_ref_pwm_dc(unsigned int refId)
davide.aliprandi@st.com 3:b0128df93d26 331 {
davide.aliprandi@st.com 3:b0128df93d26 332 return (unsigned int) Stspin240_250_GetRefPwmDc(refId);
davide.aliprandi@st.com 3:b0128df93d26 333 }
davide.aliprandi@st.com 3:b0128df93d26 334
davide.aliprandi@st.com 3:b0128df93d26 335 /**
davide.aliprandi@st.com 3:b0128df93d26 336 * @brief Getting the frequency of the PWM used for REF.
davide.aliprandi@st.com 3:b0128df93d26 337 * @param refId Id of the reference PWM signal.
davide.aliprandi@st.com 3:b0128df93d26 338 * @retval frequency in Hz.
davide.aliprandi@st.com 3:b0128df93d26 339 */
davide.aliprandi@st.com 3:b0128df93d26 340 virtual unsigned int get_ref_pwm_freq(unsigned int refId)
davide.aliprandi@st.com 3:b0128df93d26 341 {
davide.aliprandi@st.com 3:b0128df93d26 342 return (unsigned int) Stspin240_250_GetRefPwmFreq(refId);
davide.aliprandi@st.com 3:b0128df93d26 343 }
davide.aliprandi@st.com 3:b0128df93d26 344
davide.aliprandi@st.com 3:b0128df93d26 345 /**
davide.aliprandi@st.com 3:b0128df93d26 346 * @brief Releasing the reset (exiting standby mode).
davide.aliprandi@st.com 3:b0128df93d26 347 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 348 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 349 */
davide.aliprandi@st.com 3:b0128df93d26 350 virtual void release_reset(void)
davide.aliprandi@st.com 3:b0128df93d26 351 {
davide.aliprandi@st.com 3:b0128df93d26 352 Stspin240_250_ReleaseReset();
davide.aliprandi@st.com 3:b0128df93d26 353 }
davide.aliprandi@st.com 3:b0128df93d26 354
davide.aliprandi@st.com 3:b0128df93d26 355 /**
davide.aliprandi@st.com 3:b0128df93d26 356 * @brief Reseting (entering standby mode).
davide.aliprandi@st.com 3:b0128df93d26 357 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 358 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 359 */
davide.aliprandi@st.com 3:b0128df93d26 360 virtual void reset(void)
davide.aliprandi@st.com 3:b0128df93d26 361 {
davide.aliprandi@st.com 3:b0128df93d26 362 Stspin240_250_Reset();
davide.aliprandi@st.com 3:b0128df93d26 363 }
davide.aliprandi@st.com 3:b0128df93d26 364
davide.aliprandi@st.com 3:b0128df93d26 365 /**
davide.aliprandi@st.com 3:b0128df93d26 366 * @brief Setting the direction of rotation of the firmware.
davide.aliprandi@st.com 3:b0128df93d26 367 * @param motorId from 0 to (MAX_NUMBER_OF_BRUSH_DC_MOTORS - 1).
davide.aliprandi@st.com 3:b0128df93d26 368 * @param direction The direction of rotation.
davide.aliprandi@st.com 3:b0128df93d26 369 * @retval None
davide.aliprandi@st.com 3:b0128df93d26 370 */
davide.aliprandi@st.com 3:b0128df93d26 371 virtual void set_direction(unsigned int motorId, direction_t direction)
davide.aliprandi@st.com 3:b0128df93d26 372 {
davide.aliprandi@st.com 3:b0128df93d26 373 Stspin240_250_SetDirection(motorId, (motorDir_t) direction);
davide.aliprandi@st.com 3:b0128df93d26 374 }
davide.aliprandi@st.com 3:b0128df93d26 375
davide.aliprandi@st.com 3:b0128df93d26 376 /**
davide.aliprandi@st.com 3:b0128df93d26 377 * @brief Setting the duty cycle of the PWM used for REF.
davide.aliprandi@st.com 3:b0128df93d26 378 * @param refId Id of the reference PWM signal.
davide.aliprandi@st.com 3:b0128df93d26 379 * @param newDc new duty cycle from 0 to 100
davide.aliprandi@st.com 3:b0128df93d26 380 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 381 */
davide.aliprandi@st.com 3:b0128df93d26 382 virtual void set_ref_pwm_dc(unsigned int refId, unsigned int newDc)
davide.aliprandi@st.com 3:b0128df93d26 383 {
davide.aliprandi@st.com 3:b0128df93d26 384 Stspin240_250_SetRefPwmDc(refId, newDc);
davide.aliprandi@st.com 3:b0128df93d26 385 }
davide.aliprandi@st.com 3:b0128df93d26 386
davide.aliprandi@st.com 3:b0128df93d26 387 /**
davide.aliprandi@st.com 3:b0128df93d26 388 * @brief Setting the frequency of the PWM used for REF.
davide.aliprandi@st.com 3:b0128df93d26 389 * @param refId Id of the reference PWM signal.
davide.aliprandi@st.com 3:b0128df93d26 390 * @param frequency in Hz.
davide.aliprandi@st.com 3:b0128df93d26 391 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 392 */
davide.aliprandi@st.com 3:b0128df93d26 393 virtual void set_ref_pwm_freq(unsigned int refId, unsigned int frequency)
davide.aliprandi@st.com 3:b0128df93d26 394 {
davide.aliprandi@st.com 3:b0128df93d26 395 Stspin240_250_SetRefPwmFreq(refId, frequency);
davide.aliprandi@st.com 3:b0128df93d26 396 }
davide.aliprandi@st.com 3:b0128df93d26 397
davide.aliprandi@st.com 3:b0128df93d26 398 /**
davide.aliprandi@st.com 3:b0128df93d26 399 * @brief Public static functions
davide.aliprandi@st.com 3:b0128df93d26 400 */
davide.aliprandi@st.com 3:b0128df93d26 401 static uint8_t get_nb_devices(void)
davide.aliprandi@st.com 3:b0128df93d26 402 {
davide.aliprandi@st.com 3:b0128df93d26 403 return numberOfDevices;
davide.aliprandi@st.com 3:b0128df93d26 404 }
davide.aliprandi@st.com 3:b0128df93d26 405
davide.aliprandi@st.com 3:b0128df93d26 406 /*** Public Interrupt Related Methods ***/
Manu_L 0:13bc901c90aa 407
davide.aliprandi@st.com 3:b0128df93d26 408 /* ACTION 6 --------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 409 * Implement here interrupt related methods, if any. *
davide.aliprandi@st.com 3:b0128df93d26 410 * Note that interrupt handling is platform dependent, e.g.: *
davide.aliprandi@st.com 3:b0128df93d26 411 * + mbed: *
davide.aliprandi@st.com 3:b0128df93d26 412 * InterruptIn feature_irq(pin); //Interrupt object. *
davide.aliprandi@st.com 3:b0128df93d26 413 * feature_irq.rise(callback); //Attach a callback. *
davide.aliprandi@st.com 3:b0128df93d26 414 * feature_irq.mode(PullNone); //Set interrupt mode. *
davide.aliprandi@st.com 3:b0128df93d26 415 * feature_irq.enable_irq(); //Enable interrupt. *
davide.aliprandi@st.com 3:b0128df93d26 416 * feature_irq.disable_irq(); //Disable interrupt. *
davide.aliprandi@st.com 3:b0128df93d26 417 * + Arduino: *
davide.aliprandi@st.com 3:b0128df93d26 418 * attachInterrupt(pin, callback, RISING); //Attach a callback. *
davide.aliprandi@st.com 3:b0128df93d26 419 * detachInterrupt(pin); //Detach a callback. *
davide.aliprandi@st.com 3:b0128df93d26 420 * *
davide.aliprandi@st.com 3:b0128df93d26 421 * Example (mbed): *
davide.aliprandi@st.com 3:b0128df93d26 422 * void attach_feature_irq(void (*fptr) (void)) *
davide.aliprandi@st.com 3:b0128df93d26 423 * { *
davide.aliprandi@st.com 3:b0128df93d26 424 * feature_irq.rise(fptr); *
davide.aliprandi@st.com 3:b0128df93d26 425 * } *
davide.aliprandi@st.com 3:b0128df93d26 426 * *
davide.aliprandi@st.com 3:b0128df93d26 427 * void enable_feature_irq(void) *
davide.aliprandi@st.com 3:b0128df93d26 428 * { *
davide.aliprandi@st.com 3:b0128df93d26 429 * feature_irq.enable_irq(); *
davide.aliprandi@st.com 3:b0128df93d26 430 * } *
davide.aliprandi@st.com 3:b0128df93d26 431 * *
davide.aliprandi@st.com 3:b0128df93d26 432 * void disable_feature_irq(void) *
davide.aliprandi@st.com 3:b0128df93d26 433 * { *
davide.aliprandi@st.com 3:b0128df93d26 434 * feature_irq.disable_irq(); *
davide.aliprandi@st.com 3:b0128df93d26 435 * } *
davide.aliprandi@st.com 3:b0128df93d26 436 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 437 /**
davide.aliprandi@st.com 3:b0128df93d26 438 * @brief Attaching an interrupt handler to the FLAG interrupt.
davide.aliprandi@st.com 3:b0128df93d26 439 * @param fptr An interrupt handler.
davide.aliprandi@st.com 3:b0128df93d26 440 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 441 */
davide.aliprandi@st.com 3:b0128df93d26 442 void attach_flag_irq(void (*fptr)(void))
davide.aliprandi@st.com 3:b0128df93d26 443 {
davide.aliprandi@st.com 3:b0128df93d26 444 flag_and_enable.mode(PullDown);
davide.aliprandi@st.com 3:b0128df93d26 445 flag_and_enable.fall(fptr);
davide.aliprandi@st.com 3:b0128df93d26 446 }
davide.aliprandi@st.com 3:b0128df93d26 447
davide.aliprandi@st.com 3:b0128df93d26 448 /**
davide.aliprandi@st.com 3:b0128df93d26 449 * @brief Enabling the FLAG interrupt handling.
davide.aliprandi@st.com 3:b0128df93d26 450 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 451 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 452 */
davide.aliprandi@st.com 3:b0128df93d26 453 void enable_flag_irq(void)
davide.aliprandi@st.com 3:b0128df93d26 454 {
davide.aliprandi@st.com 3:b0128df93d26 455 flag_and_enable.enable_irq();
davide.aliprandi@st.com 3:b0128df93d26 456 }
davide.aliprandi@st.com 3:b0128df93d26 457
davide.aliprandi@st.com 3:b0128df93d26 458 /**
davide.aliprandi@st.com 3:b0128df93d26 459 * @brief Disabling the FLAG interrupt handling.
davide.aliprandi@st.com 3:b0128df93d26 460 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 461 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 462 */
davide.aliprandi@st.com 3:b0128df93d26 463 void disable_flag_irq(void)
davide.aliprandi@st.com 3:b0128df93d26 464 {
davide.aliprandi@st.com 3:b0128df93d26 465 flag_and_enable.disable_irq();
davide.aliprandi@st.com 3:b0128df93d26 466 }
davide.aliprandi@st.com 3:b0128df93d26 467
davide.aliprandi@st.com 3:b0128df93d26 468 protected:
davide.aliprandi@st.com 3:b0128df93d26 469
davide.aliprandi@st.com 3:b0128df93d26 470 /*** Protected Component Related Methods ***/
davide.aliprandi@st.com 3:b0128df93d26 471
davide.aliprandi@st.com 3:b0128df93d26 472 /* ACTION 7 --------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 473 * Declare here the component's specific methods. *
davide.aliprandi@st.com 3:b0128df93d26 474 * They should be: *
davide.aliprandi@st.com 3:b0128df93d26 475 * + Methods with the same name of the C component's virtual table's *
davide.aliprandi@st.com 3:b0128df93d26 476 * functions (1); *
davide.aliprandi@st.com 3:b0128df93d26 477 * + Methods with the same name of the C component's extended virtual *
davide.aliprandi@st.com 3:b0128df93d26 478 * table's functions, if any (2); *
davide.aliprandi@st.com 3:b0128df93d26 479 * + Helper methods, if any, like functions declared in the component's *
davide.aliprandi@st.com 3:b0128df93d26 480 * source files but not pointed by the component's virtual table (3). *
davide.aliprandi@st.com 3:b0128df93d26 481 * *
davide.aliprandi@st.com 3:b0128df93d26 482 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 483 * status_t COMPONENT_get_value(float *f); //(1) *
davide.aliprandi@st.com 3:b0128df93d26 484 * status_t COMPONENT_enable_feature(void); //(2) *
davide.aliprandi@st.com 3:b0128df93d26 485 * status_t COMPONENT_compute_average(void); //(3) *
davide.aliprandi@st.com 3:b0128df93d26 486 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 487
davide.aliprandi@st.com 3:b0128df93d26 488 status_t Stspin240_250_Init(void *init);
davide.aliprandi@st.com 3:b0128df93d26 489 status_t Stspin240_250_ReadId(uint8_t *id);
davide.aliprandi@st.com 3:b0128df93d26 490 void Stspin240_250_AttachErrorHandler(void (*callback)(uint16_t error));
davide.aliprandi@st.com 3:b0128df93d26 491 void Stspin240_250_DisableBridge(uint8_t bridgeId);
davide.aliprandi@st.com 3:b0128df93d26 492 void Stspin240_250_EnableBridge(uint8_t bridgeId);
davide.aliprandi@st.com 3:b0128df93d26 493 void Stspin240_250_ErrorHandler(uint16_t error);
davide.aliprandi@st.com 3:b0128df93d26 494 uint32_t Stspin240_250_GetBridgeInputPwmFreq(uint8_t bridgeId);
davide.aliprandi@st.com 3:b0128df93d26 495 uint16_t Stspin240_250_GetBridgeStatus(void);
davide.aliprandi@st.com 3:b0128df93d26 496 uint16_t Stspin240_250_GetCurrentSpeed(uint8_t motorId);
davide.aliprandi@st.com 3:b0128df93d26 497 motorState_t Stspin240_250_get_device_state(uint8_t motorId);
davide.aliprandi@st.com 3:b0128df93d26 498 motorDir_t Stspin240_250_GetDirection(uint8_t motorId);
davide.aliprandi@st.com 3:b0128df93d26 499 uint32_t Stspin240_250_GetFwVersion(void);
davide.aliprandi@st.com 3:b0128df93d26 500 uint8_t Stspin240_250_GetRefPwmDc(uint8_t refId);
davide.aliprandi@st.com 3:b0128df93d26 501 uint32_t Stspin240_250_GetRefPwmFreq(uint8_t refId);
davide.aliprandi@st.com 3:b0128df93d26 502 void Stspin240_250_HardHiz(uint8_t motorId);
davide.aliprandi@st.com 3:b0128df93d26 503 void Stspin240_250_HardStop(uint8_t motorId);
davide.aliprandi@st.com 3:b0128df93d26 504 void Stspin240_250_Releasereset(void);
davide.aliprandi@st.com 3:b0128df93d26 505 void Stspin240_250_reset(void);
davide.aliprandi@st.com 3:b0128df93d26 506 void Stspin240_250_Run(uint8_t motorId, motorDir_t direction);
davide.aliprandi@st.com 3:b0128df93d26 507 void Stspin240_250_SetBridgeInputPwmFreq(uint8_t bridgeId, uint32_t newFreq);
davide.aliprandi@st.com 3:b0128df93d26 508 void Stspin240_250_SetDirection(uint8_t motorId, motorDir_t dir);
davide.aliprandi@st.com 3:b0128df93d26 509 void Stspin240_250_SetDualFullBridgeconfig(uint8_t enable);
davide.aliprandi@st.com 3:b0128df93d26 510 bool Stspin240_250_SetMaxSpeed(uint8_t motorId,uint16_t newMaxSpeed);
davide.aliprandi@st.com 3:b0128df93d26 511 void Stspin240_250_SetRefPwmDc(uint8_t refId, uint8_t newDc);
davide.aliprandi@st.com 3:b0128df93d26 512 void Stspin240_250_SetRefPwmFreq(uint8_t refId, uint32_t newFreq);
davide.aliprandi@st.com 3:b0128df93d26 513
davide.aliprandi@st.com 3:b0128df93d26 514 /**
davide.aliprandi@st.com 3:b0128df93d26 515 * @brief Functions to initialize the registers
davide.aliprandi@st.com 3:b0128df93d26 516 */
davide.aliprandi@st.com 3:b0128df93d26 517 void Stspin240_250_SetDeviceParamsToGivenValues(Stspin240_250_init_t *pInitPrm);
davide.aliprandi@st.com 3:b0128df93d26 518 void Stspin240_250_SetDeviceParamsToPredefinedValues(void);
davide.aliprandi@st.com 3:b0128df93d26 519
davide.aliprandi@st.com 3:b0128df93d26 520 /**
davide.aliprandi@st.com 3:b0128df93d26 521 * @brief Get the state of the standby/reset pin
davide.aliprandi@st.com 3:b0128df93d26 522 */
davide.aliprandi@st.com 3:b0128df93d26 523 uint8_t Stspin240_250_GetResetState(void);
davide.aliprandi@st.com 3:b0128df93d26 524
davide.aliprandi@st.com 3:b0128df93d26 525 /*** Component's I/O Methods ***/
davide.aliprandi@st.com 3:b0128df93d26 526
davide.aliprandi@st.com 3:b0128df93d26 527 /* ACTION 8 --------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 528 * Implement here other I/O methods beyond those already implemented *
davide.aliprandi@st.com 3:b0128df93d26 529 * above, which are declared extern within the component's header file. *
davide.aliprandi@st.com 3:b0128df93d26 530 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 531 /**
davide.aliprandi@st.com 3:b0128df93d26 532 * @brief Making the CPU wait.
davide.aliprandi@st.com 3:b0128df93d26 533 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 534 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 535 */
davide.aliprandi@st.com 3:b0128df93d26 536 void Stspin240_250_Board_Delay(uint32_t delay)
davide.aliprandi@st.com 3:b0128df93d26 537 {
davide.aliprandi@st.com 3:b0128df93d26 538 wait_ms(delay);
davide.aliprandi@st.com 3:b0128df93d26 539 }
davide.aliprandi@st.com 3:b0128df93d26 540
davide.aliprandi@st.com 3:b0128df93d26 541 /**
davide.aliprandi@st.com 3:b0128df93d26 542 * @brief Disable bridge.
davide.aliprandi@st.com 3:b0128df93d26 543 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 544 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 545 */
davide.aliprandi@st.com 3:b0128df93d26 546 void Stspin240_250_Board_DisableBridge(void)
davide.aliprandi@st.com 3:b0128df93d26 547 {
davide.aliprandi@st.com 3:b0128df93d26 548 flag_and_enable.disable_irq();
davide.aliprandi@st.com 3:b0128df93d26 549 flag_and_enable.mode(PullDown);
davide.aliprandi@st.com 3:b0128df93d26 550 }
davide.aliprandi@st.com 3:b0128df93d26 551
davide.aliprandi@st.com 3:b0128df93d26 552 /**
davide.aliprandi@st.com 3:b0128df93d26 553 * @brief Enable bridge.
davide.aliprandi@st.com 3:b0128df93d26 554 * @param addDelay if different from 0, a delay is added after bridge activation..
davide.aliprandi@st.com 3:b0128df93d26 555 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 556 */
davide.aliprandi@st.com 3:b0128df93d26 557 void Stspin240_250_Board_EnableBridge(uint8_t addDelay)
davide.aliprandi@st.com 3:b0128df93d26 558 {
davide.aliprandi@st.com 3:b0128df93d26 559 flag_and_enable.mode(PullUp);
davide.aliprandi@st.com 3:b0128df93d26 560 if (addDelay)
davide.aliprandi@st.com 3:b0128df93d26 561 {
davide.aliprandi@st.com 3:b0128df93d26 562 Stspin240_250_Board_Delay(BRIDGE_TURN_ON_DELAY);
davide.aliprandi@st.com 3:b0128df93d26 563 }
davide.aliprandi@st.com 3:b0128df93d26 564 flag_and_enable.enable_irq();
davide.aliprandi@st.com 3:b0128df93d26 565 }
davide.aliprandi@st.com 3:b0128df93d26 566
davide.aliprandi@st.com 3:b0128df93d26 567 /**
davide.aliprandi@st.com 3:b0128df93d26 568 * @brief Get the status of the reset Pin.
davide.aliprandi@st.com 3:b0128df93d26 569 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 570 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 571 */
davide.aliprandi@st.com 3:b0128df93d26 572 uint16_t Stspin240_250_Board_GetResetPinState(void)
davide.aliprandi@st.com 3:b0128df93d26 573 {
davide.aliprandi@st.com 3:b0128df93d26 574 return((uint16_t)flag_and_enable.read());
davide.aliprandi@st.com 3:b0128df93d26 575 }
Manu_L 0:13bc901c90aa 576
davide.aliprandi@st.com 3:b0128df93d26 577 /**
davide.aliprandi@st.com 3:b0128df93d26 578 * @brief Get the status of the flag and enable Pin.
davide.aliprandi@st.com 3:b0128df93d26 579 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 580 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 581 */
davide.aliprandi@st.com 3:b0128df93d26 582 uint16_t Stspin240_250_Board_GetFaultPinState(void)
davide.aliprandi@st.com 3:b0128df93d26 583 {
davide.aliprandi@st.com 3:b0128df93d26 584 return((uint16_t)flag_and_enable.read());
davide.aliprandi@st.com 3:b0128df93d26 585 }
davide.aliprandi@st.com 3:b0128df93d26 586
davide.aliprandi@st.com 3:b0128df93d26 587 /**
davide.aliprandi@st.com 3:b0128df93d26 588 * @brief Deinitialising the PWM.
davide.aliprandi@st.com 3:b0128df93d26 589 * @param pwmId 0 for bridge A PWM, 1 for bridge B PWM, 2 for REF PWM.
davide.aliprandi@st.com 3:b0128df93d26 590 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 591 */
davide.aliprandi@st.com 3:b0128df93d26 592 void Stspin240_250_Board_PwmDeInit(uint8_t pwmId)
davide.aliprandi@st.com 3:b0128df93d26 593 {
davide.aliprandi@st.com 3:b0128df93d26 594
davide.aliprandi@st.com 3:b0128df93d26 595 }
davide.aliprandi@st.com 3:b0128df93d26 596
davide.aliprandi@st.com 3:b0128df93d26 597 /**
davide.aliprandi@st.com 3:b0128df93d26 598 * @brief Initialising the PWM.
davide.aliprandi@st.com 3:b0128df93d26 599 * @param pwmId 0 for bridge A PWM, 1 for bridge B PWM, 2 for REF PWM.
davide.aliprandi@st.com 3:b0128df93d26 600 * @param onlyChannel.
davide.aliprandi@st.com 3:b0128df93d26 601 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 602 */
davide.aliprandi@st.com 3:b0128df93d26 603 void Stspin240_250_Board_PwmInit(uint8_t pwmId, uint8_t onlyChannel)
davide.aliprandi@st.com 3:b0128df93d26 604 {
davide.aliprandi@st.com 3:b0128df93d26 605
davide.aliprandi@st.com 3:b0128df93d26 606 }
davide.aliprandi@st.com 3:b0128df93d26 607
davide.aliprandi@st.com 3:b0128df93d26 608 /**
davide.aliprandi@st.com 3:b0128df93d26 609 * @brief Setting the frequency of PWM.
davide.aliprandi@st.com 3:b0128df93d26 610 * The frequency of bridge A and B controls directly the speed of the device.
davide.aliprandi@st.com 3:b0128df93d26 611 * @param pwmId 0 for bridge A PWM, 1 for bridge B PWM, 2 for REF PWM.
davide.aliprandi@st.com 3:b0128df93d26 612 * @param newFreq frequency to apply in Hz.
davide.aliprandi@st.com 3:b0128df93d26 613 * @param duty Duty cycle to use from 0 to 100.
davide.aliprandi@st.com 3:b0128df93d26 614 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 615 */
davide.aliprandi@st.com 3:b0128df93d26 616 void Stspin240_250_Board_PwmSetFreq(int8_t pwmId, uint32_t newFreq, uint8_t duty)
davide.aliprandi@st.com 3:b0128df93d26 617 {
davide.aliprandi@st.com 3:b0128df93d26 618 /* Computing the period of PWM. */
davide.aliprandi@st.com 3:b0128df93d26 619 double period = 1.0f / newFreq;
davide.aliprandi@st.com 3:b0128df93d26 620
davide.aliprandi@st.com 3:b0128df93d26 621 switch (pwmId)
davide.aliprandi@st.com 3:b0128df93d26 622 {
davide.aliprandi@st.com 3:b0128df93d26 623 case 0:
davide.aliprandi@st.com 3:b0128df93d26 624 default:
davide.aliprandi@st.com 3:b0128df93d26 625 /* Setting the period and the duty-cycle of PWM A. */
davide.aliprandi@st.com 3:b0128df93d26 626 pwmA.period(period);
davide.aliprandi@st.com 3:b0128df93d26 627 pwmA.write((float)(duty / 100.0f));
davide.aliprandi@st.com 3:b0128df93d26 628 break;
davide.aliprandi@st.com 3:b0128df93d26 629 case 1:
davide.aliprandi@st.com 3:b0128df93d26 630 /* Setting the period and the duty-cycle of PWM B. */
davide.aliprandi@st.com 3:b0128df93d26 631 pwmB.period(period);
davide.aliprandi@st.com 3:b0128df93d26 632 pwmB.write((float)(duty / 100.0f));
davide.aliprandi@st.com 3:b0128df93d26 633 break;
davide.aliprandi@st.com 3:b0128df93d26 634 case 2:
davide.aliprandi@st.com 3:b0128df93d26 635 /* Setting the period and the duty-cycle of PWM Ref. */
davide.aliprandi@st.com 3:b0128df93d26 636 pwmRef.period(period);
davide.aliprandi@st.com 3:b0128df93d26 637 pwmRef.write((float)(duty / 100.0f));
davide.aliprandi@st.com 3:b0128df93d26 638 break;
davide.aliprandi@st.com 3:b0128df93d26 639 }
davide.aliprandi@st.com 3:b0128df93d26 640 }
davide.aliprandi@st.com 3:b0128df93d26 641
davide.aliprandi@st.com 3:b0128df93d26 642 /**
davide.aliprandi@st.com 3:b0128df93d26 643 * @brief Stopping the PWM.
davide.aliprandi@st.com 3:b0128df93d26 644 * @param pwmId 0 for bridge A PWM, 1 for bridge B PWM, 2 for REF PWM.
davide.aliprandi@st.com 3:b0128df93d26 645 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 646 */
davide.aliprandi@st.com 3:b0128df93d26 647 void Stspin240_250_Board_PwmStop(uint8_t pwmId)
davide.aliprandi@st.com 3:b0128df93d26 648 {
davide.aliprandi@st.com 3:b0128df93d26 649 switch (pwmId)
davide.aliprandi@st.com 3:b0128df93d26 650 {
davide.aliprandi@st.com 3:b0128df93d26 651 case 0:
davide.aliprandi@st.com 3:b0128df93d26 652 default:
davide.aliprandi@st.com 3:b0128df93d26 653 pwmA.write(0.0f);
davide.aliprandi@st.com 3:b0128df93d26 654 break;
davide.aliprandi@st.com 3:b0128df93d26 655 case 1:
davide.aliprandi@st.com 3:b0128df93d26 656 pwmB.write(0.0f);
davide.aliprandi@st.com 3:b0128df93d26 657 break;
davide.aliprandi@st.com 3:b0128df93d26 658 case 2:
davide.aliprandi@st.com 3:b0128df93d26 659 pwmRef.write(0.0f);
davide.aliprandi@st.com 3:b0128df93d26 660 break;
davide.aliprandi@st.com 3:b0128df93d26 661 }
davide.aliprandi@st.com 3:b0128df93d26 662 }
davide.aliprandi@st.com 3:b0128df93d26 663
davide.aliprandi@st.com 3:b0128df93d26 664 /**
davide.aliprandi@st.com 3:b0128df93d26 665 * @brief Putting the device in standby mode.
davide.aliprandi@st.com 3:b0128df93d26 666 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 667 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 668 */
davide.aliprandi@st.com 3:b0128df93d26 669 void Stspin240_250_Board_Releasereset(void)
davide.aliprandi@st.com 3:b0128df93d26 670 {
davide.aliprandi@st.com 3:b0128df93d26 671 standby_reset = 1;
davide.aliprandi@st.com 3:b0128df93d26 672 Stspin240_250_Board_Delay(EXIT_STANDBY_MODE_DELAY);
davide.aliprandi@st.com 3:b0128df93d26 673 }
Manu_L 0:13bc901c90aa 674
davide.aliprandi@st.com 3:b0128df93d26 675 /**
davide.aliprandi@st.com 3:b0128df93d26 676 * @brief Putting the device in reset mode.
davide.aliprandi@st.com 3:b0128df93d26 677 * @param None.
davide.aliprandi@st.com 3:b0128df93d26 678 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 679 */
davide.aliprandi@st.com 3:b0128df93d26 680 void Stspin240_250_Board_reset(void)
davide.aliprandi@st.com 3:b0128df93d26 681 {
davide.aliprandi@st.com 3:b0128df93d26 682 standby_reset = 0;
davide.aliprandi@st.com 3:b0128df93d26 683 }
davide.aliprandi@st.com 3:b0128df93d26 684
davide.aliprandi@st.com 3:b0128df93d26 685 /**
davide.aliprandi@st.com 3:b0128df93d26 686 * @brief Setting the direction of rotation.
davide.aliprandi@st.com 3:b0128df93d26 687 * @param bridgeId 0 for bridge A, 1 for bridge B.
davide.aliprandi@st.com 3:b0128df93d26 688 * @param gpioState direction of rotation: "1" for forward, "0" for backward.
davide.aliprandi@st.com 3:b0128df93d26 689 * @retval None.
davide.aliprandi@st.com 3:b0128df93d26 690 */
davide.aliprandi@st.com 3:b0128df93d26 691 void Stspin240_250_Board_SetDirectionGpio(uint8_t bridgeId, uint8_t gpioState)
davide.aliprandi@st.com 3:b0128df93d26 692 {
davide.aliprandi@st.com 3:b0128df93d26 693 if (bridgeId == 0)
davide.aliprandi@st.com 3:b0128df93d26 694 {
davide.aliprandi@st.com 3:b0128df93d26 695 dirA = gpioState;
davide.aliprandi@st.com 3:b0128df93d26 696 }
davide.aliprandi@st.com 3:b0128df93d26 697 else
davide.aliprandi@st.com 3:b0128df93d26 698 {
davide.aliprandi@st.com 3:b0128df93d26 699 dirB = gpioState;
davide.aliprandi@st.com 3:b0128df93d26 700 }
davide.aliprandi@st.com 3:b0128df93d26 701 }
davide.aliprandi@st.com 3:b0128df93d26 702
davide.aliprandi@st.com 3:b0128df93d26 703 /*** Component's Instance Variables ***/
davide.aliprandi@st.com 3:b0128df93d26 704
davide.aliprandi@st.com 3:b0128df93d26 705 /* ACTION 9 --------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 706 * Declare here interrupt related variables, if needed. *
davide.aliprandi@st.com 3:b0128df93d26 707 * Note that interrupt handling is platform dependent, see *
davide.aliprandi@st.com 3:b0128df93d26 708 * "Interrupt Related Methods" above. *
davide.aliprandi@st.com 3:b0128df93d26 709 * *
davide.aliprandi@st.com 3:b0128df93d26 710 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 711 * + mbed: *
davide.aliprandi@st.com 3:b0128df93d26 712 * InterruptIn feature_irq; *
davide.aliprandi@st.com 3:b0128df93d26 713 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 714 /* Flag Interrupt. */
davide.aliprandi@st.com 3:b0128df93d26 715 InterruptIn flag_and_enable;
davide.aliprandi@st.com 3:b0128df93d26 716
davide.aliprandi@st.com 3:b0128df93d26 717 /* ACTION 10 -------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 718 * Declare here other pin related variables, if needed. *
davide.aliprandi@st.com 3:b0128df93d26 719 * *
davide.aliprandi@st.com 3:b0128df93d26 720 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 721 * + mbed: *
davide.aliprandi@st.com 3:b0128df93d26 722 * DigitalOut standby_reset; *
davide.aliprandi@st.com 3:b0128df93d26 723 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 724 /* Standby/reset pin. */
davide.aliprandi@st.com 3:b0128df93d26 725 DigitalOut standby_reset;
davide.aliprandi@st.com 3:b0128df93d26 726
davide.aliprandi@st.com 3:b0128df93d26 727 /* Direction pin of bridge A. */
davide.aliprandi@st.com 3:b0128df93d26 728 DigitalOut dirA;
Manu_L 0:13bc901c90aa 729
davide.aliprandi@st.com 3:b0128df93d26 730 /* Direction pin of bridge B. */
davide.aliprandi@st.com 3:b0128df93d26 731 DigitalOut dirB;
davide.aliprandi@st.com 3:b0128df93d26 732
davide.aliprandi@st.com 3:b0128df93d26 733 /* Pulse Width Modulation pin for bridge A input. */
davide.aliprandi@st.com 3:b0128df93d26 734 PwmOut pwmA;
davide.aliprandi@st.com 3:b0128df93d26 735
davide.aliprandi@st.com 3:b0128df93d26 736 /* Pulse Width Modulation pin for bridge A input. */
davide.aliprandi@st.com 3:b0128df93d26 737 PwmOut pwmB;
davide.aliprandi@st.com 3:b0128df93d26 738
davide.aliprandi@st.com 3:b0128df93d26 739 /* Pulse Width Modulation pin for Ref signal. */
davide.aliprandi@st.com 3:b0128df93d26 740 PwmOut pwmRef;
davide.aliprandi@st.com 3:b0128df93d26 741
davide.aliprandi@st.com 3:b0128df93d26 742 /* ACTION 11 -------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 743 * Declare here communication related variables, if needed. *
davide.aliprandi@st.com 3:b0128df93d26 744 * *
davide.aliprandi@st.com 3:b0128df93d26 745 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 746 * + mbed: *
davide.aliprandi@st.com 3:b0128df93d26 747 * DigitalOut ssel; *
davide.aliprandi@st.com 3:b0128df93d26 748 * DevSPI &dev_spi; *
davide.aliprandi@st.com 3:b0128df93d26 749 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 750
davide.aliprandi@st.com 3:b0128df93d26 751 /* ACTION 12 -------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 752 * Declare here identity related variables, if needed. *
davide.aliprandi@st.com 3:b0128df93d26 753 * Note that there should be only a unique identifier for each component, *
davide.aliprandi@st.com 3:b0128df93d26 754 * which should be the "who_am_i" parameter. *
davide.aliprandi@st.com 3:b0128df93d26 755 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 756 /* Identity */
davide.aliprandi@st.com 3:b0128df93d26 757 uint8_t who_am_i;
davide.aliprandi@st.com 3:b0128df93d26 758
davide.aliprandi@st.com 3:b0128df93d26 759 /* ACTION 13 -------------------------------------------------------------*
davide.aliprandi@st.com 3:b0128df93d26 760 * Declare here the component's static and non-static data, one variable *
davide.aliprandi@st.com 3:b0128df93d26 761 * per line. *
davide.aliprandi@st.com 3:b0128df93d26 762 * *
davide.aliprandi@st.com 3:b0128df93d26 763 * Example: *
davide.aliprandi@st.com 3:b0128df93d26 764 * float measure; *
davide.aliprandi@st.com 3:b0128df93d26 765 * int instance_id; *
davide.aliprandi@st.com 3:b0128df93d26 766 * static int number_of_instances; *
davide.aliprandi@st.com 3:b0128df93d26 767 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 3:b0128df93d26 768 /* Data. */
davide.aliprandi@st.com 3:b0128df93d26 769 void (*errorHandlerCallback)(uint16_t error);
davide.aliprandi@st.com 3:b0128df93d26 770 deviceParams_t device_prm;
davide.aliprandi@st.com 3:b0128df93d26 771 uint8_t deviceInstance;
davide.aliprandi@st.com 3:b0128df93d26 772
davide.aliprandi@st.com 3:b0128df93d26 773
davide.aliprandi@st.com 3:b0128df93d26 774 /* Static data. */
davide.aliprandi@st.com 3:b0128df93d26 775 static uint8_t numberOfDevices;
davide.aliprandi@st.com 3:b0128df93d26 776 static uint8_t arrayNbMaxMotorsByConfig[2];
davide.aliprandi@st.com 3:b0128df93d26 777
davide.aliprandi@st.com 3:b0128df93d26 778 public:
davide.aliprandi@st.com 3:b0128df93d26 779
davide.aliprandi@st.com 3:b0128df93d26 780 /* Static data. */
davide.aliprandi@st.com 3:b0128df93d26 781
davide.aliprandi@st.com 3:b0128df93d26 782 };
davide.aliprandi@st.com 3:b0128df93d26 783
davide.aliprandi@st.com 3:b0128df93d26 784 #endif // __STSPIN240_250_CLASS_H
Manu_L 0:13bc901c90aa 785
Manu_L 0:13bc901c90aa 786 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/