temp.c: integrate next_start_adc_time clock into next_read_time.
Extra clock next_start_adc_time was unnecessary. As @phord observed, it was more understandable to explicitly call start_adc() 1 cycle ahead during temp_sensor_tick(), for sensors which use analog_read().
This commit is contained in:
parent
1aa8698f62
commit
86c3d97315
77
temp.c
77
temp.c
|
|
@ -89,15 +89,6 @@ struct {
|
||||||
uint16_t next_read_time; ///< how long until we can read this sensor again?
|
uint16_t next_read_time; ///< how long until we can read this sensor again?
|
||||||
} temp_sensors_runtime[NUM_TEMP_SENSORS];
|
} temp_sensors_runtime[NUM_TEMP_SENSORS];
|
||||||
|
|
||||||
#ifdef NEEDS_START_ADC
|
|
||||||
/**
|
|
||||||
Timer/counter for initiating ADC reads via start_adc(). Runs on the same
|
|
||||||
interval as analog_read(), but is shifted in time, which is why this
|
|
||||||
additional counter is needed.
|
|
||||||
*/
|
|
||||||
uint16_t next_start_adc_time;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** \def TEMP_EWMA
|
/** \def TEMP_EWMA
|
||||||
|
|
||||||
Default alpha constant for the Exponentially Weighted Moving Average (EWMA)
|
Default alpha constant for the Exponentially Weighted Moving Average (EWMA)
|
||||||
|
|
@ -141,16 +132,18 @@ void temp_init() {
|
||||||
#ifdef TEMP_THERMISTOR
|
#ifdef TEMP_THERMISTOR
|
||||||
// Mostly handled by analog_init().
|
// Mostly handled by analog_init().
|
||||||
case TT_THERMISTOR:
|
case TT_THERMISTOR:
|
||||||
// Schedule first read.
|
// Schedule first read. Decrement by 1, because clock_counter_250ms
|
||||||
temp_sensors_runtime[i].next_read_time = ANALOG_READ_INTERVAL;
|
// is 1 tick ahead.
|
||||||
|
temp_sensors_runtime[i].next_read_time = ANALOG_READ_INTERVAL - 1;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TEMP_AD595
|
#ifdef TEMP_AD595
|
||||||
// Mostly handled by analog_init().
|
// Mostly handled by analog_init().
|
||||||
case TT_AD595:
|
case TT_AD595:
|
||||||
// Schedule first read.
|
// Schedule first read. Decrement by 1, because clock_counter_250ms
|
||||||
temp_sensors_runtime[i].next_read_time = ANALOG_READ_INTERVAL;
|
// is 1 tick ahead.
|
||||||
|
temp_sensors_runtime[i].next_read_time = ANALOG_READ_INTERVAL - 1;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -171,16 +164,6 @@ void temp_init() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NEEDS_START_ADC
|
|
||||||
/**
|
|
||||||
Schedule the first ADC conversion so that it starts one 10ms cycle
|
|
||||||
before the sensors are actually read. This way analog_read() returns a
|
|
||||||
value that's only 10ms old.
|
|
||||||
*/
|
|
||||||
next_start_adc_time = (ANALOG_READ_INTERVAL > 0) ?
|
|
||||||
(ANALOG_READ_INTERVAL - 1) : 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -419,6 +402,39 @@ void temp_sensor_tick() {
|
||||||
) / EWMA_SCALE);
|
) / EWMA_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef NEEDS_START_ADC
|
||||||
|
/**
|
||||||
|
Sensors that use analog_read() need an start_adc() a 10ms cycle before
|
||||||
|
they actually do the reading so that ADC conversion can start and
|
||||||
|
finish in time.
|
||||||
|
*/
|
||||||
|
if (temp_sensors_runtime[i].next_read_time == 1) {
|
||||||
|
uint8_t needs_start_adc = 0;
|
||||||
|
|
||||||
|
// Determine if the sensor uses analog_read().
|
||||||
|
switch(temp_sensors[i].temp_type) {
|
||||||
|
#ifdef TEMP_THERMISTOR
|
||||||
|
case TT_THERMISTOR:
|
||||||
|
needs_start_adc = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TEMP_AD595
|
||||||
|
case TT_AD595:
|
||||||
|
needs_start_adc = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default: /* Prevent compiler warning. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needs_start_adc) {
|
||||||
|
start_adc();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Decrement the counter here so that we avoid a off-by-one error. It's
|
Decrement the counter here so that we avoid a off-by-one error. It's
|
||||||
assumed that sensor update code in the switch statement above has set a
|
assumed that sensor update code in the switch statement above has set a
|
||||||
|
|
@ -426,21 +442,6 @@ void temp_sensor_tick() {
|
||||||
*/
|
*/
|
||||||
temp_sensors_runtime[i].next_read_time--;
|
temp_sensors_runtime[i].next_read_time--;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NEEDS_START_ADC
|
|
||||||
// Start ADC conversion when the time comes.
|
|
||||||
if (next_start_adc_time > 1) {
|
|
||||||
next_start_adc_time--;
|
|
||||||
} else {
|
|
||||||
start_adc();
|
|
||||||
/**
|
|
||||||
start_adc() runs on the same interval as analog_read(), but it's
|
|
||||||
shifted in time so that it happens 10ms earlier. This way the ADC
|
|
||||||
conversion can finish before its results are read.
|
|
||||||
*/
|
|
||||||
next_start_adc_time = ANALOG_READ_INTERVAL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue