Library for HX711 device. 24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales

Dependents:   EXPO_ANDA EXPO_ANDA_Copilotoco

Committer:
mcm
Date:
Wed Sep 13 09:11:22 2017 +0000
Revision:
4:d7a5cd03ed09
Parent:
3:d246aa415f3a
Adapt the scale was fixed, myFactor now works as expected, some comments were improved.

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 3:d246aa415f3a 244 if ( myChannel_Gain != _HX711_CHANNEL_GAIN )
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 4:d7a5cd03ed09 426 * @version 13/September/2017 Adapt the scale was fixed, myFactor now works as expected.
mcm 4:d7a5cd03ed09 427 * 12/September/2017 The ORIGIN
mcm 2:1af13a8a8275 428 * @pre NaN.
mcm 2:1af13a8a8275 429 * @warning NaN.
mcm 2:1af13a8a8275 430 */
mcm 2:1af13a8a8275 431 HX711::Vector_mass_t HX711::HX711_CalculateMass ( Vector_count_t* myNewRawData, float myCalibratedMass, HX711_scale_t myScaleCalibratedMass )
mcm 2:1af13a8a8275 432 {
mcm 2:1af13a8a8275 433 // Terminology by Texas Instruments: sbau175a.pdf, p8 2.1.1 Calculation of Mass
mcm 2:1af13a8a8275 434 float m, w_zs;
mcm 2:1af13a8a8275 435 float c_zs, w_fs, c_fs, w_t;
mcm 2:1af13a8a8275 436 float c = 0;
mcm 4:d7a5cd03ed09 437 float myFactor = 1.0;
mcm 2:1af13a8a8275 438
mcm 2:1af13a8a8275 439 Vector_mass_t w;
mcm 2:1af13a8a8275 440
mcm 2:1af13a8a8275 441
mcm 2:1af13a8a8275 442 // Adapt the scale ( kg as reference )
mcm 2:1af13a8a8275 443 switch ( myScaleCalibratedMass ) {
mcm 2:1af13a8a8275 444 default:
mcm 2:1af13a8a8275 445 case HX711_SCALE_kg:
mcm 4:d7a5cd03ed09 446 // myFactor = 1.0;
mcm 2:1af13a8a8275 447 break;
mcm 2:1af13a8a8275 448
mcm 2:1af13a8a8275 449 case HX711_SCALE_g:
mcm 2:1af13a8a8275 450 myFactor /= 1000.0;
mcm 2:1af13a8a8275 451 break;
mcm 2:1af13a8a8275 452
mcm 2:1af13a8a8275 453 case HX711_SCALE_mg:
mcm 2:1af13a8a8275 454 myFactor /= 1000000.0;
mcm 2:1af13a8a8275 455 break;
mcm 2:1af13a8a8275 456
mcm 2:1af13a8a8275 457 case HX711_SCALE_ug:
mcm 2:1af13a8a8275 458 myFactor /= 1000000000.0;
mcm 2:1af13a8a8275 459 break;
mcm 2:1af13a8a8275 460
mcm 2:1af13a8a8275 461 }
mcm 2:1af13a8a8275 462
mcm 2:1af13a8a8275 463
mcm 2:1af13a8a8275 464 // Calculate the Calibration Constant ( m )
mcm 2:1af13a8a8275 465 w_fs = ( myCalibratedMass / myFactor ); // User-specified calibration mass
mcm 2:1af13a8a8275 466 c_zs = myNewRawData->myRawValue_WithoutCalibratedMass; // ADC measurement taken with no load
mcm 2:1af13a8a8275 467 c_fs = myNewRawData->myRawValue_WithCalibratedMass; // ADC code taken with the calibration mass applied
mcm 2:1af13a8a8275 468
mcm 2:1af13a8a8275 469 m = ( float )( w_fs / ( ( c_fs ) - c_zs ) ); // The Calibration Constant
mcm 2:1af13a8a8275 470
mcm 2:1af13a8a8275 471
mcm 2:1af13a8a8275 472 // Calculate the zero-scale mass ( w_zs )
mcm 2:1af13a8a8275 473 w_zs = - ( m * c_zs );
mcm 2:1af13a8a8275 474
mcm 2:1af13a8a8275 475
mcm 2:1af13a8a8275 476 // Calculate the mass ( w )
mcm 2:1af13a8a8275 477 w_t = myNewRawData->myRawValue_TareWeight; // ADC code taken without any mass after the system is calibrated;
mcm 2:1af13a8a8275 478 c = myNewRawData->myRawValue; // The ADC code
mcm 2:1af13a8a8275 479
mcm 2:1af13a8a8275 480 w.myMass = ( m * c ) + w_zs - w_t; // The mass according to myScaleCalibratedMass
mcm 2:1af13a8a8275 481
mcm 2:1af13a8a8275 482
mcm 2:1af13a8a8275 483 // Update Internal Parameters
mcm 2:1af13a8a8275 484 _HX711_USER_CALIBATED_MASS = myCalibratedMass;
mcm 2:1af13a8a8275 485 _HX711_SCALE = myScaleCalibratedMass;
mcm 2:1af13a8a8275 486
mcm 2:1af13a8a8275 487
mcm 2:1af13a8a8275 488
mcm 2:1af13a8a8275 489 return w;
mcm 2:1af13a8a8275 490 }
mcm 2:1af13a8a8275 491
mcm 2:1af13a8a8275 492
mcm 2:1af13a8a8275 493
mcm 2:1af13a8a8275 494 /**
mcm 3:d246aa415f3a 495 * @brief HX711_SetAutoTare ( HX711_channel_gain_t ,float ,HX711_scale_t ,Vector_count_t* ,float )
mcm 2:1af13a8a8275 496 *
mcm 2:1af13a8a8275 497 * @details It reads data without any mass on the load cell after the system is calibrated to calculate the tare weight.
mcm 2:1af13a8a8275 498 *
mcm 3:d246aa415f3a 499 * @param[in] myChannel_Gain: Gain/Channel to perform the new measurement.
mcm 3:d246aa415f3a 500 * @param[in] myCalibratedMass: A known value for the calibrated mass when myRawValue_WithCalibratedMass was
mcm 3:d246aa415f3a 501 * calculated.
mcm 3:d246aa415f3a 502 * @param[in] myScaleCalibratedMass: The range of the calibrated mass ( kg, g, mg or ug ).
mcm 3:d246aa415f3a 503 * @param[in] myTime: How long the auto-set lasts.
mcm 2:1af13a8a8275 504 *
mcm 3:d246aa415f3a 505 * @param[out] myNewRawData: myRawValue_TareWeight ( ADC code taken without any mass ).
mcm 2:1af13a8a8275 506 *
mcm 2:1af13a8a8275 507 *
mcm 2:1af13a8a8275 508 * @return Status of HX711_SetAutoTare.
mcm 2:1af13a8a8275 509 *
mcm 2:1af13a8a8275 510 *
mcm 2:1af13a8a8275 511 * @author Manuel Caballero
mcm 2:1af13a8a8275 512 * @date 12/September/2017
mcm 2:1af13a8a8275 513 * @version 12/September/2017 The ORIGIN
mcm 2:1af13a8a8275 514 * @pre NaN.
mcm 2:1af13a8a8275 515 * @warning NaN.
mcm 2:1af13a8a8275 516 */
mcm 3:d246aa415f3a 517 HX711::HX711_status_t HX711::HX711_SetAutoTare ( HX711_channel_gain_t myChannel_Gain, float myCalibratedMass, HX711_scale_t myScaleCalibratedMass, Vector_count_t* myNewRawData, float myTime )
mcm 2:1af13a8a8275 518 {
mcm 2:1af13a8a8275 519 HX711_status_t aux;
mcm 2:1af13a8a8275 520 Vector_mass_t myCalculatedMass;
mcm 2:1af13a8a8275 521 float myAuxData = 0;
mcm 2:1af13a8a8275 522 uint32_t i = 0;
mcm 2:1af13a8a8275 523
mcm 2:1af13a8a8275 524
mcm 2:1af13a8a8275 525 // Perform a new bunch of readings every 1 second
mcm 2:1af13a8a8275 526 for ( i = 0; i < myTime; i++ ) {
mcm 2:1af13a8a8275 527 aux = HX711_ReadRawData ( myChannel_Gain, myNewRawData, 10 );
mcm 2:1af13a8a8275 528 myAuxData += myNewRawData->myRawValue;
mcm 2:1af13a8a8275 529 wait(1);
mcm 2:1af13a8a8275 530 }
mcm 3:d246aa415f3a 531
mcm 2:1af13a8a8275 532 myNewRawData->myRawValue = ( float )( myAuxData / myTime );
mcm 3:d246aa415f3a 533
mcm 2:1af13a8a8275 534 // Turn it into mass
mcm 3:d246aa415f3a 535 myCalculatedMass = HX711_CalculateMass ( myNewRawData, myCalibratedMass, myScaleCalibratedMass );
mcm 2:1af13a8a8275 536
mcm 2:1af13a8a8275 537 // Update the value without any mass
mcm 2:1af13a8a8275 538 myNewRawData->myRawValue_TareWeight = myCalculatedMass.myMass;
mcm 3:d246aa415f3a 539
mcm 3:d246aa415f3a 540
mcm 3:d246aa415f3a 541 // Update Internal Parameters
mcm 3:d246aa415f3a 542 _HX711_USER_CALIBATED_MASS = myCalibratedMass;
mcm 3:d246aa415f3a 543 _HX711_SCALE = myScaleCalibratedMass;
mcm 2:1af13a8a8275 544
mcm 2:1af13a8a8275 545
mcm 2:1af13a8a8275 546
mcm 2:1af13a8a8275 547 if ( aux == HX711_SUCCESS )
mcm 2:1af13a8a8275 548 return HX711_SUCCESS;
mcm 2:1af13a8a8275 549 else
mcm 2:1af13a8a8275 550 return HX711_FAILURE;
mcm 2:1af13a8a8275 551 }
mcm 2:1af13a8a8275 552
mcm 2:1af13a8a8275 553
mcm 2:1af13a8a8275 554
mcm 3:d246aa415f3a 555 /**
mcm 3:d246aa415f3a 556 * @brief HX711_SetManualTare ( float myTareWeight )
mcm 3:d246aa415f3a 557 *
mcm 3:d246aa415f3a 558 * @details It sets a tare weight manually.
mcm 3:d246aa415f3a 559 *
mcm 3:d246aa415f3a 560 * @param[in] myTareWeight: Tare weight.
mcm 3:d246aa415f3a 561 *
mcm 3:d246aa415f3a 562 * @param[out] NaN.
mcm 3:d246aa415f3a 563 *
mcm 3:d246aa415f3a 564 *
mcm 3:d246aa415f3a 565 * @return myRawValue_TareWeight.
mcm 3:d246aa415f3a 566 *
mcm 3:d246aa415f3a 567 *
mcm 3:d246aa415f3a 568 * @author Manuel Caballero
mcm 3:d246aa415f3a 569 * @date 12/September/2017
mcm 3:d246aa415f3a 570 * @version 12/September/2017 The ORIGIN
mcm 3:d246aa415f3a 571 * @pre NaN.
mcm 3:d246aa415f3a 572 * @warning NaN.
mcm 3:d246aa415f3a 573 */
mcm 3:d246aa415f3a 574 HX711::Vector_count_t HX711::HX711_SetManualTare ( float myTareWeight )
mcm 3:d246aa415f3a 575 {
mcm 3:d246aa415f3a 576 Vector_count_t myNewTareWeight;
mcm 2:1af13a8a8275 577
mcm 3:d246aa415f3a 578 // Update the value defined by the user
mcm 3:d246aa415f3a 579 myNewTareWeight.myRawValue_TareWeight = myTareWeight;
mcm 3:d246aa415f3a 580
mcm 3:d246aa415f3a 581
mcm 3:d246aa415f3a 582
mcm 3:d246aa415f3a 583 return myNewTareWeight;
mcm 3:d246aa415f3a 584 }
mcm 3:d246aa415f3a 585
mcm 3:d246aa415f3a 586
mcm 3:d246aa415f3a 587
mcm 3:d246aa415f3a 588 /**
mcm 3:d246aa415f3a 589 * @brief HX711_CalculateVoltage ( Vector_count_t* ,float )
mcm 3:d246aa415f3a 590 *
mcm 3:d246aa415f3a 591 * @details It calculates the mass.
mcm 3:d246aa415f3a 592 *
mcm 3:d246aa415f3a 593 * @param[in] myChannel_Gain: Gain/Channel of the measurement.
mcm 3:d246aa415f3a 594 * @param[in] myNewRawData: myRawValue ( the current data taken by the system ).
mcm 3:d246aa415f3a 595 * @param[in] myVoltageReference: The voltage at the converter reference input.
mcm 3:d246aa415f3a 596 *
mcm 3:d246aa415f3a 597 * @param[out] NaN.
mcm 3:d246aa415f3a 598 *
mcm 3:d246aa415f3a 599 *
mcm 3:d246aa415f3a 600 * @return The calculated voltage.
mcm 3:d246aa415f3a 601 *
mcm 3:d246aa415f3a 602 *
mcm 3:d246aa415f3a 603 * @author Manuel Caballero
mcm 3:d246aa415f3a 604 * @date 12/September/2017
mcm 3:d246aa415f3a 605 * @version 12/September/2017 The ORIGIN
mcm 3:d246aa415f3a 606 * @pre NaN.
mcm 3:d246aa415f3a 607 * @warning NaN.
mcm 3:d246aa415f3a 608 */
mcm 3:d246aa415f3a 609 HX711::Vector_voltage_t HX711::HX711_CalculateVoltage ( Vector_count_t* myNewRawData, float myVoltageReference )
mcm 3:d246aa415f3a 610 {
mcm 3:d246aa415f3a 611 // Terminology by Texas Instruments: sbau175a.pdf, p12 3.2 Measurement Modes Raw
mcm 3:d246aa415f3a 612 float x, B, A;
mcm 3:d246aa415f3a 613
mcm 3:d246aa415f3a 614 Vector_voltage_t v;
mcm 3:d246aa415f3a 615
mcm 3:d246aa415f3a 616
mcm 3:d246aa415f3a 617 x = myNewRawData->myRawValue;
mcm 3:d246aa415f3a 618 B = ( 16777216.0 - 1.0 );
mcm 3:d246aa415f3a 619
mcm 3:d246aa415f3a 620 // Adatp the gain
mcm 3:d246aa415f3a 621 switch ( _HX711_CHANNEL_GAIN ) {
mcm 3:d246aa415f3a 622 default:
mcm 3:d246aa415f3a 623 case CHANNEL_A_GAIN_128:
mcm 3:d246aa415f3a 624 A = 128.0;
mcm 3:d246aa415f3a 625 break;
mcm 3:d246aa415f3a 626
mcm 3:d246aa415f3a 627 case CHANNEL_B_GAIN_32:
mcm 3:d246aa415f3a 628 A = 32.0;
mcm 3:d246aa415f3a 629 break;
mcm 3:d246aa415f3a 630
mcm 3:d246aa415f3a 631 case CHANNEL_A_GAIN_64:
mcm 3:d246aa415f3a 632 A = 64.0;
mcm 3:d246aa415f3a 633 break;
mcm 3:d246aa415f3a 634 }
mcm 3:d246aa415f3a 635
mcm 3:d246aa415f3a 636
mcm 3:d246aa415f3a 637 // Calculate the voltage ( v )
mcm 3:d246aa415f3a 638 v.myVoltage = ( float )( ( x / B ) * ( myVoltageReference / A ) ); // The voltage
mcm 3:d246aa415f3a 639
mcm 3:d246aa415f3a 640
mcm 3:d246aa415f3a 641
mcm 3:d246aa415f3a 642
mcm 3:d246aa415f3a 643 return v;
mcm 3:d246aa415f3a 644 }