fome-fw/firmware/controllers/alternatorController.cpp

94 lines
2.8 KiB
C++
Raw Normal View History

2014-08-29 07:52:33 -07:00
/**
* @file alternatorController.cpp
* @brief alternator controller - turn alternator off if you do not really need it
*
* @date Apr 6, 2014
* @author Dmitry Sidin
2015-03-02 17:04:34 -08:00
* @author Andrey Belomutskiy, (c) 2012-2015
2014-08-29 07:52:33 -07:00
*/
#include "main.h"
#include "rpm_calculator.h"
#include "pwm_generator.h"
#include "alternatorController.h"
#include "pin_repository.h"
2015-03-02 20:05:27 -08:00
#include "engine.h"
2014-08-29 07:52:33 -07:00
#include "voltage.h"
2015-03-02 20:05:27 -08:00
#include "pid.h"
2014-08-29 07:52:33 -07:00
2015-03-02 20:05:27 -08:00
EXTERN_ENGINE
;
2014-08-29 07:52:33 -07:00
2015-03-02 20:05:27 -08:00
static Logging *logger;
2014-08-29 07:52:33 -07:00
2015-03-02 20:05:27 -08:00
#define ALTERNATOR_VALVE_PWM_FREQUENCY 300
2014-08-29 07:52:33 -07:00
2015-03-02 20:05:27 -08:00
static SimplePwm alternatorControl;
static OutputPin alternatorPin;
2015-03-19 18:11:55 -07:00
static Pid altPid(10, 0, 0, 1, 90);
2014-08-29 07:52:33 -07:00
2015-03-03 14:04:50 -08:00
static THD_WORKING_AREA(alternatorControlThreadStack, UTILITY_THREAD_STACK_SIZE);
2014-08-29 07:52:33 -07:00
2015-03-13 19:05:50 -07:00
static float currentAltDuty;
2014-08-29 07:52:33 -07:00
static msg_t AltCtrlThread(int param) {
chRegSetThreadName("AlternatorController");
2015-03-02 20:05:27 -08:00
while (true) {
chThdSleepMilliseconds(100);
2014-08-29 07:52:33 -07:00
2015-03-13 19:05:50 -07:00
currentAltDuty = altPid.getValue(14, getVBatt(engineConfiguration), 1);
2015-03-04 19:08:26 -08:00
if (boardConfiguration->isVerboseAlternator) {
2015-03-20 23:05:11 -07:00
scheduleMsg(logger, "alt duty: %f/vbatt=%f/p=%f/i=%f/d=%f int=%f", currentAltDuty, getVBatt(engineConfiguration),
altPid.getP(), altPid.getI(), altPid.getD(), altPid.getIntegration());
2015-03-04 19:08:26 -08:00
}
2014-08-29 07:52:33 -07:00
2015-03-13 19:05:50 -07:00
alternatorControl.setSimplePwmDutyCycle(currentAltDuty / 100);
2014-08-29 07:52:33 -07:00
}
#if defined __GNUC__
return -1;
#endif
}
2015-03-22 17:10:32 -07:00
static void applySettings(void) {
altPid.updateFactors(engineConfiguration->alternatorControlPFactor, 0, 0);
}
static void setAltPFactor(float p) {
engineConfiguration->alternatorControlPFactor = p;
2015-03-02 20:05:27 -08:00
scheduleMsg(logger, "setAltPid: %f", p);
2015-03-22 17:10:32 -07:00
applySettings();
2014-08-29 07:52:33 -07:00
}
2015-03-10 20:04:53 -07:00
static void applyAlternatorPinState(PwmConfig *state, int stateIndex) {
efiAssertVoid(stateIndex < PWM_PHASE_MAX_COUNT, "invalid stateIndex");
efiAssertVoid(state->multiWave.waveCount == 1, "invalid idle waveCount");
OutputPin *output = state->outputPins[0];
int value = state->multiWave.waves[0].pinStates[stateIndex];
if (!value || engineConfiguration->isAlternatorControlEnabled)
output->setValue(value);
}
2015-03-13 19:05:50 -07:00
static void showAltInfo(void) {
scheduleMsg(logger, "atl=%s", boolToString(engineConfiguration->isAlternatorControlEnabled));
2015-03-28 19:10:34 -07:00
scheduleMsg(logger, "p=%f/i=%f/d=%f", engineConfiguration->alternatorControlPFactor,
0, 0); // todo: i & d
2015-03-13 19:05:50 -07:00
scheduleMsg(logger, "vbatt=%f/duty=%f", getVBatt(engineConfiguration), currentAltDuty);
}
2015-03-02 20:05:27 -08:00
void initAlternatorCtrl(Logging *sharedLogger) {
logger = sharedLogger;
if (boardConfiguration->alternatorControlPin == GPIO_UNASSIGNED)
return;
startSimplePwmExt(&alternatorControl, "Alternator control", boardConfiguration->alternatorControlPin,
&alternatorPin,
2015-03-10 20:04:53 -07:00
ALTERNATOR_VALVE_PWM_FREQUENCY, 0.1, applyAlternatorPinState);
2015-03-04 19:08:26 -08:00
chThdCreateStatic(alternatorControlThreadStack, sizeof(alternatorControlThreadStack), LOWPRIO,
(tfunc_t) AltCtrlThread, NULL);
2015-03-02 20:05:27 -08:00
2015-03-22 17:10:32 -07:00
addConsoleActionF("set_alt_p", setAltPFactor);
2015-03-13 19:05:50 -07:00
addConsoleAction("altinfo", showAltInfo);
2015-03-22 17:10:32 -07:00
applySettings();
2015-03-02 20:05:27 -08:00
}