little progress

This commit is contained in:
rusEfi 2018-11-25 23:13:03 -05:00
parent 41375a0ae2
commit 74585d835c
3 changed files with 52 additions and 10 deletions

View File

@ -94,6 +94,9 @@ static percent_t currentEtbDuty;
static bool wasEtbBraking = false;
// todo: need to fix PWM so that it supports zero duty cycle
#define PERCENT_TO_DUTY(X) (maxF((minI(X, 99.9)) / 100.0, 0.1))
static msg_t etbThread(void *arg) {
UNUSED(arg);
while (true) {
@ -127,11 +130,14 @@ static msg_t etbThread(void *arg) {
tuneWorkingPid.updateFactors(autoTune.output, 0, 0);
float value = tuneWorkingPid.getValue(50, actualThrottlePosition);
scheduleMsg(&logger, "output %f value=%f", autoTune.output, value);
etbPwmUp.setSimplePwmDutyCycle(value);
scheduleMsg(&logger, "AT input=%f output=%f PID=%f", autoTune.input,
autoTune.output,
value);
scheduleMsg(&logger, "AT PID=%f", value);
etbPwmUp.setSimplePwmDutyCycle(PERCENT_TO_DUTY(value));
if (result) {
scheduleMsg(&logger, "GREAT NEWS!");
scheduleMsg(&logger, "GREAT NEWS! %f/%f/%f", autoTune.GetKp(), autoTune.GetKi(), autoTune.GetKd());
}
tuneWorkingPid.sleep();
@ -144,7 +150,7 @@ static msg_t etbThread(void *arg) {
currentEtbDuty = pid.getValue(targetPosition, actualThrottlePosition);
etbPwmUp.setSimplePwmDutyCycle(currentEtbDuty / 100);
etbPwmUp.setSimplePwmDutyCycle(PERCENT_TO_DUTY(currentEtbDuty));
if (boardConfiguration->etbDirectionPin2 != GPIO_UNASSIGNED) {
bool needEtbBraking = absF(targetPosition - actualThrottlePosition) < 3;
@ -169,13 +175,13 @@ static msg_t etbThread(void *arg) {
}
/**
* set_etb X
* manual duty cycle control without PID. Percent value from 0 to 100
*/
static void setThrottleDutyCycle(float level) {
scheduleMsg(&logger, "setting ETB duty=%f", level);
float dc = (minI(level, 98)) / 100.0;
dc = maxF(dc, 0.00001); // todo: need to fix PWM so that it supports zero duty cycle
float dc = PERCENT_TO_DUTY(level);
valueOverride = dc;
etbPwmUp.setSimplePwmDutyCycle(dc);
print("etb duty = %.2f\r\n", dc);
@ -285,15 +291,25 @@ static void setTempOutput(float value) {
autoTune.output = value;
}
static void setTempStep(float value) {
/**
* set_etbat_step X
*/
static void setAutoStep(float value) {
autoTune.reset();
autoTune.SetOutputStep(value);
}
static void setAutoPeriod(int period) {
tuneWorkingPidSettings.period = period;
autoTune.reset();
}
void initElectronicThrottle(void) {
addConsoleAction("ethinfo", showEthInfo);
if (!hasPedalPositionSensor()) {
return;
}
autoTune.SetOutputStep(0.1);
startETBPins();
@ -304,14 +320,16 @@ void initElectronicThrottle(void) {
tuneWorkingPidSettings.pFactor = 1;
tuneWorkingPidSettings.iFactor = 0;
tuneWorkingPidSettings.dFactor = 0;
tuneWorkingPidSettings.offset = 10; // todo: not hard-coded value
// tuneWorkingPidSettings.offset = 10; // todo: not hard-coded value
//todo tuneWorkingPidSettings.period = 10;
tuneWorkingPidSettings.minValue = 0;
tuneWorkingPidSettings.maxValue = 100;
tuneWorkingPidSettings.period = 100;
// this is useful one you do "enable etb_auto"
addConsoleActionF("set_etb_output", setTempOutput);
addConsoleActionF("set_etb_step", setTempStep);
addConsoleActionF("set_etbat_output", setTempOutput);
addConsoleActionF("set_etbat_step", setAutoStep);
addConsoleActionI("set_etbat_period", setAutoPeriod);
applyPidSettings();

View File

@ -43,14 +43,28 @@ Tuning tuningRule[PID_AutoTune::NO_OVERSHOOT_PID + 1] =
};
PID_AutoTune::PID_AutoTune() {
reset();
}
void PID_AutoTune::Cancel()
{
state = AUTOTUNER_OFF;
}
void PID_AutoTune::reset() {
running = false;
controlType = ZIEGLER_NICHOLS_PID;
noiseBand = 0.5;
setState(AUTOTUNER_OFF);
oStep = 10.0;
memset(lastPeaks, 0, sizeof(lastPeaks));
memset(lastInputs, 0, sizeof(lastInputs));
logger = NULL;
input = output = 0;
SetLookbackSec(10);
}
void PID_AutoTune::SetLookbackSec(int value)
@ -115,6 +129,8 @@ void PID_AutoTune::setPeakType(PidAutoTune_Peak peakType) {
*/
bool PID_AutoTune::Runtime(Logging *logger)
{
this->logger = logger; // a bit lazy but good enough
// check ready for new input
unsigned long now = currentTimeMillis();
@ -772,6 +788,11 @@ float PID_AutoTune::GetKd()
void PID_AutoTune::setOutput(float output) {
this->output = output;
if (logger != NULL) {
scheduleMsg(logger, "setOutput %f %s", output, getPidAutoTune_AutoTunerState(state));
}
#if EFI_UNIT_TEST
printf("output=%f\r\n", output);
#endif /* EFI_UNIT_TEST */

View File

@ -110,6 +110,8 @@ public:
// returns true when done, otherwise returns false
void Cancel(); // * Stops the AutoTune
void reset();
void SetOutputStep(double); // * how far above and below the starting value will
// the output step?
double GetOutputStep(); //
@ -128,6 +130,7 @@ public:
float GetKi(); // computed tuning parameters.
float GetKd(); //
Logging *logger;
byte peakCount;
float input;
// suggested P coefficient while auto-tuning