Skip to content
Permalink
Browse files

some hack to handle linear CLT sensors

  • Loading branch information
rusefi committed Jun 12, 2017
1 parent 0893e50 commit ec47e857ef3e1ce792836279468811d710f6f60b
@@ -170,6 +170,8 @@ void ensureArrayIsAscending(const char *msg, const float array[], int size) {
/** @brief Binary search
* @returns the highest index within sorted array such that array[i] is greater than or equal to the parameter
* @note If the parameter is smaller than the first element of the array, -1 is returned.
*
* See also ensureArrayIsAscending
*/
int findIndexMsg(const char *msg, const float array[], int size, float value) {
if (cisnan(value)) {
@@ -77,10 +77,20 @@ float getResistance(ThermistorConf *config, float voltage) {
return resistance;
}

float getTemperatureC(ThermistorConf *config, ThermistorMath *tm) {
float getTemperatureC(ThermistorConf *config, ThermistorMath *tm, bool useLinear) {
tm->setConfig(&config->config); // implementation checks if configuration has changed or not

float voltage = getVoltageDivided("term", config->adcChannel);
if (useLinear) {
// todo: fix this horrible code!
// should work as a short term fix.
// todo: move 'useLinearXXXSensor' into termistor configuration record
// yes, we use 'resistance' setting for 'voltage' here
return interpolate(config->config.resistance_1, config->config.tempC_1,
config->config.resistance_2, config->config.tempC_2,
voltage);

}
float resistance = getResistance(config, voltage);

float kelvinTemperature = tm->getKelvinTemperatureByResistance(resistance);
@@ -109,7 +119,8 @@ float getCoolantTemperature(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
engine->isCltBroken = false;
return NO_CLT_SENSOR_TEMPERATURE;
}
float temperature = getTemperatureC(&engineConfiguration->clt, &engine->engineState.cltCurve);
float temperature = getTemperatureC(&engineConfiguration->clt, &engine->engineState.cltCurve,
engineConfiguration->useLinearCltSensor);
if (!isValidCoolantTemperature(temperature)) {
efiAssert(engineConfiguration!=NULL, "NULL engineConfiguration", NAN);
warning(OBD_Engine_Coolant_Temperature_Circuit_Malfunction, "unrealistic CLT %f", temperature);
@@ -189,7 +200,8 @@ float getIntakeAirTemperature(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
if (!hasIatSensor(PASS_ENGINE_PARAMETER_SIGNATURE)) {
return NO_IAT_SENSOR_TEMPERATURE;
}
float temperature = getTemperatureC(&engineConfiguration->iat, &engine->engineState.iatCurve);
float temperature = getTemperatureC(&engineConfiguration->iat, &engine->engineState.iatCurve,
engineConfiguration->useLinearIatSensor);
if (!isValidIntakeAirTemperature(temperature)) {
efiAssert(engineConfiguration!=NULL, "NULL engineConfiguration", NAN);
#if EFI_PROD_CODE || EFI_UNIT_TEST || defined(__DOXYGEN__)
@@ -32,7 +32,7 @@ float convertFtoCelcius(float tempF);

float getKelvinTemperature(float resistance, ThermistorMath *tm);
float getResistance(ThermistorConf *config, float voltage);
float getTemperatureC(ThermistorConf *config, ThermistorMath *tm);
float getTemperatureC(ThermistorConf *config, ThermistorMath *tm, bool useLinear);
float getCoolantTemperature(DECLARE_ENGINE_PARAMETER_SIGNATURE);
bool isValidCoolantTemperature(float temperature);
float getIntakeAirTemperature(DECLARE_ENGINE_PARAMETER_SIGNATURE);
@@ -378,12 +378,12 @@ static void setOM(int value) {

static char pinNameBuffer[16];

static void printThermistor(const char *msg, ThermistorConf *config, ThermistorMath *tm) {
static void printThermistor(const char *msg, ThermistorConf *config, ThermistorMath *tm, bool useLinear) {
adc_channel_e adcChannel = config->adcChannel;
float voltage = getVoltageDivided("term", adcChannel);
float r = getResistance(config, voltage);

float t = getTemperatureC(config, tm);
float t = getTemperatureC(config, tm, useLinear);

thermistor_conf_s *tc = &config->config;

@@ -417,11 +417,13 @@ static void printTPSInfo(void) {

static void printTemperatureInfo(void) {
#if EFI_ANALOG_SENSORS || defined(__DOXYGEN__)
printThermistor("CLT", &engineConfiguration->clt, &engine->engineState.cltCurve);
printThermistor("CLT", &engineConfiguration->clt, &engine->engineState.cltCurve,
engineConfiguration->useLinearCltSensor);
if (!isValidCoolantTemperature(getCoolantTemperature(PASS_ENGINE_PARAMETER_SIGNATURE))) {
scheduleMsg(&logger, "CLT sensing error");
}
printThermistor("IAT", &engineConfiguration->iat, &engine->engineState.iatCurve);
printThermistor("IAT", &engineConfiguration->iat, &engine->engineState.iatCurve,
engineConfiguration->useLinearIatSensor);
if (!isValidIntakeAirTemperature(getIntakeAirTemperature(PASS_ENGINE_PARAMETER_SIGNATURE))) {
scheduleMsg(&logger, "IAT sensing error");
}

0 comments on commit ec47e85

Please sign in to comment.
You can’t perform that action at this time.