Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r70d33c50c8c3fd987f39eaa1f3b294860d569830 -r2bdd010a62ea113058640fc1e9c763dcf885c93c --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 70d33c50c8c3fd987f39eaa1f3b294860d569830) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 2bdd010a62ea113058640fc1e9c763dcf885c93c) @@ -937,25 +937,33 @@ if ( ++bpMotorSpeedCalcTimerCtr >= BP_SPEED_CALC_INTERVAL ) { U16 bpMotorHallSensorCount = getFPGABloodPumpHallSensorCount(); + U16 last = bpLastMotorHallSensorCounts[ bpMotorSpeedCalcIdx ]; U32 nextIdx = INC_WRAP( bpMotorSpeedCalcIdx, 0, BP_SPEED_CALC_BUFFER_LEN - 1 ); U16 incDelta = ( bpMotorHallSensorCount >= bpLastMotorHallSensorCounts[ nextIdx ] ? \ bpMotorHallSensorCount - bpLastMotorHallSensorCounts[ nextIdx ] : \ ( HEX_64_K - bpLastMotorHallSensorCounts[ nextIdx ] ) + bpMotorHallSensorCount ); U16 decDelta = HEX_64_K - incDelta; - U16 delta; - + U16 spdDelta; + U16 delta; + + // Keep a running 32-bit edge count used for safety check on volume in some functions + bloodPumpMotorEdgeCount += delta; + // Determine blood pump speed/direction from delta hall sensor count since last interval if ( incDelta < decDelta ) { - delta = incDelta; - bloodPumpSpeedRPM.data = ( (F32)delta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN; + spdDelta = incDelta; + bloodPumpSpeedRPM.data = ( (F32)spdDelta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN; + delta = ( bpMotorHallSensorCount >= last ? bpMotorHallSensorCount - last : ( HEX_64_K - last ) + bpMotorHallSensorCount ); + bloodPumpMotorEdgeCount += delta; } else { - delta = decDelta; - bloodPumpSpeedRPM.data = ( (F32)delta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN * -1.0; + spdDelta = decDelta; + bloodPumpSpeedRPM.data = ( (F32)spdDelta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN * -1.0; + delta = ( bpMotorHallSensorCount <= last ? last - bpMotorHallSensorCount : ( HEX_64_K - bpMotorHallSensorCount ) + last ); + bloodPumpMotorEdgeCount -= (S32)delta; } - bloodPumpMotorEdgeCount += delta; // Update last count for next time bpLastMotorHallSensorCounts[ nextIdx ] = bpMotorHallSensorCount;