Forum: Mikrocontroller und Digitale Elektronik Temperatur auslesen mit µC mithilfe eines A / D Wandler


von House M. (houseman)


Lesenswert?

Hallo zusammen,

ich versuche für mein C-Programm die Temperatur von dem Sensor KTY81-251 
über eine  A / D – Wandler auf ein Terminal zu übertragen.
Der A / D – Wandler hat eine Auflösung von 1023 Stufen ( 2 ^10  - 1 ) 
und wandelt von 0 V bis 2,5 V.
Als Beispielswert ist am Eingang des A / D – Wandlers ein Wert von 400 
mV gegeben.


Programmausschnitt:

unsigned int mw_erf10(unsigned char kanal)

  {

    unsigned int erg;                       // Variable für 10-Bit 
Wandlungsergebnis

    ADCON = (ADCON & 0xe8);                 // Kanalauswahl und 
Wandlungsende-Bit rücksetzen!

    ADCON = (ADCON | (0x08+kanal));         // Kanalauswahl und Start 
der einmaligen Wandlung!

    while((ADCON & 0x10) == 0);             // Warte bis A/D-Wandlung 
beendet ist!

    erg = ((ADDH << 2) + (ADDL & 0x03));    // Ergebnisregister auslesen 
u. zusammenbauen!

    return(erg);

  }


Im Main-Teil :

wert = mw_erf10(3);  // Umwandeln in Digital

wandel10= wert;

temp = wandel10 / (0.0125 /(2.5/1023));   // Berechnung der Temperatur


Dabei ist  sind die Variablen wert ( unsigned int ) und die Variablen 
wandel10 und temp (float).

Das Programm gibt bei mir bis jetzt 0 Grad raus.
Wenn man die Temperatur mit Hand ausrechnet kommt man auf eine logische 
Temperatur, z.B. liegen 245  mV am A D Wandler an kommen ca. 19,6 ° raus 
oder bei 400 mV ca.  32°.
Also stimmt etwas mit der Wandlung am A / D Wandler meiner Meinung nach 
nicht.

Hat jemand einen Tipp, Vorschlag oder Verbesserung?

Danke im vorraus ☺

von Bernhard S. (b_spitzer)


Lesenswert?

Wie ist der Sensor beschaltet??
Die Zeile sollte besser so aussehen:
wandel10= (float)wert;

von House M. (houseman)


Lesenswert?

Danke.

Also der Sensor wird über einen Operationsverstärker TL064 geschaltet 
und das Signal wird dann an den A/D-Wandler gegeben.

von µC-Bastler (Gast)


Lesenswert?

House Man schrieb:
> Dabei sind ... die Variablen wandel10 und temp (float).
Schlechter Plan, zumindest auf einem µC. Wozu brauchst du Float. Das 
kostet nur Flash-Speicher und Rechenzeit.
Oder rechnest du damit, dass dein Temperatursensor spontan Werte im 
µ°C-Bereich auf 6 Dezimalstellen verarbeiten können muss - was alleine 
der Sensor auf Grund seiner Genauigkeit nicht her gibt - und wesentlich 
über 100°C kommt er auch nicht?

von Karsandra (Gast)


Lesenswert?

µC-Bastler schrieb:
> Schlechter Plan, zumindest auf einem µC. Wozu brauchst du Float. Das
>
> kostet nur Flash-Speicher und Rechenzeit

Float ist nicht unbedingt schlecht. Temperaturen mist man selten 
schneller als eine Sekunde. Da hat selbst ein Tiny alle Zeit der Welt 
eine Float-Emulation schnell genug zu berechnen. Und die 4 Byte xfür 
eine Float-Variable + 4Bytes für eine Hilfsvariable werden sich da auch 
noch finden lassen.

Ich habe 2005 begonnen, analoge Temperaturerfassungen zu entwickeln. Ich 
habe diese Strategie sehr schnell verworfen, weil die hinreichend 
angemessene Kalibrierung (Korrekturberechnung) meine Möglichkeiten 
überfordert hatten. Selbst diese Linearen Sensoren wie LM35 etc. müssen 
im Offset verschoben werden, um negative Temperaturen messen zu können.

Ich bin dann auf die Dallas-Sensoren DS1820 etc. gestossen. Die verfügen 
über eine digitale Schnitstelle (1-Wire-Protokoll). Es gibt genügend 
Codebeispiele, die man als ausreichend erprobt ansehen kann. Der Vorteil 
ist, dass der ausgelesene Wert nur noch skalliert werden muss. 
Nichtlinearitäten sind weitestgehend ausgeglichen.

Alternativ gibt es noch die Sensoren von Sensirion SHTxx. Die bieten 
nicht nur eine Temperaturerfassung sondern erlauben auch eine relative 
Feuchtigkeitsmessung. (Diese Kombination fand ich ganz interessant)

Ich hoffe mein Beitrag zeigt die Möglichkeiten auf Alternativen auf. 
Natürlich möchte ich Dir den Spaß des selbser Herausfindens nicht 
nehmen.
;-)
Wenn Du allerdings irgendwann für Dich feststellst, dass es 
Zeitverschwendung ist, dann hast Du jetzt Perspektiven.

Viel Spaß und Viel Erfolg.

von Temp (Gast)


Lesenswert?

Berechnung prüfen, statt einer Zeile besser in mehrere aufteilen, und 
dann jeden Rechenschritt einzeln checken.

Wenn du das debuggen willst, musst du hält jeden Einzelschritt 
kontrollieren...

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.