Adapt PID usage to float free library
This commit is contained in:
parent
202bfd7003
commit
4afbf17f12
|
@ -207,7 +207,7 @@ This continues until either:
|
||||||
PID (Best suited to wideband sensors):
|
PID (Best suited to wideband sensors):
|
||||||
|
|
||||||
*/
|
*/
|
||||||
double PID_O2, PID_output, PID_AFRTarget;
|
long PID_O2, PID_output, PID_AFRTarget;
|
||||||
PID egoPID(&PID_O2, &PID_output, &PID_AFRTarget, configPage3.egoKP, configPage3.egoKI, configPage3.egoKD, REVERSE); //This is the PID object if that algorithm is used. Needs to be global as it maintains state outside of each function call
|
PID egoPID(&PID_O2, &PID_output, &PID_AFRTarget, configPage3.egoKP, configPage3.egoKI, configPage3.egoKD, REVERSE); //This is the PID object if that algorithm is used. Needs to be global as it maintains state outside of each function call
|
||||||
|
|
||||||
byte correctionsAFRClosedLoop()
|
byte correctionsAFRClosedLoop()
|
||||||
|
@ -255,10 +255,10 @@ byte correctionsAFRClosedLoop()
|
||||||
{
|
{
|
||||||
//*************************************************************************************************************************************
|
//*************************************************************************************************************************************
|
||||||
//PID algorithm
|
//PID algorithm
|
||||||
egoPID.SetOutputLimits((double)(-configPage3.egoLimit), (double)(configPage3.egoLimit)); //Set the limits again, just incase the user has changed them since the last loop. Note that these are sent to the PID library as (Eg:) -15 and +15
|
egoPID.SetOutputLimits((long)(-configPage3.egoLimit), (long)(configPage3.egoLimit)); //Set the limits again, just incase the user has changed them since the last loop. Note that these are sent to the PID library as (Eg:) -15 and +15
|
||||||
egoPID.SetTunings(configPage3.egoKP, configPage3.egoKI, configPage3.egoKD); //Set the PID values again, just incase the user has changed them since the last loop
|
egoPID.SetTunings(configPage3.egoKP, configPage3.egoKI, configPage3.egoKD); //Set the PID values again, just incase the user has changed them since the last loop
|
||||||
PID_O2 = (double)(currentStatus.O2);
|
PID_O2 = (long)(currentStatus.O2);
|
||||||
PID_AFRTarget = (double)(currentStatus.afrTarget);
|
PID_AFRTarget = (long)(currentStatus.afrTarget);
|
||||||
|
|
||||||
egoPID.Compute();
|
egoPID.Compute();
|
||||||
//currentStatus.egoCorrection = 100 + PID_output;
|
//currentStatus.egoCorrection = 100 + PID_output;
|
||||||
|
|
|
@ -317,9 +317,11 @@ struct config3 {
|
||||||
byte lnchRetard;
|
byte lnchRetard;
|
||||||
byte lnchHardLim;
|
byte lnchHardLim;
|
||||||
byte lnchFuelAdd;
|
byte lnchFuelAdd;
|
||||||
byte unused53;
|
|
||||||
byte unused54;
|
//PID values for idle needed to go here as out of room in the idle page
|
||||||
byte unused55;
|
byte idleKP;
|
||||||
|
byte idleKI;
|
||||||
|
byte idleKD;
|
||||||
byte unused56;
|
byte unused56;
|
||||||
byte unused57;
|
byte unused57;
|
||||||
byte unused58;
|
byte unused58;
|
||||||
|
|
5
idle.h
5
idle.h
|
@ -1,3 +1,5 @@
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
#define STEPPER_FORWARD 0
|
#define STEPPER_FORWARD 0
|
||||||
#define STEPPER_BACKWARD 1
|
#define STEPPER_BACKWARD 1
|
||||||
#define IDLE_TABLE_SIZE 10
|
#define IDLE_TABLE_SIZE 10
|
||||||
|
@ -30,7 +32,8 @@ volatile byte idle2_pin_mask;
|
||||||
volatile bool idle_pwm_state;
|
volatile bool idle_pwm_state;
|
||||||
unsigned int idle_pwm_max_count; //Used for variable PWM frequency
|
unsigned int idle_pwm_max_count; //Used for variable PWM frequency
|
||||||
volatile unsigned int idle_pwm_cur_value;
|
volatile unsigned int idle_pwm_cur_value;
|
||||||
unsigned int idle_pwm_target_value;
|
long idle_pwm_target_value;
|
||||||
|
long idle_cl_target_rpm;
|
||||||
|
|
||||||
void initialiseIdle();
|
void initialiseIdle();
|
||||||
|
|
||||||
|
|
19
idle.ino
19
idle.ino
|
@ -12,6 +12,9 @@ These functions cover the PWM and stepper idle control
|
||||||
Idle Control
|
Idle Control
|
||||||
Currently limited to on/off control and open loop PWM and stepper drive
|
Currently limited to on/off control and open loop PWM and stepper drive
|
||||||
*/
|
*/
|
||||||
|
long longRPM;
|
||||||
|
PID idlePID(&longRPM, &idle_pwm_target_value, &idle_cl_target_rpm, configPage3.idleKP, configPage3.idleKI, configPage3.idleKD, DIRECT); //This is the PID object if that algorithm is used. Needs to be global as it maintains state outside of each function call
|
||||||
|
|
||||||
void initialiseIdle()
|
void initialiseIdle()
|
||||||
{
|
{
|
||||||
//By default, turn off the PWM interrupt (It gets turned on below if needed)
|
//By default, turn off the PWM interrupt (It gets turned on below if needed)
|
||||||
|
@ -62,6 +65,14 @@ void initialiseIdle()
|
||||||
iacCrankDutyTable.xSize = 4;
|
iacCrankDutyTable.xSize = 4;
|
||||||
iacCrankDutyTable.values = configPage4.iacCrankDuty;
|
iacCrankDutyTable.values = configPage4.iacCrankDuty;
|
||||||
iacCrankDutyTable.axisX = configPage4.iacCrankBins;
|
iacCrankDutyTable.axisX = configPage4.iacCrankBins;
|
||||||
|
|
||||||
|
idle_pin_port = portOutputRegister(digitalPinToPort(pinIdle1));
|
||||||
|
idle_pin_mask = digitalPinToBitMask(pinIdle1);
|
||||||
|
idle2_pin_port = portOutputRegister(digitalPinToPort(pinIdle2));
|
||||||
|
idle2_pin_mask = digitalPinToBitMask(pinIdle2);
|
||||||
|
idle_pwm_max_count = 1000000L / (16 * configPage3.idleFreq * 2); //Converts the frequency in Hz to the number of ticks (at 16uS) it takes to complete 1 cycle. Note that the frequency is divided by 2 coming from TS to allow for up to 512hz
|
||||||
|
idlePID.SetOutputLimits(0, idle_pwm_max_count);
|
||||||
|
TIMSK4 |= (1 << OCIE4C); //Turn on the C compare unit (ie turn on the interrupt)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
|
@ -133,7 +144,13 @@ void idleControl()
|
||||||
else if (idleOn) { digitalWrite(pinIdle1, LOW); idleOn = false; }
|
else if (idleOn) { digitalWrite(pinIdle1, LOW); idleOn = false; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3: //Case 3 is PWM closed loop (Not currently implemented)
|
case 3: //Case 3 is PWM closed loop
|
||||||
|
//No cranking specific value for closed loop (yet?)
|
||||||
|
idle_cl_target_rpm = table2D_getValue(&iacClosedLoopTable, currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET) * 2; //All temps are offset by 40 degrees
|
||||||
|
longRPM = currentStatus.RPM; //The PID object needs a long as the RPM input. A separate variable is used for this
|
||||||
|
//idle_pwm_target_value = percentage(currentStatus.idleDuty, idle_pwm_max_count);
|
||||||
|
|
||||||
|
idlePID.Compute();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4: //Case 4 is open loop stepper control
|
case 4: //Case 4 is open loop stepper control
|
||||||
|
|
Loading…
Reference in New Issue