Guten Abend!
Man verzeihe den wenig sagenden Titel (wobei "Werteverwertung" mir ein
echtes Meisterstück zu sein scheint). Außerdem vorweg das obligatorische
"Ich bin kein Held, was AVR's betrifft".
Mein Projekt ist das folgende:
Aus Laborglaswaren habe ich mir eine schöne Destille zusammengestellt.
Die Physik will bekanntermaßen, dass der Spaß temperaturabhängig ist. Da
normgeschliffene Quecksilberthermometer mit entsprechendem
Temperaturbereich ziemlich lang und nicht ganz billig sind, letztendlich
auch keine automatische Thermoregulation erlauben, außerdem mein Abi
geschafft ist und ich viel Zeit und wenig sinnvolles Praktisches
vorzuweisen habe, soll die Temperatursteuerung ein Atmega8 übernehmen.
Über ein Potentiometer wird eine Soll-Temperatur eingestellt, ein NTC
schnappt sich die Ist-Temperatur (beide Werte werden auf einem LCD
ausgegeben) und ein Relais schaltet die erforderliche Heizelektronik.
Soft- und hardwaremäßig stoße ich da bisher auf keine Probleme,
allerdings gefällt mir die Potentiometer-ADC-Angelegenheit vorn und
hinten nicht.
1 | int main(void) {
|
2 |
|
3 | // [...]
|
4 |
|
5 | ADC_init();
|
6 | uint16_t adcval, t_poti, t_step,
|
7 | t_max = 150, t_min = 40;
|
8 |
|
9 | // [...]
|
10 |
|
11 | t_step = (100 * (t_max - t_min)) / 1024;
|
12 | t_min = t_min * 100;
|
13 |
|
14 | while(1) {
|
15 | adcval = ADC_read(0);
|
16 | t_poti = ((t_step * adcval) + t_min) / 100;
|
17 |
|
18 | // [...]
|
19 |
|
20 | };
|
21 | }
|
t_max ist die maximale, t_min die minimale einstellbare Temperatur (in
°C). t_step gibt also an, um wieviel sich die Temperatur bei einer
Veränderung des 10-bitigen ADC-Wertes um 1 verändert, ist also die
Steigungskonstante für meine Geradengleichung t_poti(adcval) / 100.
Faktor und Dividend hundert, um was brauchbares bei Werten für t_step <
1 rauszubekommen.
Die Rundung, die ich dabei fabriziere, sorgt aber natürlich auch dafür,
dass meine Soll-Temperatur nur bis 142,4 °C statt genau 150 °C zu regeln
ist.
Wie kann ich die Angelegenheit schöner gestalten, dass ich meine
Temperatur auch tatsächlich aufs Grad genau im Intervall von genau t_min
bis genau t_max regulieren kann? Gleitkommazahlen sind mir, schon allein
weil die sich jawohl ohne größeren Rechenaufwand eher weniger mit meinem
Integer ADC-Wert vertragen, nicht besonders sympathisch. Die gesamte
Geradengleichungsangelegenheit scheint mir allerdings auch recht holprig
zu sein, eigentlich habe ich ja nur ein Intervall, in dem ständig ±1
gerechnet wird... Habe ich bei meinem Ansatz einen grundsätzlichen
Backstein vorm Kopf?! Ich freue mich auf Vorschläge!
Freundliche Grüße und schöne Feiertage,
Andreas