aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelene ToyKeeper2017-09-10 00:27:30 -0600
committerSelene ToyKeeper2017-09-10 00:27:30 -0600
commitb7d8faa65451a5c71b5b619c605e8623ecd627dc (patch)
treeb957013fd4737cf729bd7da6689e6df948cce0c2
parentRewrote gradual_tick(). Is smaller, better, and safer now. (diff)
downloadanduril-b7d8faa65451a5c71b5b619c605e8623ecd627dc.tar.gz
anduril-b7d8faa65451a5c71b5b619c605e8623ecd627dc.tar.bz2
anduril-b7d8faa65451a5c71b5b619c605e8623ecd627dc.zip
Made thermal regulation slightly more prediction-heavy, less noisy at stable state, and slightly smaller.
Added a bit of overflow protection since I think I saw it overflow with the prediction weight increased. Uses immediate temperature (instead of avg) for lowpass reset, to make it less noisy at stable state. (more trigger-happy reset switch biases it toward inaction) Avoid using volatile var, to reduce space. Overflow prevention also caps the maximum adjustment step, which should slightly help prevent overshooting the target.
-rw-r--r--spaghetti-monster/fsm-adc.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/spaghetti-monster/fsm-adc.c b/spaghetti-monster/fsm-adc.c
index 4efb11c..699c6cb 100644
--- a/spaghetti-monster/fsm-adc.c
+++ b/spaghetti-monster/fsm-adc.c
@@ -177,6 +177,7 @@ ISR(ADC_vect) {
}
// guess what the temperature will be in a few seconds
+ int16_t pt;
{
uint8_t i;
int16_t diff;
@@ -184,7 +185,7 @@ ISR(ADC_vect) {
// algorithm tweaking; not really intended to be modified
// how far ahead should we predict?
- #define THERM_PREDICTION_STRENGTH 3
+ #define THERM_PREDICTION_STRENGTH 4
// how proportional should the adjustments be?
#define THERM_DIFF_ATTENUATION 2
// acceptable temperature window size in C
@@ -207,24 +208,26 @@ ISR(ADC_vect) {
diff = t - temperature_history[0];
// projected_temperature = current temp extended forward by amplified rate of change
//projected_temperature = temperature_history[NUM_THERMAL_VALUES_HISTORY-1] + (diff<<THERM_PREDICTION_STRENGTH);
- projected_temperature = t + (diff<<THERM_PREDICTION_STRENGTH);
+ pt = projected_temperature = t + (diff<<THERM_PREDICTION_STRENGTH);
// store prediction for later averaging
- projected_temperature_history[projected_temperature_history_counter] = projected_temperature;
+ projected_temperature_history[projected_temperature_history_counter] = pt;
projected_temperature_history_counter = (projected_temperature_history_counter + 1) & (NUM_THERMAL_PROJECTED_HISTORY-1);
}
// average prediction to reduce noise
int16_t avg_projected_temperature = 0;
- for (uint8_t i = 0; i < NUM_THERMAL_PROJECTED_HISTORY; i++)
+ for (uint8_t i = 0;
+ (i < NUM_THERMAL_PROJECTED_HISTORY) && (avg_projected_temperature < 16000);
+ i++)
avg_projected_temperature += projected_temperature_history[i];
avg_projected_temperature /= NUM_THERMAL_PROJECTED_HISTORY;
// cancel counters if appropriate
- if (avg_projected_temperature > THERM_FLOOR) {
- underheat_lowpass = 0; // we're definitely not too cold
- } else if (avg_projected_temperature < THERM_CEIL) {
- overheat_lowpass = 0; // we're definitely not too hot
+ if (pt > THERM_FLOOR) {
+ underheat_lowpass = 0; // we're probably not too cold
+ } else if (pt < THERM_CEIL) {
+ overheat_lowpass = 0; // we're probably not too hot
}
if (temperature_timer) {