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.
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
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.
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 ;-)
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?
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.
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 :)
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.