Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r228bdc53e9e88533429cd514d1d509a6fcd361d0 -r45dcb7966d1996f533eb6ca321637db16535182e --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 228bdc53e9e88533429cd514d1d509a6fcd361d0) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 45dcb7966d1996f533eb6ca321637db16535182e) @@ -39,6 +39,7 @@ 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 U32 loadCellFilterTimerCount = 0; ///< used to schedule load cell filtering. static U32 loadCellDataPublicationTimerCounter = 0; ///< used to schedule load cell data publication to CAN bus. // ********** private function prototypes ********** @@ -91,28 +92,37 @@ measuredLoadCellReadingsSum[ LOAD_CELL_B1 ] += measuredLoadCellReadingsRaw[ LOAD_CELL_B1 ]; measuredLoadCellReadingsSum[ LOAD_CELL_B2 ] += measuredLoadCellReadingsRaw[ LOAD_CELL_B2 ]; - // broadcast load cell data if we are at scheduled interval. - if ( ++loadCellDataPublicationTimerCounter >= getLoadCellDataPublishInterval() ) // TODO - decouple averaging and conversion so that interval can be overridden + // filter every 100ms + if ( ++loadCellFilterTimerCount >= LOAD_CELL_SAMPLES_TO_AVERAGE ) { - loadCellDataPublicationTimerCounter = 0; + loadCellFilterTimerCount = 0; + // calculate load cell average weights filteredLoadCellWeights[ LOAD_CELL_A1 ].data = (F32)(measuredLoadCellReadingsSum[ LOAD_CELL_A1 ]) * - LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; // division for averaging folded into ADC2GRAM + LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; filteredLoadCellWeights[ LOAD_CELL_A2 ].data = (F32)(measuredLoadCellReadingsSum[ LOAD_CELL_A2 ]) * LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; filteredLoadCellWeights[ LOAD_CELL_B1 ].data = (F32)(measuredLoadCellReadingsSum[ LOAD_CELL_B1 ]) * LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; filteredLoadCellWeights[ LOAD_CELL_B2 ].data = (F32)(measuredLoadCellReadingsSum[ LOAD_CELL_B2 ]) * LOAD_CELL_AVERAGE_MULTIPLIER * ADC2GRAM + LOAD_CELL_ZERO_OFFSET; - // broadcast load cell data - broadcastLoadCellData( getLoadCellFilteredWeight( LOAD_CELL_A1 ), getLoadCellFilteredWeight( LOAD_CELL_A2 ), - getLoadCellFilteredWeight( LOAD_CELL_B1 ), getLoadCellFilteredWeight( LOAD_CELL_B2 ) ); + // reset sums for next averaging measuredLoadCellReadingsSum[ LOAD_CELL_A1 ] = 0; measuredLoadCellReadingsSum[ LOAD_CELL_A2 ] = 0; measuredLoadCellReadingsSum[ LOAD_CELL_B1 ] = 0; measuredLoadCellReadingsSum[ LOAD_CELL_B2 ] = 0; } + + // broadcast load cell data if we are at scheduled interval. + if ( ++loadCellDataPublicationTimerCounter >= getLoadCellDataPublishInterval() ) + { + loadCellDataPublicationTimerCounter = 0; + + // broadcast load cell data + broadcastLoadCellData( getLoadCellFilteredWeight( LOAD_CELL_A1 ), getLoadCellFilteredWeight( LOAD_CELL_A2 ), + getLoadCellFilteredWeight( LOAD_CELL_B1 ), getLoadCellFilteredWeight( LOAD_CELL_B2 ) ); + } } /*********************************************************************//** @@ -182,11 +192,11 @@ * @details * Inputs : none * Outputs : filteredLoadCellWeights[] - * @param value : override filtered load cell weight * @param loadCellID : ID of the load cell to override. + * @param value : override filtered load cell weight * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetLoadCellOverride( F32 value, U32 loadCellID ) +BOOL testSetLoadCellOverride( U32 loadCellID, F32 value ) { BOOL result = FALSE;