Forum: Mikrocontroller und Digitale Elektronik ATtiny kalibrieren anhand der internen Temperatur


von ?!? (Gast)


Lesenswert?

Hallo,

den internen Oszilator kann man, z.B. beim ATtiny 45, über einen 
externen Quarz kalibrieren.

IMHO ist auch der ADC-Wert des internen Temperatursensors von dem 
kalibrierten Wert abhängig.

Kann man, im Umkehrschluss, eine Kalibrierung dann auch über die 
Temperatur machen?

von clock (Gast)


Lesenswert?

?!? schrieb:
> den internen Oszilator kann man, z.B. beim ATtiny 45, über einen
> externen Quarz kalibrieren.

Wie stellst du dir den Ablauf vor?


?!? schrieb:
> IMHO ist auch der ADC-Wert des internen Temperatursensors von dem
> kalibrierten Wert abhängig.

Vom kalibrierten Wert des internen Oszillators? Wie kommst du darauf?


?!? schrieb:
> Kann man, im Umkehrschluss, eine Kalibrierung dann auch über die
> Temperatur machen?


Nicht IMHO

von ?!? (Gast)


Lesenswert?

clock schrieb:
> ?!? schrieb:
>> den internen Oszilator kann man, z.B. beim ATtiny 45, über einen
>> externen Quarz kalibrieren.
>
> Wie stellst du dir den Ablauf vor?

Ungefähr so wie in der Applicationnote von Atmel (AVR055: Using a 32kHz 
XTAL for run-time calibration of the internal RC) beschrieben.

> ?!? schrieb:
>> IMHO ist auch der ADC-Wert des internen Temperatursensors von dem
>> kalibrierten Wert abhängig.
>
> Vom kalibrierten Wert des internen Oszillators? Wie kommst du darauf?
>
Tja, wie komme ich darauf? Das war dann wohl wieder eine Mischung aus: 
Mein "perfektes" Englisch (aus dem Datenblatt übersetzt) und meinem 
Wunschdenken die Welt kann so einfach sein.

> ?!? schrieb:
>> Kann man, im Umkehrschluss, eine Kalibrierung dann auch über die
>> Temperatur machen?
>
>
> Nicht IMHO

Schade, Schade.

von Konrad S. (maybee)


Lesenswert?

Du legst von außen ein frequenzstabiles Signal an und misst per Timer 
die Periodendauer. Je nach Abweichung des Messwerts vom Sollwert 
manipulierst du OSCCAL. Den besten OSCCAL-Wert speicherst du zum 
Messwert des internen Temperatursensors. Diese Prozedur lässt du laufen, 
während du den µC aus dem Gefrierfach nimmst, während er langsam auftaut 
und auch noch während du ihn langsam mit dem Föhn aufwärmst. Du musst 
dir nur überlegen, wieviel (EEPROM-)Platz du hast und welchen 
Temperaturbereich du in welchen Schritten abdecken willst.

von clock (Gast)


Lesenswert?

?!? schrieb:
>> Wie stellst du dir den Ablauf vor?
>
> Ungefähr so wie in der Applicationnote von Atmel (AVR055: Using a 32kHz
> XTAL for run-time calibration of the internal RC) beschrieben.

Die AVR055 kannte ich noch nicht. Geht beim Tiny45 aber leider nicht da 
die Application Note einen asynchronen Timer/Counter voraussetzt.

von ?!? (Gast)


Lesenswert?

Sodele jetzt habe ich es (glaube ich) auch verstanden.

Der interne Oszilator ist zwar (auch) Temperaturabhängig. Aber der 
ADC-Wert des internen Temperatursensors hat nichts mit dem OSCCALC-Wert 
zu tun.

Ich hatte im Datenblatt nur gelesen, dass man den internen 
Temperatursensor kalibrieren kann. (Kalibrieren => Internen Oszilator 
kalibrieren)

Wenn man die AVR122 von Atmel überflogen hätte (Ja, hätte ich vorher tun 
sollen) begreift man (ich!) auch was hier gemeint ist. Der ADC-Wert ist 
ein Wert mit dem man dann rechnen kann um auf die reale Temperatur zu 
kommen.

Hierzu muss man den "offset" und den "gain" -Fehler ermitteln bzw. 
heraus rechnen.

von Konrad S. (maybee)


Lesenswert?

Ah, ich dachte, du willst den Oszillator kalibrieren. Jetzt ist es klar.

von ?!? (Gast)


Lesenswert?

Wollte ich ja auch. Nur mit einem Quarz ist mir das zu aufwendig?!?
Ich dachte: Ich messe die Umgebungstemperatur und korrigiere die Werte 
im ATTiny. Oder so.
Da haben mich auch die Werte im Datenblatt wohl ein wenig verwirrt.

