MicroForce Sensors, Compensated/Amplified
MicroForce_FMA.h@2:2f45d928f6e0, 2021-06-30 (annotated)
- Committer:
- mcm
- Date:
- Wed Jun 30 14:08:37 2021 +0000
- Revision:
- 2:2f45d928f6e0
- Parent:
- 1:4b8a700b3f5c
This driver was completed and tested (NUCLEO-L053R8) and it works as expected. This driver only supports SPI communication.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 0:e4146617a5fc | 1 | /** |
mcm | 0:e4146617a5fc | 2 | * @brief MicroForce_FMA.h |
mcm | 0:e4146617a5fc | 3 | * @details MicroForce Sensors, Compensated/Amplified. |
mcm | 0:e4146617a5fc | 4 | * Header file. |
mcm | 0:e4146617a5fc | 5 | * |
mcm | 0:e4146617a5fc | 6 | * |
mcm | 0:e4146617a5fc | 7 | * @return N/A |
mcm | 0:e4146617a5fc | 8 | * |
mcm | 0:e4146617a5fc | 9 | * @author Manuel Caballero |
mcm | 2:2f45d928f6e0 | 10 | * @date 30/June/2021 |
mcm | 2:2f45d928f6e0 | 11 | * @version 30/June/2021 The ORIGIN |
mcm | 0:e4146617a5fc | 12 | * @pre N/A. |
mcm | 2:2f45d928f6e0 | 13 | * @warning This driver only supports SPI communication. |
mcm | 0:e4146617a5fc | 14 | * @pre This code belongs to Nimbus Centre ( https://www.nimbus.cit.ie ). |
mcm | 0:e4146617a5fc | 15 | */ |
mcm | 0:e4146617a5fc | 16 | #ifndef MicroForce_FMA_H |
mcm | 0:e4146617a5fc | 17 | #define MicroForce_FMA_H |
mcm | 0:e4146617a5fc | 18 | |
mcm | 0:e4146617a5fc | 19 | #include "mbed.h" |
mcm | 0:e4146617a5fc | 20 | /** |
mcm | 0:e4146617a5fc | 21 | Example: |
mcm | 0:e4146617a5fc | 22 | @code |
mcm | 2:2f45d928f6e0 | 23 | #include "mbed.h" |
mcm | 2:2f45d928f6e0 | 24 | #include "MicroForce_FMA.h" |
mcm | 0:e4146617a5fc | 25 | |
mcm | 2:2f45d928f6e0 | 26 | MicroForce_FMA myMicroForce_FMA ( PB_5, PB_4, PB_3, PB_8, 500000 ); // MOSI: PB_5 | MISO: PB_4 | SCLK: PB_3 | CS: PB_8 | FREQ: 500kHz; |
mcm | 2:2f45d928f6e0 | 27 | Serial pc ( USBTX, USBRX ); // tx, rx |
mcm | 2:2f45d928f6e0 | 28 | |
mcm | 2:2f45d928f6e0 | 29 | DigitalOut myled ( LED1 ); |
mcm | 2:2f45d928f6e0 | 30 | Ticker newAction; |
mcm | 2:2f45d928f6e0 | 31 | |
mcm | 2:2f45d928f6e0 | 32 | |
mcm | 2:2f45d928f6e0 | 33 | //@brief Constants. |
mcm | 2:2f45d928f6e0 | 34 | |
mcm | 2:2f45d928f6e0 | 35 | |
mcm | 2:2f45d928f6e0 | 36 | //@brief Variables. |
mcm | 2:2f45d928f6e0 | 37 | volatile uint32_t myState; // State that indicates when to perform a new sample |
mcm | 2:2f45d928f6e0 | 38 | |
mcm | 2:2f45d928f6e0 | 39 | |
mcm | 2:2f45d928f6e0 | 40 | //@brief FUNCTION PROTOTYPES |
mcm | 2:2f45d928f6e0 | 41 | void changeDATA ( void ); |
mcm | 2:2f45d928f6e0 | 42 | |
mcm | 2:2f45d928f6e0 | 43 | |
mcm | 2:2f45d928f6e0 | 44 | //@brief FUNCTION FOR APPLICATION MAIN ENTRY. |
mcm | 2:2f45d928f6e0 | 45 | int main() |
mcm | 2:2f45d928f6e0 | 46 | { |
mcm | 2:2f45d928f6e0 | 47 | MicroForce_FMA::MicroForce_FMA_status_t aux; |
mcm | 2:2f45d928f6e0 | 48 | MicroForce_FMA::MicroForce_FMA_data_t myMicroForce_FMA_Data; |
mcm | 2:2f45d928f6e0 | 49 | |
mcm | 2:2f45d928f6e0 | 50 | pc.baud ( 115200 ); |
mcm | 2:2f45d928f6e0 | 51 | |
mcm | 2:2f45d928f6e0 | 52 | myled = 1; |
mcm | 2:2f45d928f6e0 | 53 | wait(3); |
mcm | 2:2f45d928f6e0 | 54 | myled = 0; |
mcm | 2:2f45d928f6e0 | 55 | |
mcm | 2:2f45d928f6e0 | 56 | |
mcm | 2:2f45d928f6e0 | 57 | myState = 0UL; // Reset the variable |
mcm | 2:2f45d928f6e0 | 58 | newAction.attach( &changeDATA, 1U ); // the address of the function to be attached ( changeDATA ) and the interval ( 5s ) |
mcm | 2:2f45d928f6e0 | 59 | |
mcm | 2:2f45d928f6e0 | 60 | // Let the callbacks take care of everything |
mcm | 2:2f45d928f6e0 | 61 | while(1) { |
mcm | 2:2f45d928f6e0 | 62 | sleep(); |
mcm | 2:2f45d928f6e0 | 63 | |
mcm | 2:2f45d928f6e0 | 64 | if ( myState == 1UL ) { |
mcm | 2:2f45d928f6e0 | 65 | myled = 1U; |
mcm | 2:2f45d928f6e0 | 66 | |
mcm | 2:2f45d928f6e0 | 67 | do { |
mcm | 2:2f45d928f6e0 | 68 | // Get all the data |
mcm | 2:2f45d928f6e0 | 69 | aux = myMicroForce_FMA.MicroForce_FMA_GetAllRawData ( &myMicroForce_FMA_Data.status, &myMicroForce_FMA_Data.force.raw_bridge_data, &myMicroForce_FMA_Data.temperature.raw_11bit_temperature ); |
mcm | 2:2f45d928f6e0 | 70 | wait_ms(1U); |
mcm | 2:2f45d928f6e0 | 71 | } while( myMicroForce_FMA_Data.status.status_bits != MicroForce_FMA::MicroForce_FMA_STATUS_BITS_NORMAL_OPERATION ); |
mcm | 2:2f45d928f6e0 | 72 | |
mcm | 2:2f45d928f6e0 | 73 | // It processes all the data |
mcm | 2:2f45d928f6e0 | 74 | myMicroForce_FMA_Data.transfer_function = MicroForce_FMA::MicroForce_FMA_TRANSFER_FUNCTION_20_TO_80; |
mcm | 2:2f45d928f6e0 | 75 | myMicroForce_FMA_Data.force_range = FMA_FORCE_RANGE_15_N; |
mcm | 2:2f45d928f6e0 | 76 | myMicroForce_FMA_Data.force.bridge_data = myMicroForce_FMA.MicroForce_FMA_CalculateForce ( myMicroForce_FMA_Data.transfer_function, myMicroForce_FMA_Data.force_range, myMicroForce_FMA_Data.force.raw_bridge_data ); |
mcm | 2:2f45d928f6e0 | 77 | myMicroForce_FMA_Data.temperature.temperature_data = myMicroForce_FMA.MicroForce_FMA_Calculate11bitTemperature ( myMicroForce_FMA_Data.temperature.raw_11bit_temperature ); |
mcm | 2:2f45d928f6e0 | 78 | |
mcm | 2:2f45d928f6e0 | 79 | |
mcm | 2:2f45d928f6e0 | 80 | // Send data through the UART |
mcm | 2:2f45d928f6e0 | 81 | pc.printf ( "Force: %d N | Temp: %d C\r\n", (uint32_t)myMicroForce_FMA_Data.force.bridge_data, (uint32_t)myMicroForce_FMA_Data.temperature.temperature_data ); |
mcm | 2:2f45d928f6e0 | 82 | |
mcm | 2:2f45d928f6e0 | 83 | // Reset the variables |
mcm | 2:2f45d928f6e0 | 84 | myState = 0UL; |
mcm | 2:2f45d928f6e0 | 85 | myled = 0U; |
mcm | 2:2f45d928f6e0 | 86 | } |
mcm | 2:2f45d928f6e0 | 87 | } |
mcm | 2:2f45d928f6e0 | 88 | } |
mcm | 2:2f45d928f6e0 | 89 | |
mcm | 2:2f45d928f6e0 | 90 | |
mcm | 2:2f45d928f6e0 | 91 | // @brief changeDATA ( void ) |
mcm | 2:2f45d928f6e0 | 92 | // |
mcm | 2:2f45d928f6e0 | 93 | // @details It changes myState variable |
mcm | 2:2f45d928f6e0 | 94 | // |
mcm | 2:2f45d928f6e0 | 95 | // @param[in] N/A |
mcm | 2:2f45d928f6e0 | 96 | // |
mcm | 2:2f45d928f6e0 | 97 | // @param[out] N/A. |
mcm | 2:2f45d928f6e0 | 98 | // |
mcm | 2:2f45d928f6e0 | 99 | // @return N/A. |
mcm | 2:2f45d928f6e0 | 100 | // |
mcm | 2:2f45d928f6e0 | 101 | // @author Manuel Caballero |
mcm | 2:2f45d928f6e0 | 102 | // @date 30/June/2021 |
mcm | 2:2f45d928f6e0 | 103 | // @version 30/June/2021 The ORIGIN |
mcm | 2:2f45d928f6e0 | 104 | // @pre N/A |
mcm | 2:2f45d928f6e0 | 105 | // @warning N/A. |
mcm | 2:2f45d928f6e0 | 106 | void changeDATA ( void ) |
mcm | 2:2f45d928f6e0 | 107 | { |
mcm | 2:2f45d928f6e0 | 108 | myState = 1UL; |
mcm | 2:2f45d928f6e0 | 109 | } |
mcm | 0:e4146617a5fc | 110 | @endcode |
mcm | 0:e4146617a5fc | 111 | */ |
mcm | 0:e4146617a5fc | 112 | |
mcm | 0:e4146617a5fc | 113 | |
mcm | 0:e4146617a5fc | 114 | /*! |
mcm | 0:e4146617a5fc | 115 | Library for the MicroForce_FMA. MicroForce Sensors, Compensated/Amplified. |
mcm | 0:e4146617a5fc | 116 | */ |
mcm | 0:e4146617a5fc | 117 | class MicroForce_FMA |
mcm | 0:e4146617a5fc | 118 | { |
mcm | 0:e4146617a5fc | 119 | public: |
mcm | 0:e4146617a5fc | 120 | /** |
mcm | 0:e4146617a5fc | 121 | * @brief STATUS BITS |
mcm | 0:e4146617a5fc | 122 | */ |
mcm | 0:e4146617a5fc | 123 | typedef enum { |
mcm | 0:e4146617a5fc | 124 | MicroForce_FMA_STATUS_BITS_MASK = ( 0b11 << 6 ), /*!< STATUS BITS mask */ |
mcm | 0:e4146617a5fc | 125 | MicroForce_FMA_STATUS_BITS_NORMAL_OPERATION = ( 0b00 << 6 ), /*!< Normal operation, valid data */ |
mcm | 0:e4146617a5fc | 126 | MicroForce_FMA_STATUS_BITS_DEVICE_IN_COMMAND_MODE = ( 0b01 << 6 ), /*!< Device in command mode */ |
mcm | 0:e4146617a5fc | 127 | MicroForce_FMA_STATUS_BITS_STALE_DATA = ( 0b10 << 6 ), /*!< Stale data */ |
mcm | 0:e4146617a5fc | 128 | MicroForce_FMA_STATUS_BITS_DIAGNOSTIC_CONDITION = ( 0b11 << 6 ) /*!< Diagnostic condition */ |
mcm | 0:e4146617a5fc | 129 | } MicroForce_FMA_status_bits_t; |
mcm | 0:e4146617a5fc | 130 | |
mcm | 0:e4146617a5fc | 131 | |
mcm | 0:e4146617a5fc | 132 | /** |
mcm | 0:e4146617a5fc | 133 | * @brief TRANSFER FUCNTION |
mcm | 0:e4146617a5fc | 134 | */ |
mcm | 0:e4146617a5fc | 135 | typedef enum { |
mcm | 0:e4146617a5fc | 136 | MicroForce_FMA_TRANSFER_FUNCTION_10_TO_90 = 0U, /*!< Tranfer function A: 10% to 90% */ |
mcm | 0:e4146617a5fc | 137 | MicroForce_FMA_TRANSFER_FUNCTION_20_TO_80 = 1U /*!< Tranfer function C: 20% to 80% */ |
mcm | 0:e4146617a5fc | 138 | } MicroForce_FMA_transfer_function_t; |
mcm | 0:e4146617a5fc | 139 | |
mcm | 0:e4146617a5fc | 140 | |
mcm | 0:e4146617a5fc | 141 | /** |
mcm | 0:e4146617a5fc | 142 | * @brief FORCE RANGE |
mcm | 0:e4146617a5fc | 143 | */ |
mcm | 1:4b8a700b3f5c | 144 | #define FMA_FORCE_RANGE_5_N 5U /*!< Force range: 5N */ |
mcm | 1:4b8a700b3f5c | 145 | #define FMA_FORCE_RANGE_15_N 15U /*!< Force range: 15N */ |
mcm | 1:4b8a700b3f5c | 146 | #define FMA_FORCE_RANGE_25_N 25U /*!< Force range: 25N */ |
mcm | 0:e4146617a5fc | 147 | |
mcm | 0:e4146617a5fc | 148 | |
mcm | 0:e4146617a5fc | 149 | |
mcm | 0:e4146617a5fc | 150 | #ifndef MicroForce_FMA_STRUCT_H |
mcm | 0:e4146617a5fc | 151 | #define MicroForce_FMA_STRUCT_H |
mcm | 0:e4146617a5fc | 152 | typedef struct { |
mcm | 0:e4146617a5fc | 153 | MicroForce_FMA_status_bits_t status_bits; |
mcm | 0:e4146617a5fc | 154 | } MicroForce_FMA_status_bits_data_t; |
mcm | 0:e4146617a5fc | 155 | |
mcm | 0:e4146617a5fc | 156 | |
mcm | 0:e4146617a5fc | 157 | typedef struct { |
mcm | 0:e4146617a5fc | 158 | uint16_t raw_bridge_data; |
mcm | 0:e4146617a5fc | 159 | float bridge_data; /*!< Force data in Newton (N) */ |
mcm | 0:e4146617a5fc | 160 | } MicroForce_FMA_bridge_data_t; |
mcm | 0:e4146617a5fc | 161 | |
mcm | 0:e4146617a5fc | 162 | |
mcm | 0:e4146617a5fc | 163 | typedef struct { |
mcm | 0:e4146617a5fc | 164 | uint8_t raw_8bit_temperature; |
mcm | 0:e4146617a5fc | 165 | uint16_t raw_11bit_temperature; |
mcm | 0:e4146617a5fc | 166 | float temperature_data; /*!< Temperature data in Celsius degree */ |
mcm | 0:e4146617a5fc | 167 | } MicroForce_FMA_temperature_data_t; |
mcm | 0:e4146617a5fc | 168 | |
mcm | 0:e4146617a5fc | 169 | |
mcm | 0:e4146617a5fc | 170 | /* User's data */ |
mcm | 0:e4146617a5fc | 171 | typedef struct { |
mcm | 0:e4146617a5fc | 172 | MicroForce_FMA_transfer_function_t transfer_function; /*!< Transfer function. Calibration */ |
mcm | 0:e4146617a5fc | 173 | uint8_t force_range; /*!< Force Range */ |
mcm | 0:e4146617a5fc | 174 | |
mcm | 0:e4146617a5fc | 175 | MicroForce_FMA_status_bits_data_t status; /*!< Status bits. Device condition */ |
mcm | 0:e4146617a5fc | 176 | |
mcm | 0:e4146617a5fc | 177 | MicroForce_FMA_bridge_data_t force; /*!< Force data */ |
mcm | 0:e4146617a5fc | 178 | MicroForce_FMA_temperature_data_t temperature; /*!< Temperature data */ |
mcm | 0:e4146617a5fc | 179 | } MicroForce_FMA_data_t; |
mcm | 0:e4146617a5fc | 180 | #endif |
mcm | 0:e4146617a5fc | 181 | |
mcm | 0:e4146617a5fc | 182 | |
mcm | 0:e4146617a5fc | 183 | |
mcm | 0:e4146617a5fc | 184 | /** |
mcm | 0:e4146617a5fc | 185 | * @brief INTERNAL CONSTANTS |
mcm | 0:e4146617a5fc | 186 | */ |
mcm | 0:e4146617a5fc | 187 | typedef enum { |
mcm | 0:e4146617a5fc | 188 | MicroForce_FMA_SUCCESS = 0, |
mcm | 0:e4146617a5fc | 189 | MicroForce_FMA_FAILURE = 1, |
mcm | 0:e4146617a5fc | 190 | SPI_SUCCESS = 1 |
mcm | 0:e4146617a5fc | 191 | } MicroForce_FMA_status_t; |
mcm | 0:e4146617a5fc | 192 | |
mcm | 0:e4146617a5fc | 193 | |
mcm | 0:e4146617a5fc | 194 | |
mcm | 0:e4146617a5fc | 195 | |
mcm | 0:e4146617a5fc | 196 | /** Create an MicroForce_FMA object connected to the specified SPI pins. |
mcm | 0:e4146617a5fc | 197 | * |
mcm | 0:e4146617a5fc | 198 | * @param mosi SPI Master Output Slave Input |
mcm | 0:e4146617a5fc | 199 | * @param miso SPI Master Input Slave Output |
mcm | 0:e4146617a5fc | 200 | * @param sclk SPI clock |
mcm | 0:e4146617a5fc | 201 | * @param cs SPI Chip Select |
mcm | 0:e4146617a5fc | 202 | * @param freq SPI frequency in Hz. |
mcm | 0:e4146617a5fc | 203 | */ |
mcm | 0:e4146617a5fc | 204 | MicroForce_FMA ( PinName mosi, PinName miso, PinName sclk, PinName cs, uint32_t freq ); |
mcm | 0:e4146617a5fc | 205 | |
mcm | 0:e4146617a5fc | 206 | /** Delete MicroForce_FMA object. |
mcm | 0:e4146617a5fc | 207 | */ |
mcm | 0:e4146617a5fc | 208 | ~MicroForce_FMA(); |
mcm | 0:e4146617a5fc | 209 | |
mcm | 0:e4146617a5fc | 210 | /** It gets the raw force data. |
mcm | 0:e4146617a5fc | 211 | */ |
mcm | 0:e4146617a5fc | 212 | MicroForce_FMA_status_t MicroForce_FMA_GetRawForce ( MicroForce_FMA_status_bits_data_t* myStatus, uint16_t* myRawBridgeData ); |
mcm | 0:e4146617a5fc | 213 | |
mcm | 0:e4146617a5fc | 214 | /** It calculates the force data in Newton (N). |
mcm | 0:e4146617a5fc | 215 | */ |
mcm | 0:e4146617a5fc | 216 | float MicroForce_FMA_CalculateForce ( MicroForce_FMA_transfer_function_t myCalibration, uint8_t myForceRange, uint16_t myRawBridgeData ); |
mcm | 0:e4146617a5fc | 217 | |
mcm | 0:e4146617a5fc | 218 | /** It gets the raw 8-bit temperature. |
mcm | 0:e4146617a5fc | 219 | */ |
mcm | 0:e4146617a5fc | 220 | MicroForce_FMA_status_t MicroForce_FMA_GetRaw8bitTemperature ( MicroForce_FMA_status_bits_data_t* myStatus, uint8_t* myRaw8bitTemp ); |
mcm | 0:e4146617a5fc | 221 | |
mcm | 0:e4146617a5fc | 222 | /** It gets the raw 11-bit temperature. |
mcm | 0:e4146617a5fc | 223 | */ |
mcm | 0:e4146617a5fc | 224 | MicroForce_FMA_status_t MicroForce_FMA_GetRaw11bitTemperature ( MicroForce_FMA_status_bits_data_t* myStatus, uint16_t* myRaw11bitTemp ); |
mcm | 0:e4146617a5fc | 225 | |
mcm | 0:e4146617a5fc | 226 | /** It calculates the 8-bit temperature in Celsius degree. |
mcm | 0:e4146617a5fc | 227 | */ |
mcm | 0:e4146617a5fc | 228 | float MicroForce_FMA_Calculate8bitTemperature ( uint8_t myRawTemperature ); |
mcm | 0:e4146617a5fc | 229 | |
mcm | 0:e4146617a5fc | 230 | /** It calculates the 11-bit temperature in Celsius degree. |
mcm | 0:e4146617a5fc | 231 | */ |
mcm | 0:e4146617a5fc | 232 | float MicroForce_FMA_Calculate11bitTemperature ( uint16_t myRawTemperature ); |
mcm | 0:e4146617a5fc | 233 | |
mcm | 0:e4146617a5fc | 234 | /** It gets the all raw data ( bridge data and 11-bit temperature ). |
mcm | 0:e4146617a5fc | 235 | */ |
mcm | 0:e4146617a5fc | 236 | MicroForce_FMA_status_t MicroForce_FMA_GetAllRawData ( MicroForce_FMA_status_bits_data_t* myStatus, uint16_t* myRawBridgeData, uint16_t* myRaw11bitTemp ); |
mcm | 0:e4146617a5fc | 237 | |
mcm | 0:e4146617a5fc | 238 | private: |
mcm | 0:e4146617a5fc | 239 | SPI _spi; |
mcm | 0:e4146617a5fc | 240 | DigitalOut _cs; |
mcm | 0:e4146617a5fc | 241 | }; |
mcm | 0:e4146617a5fc | 242 | |
mcm | 0:e4146617a5fc | 243 | #endif |