Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r4a41a54d255afc5cef0599e2a832927ed2b0ee5d -r22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 4a41a54d255afc5cef0599e2a832927ed2b0ee5d) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc) @@ -341,12 +341,10 @@ { // set initial PWM duty cycle bloodPumpPWMDutyCyclePctSet = BP_PWM_ZERO_OFFSET + MAX_BLOOD_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); // allow blood pump to run in requested direction setBloodPumpDirection( bloodPumpDirection ); releaseBloodPumpStop(); - // start PWM for blood pump - etpwmStartTBCLK(); isBloodPumpOn = TRUE; result = BLOOD_PUMP_RAMPING_UP_STATE; } @@ -373,7 +371,7 @@ { // start ramp down to stop bloodPumpPWMDutyCyclePctSet -= MAX_BLOOD_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); result = BLOOD_PUMP_RAMPING_DOWN_STATE; } // have we reached end of ramp up? @@ -387,7 +385,7 @@ else { bloodPumpPWMDutyCyclePctSet += MAX_BLOOD_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } return result; @@ -424,7 +422,7 @@ else { bloodPumpPWMDutyCyclePctSet -= MAX_BLOOD_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } return result; @@ -452,7 +450,7 @@ { newPWM = runPIController( PI_CONTROLLER_ID_BLOOD_FLOW, tgtFlow, actFlow ); bloodPumpPWMDutyCyclePctSet = newPWM; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( bloodPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); bpControlTimerCounter = 0; } @@ -473,7 +471,6 @@ isBloodPumpOn = FALSE; bloodPumpPWMDutyCyclePctSet = 0.0; etpwmSetCmpA( etpwmREG1, 0 ); - etpwmStopTBCLK(); SET_BP_STOP(); } @@ -656,6 +653,7 @@ flowReadingsTotal = 0.0; flowReadingsIdx = 0; flowReadingsCount = 0; + flowReadingsTmrCtr = 0; bpControlTimerCounter = 0; } @@ -711,7 +709,7 @@ break; default: - // TODO - s/w fault? + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_BLOOD_FLOW_INVALID_FILTER_STATE, flowReadingsTmrCtr ) break; } } Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r4a41a54d255afc5cef0599e2a832927ed2b0ee5d -r22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 4a41a54d255afc5cef0599e2a832927ed2b0ee5d) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc) @@ -40,7 +40,7 @@ #define MAX_DIAL_IN_FLOW_RATE 500 // mL/min #define MIN_DIAL_IN_FLOW_RATE 100 // mL/min -#define MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE 0.02 // duty cycle TODO - fixed or parameterized or set in motor controller? +#define MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE 0.005 // duty cycle TODO - fixed or parameterized or set in motor controller? #define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.88 // controller will error if PWM duty cycle > 90%, so set max to 88% #define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.12 // controller will error if PWM duty cycle < 10%, so set min to 12% @@ -341,13 +341,11 @@ if ( getTargetDialInFlowRate() != 0 ) { // set initial PWM duty cycle - dialInPumpPWMDutyCyclePctSet = MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + dialInPumpPWMDutyCyclePctSet = DIP_PWM_ZERO_OFFSET + MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; + etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); // allow dialIn pump to run in requested direction setDialInPumpDirection( dialInPumpDirection ); releaseDialInPumpStop(); - // start PWM for dialIn pump - etpwmStartTBCLK(); isDialInPumpOn = TRUE; result = DIAL_IN_PUMP_RAMPING_UP_STATE; } @@ -374,7 +372,7 @@ { // start ramp down to stop dialInPumpPWMDutyCyclePctSet -= MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); result = DIAL_IN_PUMP_RAMPING_DOWN_STATE; } // have we reached end of ramp up? @@ -388,7 +386,7 @@ else { dialInPumpPWMDutyCyclePctSet += MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } return result; @@ -425,7 +423,7 @@ else { dialInPumpPWMDutyCyclePctSet -= MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } return result; @@ -453,7 +451,7 @@ { newPWM = runPIController( PI_CONTROLLER_ID_DIALYSATE_FLOW, tgtFlow, actFlow ); dialInPumpPWMDutyCyclePctSet = newPWM; - etpwmSetCmpA( etpwmREG1, (U32)FLOAT_TO_INT_WITH_ROUND( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG1->TBPRD) ) ); + etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); dipControlTimerCounter = 0; } @@ -473,8 +471,7 @@ { isDialInPumpOn = FALSE; dialInPumpPWMDutyCyclePctSet = 0.0; - etpwmSetCmpA( etpwmREG1, 0 ); - etpwmStopTBCLK(); + etpwmSetCmpA( etpwmREG2, 0 ); SET_DIP_STOP(); } @@ -656,6 +653,7 @@ flowReadingsTotal = 0.0; flowReadingsIdx = 0; flowReadingsCount = 0; + flowReadingsTmrCtr = 0; dipControlTimerCounter = 0; } @@ -711,7 +709,7 @@ break; default: - // TODO - s/w fault? + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_IN_FLOW_INVALID_FILTER_STATE, flowReadingsTmrCtr ) break; } } Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r07b9515c080aa68fecfa331cbc593adea4c0b8dc -r22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 07b9515c080aa68fecfa331cbc593adea4c0b8dc) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc) @@ -163,6 +163,8 @@ SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, SW_FAULT_ID_DIAL_OUT_FLOW_SET_TOO_HIGH, + SW_FAULT_ID_BLOOD_FLOW_INVALID_FILTER_STATE, + SW_FAULT_ID_DIAL_IN_FLOW_INVALID_FILTER_STATE, // 45 NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/source/sys_main.c =================================================================== diff -u -r4a41a54d255afc5cef0599e2a832927ed2b0ee5d -r22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc --- firmware/source/sys_main.c (.../sys_main.c) (revision 4a41a54d255afc5cef0599e2a832927ed2b0ee5d) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 22f7bcd7e26dc6be337fdb6adbc9281e8f60dbbc) @@ -131,6 +131,13 @@ adcInit(); // configure internal ADC channels mibspiInit(); // re-purposing MIBSPI5 I/O/C pins as GPIO etpwmInit(); // configure PWMs + etpwmSetCmpA( etpwmREG1, 0 ); + etpwmSetCmpA( etpwmREG2, 0 ); + etpwmSetCmpA( etpwmREG3, 0 ); + etpwmSetCmpA( etpwmREG4, 0 ); + etpwmSetCmpA( etpwmREG6, 0 ); + etpwmSetCmpA( etpwmREG7, 0 ); + etpwmStartTBCLK(); canInit(); // CAN1 = CAN, re-purposing CAN2 and CAN3 Rx and Tx pins as GPIO //canEnableloopback( canREG1, External_Lbk ); // TODO - debug code sciInit(); // SCI1 used for PC serial interface, SCI2 used for FPGA serial interface