mikrocontroller.net

Forum: Projekte & Code Farbthermometer tiny13 asm


Autor: Fred Feuerstein (feuerstein7)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Farbthermometer mit tiny13 in asm. Basierend auf der Soft-PWM Routine in 
Tutorial. Eine RGB-LED mit gemeinsamen Pluspol wird an PB0 bis PB3 
angeschlossen (0=blau, 1=grün, 2=rot). Am Eingang (PB4) ist ein 
Spannungsteiler bestehend aus einem Temperaturabhängigen Widerstand an 
Vcc und einen 1k an Masse geschaltet. Die Farbdarstellung ist von 
Wikipedia „HSV-RGB-comparison“, es wird der Bereich im Winkel von 0° bis 
240° dargestellt. 
(http://de.wikipedia.org/w/index.php?title=Datei:HS...)
Bei Temperaturerhöhung ändert sich die Farbe „stufenlos“ von blau, 
türkis, grün, gelb, orange bis rot. Es wird bis auf dem AD-Converter 
keine spezielle Hardware genutzt, somit sollte das auch leicht auf 
anderen AVRs laufen.
Viel Spaß damit.

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

was für ein NTC (1 k oder 10k Ohm ) wird denn benutzt und welcher 
Wertebereich am ADC ergibt sich: 0..1023 oder 0..255 ?
Kann man den ADC nicht vor dem PWM starten und dann nach der PWM routine 
auf den ADC warten, der müsste doch dann schon fertig sein.
Für die PWM Routine fällt mir was anderes auf:
Eine Farbe ist immer aus, eine andere immer an und nur eine wird 
überhaupt variiert.
        ADC       rot   gruen   blau
gplus :   0.. 64  0     0..63   63     :eiskalt
bminus:  64..127  0     63      0..63  :kalt
rplus : 128..191  0..63 63      0      :warm
gminus: 192..?    63    0..63   0      :heiss

Für das PWM reicht es also, eine Maske zu erstellen, welchen Pin an Port 
B das PWM betrifft. die anderen liegen ja schon fest auf 0 oder 1.
Also statt
ldi rot,0          ; rote LED bleibt aus
    ldi blau, 63        ; blau LED bleibt an
    mov gn, temp2        ; grüne LED erhält AD Wert von 0...63
    rjmp end 
einfach nur einen Vergleich mit Farbcount.
//Bei Dir PortBMaske = temp in Ausgabe
   //Zu Beginn alle relevanten einschalten
   ldi PortBMaske ,Rot_AN OR Gruen_AN OR Blau_AUS ;
   //Bei PWMCount=Farbcount bei der PortBmaske logisch mit PWMMAske
   //um passende Farbe aus zu schalten
   ldi PWMMaske,Gruen_AUS;
   mov FarbCount, temp2;

Autor: Fred Feuerstein (feuerstein7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Der NTC ist einer der gerade da war. Er hat eine blaue Gehäusefarbe mit 
einem weißen Farbpunkt. (Immer diese tolle Beschriftung kleiner 
Bauteile) Ich habe auch keine Kennlinie aufgenommen, da ich keine 
Regelbare Temperaturquelle greifbar hatte. Die Werte  die ich habe:
100k bei Eisspray, 10k bei Raumtemp, und 5k in der Nähe der 
Lötkolbenspitze. (Den Festwiderstand hab ich inzwischen gegen ein Poti 
getauscht, so kann man das besser abgleichen)
Der ADC liefert Werte von 0...1023, die oberen beiden Bytes werden aber 
nicht genutzt, Grund dafür ist die Verwendung von Akkus als 
Spannungsquelle. Da der Spannungsteiler nicht den ganzen Bereich 
zwischen 0V und Vcc abdecken kann sollte die Ref. Spannung möglichst 
klein sein. Bei interner Vref (1,1V) würde das Ergebnis von der 
Eingangsspannung abhängen. Also Vcc als ‚Vref bei Vcc=3.6V ergibt sich 
so eine maximale AD-Spannung von:
3.6/1024*256=0.9V.
Das mit dem AD-Wandler stimmt, ich habe jetzt GET_AD und wait_AD in der 
Reihenfolge getauscht und unter count den Aufruf in rjmp wait_ad 
geändert. (Ich glaube langsam Assemblerprogrammierer sind alles 
Speedfreaks :))
Ja auch das mit der LED Steuerung stimmt, Grund ist eigentlich nur die 
Reihenfolge in der das Programm entstanden ist. Erst war da die 
Soft-PWM, später entstand der Rest. Es gibt halt immer mehrere Lösungen, 
sicher auch bessere aber so ging’s halt auch.  Das im Endeffekt nur eine 
LED gedimmt wird war mir Anfangs noch nicht klar, dies zeigte sich erst 
nachdem ich ein passendes Farbschema gefunden hatte welches den Eindruck 
von kalt bis warm vermittelt.

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich finde die Umrechnung in einen Farbwert anschaulich und gut gelungen.
Kann der Attiny 13 nicht auch in einer Art 8-Bit Modus betrieben werden?
Damit wäre der Temperaturbereich weiter.
[Zitat]
The ADC generates a 10-bit result which is presented in the ADC Data 
Registers, ADCH and ADCL. By default, the result is presented right 
adjusted, but can optionally be presented left adjusted by setting the 
ADLAR bit in ADMUX.
If the result is left adjusted and no more than 8-bit precision is 
required, it is sufficient to read ADCH.[/Zitat]

Denn bei einem R_Ntc= 10 kOhm ( @ 25 Grad C ) NTC und einem 
Spannungsteilerwiderstand von R_Fuss von 1 kOhm , darf R_Ntc auch 
kleiner 4 kOhm etwa 40..50 Grad C werden.
Siehe http://www.fuehlersysteme.de/resistance_characteri...
Aber die Kurven sind extrem nichtlinear.

Wenn man etwas rechnet kommt man zu solchen Größen:
http://www.umnicom.de/Elektronik/Mikrokontroller/A...
Der bestimmt RP so, das die Abweichung in seinem Messberecih besonders 
klein wird.
Am Ende hat er eine Formel für T = Steigung * Ua + OffSet ( steht die da 
irgendwo, auch wenn sie es ist? )

Das ist natürlich mit Kanonen auf Spatzen geschossen, auf ein Grad genau 
zu gucken.
Aber warum nicht, es ist ja noch Platz da ;-)

