Sim Youngwoo / HX711

Dependents:   torque_calibration_ywsim

Committer:
mcm
Date:
Tue Sep 12 14:38:13 2017 +0000
Revision:
2:1af13a8a8275
Parent:
1:06652a775538
Child:
3:d246aa415f3a
Most of the function are defined and tested. The voltage function is left

Who changed what in which revision?

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