rusefi-1/firmware/controllers/gauges/tachometer.cpp

81 lines
1.7 KiB
C++
Raw Normal View History

2015-08-18 12:03:44 -07:00
/*
* @file tachometer.cpp
2015-08-18 14:01:49 -07:00
* @brief This is about driving external analog tachometers
2015-08-18 12:03:44 -07:00
*
2016-08-16 19:05:36 -07:00
* This implementation produces one pulse per engine cycle
*
2015-08-18 12:03:44 -07:00
* @date Aug 18, 2015
2020-01-13 18:57:43 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-08-18 12:03:44 -07:00
*/
#include "pch.h"
2015-08-18 12:03:44 -07:00
#include "tachometer.h"
static SimplePwm tachControl("tach");
static float tachFreq;
static float duty;
#if EFI_UNIT_TEST
float getTachFreq() {
return tachFreq;
}
2015-08-19 13:01:36 -07:00
float getTachDuty() {
return duty;
2015-08-19 13:01:36 -07:00
}
#endif
2015-08-18 14:01:49 -07:00
static bool tachHasInit = false;
void tachSignalCallback() {
// Only do anything if tach enabled
if (!tachHasInit) {
return;
}
// How many tach pulse periods do we have?
int periods = engineConfiguration->tachPulsePerRev;
if (periods == 0 || periods > 10) {
firmwareError(CUSTOM_ERR_6709, "Invalid tachometer pulse per rev: %d", periods);
2015-08-18 21:03:11 -07:00
return;
}
// What is the angle per tach output period?
2022-01-20 20:36:09 -08:00
float cycleTimeMs = 60000.0f / Sensor::getOrZero(SensorType::Rpm);
float periodTimeMs = cycleTimeMs / periods;
tachFreq = 1000.0f / periodTimeMs;
if (engineConfiguration->tachPulseDurationAsDutyCycle) {
// Simple case - duty explicitly set
duty = engineConfiguration->tachPulseDuractionMs;
2017-08-28 18:00:36 -07:00
} else {
// Constant high-time mode - compute the correct duty cycle
duty = engineConfiguration->tachPulseDuractionMs / periodTimeMs;
}
// In case Freq is under 1Hz, we stop pwm to avoid warnings!
if (tachFreq < 1) {
tachFreq = NAN;
2017-08-28 18:00:36 -07:00
}
tachControl.setSimplePwmDutyCycle(duty);
tachControl.setFrequency(tachFreq);
2015-08-18 14:01:49 -07:00
}
void initTachometer() {
tachHasInit = false;
if (!isBrainPinValid(engineConfiguration->tachOutputPin)) {
2015-08-18 12:03:44 -07:00
return;
2015-08-18 21:03:11 -07:00
}
2015-08-18 12:03:44 -07:00
startSimplePwm(&tachControl,
"Tachometer",
&engine->executor,
&enginePins.tachOut,
NAN, 0.1f);
2015-08-18 14:01:49 -07:00
tachHasInit = true;
2015-08-18 12:03:44 -07:00
}