Autor: Fred Feuerstein (feuerstein7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
der AD-Wandler läuft immer mit 10bit Auflösung, es kommt nur drauf an 
wie viel Bit (und welche) verwendet werden. Bei ADLAR=0 (rechts 
ausgerichtet) sind Bit 0...7 in ADCL und Bit 8...10 in ADCH. Bei ADLAR=1 
(links ausgerichtet) sind Bit 2...9 in ADCH und Bit 0..1 in ADCL. Wenn 
nur 8Bit gebraucht werden, wird Bit0 und Bit1 ignoriert. Ich mach’s hier 
andersrum, rechts ausgerichtet und Bit9 und Bit8 werden ignoriert. 
Warum? Weil ich die großen Werte nicht haben will dafür aber eine 
feinere Auflösung, also liefert der AD Werte von 0...255.
Zum NTC so wie ich das verstehe geht es dort um Linearisierung, das wird 
aber nicht im Code erledigt sondern durch ein kleines 
Widerstandnetzwerk. Eigentlich kommt ein R parallel zum NTC und einer zu 
den beiden in Reihe. Die Dimensionierung hängt allerdings vom 
Temperaturbereich und vom NTC selber her ab.
Die Auflösung muss aber nicht immer linear sein, da die Darstellung in 
Farben und nicht in Zahlen erfolgt. Wenn es linear sein soll gäbe es 
noch mehrere Lösungen:
-  Wertetabelle, in Software Funktion einbinden welche die Werte 
annährend liniearisiert
-  Anderen Sensor verwenden
-  Digitalen Temperatursensor (DS1621 oder so)
-  Hardware Lösung durch R-Netzwerk
Wofür sollst den sein, PC CPU Temp?

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eigentlich für ein Aussenthermometer von -10..+30 Grad für einen 
Schalter mit Glimmlampenfenster.
Darunter oder darüber ist es eh' viel zu kalt oder warm ;-)

Deine Benutzung von 0..0.9 Volt ist ja von der Auflösung auch nur ein 
Viertel von 3.6 V, genau wie mein Vorschlag nur die oberen 8-Bit der 
10-Bit zu nutzen, bei Ausnutzung von 0..3.6 V.

Wenn ich wie Spannung wie in 
http://www.umnicom.de/Elektronik/Mikrokontroller/A... 
messe, bekomme ich

Bei einem NTC 10 kOhm mit B = 3920 ergibt sich
Ru(-10°)= 57,47 kOhm
Rm( (-10+30)/2 = 10 °)= 20,07 kOhm
Ro(30°) = 8,05 kOhm


ergibt Rp=15,344 kOhm
Ua(min = -10°) = 0,21073... * Uein
Ua(max =  30°) = 0,65589... * Uein

Also wird nur ein Spannungsbereich von 0.445 * Uein wird überstrichen, 
entsprechend ADC-Werte von 215 bis 672 bei ADCref= Uein nur 457 ADC 
Werte.
Mit den 4 Winkelbereichen ergibt sich ja dennoch eine mögliche Auflösung 
von ~114 Werten pro Bereich, also könnte der PWM einen TOP-Wert von 114 
haben.
400 Farbwerte für 40 Grad ist reichlich.

Autor: Fred Feuerstein (feuerstein7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die Verwendung von Vcc als Referenzspannung hat sich bei mir nur deshalb 
ergeben, weil ich die Schaltung mit Solarzelle und Akku versorge. 
Schwankungen in der Betriebsspannung würden also bei interner 
Referenzspannung das Ergebnis beeinflussen. Wenn die Schaltung aber mit 
konstanter Spannung betrieben wird bietet sich natürlich an die interne 
Vref zu nutzen. Bei einen Rp von 15,344kOhm würde ich auf jeden Fall zum 
Poti raten :)

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Vein als Vref hat bei dem Spannungsteiler den großen Vorteil, dass die 
Werte des ADC bei langsamen Spannungsschwankungen gleich bleiben.
Ich habe festgestellt, das meine Temperaturzonenaufteilung mir nicht 
passt.
Ich hätte gern grün für 20 Grad.
Oben habe ich reines grün bei 10 Grad.
Wenn man die Zonen anders aufteilt muss ich eben andere Konstane 
bestimmen.
Statt eines Offset von = bei Dir und 215 bei mir und einem V von 64 bei 
Dir und 114 bei mir, kann man es ja allgemeiner machen.
Ich habe eine Zone hinzugenommen. Zone I ist sozusagen eiskalt :)
Zone VI finde ich schlecht nutzbar.
            ADC-Konst    rot     gruen    blau
