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; Index: firmware/App/Controllers/LoadCell.h =================================================================== diff -u -rb5e25e2bf3b87f12f9d1beedf460b5884c8816e9 -r45dcb7966d1996f533eb6ca321637db16535182e --- firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision b5e25e2bf3b87f12f9d1beedf460b5884c8816e9) +++ firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision 45dcb7966d1996f533eb6ca321637db16535182e) @@ -47,7 +47,7 @@ F32 getLoadCellFilteredWeight( U32 loadCellID ); -BOOL testSetLoadCellOverride( F32 value, U32 loadCellID ); +BOOL testSetLoadCellOverride( U32 loadCellID, F32 value ); BOOL testResetLoadCellOverride( U32 loadCellID ); BOOL testSetLoadCellDataPublishIntervalOverride( U32 value ); BOOL testResetLoadCellDataPublishIntervalOverride( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rfdaea534d10067404de9bd14b91b2a81d0a7e5ef -r45dcb7966d1996f533eb6ca321637db16535182e --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision fdaea534d10067404de9bd14b91b2a81d0a7e5ef) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 45dcb7966d1996f533eb6ca321637db16535182e) @@ -950,7 +950,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_ARRAY_OVERRIDE_HANDLER_FUNC_F32( BOOL, handleTestLoadCellOverrideRequest, testSetLoadCellOverride, testResetLoadCellOverride ) +DATA_ARRAY_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestLoadCellOverrideRequest, testSetLoadCellOverride, testResetLoadCellOverride ) /************************************************************************* * @brief Index: firmware/source/sys_main.c =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -r45dcb7966d1996f533eb6ca321637db16535182e --- firmware/source/sys_main.c (.../sys_main.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 45dcb7966d1996f533eb6ca321637db16535182e) @@ -68,6 +68,7 @@ #include "FPGA.h" #include "Heaters.h" #include "InternalADC.h" +#include "LoadCell.h" #include "MsgQueues.h" #include "OperationModes.h" #include "Pressures.h" @@ -165,6 +166,7 @@ initFPGA(); initInternalADC(); initPressures(); + initLoadCell(); initHeaters(); initTemperatureSensors(); initROPump();