Zurzeit läuft es ja auch im Testlauf ohne Kalibrierung.
Das sollen mal mehrere (3-10) kleine ATTinys am RS485-Bus werden. Das 
Ganze soll dann mal im Keller, eventuell draußen, hängen. Ich habe nur 
die Befürchtung, dass die Teile bei gewissen Temperaturen nicht mehr 
kommunizieren können, da das Timing der Soft-UART nicht mehr passt.
Bei 9600 Baud soll wohl nicht so viel passieren ...

Temperatur auslesen ist nur eine Übung um mehr "Gefühl" für MC zu 
bekommen und um es zu verstehen. Nebenbei auch ein lustiges Feature, nur 
muss ich das bei jedem Controller neu berechnen.

von Konrad S. (maybee)


Lesenswert?

?!? schrieb:
> Bei 9600 Baud soll wohl nicht so viel passieren ...

Der Fehler in der Baudrate ist in Prozent. Es spielt deshalb überhaupt 
keine Rolle, ob du ein Bit pro Sekunde überträgst oder eine Million Bits 
pro Sekunde. Nach einer gewissen Menge ohne Pause übertragener Bits sind 
die UARTs so weit auseinandergedriftet, dass Fehler auftreten. Dem 
kannst du entgegenwirken, indem du nach einer bestimmten Anzahl Bytes 
eine Pause einlegst oder eben dafür sorgst, dass die µCs mit möglichst 
gleichem Takt laufen, also Quarz (sehr genau) oder über einen 
temperaturkompensierten internen Oszillator, z.B. wie oben skizziert. 
Noch eine Möglichkeit wäre, mit adaptiver Baudrate zu arbeiten.

von Klaus (Gast)


Lesenswert?

Konrad S. schrieb:
> Nach einer gewissen Menge ohne Pause übertragener Bits sind
> die UARTs so weit auseinandergedriftet, dass Fehler auftreten.

Bei jedem Startbit wird der UART neu synchronisiert.

MfG Klaus

von Cyblord -. (cyblord)


Lesenswert?

Konrad S. schrieb:
> ?!? schrieb:
>> Bei 9600 Baud soll wohl nicht so viel passieren ...
>
> Der Fehler in der Baudrate ist in Prozent. Es spielt deshalb überhaupt
> keine Rolle, ob du ein Bit pro Sekunde überträgst oder eine Million Bits
> pro Sekunde. Nach einer gewissen Menge ohne Pause übertragener Bits sind
> die UARTs so weit auseinandergedriftet, dass Fehler auftreten. Dem
> kannst du entgegenwirken, indem du nach einer bestimmten Anzahl Bytes
> eine Pause einlegst oder eben dafür sorgst, dass die µCs mit möglichst
> gleichem Takt laufen, also Quarz (sehr genau) oder über einen
> temperaturkompensierten internen Oszillator, z.B. wie oben skizziert.
> Noch eine Möglichkeit wäre, mit adaptiver Baudrate zu arbeiten.

Mannomann du laberst vielleicht einen Quatsch daher:

1.) Natürlich spielt die Baudrate dabei eine Rolle. Da die Angaben (wie 
du ja schreibst, nur nicht kapierst) in Prozent sind. Bei 9600 Baud 
beträgt die Bitdauer 104 µS. Bei einem 5% Fehler darf man um 5,2 µS 
davon abweichen. Bei 115200 Baud beträgt die Bitdauer nur 8,68µS. 5% 
Fehler bedeutet hier 0,434µS also 434nS. Der Spielraum ist unendlich 
viel kleiner. Ein ungenauer Taktgeber spielt also weniger eine Rolle je 
niedriger die Baudrate ist.
2.) Wie Klaus schon schreibt, syncronisiert man beim Startbit, vor JEDEM 
Byte auf die Mitte des Impulses und somit können UARTS nicht 
auseinanderlaufen.

gruß cyblord

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hallo erstmal...

cyblord ---- schrieb:
> 1.) Natürlich spielt die Baudrate dabei eine Rolle.

Nein.

> Ein ungenauer Taktgeber spielt also weniger eine Rolle je
> niedriger die Baudrate ist.

Ebenfalls nein.

Es geht rein um das Verhältnis. Je länger ein Bit "dauert", desto größer 
wird auch der absolute Fehler einer Zeitbasis. Die Bitrate ist also 
unerheblich, es kommt rein auf den relativen Fehler an, den man 
beispielsweise in Prozent angeben kann.

> 2.) Wie Klaus schon schreibt, syncronisiert man beim Startbit, vor JEDEM
> Byte auf die Mitte des Impulses und somit können UARTS nicht
> auseinanderlaufen.

