Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r64b37cc2955d04bbc77ea41940b1b1b30c06651b -r45fff2549ecea601f9b603f59ade225086d36e69 --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 64b37cc2955d04bbc77ea41940b1b1b30c06651b) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 45fff2549ecea601f9b603f59ade225086d36e69) @@ -29,10 +29,12 @@ #define LOAD_CELL_REPORT_PERIOD (100 / TASK_PRIORITY_INTERVAL) ///< Broadcast load cell values message every 100 ms. #define LOAD_CELL_SAMPLES_TO_AVERAGE (100 / TASK_PRIORITY_INTERVAL) ///< Averaging load cell data over the reporting interval. -#define LOAD_CELL_AVERAGE_MULTIPLIER (1.0 / (F32)LOAD_CELL_SAMPLES_TO_AVERAGE) ///< Optimization - multiplying is faster than dividing. -// TODO - gain and offset for load cells should be read from NV Data calibration record. -#define ADC2GRAM (0.0894 * 1.1338) ///< Conversion factor from ADC counts to grams. -#define LOAD_CELL_ZERO_OFFSET -1215.0 ///< Zero offset (in grams). TODO - right now, this is empty reservoir weight. +/// Optimization - multiplying is faster than dividing. +static const F32 LOAD_CELL_AVERAGE_MULTIPLIER = (1.0 / (F32)LOAD_CELL_SAMPLES_TO_AVERAGE); +/// Conversion factor from ADC counts to grams. +static const F32 ADC2GRAM = (0.0894 * 1.1338); +#define LOAD_CELL_ZERO_OFFSET -1500.0 ///< Zero offset (in grams). TODO - right now, this is empty reservoir weight. +#define LOAD_CELL_FILTER_ALPHA 0.05 ///< Alpha factor for the alpha filter used on load cell readings. #define SIZE_OF_SMALL_LOAD_CELL_AVG 10 ///< Small load cell moving average has 10 samples. #define SIZE_OF_LARGE_LOAD_CELL_AVG 40 ///< Large load cell moving average has 40 samples. @@ -64,6 +66,11 @@ static U32 smallReadingsIdx; ///< Index for next sample in load cell small rolling average sample array. static U32 largeReadingsIdx; ///< Index for next sample in load cell large rolling average sample array. +// TODO - test code +static F32 rawReadings[10]; + +// TODO - gain and offset for load cells should be read from NV Data calibration record. + // ********** private function prototypes ********** static U32 getLoadCellDataPublishInterval( void ); @@ -122,13 +129,21 @@ void execLoadCell( void ) { U32 ii; + F32 A1,B1,prevA1,prevB1; // update sums for load cell average calculations loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].measuredReadingSum += getFPGALoadCellA1(); loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].measuredReadingSum += getFPGALoadCellA2(); loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].measuredReadingSum += getFPGALoadCellB1(); loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].measuredReadingSum += getFPGALoadCellB2(); + // TODO - test code + A1 = (F32)getFPGALoadCellA1() * ADC2GRAM + LOAD_CELL_ZERO_OFFSET - loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].autoCalOffset; + B1 = (F32)getFPGALoadCellB1() * ADC2GRAM + LOAD_CELL_ZERO_OFFSET - loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].autoCalOffset; + rawReadings[loadCellDataPublicationTimerCounter] = A1; + prevA1 = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); + prevB1 = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); + // filter every 100ms if ( ++loadCellFilterTimerCount >= LOAD_CELL_SAMPLES_TO_AVERAGE ) { @@ -158,6 +173,10 @@ largeReadingsIdx = INC_WRAP( largeReadingsIdx, 0, SIZE_OF_LARGE_LOAD_CELL_AVG - 1 ); } + // TODO - test code + loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].filteredWeight.data = ( A1 * LOAD_CELL_FILTER_ALPHA ) + ( prevA1 * ( 1.0 - LOAD_CELL_FILTER_ALPHA ) ); + loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].filteredWeight.data = ( B1 * LOAD_CELL_FILTER_ALPHA ) + ( prevB1 * ( 1.0 - LOAD_CELL_FILTER_ALPHA ) ); + // broadcast load cell data if we are at scheduled interval. if ( ++loadCellDataPublicationTimerCounter >= getLoadCellDataPublishInterval() ) { @@ -166,6 +185,9 @@ // broadcast load cell data broadcastLoadCellData( getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ), getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_BACKUP ), getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ), getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_BACKUP ) ); + + // TODO - test code + broadcastLoadCellRawData( &rawReadings[0] ); } } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -ref85c4f5bd363adfd405faf3b91910363d8030f1 -r45fff2549ecea601f9b603f59ade225086d36e69 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ef85c4f5bd363adfd405faf3b91910363d8030f1) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 45fff2549ecea601f9b603f59ade225086d36e69) @@ -415,6 +415,25 @@ result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); return result; +} + +BOOL broadcastLoadCellRawData( F32 *rawData ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_LOAD_CELL_RAW_DATA_BROADCAST; + msg.hdr.payloadLen = sizeof( F32 ) * 10; + + memcpy( payloadPtr, rawData, sizeof( F32 ) * 10 ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; } /*********************************************************************//** Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r5fa15db8e36792f83650711ab29755912d229437 -r45fff2549ecea601f9b603f59ade225086d36e69 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 5fa15db8e36792f83650711ab29755912d229437) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 45fff2549ecea601f9b603f59ade225086d36e69) @@ -62,6 +62,7 @@ // MSG_ID_LOAD_CELL_READINGS BOOL broadcastLoadCellData( F32 loadCellA1, F32 loadCellA2, F32 loadCellB1, F32 loadCellB2 ); +BOOL broadcastLoadCellRawData( F32 *rawData ); // TODO - test code - remove later // MSG_ID_DG_VALVES_STATES BOOL broadcastValvesStates( U16 valvesStates );