Zone   I :   0..  V-1   V-1..0      0       V   : Violett-> Blau
Zone  II :   V..2*V-1      0     0..V-1     V   : Blau   -> Türkis
Zone III : 2*V..3*V-1      0        V    V-1..0 : Türkis -> Grün
Zone  IV : 3*V..4*V-1   0..V-1      V      0    : Grün   -> Gelb
Zone   V : 4*V..5*V-1      V     V-1..0    0    : Gelb   -> Rot
//ZoneVI : 5*V..6*V-1      V        0    0..V-1 : Rot    -> Violett

Grün ist der Übergang von Zone III->IV
Wenn ich dort 20 Grad haben will und -10 Untergrenze für Zone I belasse 
habe ich pro Zone dT = 10 Grad.Also muss ich die Obergrenze von Zone V 
auf 40 Grad erhöhen.Welch Glückes Geschick, O Grad entspräche reinem 
blau.

Damit ändern sich Ro,Rm-> Rp .Aber egal, alles machbar.
Mein V wäre dann (Adc(max)-Adc(min)-Wert) / (Anzahl der Zonen).
Bei Dir war es ja 256/4 = 64

Vielleicht sollte ich eine Exceltabelle pinseln für verschiedene B-Werte 
und Tu/To und R_ntc des Thermistors und damit Rp und die Abweichungen 
bestimmen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.