Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r4d7d40a27130dc813d653f044cbb856b1b7d8481 -r4af713cb53b909ba87893dc814d39af89fb8e8d2 --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 4d7d40a27130dc813d653f044cbb856b1b7d8481) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 4af713cb53b909ba87893dc814d39af89fb8e8d2) @@ -38,9 +38,9 @@ static OVERRIDE_U32_T loadCellDataPublishInterval = { LOAD_CELL_REPORT_PERIOD, LOAD_CELL_REPORT_PERIOD, 0, 0 }; ///< Broadcast load cell data publish interval. -static U32 measuredLoadCellReadingsRaw[ NUM_OF_LOAD_CELLS ]; ///< Latest measured raw load cell readings. static U32 measuredLoadCellReadingsSum[ NUM_OF_LOAD_CELLS ]; ///< Raw load cell sums for averaging. static OVERRIDE_F32_T filteredLoadCellWeights[ NUM_OF_LOAD_CELLS ]; ///< Latest filtered load cell weights. +static F32 autoCalOffset[ NUM_OF_LOAD_CELLS ]; ///< Auto calibration offset for load cell. static U32 loadCellFilterTimerCount = 0; ///< Load cell filtering timer count. static U32 loadCellDataPublicationTimerCounter = 0; ///< Load cell data publication timer counter to CAN bus. @@ -67,7 +67,8 @@ filteredLoadCellWeights[ i ].override = OVERRIDE_RESET; measuredLoadCellReadingsSum[ i ] = 0; - measuredLoadCellReadingsRaw[ i ] = 0; + + autoCalOffset[ i ] = 0.0; } } @@ -81,16 +82,11 @@ *************************************************************************/ void execLoadCell( void ) { - // get latest raw load cell readings - measuredLoadCellReadingsRaw[ LOAD_CELL_A1 ] = getFPGALoadCellA1(); - measuredLoadCellReadingsRaw[ LOAD_CELL_A2 ] = getFPGALoadCellA2(); - measuredLoadCellReadingsRaw[ LOAD_CELL_B1 ] = getFPGALoadCellB1(); - measuredLoadCellReadingsRaw[ LOAD_CELL_B2 ] = getFPGALoadCellB2(); // update sums for load cell average calculations - measuredLoadCellReadingsSum[ LOAD_CELL_A1 ] += measuredLoadCellReadingsRaw[ LOAD_CELL_A1 ]; - measuredLoadCellReadingsSum[ LOAD_CELL_A2 ] += measuredLoadCellReadingsRaw[ LOAD_CELL_A2 ]; - measuredLoadCellReadingsSum[ LOAD_CELL_B1 ] += measuredLoadCellReadingsRaw[ LOAD_CELL_B1 ]; - measuredLoadCellReadingsSum[ LOAD_CELL_B2 ] += measuredLoadCellReadingsRaw[ LOAD_CELL_B2 ]; + measuredLoadCellReadingsSum[ LOAD_CELL_A1 ] += getFPGALoadCellA1(); + measuredLoadCellReadingsSum[ LOAD_CELL_A2 ] += getFPGALoadCellA2(); + measuredLoadCellReadingsSum[ LOAD_CELL_B1 ] += getFPGALoadCellB1(); + measuredLoadCellReadingsSum[ LOAD_CELL_B2 ] += getFPGALoadCellB2(); // filter every 100ms if ( ++loadCellFilterTimerCount >= LOAD_CELL_SAMPLES_TO_AVERAGE ) @@ -99,13 +95,13 @@ // calculate load cell average weights filteredLoadCellWeights[ LOAD_CELL_A1 ].data = (F32)measuredLoadCellReadingsSum[ LOAD_CELL_A1 ] * - LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; + LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET - autoCalOffset[ LOAD_CELL_A1 ]; filteredLoadCellWeights[ LOAD_CELL_A2 ].data = (F32)measuredLoadCellReadingsSum[ LOAD_CELL_A2 ] * - LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; + LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET - autoCalOffset[ LOAD_CELL_A2 ]; filteredLoadCellWeights[ LOAD_CELL_B1 ].data = (F32)measuredLoadCellReadingsSum[ LOAD_CELL_B1 ] * - LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; + LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET - autoCalOffset[ LOAD_CELL_B1 ]; filteredLoadCellWeights[ LOAD_CELL_B2 ].data = (F32)measuredLoadCellReadingsSum[ LOAD_CELL_B2 ] * - LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; + LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET - autoCalOffset[ LOAD_CELL_B2 ]; // reset sums for next averaging measuredLoadCellReadingsSum[ LOAD_CELL_A1 ] = 0; @@ -127,6 +123,20 @@ /*********************************************************************//** * @brief + * The setLoadCellAutoCal function sets the load cell auto calibration offset + * for a given load cell ID. + * @details Inputs: none + * @details Outputs: autoCalibrationOffset[] + * @param loadCellID ID of load cell to set calibration offset for + * @param calOffset auto calibration offset value + *************************************************************************/ +void setLoadCellAutoCal( LOAD_CELL_ID_T loadCellID, F32 calOffset ) +{ + autoCalOffset[ loadCellID ] = calOffset; +} + +/*********************************************************************//** + * @brief * The getLoadCellFilteredWeight function gets the measured filtered load cell * weight for a given load cell ID. * @details Inputs: filteredLoadCellWeights[]