Das ist bei asynchroner Übertragung richtig, wenn es um das jeweils 
folgende Byte geht. Innerhalb eines jeden Bytes besteht das Problem aber 
weiterhin.

Trotzdem kann man natürlich mit einem unkalibrierten ATtiny seriell 
Daten übertragen. Man verlässt sich einfach nur auf die ersten 4 Bits 
eines jeden Bytes (das sind die niederwertigen 4 Bits). Dann müssten 
sogar bis zu 15% Fehler bei der Zeitbasis geschluckt werden können.

Eine zweite Möglichkeit ist, die empfangene Baudrate automatisch zu 
erkennen und diese dann auch beim Senden zu verwenden. Das hat Konrad S. 
ja schon vorgeschlagen ("adaptive Baudrate").

Schöne Grüße
Markus

von clock (Gast)


Lesenswert?

?!? schrieb:
> Zurzeit läuft es ja auch im Testlauf ohne Kalibrierung.
> Das sollen mal mehrere (3-10) kleine ATTinys am RS485-Bus werden. Das
> Ganze soll dann mal im Keller, eventuell draußen, hängen.

Alles, was mir zum Kalibrieren des Oszillators beim Tiny45 einfällt, ist 
einen Pin per Timer toggeln zu lassen und mit einem Frequenzzähler 
nachmessen. Mit OSCCAL Register korrigieren.

Temperaturabhängigkeit der Drift kann man über die Diagramme im 
Datenblatt abschätzen.

von Bassti (Gast)


Lesenswert?

clock schrieb:
> Alles, was mir zum Kalibrieren des Oszillators beim Tiny45 einfällt, ist
> einen Pin per Timer toggeln zu lassen und mit einem Frequenzzähler
> nachmessen. Mit OSCCAL Register korrigieren.

Das doch aber der selbe Takt! So funktioniert es, wenn man einen 
externen Takt einen Pin toggeln lässt oder durch einen Uhrenquarz wie in 
der Appnote...
Aber interne Temperatur messen bei gleichbleibender Spannung und dann 
nach Datenblatt kalibrieren klingt für mich auch ganz Sinnvoll... Kommt 
drauf an wie schlimm es wäre, wenn der UART mal nicht geht.

von Bassti (Gast)


Angehängte Dateien:

Lesenswert?

steht alles in der PDF...

von Bassti (Gast)


Lesenswert?

ach falscher Beitrag... jedenfalls das letzt ;)

von clock (Gast)


Lesenswert?

Bassti schrieb:
> Das doch aber der selbe Takt! So funktioniert es, wenn man einen
> externen Takt einen Pin toggeln lässt oder durch einen Uhrenquarz wie in
> der Appnote...

Der selbe Takt wie welcher Takt?

Der interne Oszillator des Tiny45 taktet einen internen Timer, der einen 
Pin toggeln läßt. Das wird mit einem Meßgerät nachgemessen und auf die 
interne Oszillatorfrequenz des Tiny zurückgeschlossen.

Die Appnote ist beim Tiny nicht anwendbar, da dieser keinen asynchronen 
Timer besitzt wie oben schon mal erwähnt.

von Konrad S. (maybee)


Lesenswert?

Hm, tja, also ...

Der Baudratengenerator des UARTs teilt den Takt auf (typischerweise) das 
16-fache der Baudrate. Mit dieser Frequenz wird der RX-Pin gesamplet. 
Beim ersten erkannten 0-Pegel wird ein Startbit angenommen und ein 
4-Bit-Zähler läuft los. Typischerweise wird bei drei 
aufeinanderfolgenden Zählerständen in der Mitte des Zählbereichs - also 
etwa bei 7, 8 und 9 - der RX-Pin abgetastet. Sind die Pegel gleich, wird 
das als ein Bit gewertet, andernfalls ist es ein Fehler.

Wenn nun der Sender einen etwas schnelleren Takt als der Empfänger hat, 
dann verschiebt sich der vom Empfänger abgetastete Bereich langsam immer 
weiter zum Ende der (Sender-)Bits und irgendwann kommt die Abtastung in 
das nächste Bit rein. Das liegt einfach daran, dass der 4-Bit-Zähler 
immer bis zum Ende zählt. Erst dann wird wieder nach einem Startbit 
Ausschau gehalten.

