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 |
5 | //um passende Farbe aus zu schalten |
6 | ldi PWMMaske,Gruen_AUS; |
7 | mov FarbCount, temp2; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.