Forum: Mikrocontroller und Digitale Elektronik Potentiometer, ADC und Werteverwertung


von Andreas S. (drohgebaerde)


Lesenswert?

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

von Andreas S. (drohgebaerde)


Lesenswert?

Ist mein Text zu lang? :-)

Schönen Abend,
Andreas

von Oliver (Gast)


Lesenswert?

Aus 2 Gründen kommst Du nicht auf einen Maximalwert von 150. Zum einen 
wird die Konstante t_step stark abgerundet (von 10,74 auf 10), zum 
anderen liefert der ADC ja maximal 1023. Selbst wenn Du mit 
Gleitkommazahlen arbeiten würdest, hättest Du erst bei einem ADC-Wert 
von 1024 den Maximalwert 150 erreicht. Ein Ansatz wäre daher, t_step auf 
11 zu erhöhen. Dann würde Dein Maximalwert jedoch bei 152 liegen.
Besser wäre es, Soll- und Istwert nicht als Temperaturwerte in Celsius 
zu vergleichen, sondern den gemessenen Temperaturwert in den Bereich von 
0 .. 1023 zu verschieben, weil Du dann die 10 Bit - Auflösung des ADC 
beibehalten kannst. In Deiner Variante beträgt die Auflösung etwas 
weniger als 8 Bit. Eine Temperaturerhöhung von (t_max-t_min)/(1024-1) 
sollte den so skalierten Istwert um 1 erhöhen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.