MicroForce Sensors, Compensated/Amplified

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?

UserRevisionLine numberNew 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