Forum: Projekte & Code Farbthermometer tiny13 asm


von Frank D. (Firma: Spezialeinheit) (feuerstein7)


Angehängte Dateien:

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:HSV-RGB-comparison.svg&filetimestamp=20060830160028)
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.

von Horst H. (horha)


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.
1
        ADC       rot   gruen   blau
2
gplus :   0.. 64  0     0..63   63     :eiskalt
3
bminus:  64..127  0     63      0..63  :kalt
4
rplus : 128..191  0..63 63      0      :warm
5
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
1
ldi rot,0          ; rote LED bleibt aus
2
    ldi blau, 63        ; blau LED bleibt an
3
    mov gn, temp2        ; grüne LED erhält AD Wert von 0...63
4
    rjmp end
einfach nur einen Vergleich mit Farbcount.
1
//Bei Dir PortBMaske = temp in Ausgabe
2
   //Zu Beginn alle relevanten einschalten
3
   ldi PortBMaske ,Rot_AN OR Gruen_AN OR Blau_AUS ;
4
   //Bei PWMCount=Farbcount bei der PortBmaske logisch mit PWMMAske
5
   //um passende Farbe aus zu schalten
6
   ldi PWMMaske,Gruen_AUS;
7
   mov FarbCount, temp2;

von Frank D. (Firma: Spezialeinheit) (feuerstein7)


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.

von Horst H. (horha)


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_characteristics_de.pdf
Aber die Kurven sind extrem nichtlinear.

Wenn man etwas rechnet kommt man zu solchen Größen:
http://www.umnicom.de/Elektronik/Mikrokontroller/Atmel/AtFan/AtFan.html#2.2.2
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 ;-)

von Frank D. (Firma: Spezialeinheit) (feuerstein7)


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?

von Horst H. (horha)


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/Atmel/AtFan/AtFan.html#2.2.2 
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.

von Frank D. (Firma: Spezialeinheit) (feuerstein7)


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 :)

von Horst H. (horha)


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.
1
            ADC-Konst    rot     gruen    blau
2
Zone   I :   0..  V-1   V-1..0      0       V   : Violett-> Blau
3
Zone  II :   V..2*V-1      0     0..V-1     V   : Blau   -> Türkis
4
Zone III : 2*V..3*V-1      0        V    V-1..0 : Türkis -> Grün
5
Zone  IV : 3*V..4*V-1   0..V-1      V      0    : Grün   -> Gelb
6
Zone   V : 4*V..5*V-1      V     V-1..0    0    : Gelb   -> Rot
7
//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.

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.