//######################## Calculate PWM for left driving
motor ############################
motorLeftPID.TaMax = 0.1;
motorLeftPID.x = motorLeftRpmCurr;
motorLeftPID.w = motorLeftRpmSet;
motorLeftPID.y_min = -pwmMax * 4;
motorLeftPID.y_max = pwmMax * 4;
motorLeftPID.max_output = pwmMax;
motorLeftPID.compute();
motorLeftPWMCurr = motorLeftPID.y;
/*
motorLeftPWMCurr = motorLeftPWMCurr + motorLeftPID.y;
if (motorLeftRpmSet >= 0) motorLeftPWMCurr = min( max(0, (int)motorLeftPWMCurr), pwmMax); // 0.. pwmMax
if (motorLeftRpmSet < 0) motorLeftPWMCurr = max(-pwmMax, min(0, (int)motorLeftPWMCurr)); // -pwmMax..0
*/
if ((abs(motorLeftRpmSet) < 0.01) && (abs(motorLeftPWMCurr) < 30)) motorLeftPWMCurr = 0;
//######################## Calculate PWM for right driving
motor ############################
motorRightPID.TaMax = 0.1;
motorRightPID.x = motorRightRpmCurr;
motorRightPID.w = motorRightRpmSet;
motorRightPID.y_min = -pwmMax * 4;
motorRightPID.y_max = pwmMax * 4;
motorRightPID.max_output = pwmMax;
motorRightPID.compute();
motorRightPWMCurr = motorRightPID.y;
/*
motorRightPWMCurr = motorRightPWMCurr + motorRightPID.y;
if (motorRightRpmSet >= 0) motorRightPWMCurr = min( max(0, (int)motorRightPWMCurr), pwmMax); // 0.. pwmMax
if (motorRightRpmSet < 0) motorRightPWMCurr = max(-pwmMax, min(0, (int)motorRightPWMCurr)); // -pwmMax..0
*/
if ((abs(motorRightRpmSet) < 0.01) && (abs(motorRightPWMCurr) < 30)) motorRightPWMCurr = 0;
//######################## Reduce PWM if more than pwmMax ##########################
float maxPWMCurr = max(abs(motorLeftPWMCurr), abs(motorRightPWMCurr));
if((maxPWMCurr > pwmMax) && (maxPWMCurr != 0)){
motorLeftPWMCurr = (int)(motorLeftPWMCurr / maxPWMCurr * pwmMax);
motorRightPWMCurr = (int)(motorRightPWMCurr / maxPWMCurr * pwmMax);
}