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 "tachometer.h"
|
2020-04-26 14:40:12 -07:00
|
|
|
#include "pwm_generator_logic.h"
|
2019-04-09 19:52:03 -07:00
|
|
|
|
2015-08-18 12:03:44 -07:00
|
|
|
EXTERN_ENGINE;
|
|
|
|
|
2020-04-02 12:20:04 -07:00
|
|
|
static SimplePwm tachControl("tach");
|
|
|
|
static float tachFreq;
|
|
|
|
static float duty;
|
|
|
|
|
|
|
|
#if EFI_UNIT_TEST
|
2020-08-21 12:36:43 -07:00
|
|
|
float getTachFreq() {
|
2020-04-02 12:20:04 -07:00
|
|
|
return tachFreq;
|
|
|
|
}
|
2015-08-19 13:01:36 -07:00
|
|
|
|
2020-08-21 12:36:43 -07:00
|
|
|
float getTachDuty() {
|
2020-04-02 12:20:04 -07:00
|
|
|
return duty;
|
2015-08-19 13:01:36 -07:00
|
|
|
}
|
2020-04-02 12:20:04 -07:00
|
|
|
#endif
|
2015-08-18 14:01:49 -07:00
|
|
|
|
2020-08-21 12:36:43 -07:00
|
|
|
static bool tachHasInit = false;
|
|
|
|
|
|
|
|
void tachSignalCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
|
|
|
// Only do anything if tach enabled
|
|
|
|
if (!tachHasInit) {
|
2020-04-02 12:20:04 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// How many tach pulse periods do we have?
|
|
|
|
int periods = CONFIG(tachPulsePerRev);
|
|
|
|
|
2020-05-23 07:46:28 -07:00
|
|
|
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;
|
|
|
|
}
|
2020-04-02 12:20:04 -07:00
|
|
|
|
|
|
|
// What is the angle per tach output period?
|
2020-05-06 05:38:15 -07:00
|
|
|
float cycleTimeMs = 60000.0f / GET_RPM();
|
2020-04-02 12:20:04 -07:00
|
|
|
float periodTimeMs = cycleTimeMs / periods;
|
2020-05-06 05:38:15 -07:00
|
|
|
tachFreq = 1000.0f / periodTimeMs;
|
2020-04-02 12:20:04 -07:00
|
|
|
|
|
|
|
if (CONFIG(tachPulseDurationAsDutyCycle)) {
|
|
|
|
// Simple case - duty explicitly set
|
|
|
|
duty = CONFIG(tachPulseDuractionMs);
|
2017-08-28 18:00:36 -07:00
|
|
|
} else {
|
2020-04-02 12:20:04 -07:00
|
|
|
// Constant high-time mode - compute the correct duty cycle
|
|
|
|
duty = CONFIG(tachPulseDuractionMs) / periodTimeMs;
|
|
|
|
}
|
|
|
|
|
|
|
|
// In case Freq is under 1Hz, we stop pwm to avoid warnings!
|
2020-05-06 05:38:15 -07:00
|
|
|
if (tachFreq < 1) {
|
2020-04-02 12:20:04 -07:00
|
|
|
tachFreq = NAN;
|
2017-08-28 18:00:36 -07:00
|
|
|
}
|
2020-04-02 12:20:04 -07:00
|
|
|
|
|
|
|
tachControl.setSimplePwmDutyCycle(duty);
|
|
|
|
tachControl.setFrequency(tachFreq);
|
2015-08-18 14:01:49 -07:00
|
|
|
}
|
|
|
|
|
2020-04-01 16:00:56 -07:00
|
|
|
void initTachometer(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
2020-08-21 12:36:43 -07:00
|
|
|
tachHasInit = false;
|
2019-12-11 14:48:55 -08:00
|
|
|
if (CONFIG(tachOutputPin) == GPIO_UNASSIGNED) {
|
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
|
|
|
|
2020-04-02 12:20:04 -07:00
|
|
|
startSimplePwmExt(&tachControl,
|
|
|
|
"Tachometer",
|
|
|
|
&engine->executor,
|
|
|
|
CONFIG(tachOutputPin),
|
|
|
|
&enginePins.tachOut,
|
2020-05-06 05:38:15 -07:00
|
|
|
NAN, 0.1f);
|
2015-08-18 14:01:49 -07:00
|
|
|
|
2020-08-21 12:36:43 -07:00
|
|
|
tachHasInit = true;
|
2015-08-18 12:03:44 -07:00
|
|
|
}
|