Sim Youngwoo / HX711

Dependents:   torque_calibration_ywsim

Committer:
ywsim
Date:
Fri Feb 12 22:50:27 2021 +0000
Revision:
5:4f34d26cc9e7
Parent:
4:d7a5cd03ed09
aa

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