24-Bit Analog-to-Digital Converter for Bridge Sensors.

Dependents:   weightscale Projet-BTS-balance Programme_Final_V6

Committer:
mcm
Date:
Mon Sep 18 13:51:20 2017 +0000
Revision:
1:16ae36a95be6
Parent:
0:5b0aa77c60ec
ADS1231 library was completed and it is ready for testing.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:16ae36a95be6 1 /**
mcm 1:16ae36a95be6 2 * @brief ADS1231.h
mcm 1:16ae36a95be6 3 * @details 24-Bit Analog-to-Digital Converter for Bridge Sensors.
mcm 1:16ae36a95be6 4 * Function file.
mcm 1:16ae36a95be6 5 *
mcm 1:16ae36a95be6 6 *
mcm 1:16ae36a95be6 7 * @return NA
mcm 1:16ae36a95be6 8 *
mcm 1:16ae36a95be6 9 * @author Manuel Caballero
mcm 1:16ae36a95be6 10 * @date 18/September/2017
mcm 1:16ae36a95be6 11 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 12 * @pre NaN.
mcm 1:16ae36a95be6 13 * @warning NaN
mcm 1:16ae36a95be6 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 1:16ae36a95be6 15 */
mcm 1:16ae36a95be6 16
mcm 1:16ae36a95be6 17 #include "ADS1231.h"
mcm 1:16ae36a95be6 18
mcm 1:16ae36a95be6 19
mcm 1:16ae36a95be6 20 ADS1231::ADS1231 ( PinName SCLK, PinName DOUT )
mcm 1:16ae36a95be6 21 : _SCLK ( SCLK )
mcm 1:16ae36a95be6 22 , _DOUT ( DOUT )
mcm 1:16ae36a95be6 23 {
mcm 1:16ae36a95be6 24
mcm 1:16ae36a95be6 25 }
mcm 1:16ae36a95be6 26
mcm 1:16ae36a95be6 27
mcm 1:16ae36a95be6 28 ADS1231::~ADS1231()
mcm 1:16ae36a95be6 29 {
mcm 1:16ae36a95be6 30 }
mcm 1:16ae36a95be6 31
mcm 1:16ae36a95be6 32
mcm 1:16ae36a95be6 33
mcm 1:16ae36a95be6 34 /**
mcm 1:16ae36a95be6 35 * @brief ADS1231_Reset ( void )
mcm 1:16ae36a95be6 36 *
mcm 1:16ae36a95be6 37 * @details It performs an internal reset.
mcm 1:16ae36a95be6 38 *
mcm 1:16ae36a95be6 39 * @param[in] NaN.
mcm 1:16ae36a95be6 40 *
mcm 1:16ae36a95be6 41 * @param[out] NaN.
mcm 1:16ae36a95be6 42 *
mcm 1:16ae36a95be6 43 *
mcm 1:16ae36a95be6 44 * @return Status of ADS1231_Reset.
mcm 1:16ae36a95be6 45 *
mcm 1:16ae36a95be6 46 *
mcm 1:16ae36a95be6 47 * @author Manuel Caballero
mcm 1:16ae36a95be6 48 * @date 18/September/2017
mcm 1:16ae36a95be6 49 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 50 * @pre When SCLK pin changes from low to high and stays at high for
mcm 1:16ae36a95be6 51 * longer than 26μs, ADS1231 enters power down mode.
mcm 1:16ae36a95be6 52 *
mcm 1:16ae36a95be6 53 * When SCLK returns to low, chip will reset and enter normal
mcm 1:16ae36a95be6 54 * operation mode.
mcm 1:16ae36a95be6 55 * @warning NaN.
mcm 1:16ae36a95be6 56 */
mcm 1:16ae36a95be6 57 ADS1231::ADS1231_status_t ADS1231::ADS1231_Reset ( void )
mcm 1:16ae36a95be6 58 {
mcm 1:16ae36a95be6 59 _SCLK = ADS1231_PIN_HIGH;
mcm 1:16ae36a95be6 60 wait_us ( 52 ); // Datasheet p15. At least 26us ( Security Factor: 2*26us = 52us )
mcm 1:16ae36a95be6 61 _SCLK = ADS1231_PIN_LOW;
mcm 1:16ae36a95be6 62
mcm 1:16ae36a95be6 63
mcm 1:16ae36a95be6 64
mcm 1:16ae36a95be6 65 if ( _DOUT == ADS1231_PIN_HIGH )
mcm 1:16ae36a95be6 66 return ADS1231_SUCCESS;
mcm 1:16ae36a95be6 67 else
mcm 1:16ae36a95be6 68 return ADS1231_FAILURE;
mcm 1:16ae36a95be6 69 }
mcm 1:16ae36a95be6 70
mcm 1:16ae36a95be6 71
mcm 1:16ae36a95be6 72
mcm 1:16ae36a95be6 73 /**
mcm 1:16ae36a95be6 74 * @brief ADS1231_PowerDown ( void )
mcm 1:16ae36a95be6 75 *
mcm 1:16ae36a95be6 76 * @details It puts the device in power-down mode.
mcm 1:16ae36a95be6 77 *
mcm 1:16ae36a95be6 78 * @param[in] NaN.
mcm 1:16ae36a95be6 79 *
mcm 1:16ae36a95be6 80 * @param[out] NaN.
mcm 1:16ae36a95be6 81 *
mcm 1:16ae36a95be6 82 *
mcm 1:16ae36a95be6 83 * @return Status of ADS1231_PowerDown.
mcm 1:16ae36a95be6 84 *
mcm 1:16ae36a95be6 85 *
mcm 1:16ae36a95be6 86 * @author Manuel Caballero
mcm 1:16ae36a95be6 87 * @date 18/September/2017
mcm 1:16ae36a95be6 88 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 89 * @pre When SCLK pin changes from low to high and stays at high for
mcm 1:16ae36a95be6 90 * longer than 26μs, ADS1231 enters power down mode.
mcm 1:16ae36a95be6 91 * @warning NaN.
mcm 1:16ae36a95be6 92 */
mcm 1:16ae36a95be6 93 ADS1231::ADS1231_status_t ADS1231::ADS1231_PowerDown ( void )
mcm 1:16ae36a95be6 94 {
mcm 1:16ae36a95be6 95 _SCLK = ADS1231_PIN_HIGH;
mcm 1:16ae36a95be6 96 wait_us ( 52 ); // Datasheet p15. At least 26us ( Security Factor: 2*26us = 52us )
mcm 1:16ae36a95be6 97
mcm 1:16ae36a95be6 98
mcm 1:16ae36a95be6 99
mcm 1:16ae36a95be6 100 if ( _DOUT == ADS1231_PIN_HIGH )
mcm 1:16ae36a95be6 101 return ADS1231_SUCCESS;
mcm 1:16ae36a95be6 102 else
mcm 1:16ae36a95be6 103 return ADS1231_FAILURE;
mcm 1:16ae36a95be6 104 }
mcm 1:16ae36a95be6 105
mcm 1:16ae36a95be6 106
mcm 1:16ae36a95be6 107
mcm 1:16ae36a95be6 108 /**
mcm 1:16ae36a95be6 109 * @brief ADS1231_ReadRawData ( Vector_count_t*, uint32_t )
mcm 1:16ae36a95be6 110 *
mcm 1:16ae36a95be6 111 * @details It reads the raw data from the device.
mcm 1:16ae36a95be6 112 *
mcm 1:16ae36a95be6 113 * @param[in] myAverage: How many measurement we have to get and deliver the average.
mcm 1:16ae36a95be6 114 *
mcm 1:16ae36a95be6 115 * @param[out] myNewRawData: The new value from the device.
mcm 1:16ae36a95be6 116 *
mcm 1:16ae36a95be6 117 *
mcm 1:16ae36a95be6 118 * @return Status of ADS1231_ReadRawData.
mcm 1:16ae36a95be6 119 *
mcm 1:16ae36a95be6 120 *
mcm 1:16ae36a95be6 121 * @author Manuel Caballero
mcm 1:16ae36a95be6 122 * @date 18/September/2017
mcm 1:16ae36a95be6 123 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 124 * @pre NaN.
mcm 1:16ae36a95be6 125 * @warning NaN.
mcm 1:16ae36a95be6 126 */
mcm 1:16ae36a95be6 127 ADS1231::ADS1231_status_t ADS1231::ADS1231_ReadRawData ( Vector_count_t* myNewRawData, uint32_t myAverage )
mcm 1:16ae36a95be6 128 {
mcm 1:16ae36a95be6 129 uint32_t i = 0; // Counter and timeout variable
mcm 1:16ae36a95be6 130 uint32_t ii = 0; // Counter variable
mcm 1:16ae36a95be6 131 uint32_t myAuxData = 0;
mcm 1:16ae36a95be6 132
mcm 1:16ae36a95be6 133
mcm 1:16ae36a95be6 134
mcm 1:16ae36a95be6 135 myNewRawData->myRawValue = 0; // Reset variable at the beginning
mcm 1:16ae36a95be6 136
mcm 1:16ae36a95be6 137 // Start collecting the new measurement as many as myAverage
mcm 1:16ae36a95be6 138 for ( ii = 0; ii < myAverage; ii++ ) {
mcm 1:16ae36a95be6 139 // Reset the value
mcm 1:16ae36a95be6 140 myAuxData = 0;
mcm 1:16ae36a95be6 141
mcm 1:16ae36a95be6 142 // Wait until the device is ready or timeout
mcm 1:16ae36a95be6 143 i = 23232323;
mcm 1:16ae36a95be6 144 _SCLK = ADS1231_PIN_LOW;
mcm 1:16ae36a95be6 145 while ( ( _DOUT == ADS1231_PIN_HIGH ) && ( --i ) );
mcm 1:16ae36a95be6 146
mcm 1:16ae36a95be6 147 // Check if something is wrong with the device because of the timeout
mcm 1:16ae36a95be6 148 if ( i < 1 )
mcm 1:16ae36a95be6 149 return ADS1231_FAILURE;
mcm 1:16ae36a95be6 150
mcm 1:16ae36a95be6 151
mcm 1:16ae36a95be6 152 // Read the data
mcm 1:16ae36a95be6 153 for ( i = 0; i < 24; i++ ) {
mcm 1:16ae36a95be6 154 // wait_us ( 1 ); // Datasheet p13. t_SCLK ( Min. 100ns )
mcm 1:16ae36a95be6 155 _SCLK = ADS1231_PIN_HIGH;
mcm 1:16ae36a95be6 156 // wait_us ( 1 ); // Datasheet p13. t_SCLK ( Min. 100ns )
mcm 1:16ae36a95be6 157 myAuxData <<= 1;
mcm 1:16ae36a95be6 158 _SCLK = ADS1231_PIN_LOW;
mcm 1:16ae36a95be6 159
mcm 1:16ae36a95be6 160 // High or Low bit
mcm 1:16ae36a95be6 161 if ( _DOUT == ADS1231_PIN_HIGH )
mcm 1:16ae36a95be6 162 myAuxData++;
mcm 1:16ae36a95be6 163 }
mcm 1:16ae36a95be6 164
mcm 1:16ae36a95be6 165 // Last bit to release the bus
mcm 1:16ae36a95be6 166 // wait_us ( 1 ); // Datasheet p13. t_SCLK ( Min. 100ns )
mcm 1:16ae36a95be6 167 _SCLK = ADS1231_PIN_HIGH;
mcm 1:16ae36a95be6 168 // wait_us ( 1 ); // Datasheet p13. t_SCLK ( Min. 100ns )
mcm 1:16ae36a95be6 169 _SCLK = ADS1231_PIN_LOW;
mcm 1:16ae36a95be6 170
mcm 1:16ae36a95be6 171
mcm 1:16ae36a95be6 172 // Update data to get the average
mcm 1:16ae36a95be6 173 myAuxData ^= 0x800000;
mcm 1:16ae36a95be6 174 myNewRawData->myRawValue += myAuxData;
mcm 1:16ae36a95be6 175 }
mcm 1:16ae36a95be6 176
mcm 1:16ae36a95be6 177 myNewRawData->myRawValue /= ( float )myAverage;
mcm 1:16ae36a95be6 178
mcm 1:16ae36a95be6 179
mcm 1:16ae36a95be6 180
mcm 1:16ae36a95be6 181 if ( _DOUT == ADS1231_PIN_HIGH )
mcm 1:16ae36a95be6 182 return ADS1231_SUCCESS;
mcm 1:16ae36a95be6 183 else
mcm 1:16ae36a95be6 184 return ADS1231_FAILURE;
mcm 1:16ae36a95be6 185 }
mcm 1:16ae36a95be6 186
mcm 1:16ae36a95be6 187
mcm 1:16ae36a95be6 188
mcm 1:16ae36a95be6 189 /**
mcm 1:16ae36a95be6 190 * @brief ADS1231_ReadData_WithCalibratedMass ( Vector_count_t* myNewRawData, uint32_t myAverage )
mcm 1:16ae36a95be6 191 *
mcm 1:16ae36a95be6 192 * @details It reads data with a calibrated mass on the load cell.
mcm 1:16ae36a95be6 193 *
mcm 1:16ae36a95be6 194 * @param[in] myAverage: How many data to read.
mcm 1:16ae36a95be6 195 *
mcm 1:16ae36a95be6 196 * @param[out] myNewRawData: myRawValue_WithCalibratedMass ( ADC code taken with calibrated mass ).
mcm 1:16ae36a95be6 197 *
mcm 1:16ae36a95be6 198 *
mcm 1:16ae36a95be6 199 * @return Status of ADS1231_ReadData_WithCalibratedMass.
mcm 1:16ae36a95be6 200 *
mcm 1:16ae36a95be6 201 *
mcm 1:16ae36a95be6 202 * @author Manuel Caballero
mcm 1:16ae36a95be6 203 * @date 18/September/2017
mcm 1:16ae36a95be6 204 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 205 * @pre NaN.
mcm 1:16ae36a95be6 206 * @warning NaN.
mcm 1:16ae36a95be6 207 */
mcm 1:16ae36a95be6 208 ADS1231::ADS1231_status_t ADS1231::ADS1231_ReadData_WithCalibratedMass ( Vector_count_t* myNewRawData, uint32_t myAverage )
mcm 1:16ae36a95be6 209 {
mcm 1:16ae36a95be6 210 ADS1231_status_t aux;
mcm 1:16ae36a95be6 211
mcm 1:16ae36a95be6 212 // Perform a new bunch of readings
mcm 1:16ae36a95be6 213 aux = ADS1231_ReadRawData ( myNewRawData, myAverage );
mcm 1:16ae36a95be6 214
mcm 1:16ae36a95be6 215
mcm 1:16ae36a95be6 216 // Update the value with a calibrated mass
mcm 1:16ae36a95be6 217 myNewRawData->myRawValue_WithCalibratedMass = myNewRawData->myRawValue;
mcm 1:16ae36a95be6 218
mcm 1:16ae36a95be6 219
mcm 1:16ae36a95be6 220
mcm 1:16ae36a95be6 221 if ( aux == ADS1231_SUCCESS )
mcm 1:16ae36a95be6 222 return ADS1231_SUCCESS;
mcm 1:16ae36a95be6 223 else
mcm 1:16ae36a95be6 224 return ADS1231_FAILURE;
mcm 1:16ae36a95be6 225 }
mcm 1:16ae36a95be6 226
mcm 1:16ae36a95be6 227
mcm 1:16ae36a95be6 228
mcm 1:16ae36a95be6 229 /**
mcm 1:16ae36a95be6 230 * @brief ADS1231_ReadData_WithoutMass ( Vector_count_t* myNewRawData, uint32_t myAverage )
mcm 1:16ae36a95be6 231 *
mcm 1:16ae36a95be6 232 * @details It reads data without any mass on the load cell.
mcm 1:16ae36a95be6 233 *
mcm 1:16ae36a95be6 234 * @param[in] myAverage: How many data to read.
mcm 1:16ae36a95be6 235 *
mcm 1:16ae36a95be6 236 * @param[out] myNewRawData: myRawValue_WithoutCalibratedMass ( ADC code taken without any mass ).
mcm 1:16ae36a95be6 237 *
mcm 1:16ae36a95be6 238 *
mcm 1:16ae36a95be6 239 * @return Status of ADS1231_ReadData_WithoutMass.
mcm 1:16ae36a95be6 240 *
mcm 1:16ae36a95be6 241 *
mcm 1:16ae36a95be6 242 * @author Manuel Caballero
mcm 1:16ae36a95be6 243 * @date 18/September/2017
mcm 1:16ae36a95be6 244 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 245 * @pre NaN.
mcm 1:16ae36a95be6 246 * @warning NaN.
mcm 1:16ae36a95be6 247 */
mcm 1:16ae36a95be6 248 ADS1231::ADS1231_status_t ADS1231::ADS1231_ReadData_WithoutMass ( Vector_count_t* myNewRawData, uint32_t myAverage )
mcm 1:16ae36a95be6 249 {
mcm 1:16ae36a95be6 250 ADS1231_status_t aux;
mcm 1:16ae36a95be6 251
mcm 1:16ae36a95be6 252 // Perform a new bunch of readings
mcm 1:16ae36a95be6 253 aux = ADS1231_ReadRawData ( myNewRawData, myAverage );
mcm 1:16ae36a95be6 254
mcm 1:16ae36a95be6 255
mcm 1:16ae36a95be6 256 // Update the value without any mass
mcm 1:16ae36a95be6 257 myNewRawData->myRawValue_WithoutCalibratedMass = myNewRawData->myRawValue;
mcm 1:16ae36a95be6 258
mcm 1:16ae36a95be6 259
mcm 1:16ae36a95be6 260
mcm 1:16ae36a95be6 261 if ( aux == ADS1231_SUCCESS )
mcm 1:16ae36a95be6 262 return ADS1231_SUCCESS;
mcm 1:16ae36a95be6 263 else
mcm 1:16ae36a95be6 264 return ADS1231_FAILURE;
mcm 1:16ae36a95be6 265 }
mcm 1:16ae36a95be6 266
mcm 1:16ae36a95be6 267
mcm 1:16ae36a95be6 268
mcm 1:16ae36a95be6 269 /**
mcm 1:16ae36a95be6 270 * @brief ADS1231_CalculateMass ( Vector_count_t* myNewRawData, uint32_t myCalibratedMass, ADS1231_scale_t myScaleCalibratedMass )
mcm 1:16ae36a95be6 271 *
mcm 1:16ae36a95be6 272 * @details It calculates the mass.
mcm 1:16ae36a95be6 273 *
mcm 1:16ae36a95be6 274 * @param[in] myNewRawData: It has myRawValue_WithCalibratedMass ( ADC code taken with calibrated mass ),
mcm 1:16ae36a95be6 275 * myRawValue_WithoutCalibratedMass ( ADC code taken without any mass ) and
mcm 1:16ae36a95be6 276 * myRawValue ( the current data taken by the system ).
mcm 1:16ae36a95be6 277 * @param[in] myCalibratedMass: A known value for the calibrated mass when myRawValue_WithCalibratedMass was
mcm 1:16ae36a95be6 278 * calculated.
mcm 1:16ae36a95be6 279 * @param[in] myScaleCalibratedMass: The range of the calibrated mass ( kg, g, mg or ug ).
mcm 1:16ae36a95be6 280 *
mcm 1:16ae36a95be6 281 * @param[out] NaN.
mcm 1:16ae36a95be6 282 *
mcm 1:16ae36a95be6 283 *
mcm 1:16ae36a95be6 284 * @return The calculated mass.
mcm 1:16ae36a95be6 285 *
mcm 1:16ae36a95be6 286 *
mcm 1:16ae36a95be6 287 * @author Manuel Caballero
mcm 1:16ae36a95be6 288 * @date 18/September/2017
mcm 1:16ae36a95be6 289 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 290 * @pre NaN.
mcm 1:16ae36a95be6 291 * @warning NaN.
mcm 1:16ae36a95be6 292 */
mcm 1:16ae36a95be6 293 ADS1231::Vector_mass_t ADS1231::ADS1231_CalculateMass ( Vector_count_t* myNewRawData, float myCalibratedMass, ADS1231_scale_t myScaleCalibratedMass )
mcm 1:16ae36a95be6 294 {
mcm 1:16ae36a95be6 295 // Terminology by Texas Instruments: sbau175a.pdf, p8 2.1.1 Calculation of Mass
mcm 1:16ae36a95be6 296 float m, w_zs;
mcm 1:16ae36a95be6 297 float c_zs, w_fs, c_fs, w_t;
mcm 1:16ae36a95be6 298 float c = 0;
mcm 1:16ae36a95be6 299 float myFactor = 1.0;
mcm 1:16ae36a95be6 300
mcm 1:16ae36a95be6 301 Vector_mass_t w;
mcm 1:16ae36a95be6 302
mcm 1:16ae36a95be6 303
mcm 1:16ae36a95be6 304 // Adapt the scale ( kg as reference )
mcm 1:16ae36a95be6 305 switch ( myScaleCalibratedMass ) {
mcm 1:16ae36a95be6 306 default:
mcm 1:16ae36a95be6 307 case ADS1231_SCALE_kg:
mcm 1:16ae36a95be6 308 // myFactor = 1.0;
mcm 1:16ae36a95be6 309 break;
mcm 1:16ae36a95be6 310
mcm 1:16ae36a95be6 311 case ADS1231_SCALE_g:
mcm 1:16ae36a95be6 312 myFactor /= 1000.0;
mcm 1:16ae36a95be6 313 break;
mcm 1:16ae36a95be6 314
mcm 1:16ae36a95be6 315 case ADS1231_SCALE_mg:
mcm 1:16ae36a95be6 316 myFactor /= 1000000.0;
mcm 1:16ae36a95be6 317 break;
mcm 1:16ae36a95be6 318
mcm 1:16ae36a95be6 319 case ADS1231_SCALE_ug:
mcm 1:16ae36a95be6 320 myFactor /= 1000000000.0;
mcm 1:16ae36a95be6 321 break;
mcm 1:16ae36a95be6 322
mcm 1:16ae36a95be6 323 }
mcm 1:16ae36a95be6 324
mcm 1:16ae36a95be6 325
mcm 1:16ae36a95be6 326 // Calculate the Calibration Constant ( m )
mcm 1:16ae36a95be6 327 w_fs = ( myCalibratedMass / myFactor ); // User-specified calibration mass
mcm 1:16ae36a95be6 328 c_zs = myNewRawData->myRawValue_WithoutCalibratedMass; // ADC measurement taken with no load
mcm 1:16ae36a95be6 329 c_fs = myNewRawData->myRawValue_WithCalibratedMass; // ADC code taken with the calibration mass applied
mcm 1:16ae36a95be6 330
mcm 1:16ae36a95be6 331 m = ( float )( w_fs / ( ( c_fs ) - c_zs ) ); // The Calibration Constant
mcm 1:16ae36a95be6 332
mcm 1:16ae36a95be6 333
mcm 1:16ae36a95be6 334 // Calculate the zero-scale mass ( w_zs )
mcm 1:16ae36a95be6 335 w_zs = - ( m * c_zs );
mcm 1:16ae36a95be6 336
mcm 1:16ae36a95be6 337
mcm 1:16ae36a95be6 338 // Calculate the mass ( w )
mcm 1:16ae36a95be6 339 w_t = myNewRawData->myRawValue_TareWeight; // ADC code taken without any mass after the system is calibrated;
mcm 1:16ae36a95be6 340 c = myNewRawData->myRawValue; // The ADC code
mcm 1:16ae36a95be6 341
mcm 1:16ae36a95be6 342 w.myMass = ( m * c ) + w_zs - w_t; // The mass according to myScaleCalibratedMass
mcm 1:16ae36a95be6 343
mcm 1:16ae36a95be6 344
mcm 1:16ae36a95be6 345 // Update Internal Parameters
mcm 1:16ae36a95be6 346 _ADS1231_USER_CALIBATED_MASS = myCalibratedMass;
mcm 1:16ae36a95be6 347 _ADS1231_SCALE = myScaleCalibratedMass;
mcm 1:16ae36a95be6 348
mcm 1:16ae36a95be6 349
mcm 1:16ae36a95be6 350
mcm 1:16ae36a95be6 351 return w;
mcm 1:16ae36a95be6 352 }
mcm 1:16ae36a95be6 353
mcm 1:16ae36a95be6 354
mcm 1:16ae36a95be6 355
mcm 1:16ae36a95be6 356 /**
mcm 1:16ae36a95be6 357 * @brief ADS1231_SetAutoTare ( float ,ADS1231_scale_t ,Vector_count_t* ,float )
mcm 1:16ae36a95be6 358 *
mcm 1:16ae36a95be6 359 * @details It reads data without any mass on the load cell after the system is calibrated to calculate the tare weight.
mcm 1:16ae36a95be6 360 *
mcm 1:16ae36a95be6 361 * @param[in] myCalibratedMass: A known value for the calibrated mass when myRawValue_WithCalibratedMass was
mcm 1:16ae36a95be6 362 * calculated.
mcm 1:16ae36a95be6 363 * @param[in] myScaleCalibratedMass: The range of the calibrated mass ( kg, g, mg or ug ).
mcm 1:16ae36a95be6 364 * @param[in] myTime: How long the auto-set lasts.
mcm 1:16ae36a95be6 365 *
mcm 1:16ae36a95be6 366 * @param[out] myNewRawData: myRawValue_TareWeight ( ADC code taken without any mass ).
mcm 1:16ae36a95be6 367 *
mcm 1:16ae36a95be6 368 *
mcm 1:16ae36a95be6 369 * @return Status of ADS1231_SetAutoTare.
mcm 1:16ae36a95be6 370 *
mcm 1:16ae36a95be6 371 *
mcm 1:16ae36a95be6 372 * @author Manuel Caballero
mcm 1:16ae36a95be6 373 * @date 18/September/2017
mcm 1:16ae36a95be6 374 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 375 * @pre NaN.
mcm 1:16ae36a95be6 376 * @warning NaN.
mcm 1:16ae36a95be6 377 */
mcm 1:16ae36a95be6 378 ADS1231::ADS1231_status_t ADS1231::ADS1231_SetAutoTare ( float myCalibratedMass, ADS1231_scale_t myScaleCalibratedMass, Vector_count_t* myNewRawData, float myTime )
mcm 1:16ae36a95be6 379 {
mcm 1:16ae36a95be6 380 ADS1231_status_t aux;
mcm 1:16ae36a95be6 381 Vector_mass_t myCalculatedMass;
mcm 1:16ae36a95be6 382 float myAuxData = 0;
mcm 1:16ae36a95be6 383 uint32_t i = 0;
mcm 1:16ae36a95be6 384
mcm 1:16ae36a95be6 385
mcm 1:16ae36a95be6 386 // Perform a new bunch of readings every 1 second
mcm 1:16ae36a95be6 387 for ( i = 0; i < myTime; i++ ) {
mcm 1:16ae36a95be6 388 aux = ADS1231_ReadRawData ( myNewRawData, 10 );
mcm 1:16ae36a95be6 389 myAuxData += myNewRawData->myRawValue;
mcm 1:16ae36a95be6 390 wait(1);
mcm 1:16ae36a95be6 391 }
mcm 1:16ae36a95be6 392
mcm 1:16ae36a95be6 393 myNewRawData->myRawValue = ( float )( myAuxData / myTime );
mcm 1:16ae36a95be6 394
mcm 1:16ae36a95be6 395 // Turn it into mass
mcm 1:16ae36a95be6 396 myCalculatedMass = ADS1231_CalculateMass ( myNewRawData, myCalibratedMass, myScaleCalibratedMass );
mcm 1:16ae36a95be6 397
mcm 1:16ae36a95be6 398 // Update the value without any mass
mcm 1:16ae36a95be6 399 myNewRawData->myRawValue_TareWeight = myCalculatedMass.myMass;
mcm 1:16ae36a95be6 400
mcm 1:16ae36a95be6 401
mcm 1:16ae36a95be6 402 // Update Internal Parameters
mcm 1:16ae36a95be6 403 _ADS1231_USER_CALIBATED_MASS = myCalibratedMass;
mcm 1:16ae36a95be6 404 _ADS1231_SCALE = myScaleCalibratedMass;
mcm 1:16ae36a95be6 405
mcm 1:16ae36a95be6 406
mcm 1:16ae36a95be6 407
mcm 1:16ae36a95be6 408 if ( aux == ADS1231_SUCCESS )
mcm 1:16ae36a95be6 409 return ADS1231_SUCCESS;
mcm 1:16ae36a95be6 410 else
mcm 1:16ae36a95be6 411 return ADS1231_FAILURE;
mcm 1:16ae36a95be6 412 }
mcm 1:16ae36a95be6 413
mcm 1:16ae36a95be6 414
mcm 1:16ae36a95be6 415
mcm 1:16ae36a95be6 416 /**
mcm 1:16ae36a95be6 417 * @brief ADS1231_SetManualTare ( float myTareWeight )
mcm 1:16ae36a95be6 418 *
mcm 1:16ae36a95be6 419 * @details It sets a tare weight manually.
mcm 1:16ae36a95be6 420 *
mcm 1:16ae36a95be6 421 * @param[in] myTareWeight: Tare weight.
mcm 1:16ae36a95be6 422 *
mcm 1:16ae36a95be6 423 * @param[out] NaN.
mcm 1:16ae36a95be6 424 *
mcm 1:16ae36a95be6 425 *
mcm 1:16ae36a95be6 426 * @return myRawValue_TareWeight.
mcm 1:16ae36a95be6 427 *
mcm 1:16ae36a95be6 428 *
mcm 1:16ae36a95be6 429 * @author Manuel Caballero
mcm 1:16ae36a95be6 430 * @date 12/September/2017
mcm 1:16ae36a95be6 431 * @version 12/September/2017 The ORIGIN
mcm 1:16ae36a95be6 432 * @pre NaN.
mcm 1:16ae36a95be6 433 * @warning NaN.
mcm 1:16ae36a95be6 434 */
mcm 1:16ae36a95be6 435 ADS1231::Vector_count_t ADS1231::ADS1231_SetManualTare ( float myTareWeight )
mcm 1:16ae36a95be6 436 {
mcm 1:16ae36a95be6 437 Vector_count_t myNewTareWeight;
mcm 1:16ae36a95be6 438
mcm 1:16ae36a95be6 439 // Update the value defined by the user
mcm 1:16ae36a95be6 440 myNewTareWeight.myRawValue_TareWeight = myTareWeight;
mcm 1:16ae36a95be6 441
mcm 1:16ae36a95be6 442
mcm 1:16ae36a95be6 443
mcm 1:16ae36a95be6 444 return myNewTareWeight;
mcm 1:16ae36a95be6 445 }
mcm 1:16ae36a95be6 446
mcm 1:16ae36a95be6 447
mcm 1:16ae36a95be6 448
mcm 1:16ae36a95be6 449 /**
mcm 1:16ae36a95be6 450 * @brief ADS1231_CalculateVoltage ( Vector_count_t* ,float )
mcm 1:16ae36a95be6 451 *
mcm 1:16ae36a95be6 452 * @details It calculates the mass.
mcm 1:16ae36a95be6 453 *
mcm 1:16ae36a95be6 454 * @param[in] myNewRawData: myRawValue ( the current data taken by the system ).
mcm 1:16ae36a95be6 455 * @param[in] myVoltageReference: The voltage at the converter reference input.
mcm 1:16ae36a95be6 456 *
mcm 1:16ae36a95be6 457 * @param[out] NaN.
mcm 1:16ae36a95be6 458 *
mcm 1:16ae36a95be6 459 *
mcm 1:16ae36a95be6 460 * @return The calculated voltage.
mcm 1:16ae36a95be6 461 *
mcm 1:16ae36a95be6 462 *
mcm 1:16ae36a95be6 463 * @author Manuel Caballero
mcm 1:16ae36a95be6 464 * @date 18/September/2017
mcm 1:16ae36a95be6 465 * @version 18/September/2017 The ORIGIN
mcm 1:16ae36a95be6 466 * @pre NaN.
mcm 1:16ae36a95be6 467 * @warning NaN.
mcm 1:16ae36a95be6 468 */
mcm 1:16ae36a95be6 469 ADS1231::Vector_voltage_t ADS1231::ADS1231_CalculateVoltage ( Vector_count_t* myNewRawData, float myVoltageReference )
mcm 1:16ae36a95be6 470 {
mcm 1:16ae36a95be6 471 // Terminology by Texas Instruments: sbau175a.pdf, p12 3.2 Measurement Modes Raw
mcm 1:16ae36a95be6 472 float x, B, A;
mcm 1:16ae36a95be6 473
mcm 1:16ae36a95be6 474 Vector_voltage_t v;
mcm 1:16ae36a95be6 475
mcm 1:16ae36a95be6 476
mcm 1:16ae36a95be6 477 x = myNewRawData->myRawValue;
mcm 1:16ae36a95be6 478 B = ( 16777216.0 - 1.0 );
mcm 1:16ae36a95be6 479 A = 128.0;
mcm 1:16ae36a95be6 480
mcm 1:16ae36a95be6 481
mcm 1:16ae36a95be6 482
mcm 1:16ae36a95be6 483 // Calculate the voltage ( v )
mcm 1:16ae36a95be6 484 v.myVoltage = ( float )( ( x / B ) * ( myVoltageReference / A ) ); // The voltage
mcm 1:16ae36a95be6 485
mcm 1:16ae36a95be6 486
mcm 1:16ae36a95be6 487
mcm 1:16ae36a95be6 488
mcm 1:16ae36a95be6 489 return v;
mcm 1:16ae36a95be6 490 }