Die Situation für den Empfänger lässt sich verbessern, wenn der Sender 
dafür sorgt, dass ein Startbit sicher als Startbit erkennt werden kann. 
Dafür muss zwischen dem Ende des Stoppbits und dem Beginn des 
nachfolgenden Startbits soviel Zeit liegen, dass das Auseinanderdriften 
von schnellerem Sender und langsamerem Empfänger über den Zeitraum der 
ohne Pause übertragenen Bits (Start- und Stoppbits zählen mit) 
mindestens kompensiert wird. Eine Möglichkeit (bei z.B. ATmega) ist, 
beim Senden mit zwei Stoppbits zu arbeiten (auf Kosten der 
Nutzdatenrate). Eine andere Möglichkeit ist, nach einer gewissen Anzahl 
gesendeter Bytes eine kleine Pause einzulegen (Dauer: ein Byte incl. 
Start- und Stoppbit).

Je höher die Baudrate ist, desto schwieriger wird es für den 
Baudratengenerator das 16-fache der Baudrate genau zu erzeugen. Deshalb 
nimmt man gerade für hohe Baudraten gern einen Quarz mit scheinbar 
"krummer" Frequenz. Aber mit ein paar Vorkehrungen gehen auch 115200 
Baud mit internen Oszillator ganz gut.

Unterm Strich: Die Mikrosekunden pro Bit spielen keine Rolle, es geht um 
die 16 Takte, die der Baudratengenerator pro Bit liefert.

@cyblord
Wenn du UART-Beschreibungen hast, die etwas anders sagen, dann lass es 
mich wissen.
(Ja, mir ist bekannt, dass der UART im ATxmega noch etwas mehr 
draufhat.)

von Konrad S. (maybee)


Lesenswert?

clock schrieb:
> Alles, was mir zum Kalibrieren des Oszillators beim Tiny45 einfällt, ist
> einen Pin per Timer toggeln zu lassen und mit einem Frequenzzähler
> nachmessen. Mit OSCCAL Register korrigieren.

Im Prinzip: ja.
Nur würde ich die Sache umdrehen und - wie oben beschrieben - ein 
möglichst präzises Referenzsignal an den µC anlegen. Sagen wir mal mit 
1Hz. Dann sollten bei ungeteiltem internem Oszillator für jede Periode 
des Referenzsignals 8000000 Takte vergehen, die per Timer plus 
Overflow-Interrupt gezählt werden. Jetzt kann man den OSCCAL-Wert 
ändern, bis die Abweichung vom Sollwert minimal wird. Diesen OSCCAL-Wert 
speichert man für die Temperatur, die der interne Temperatursensor 
misst. Macht man das über den vorgesehenen Einsatztemperaturbereich, 
dann bekommt man einen temperaturkompensierten internen Oszillator: 
Gelegentlich die Temperatur messen und ggf. den dazugehörigen 
OSCCAL-Wert setzen.

von clock (Gast)


Lesenswert?

Konrad S. schrieb:
> Nur würde ich die Sache umdrehen und - wie oben beschrieben - ein
> möglichst präzises Referenzsignal an den µC anlegen. Sagen wir mal mit
> 1Hz. Dann sollten bei ungeteiltem internem Oszillator für jede Periode
> des Referenzsignals 8000000 Takte vergehen, die per Timer plus
> Overflow-Interrupt gezählt werden.

OK, verstanden. Danke.

von Purzel H. (hacky)


Lesenswert?

Es ist nicht nur die Temperatur, die den Oszillator beeinflusst, auch 
die Spannung. Wenn die Leute sich keinen Quarz fuer 15 cents leisten 
koennen, werden sie auch nicht einen so stabilen Spannungsregler 
vermoegen...
NB. Die Appnote von atmel ist verbesserungswuerdig.

http://www.ibrtses.com/embedded/avrosccal.html

von Konrad S. (maybee)


Lesenswert?

Delta Oschi schrieb:
> Es ist nicht nur die Temperatur, die den Oszillator beeinflusst, auch
> die Spannung. Wenn die Leute sich keinen Quarz fuer 15 cents leisten
> koennen, werden sie auch nicht einen so stabilen Spannungsregler
> vermoegen...

Es sind nicht die "sündteuren" Quarze, sondern die zwei benötigten Pins 
für das Anschließen des Quarzes bei einem ATtiny25/45/85. 
"Verdrahtungsaufwand" und Platinenfläche wären noch Argumente.

> NB. Die Appnote von atmel ist verbesserungswuerdig.

Ja, davon gibt es einige. Aber als Anregung sind die Appnotes gut zu 
gebrauchen.

> http://www.ibrtses.com/embedded/avrosccal.html

Danke für den Link.

von Bassti (Gast)


Lesenswert?

Also mit dem Source von Atmel (aus der Appnote) hab ich mal folgendes 
getan:

Beitrag "GPS Wanze - Tiny GPS"

Kann ?!? sich ja mal anschauen, ist nicht wirklich schwierig mit dem 
Uhrenquarz.

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.