Genauigkeit interner Oszillator Mega8 ...

Gast #432069
Lesenswert?

Hallo,
ich benötige einen Timer der maximal 30 Minuten (+/- 5 Sekunden kein 
Problem) läuft (Pumpe an).
Die Hardware besteht aus einem Mega8 dessen Pins VOLLSTÄNDIG belegt 
sind.
Daher läuft er mit internem Oszillator bei 1MHz.
Prescaler auf 64 = 15625 =>  8bit Timer => 15625/256 = 61,035...
Also Zähler bei 61 ungefähr 1 Sekunde.
Abweichung 9 Ticks pro Sekunde, ca. 1 Sekunde pro 30 Minuten.
So ich mich nicht gerade verrechnet habe ;)
Wahrscheinlich bin ich nur zu blöd im Datenblatt eine Kennkurve o.ä. für 
die Abweichung des interen Oszillators zu finden.

Zusammengefaßt:
- Der Controller ist ein Mega8, OHNE freie Pins
- Umgebungstemperatur schwankt zwischen 20°C und 45° C
- Es muß ein Timer 30m laufen mit maximaler Abweichung von 5s
- Timer0 wie folgt initialisiert:     TCCR0 = (1 << CS00) | (1 << CS01);
- In IRQ Variable auf 61 ca. 1 Sekunde abgefragt

Frage, wie stark ist die Abweichung des internen Oszillators bei 45°C 
Umgebungstemperatur ?
Erfahrungwerte oder Kennline gefragt.
Danke,
Markus
Gast #432112
Lesenswert?

OK,
also bei 45°C wären es dann statt 1MHz nur noch ca. 950kHz.
15625-14843,75 = 781,25 Ticks Abweichung :(
Paßt nie, irgend eine Idee wie das ausgeglichen werden könnte ?
Temperatursensor fällt allerdings aus :(
Seh' schon dann wird wohl extern was abgefragt werden müssen :(
Danke ;)
#432122
Lesenswert?

Hast du evtl. ein periodisches externes Signal zur Verfügung, mit dem du 
den AVR on-the-fly kalibrieren kannst?

Z.b. Nulldurchgangs-IRQ bei Phasenanschnittssteuerung. Da kann man dann 
schön das OSCCAL-Register danach stellen.

Alternativ könnte man dann ja aber auch gleich die 50Hz für den Timer 
nehmen...
Gast #432131
Lesenswert?

Sollte auf der Platine noch Platz für ein 8-Eingangs-Multiplexer-IC [*] 
sein:  Damit kannst Du auf einfachste Weise mit einem geschätzten 
Aufwand von 10 Codezeilen Assembler acht digitale Eingänge über vier 
Leitungen einlesen (drei µC-Ausgänge um 0...7 an den Multiplexereingang 
zu legen, und einen µC-Eingang fürs Multiplexer-Ausgangssignal).  Dann 
hättest Du vier µC-Pins frei. Wäre das eine Lösung für Dein Problem?

[*] 74HCT251, 16 Pin, 0.31 € bei Reichelt
Gast #432156
Lesenswert?

OK,
dann mal wie's insgesamt aussieht:

- Fertig aufgebautes Board, KEINE Erweiterungsmöglichkeiten
- PortB komplett durch 8bit ADC verwendet
- PortD komplett durch 8bit ADC verwendet
- PortC steuert via Software PWM zwei Pumpen PC0&PC1 (ist so :( )
- PortC Pin5&4 ist TWI=I2C Slave
- PortC Pin2&3 ebenfalls ADC
- Frei nur noch PC6

Aufgabe:
Dritte Pumpe soll 30 Minuten angehen, wenn Steuerwert an ADC PC2 
bestimmten Schwellwert erreicht hat.

Mir ist es NICHT möglich irgendetwas an der Hardware zu ändern :(
Weil alleine wegen Software PWM würde ich ja gerne ......

Also nach dem Diagramm auf S272 wären bei -20°C bis +20°C bei 5V eine 
Differenz von 200kHz => bei +/-5° Temperaturänderung +/- 25kHz 
Unterschied.
Stimmt's oder Verpeil ich da wieder was ?

20°C = 1,1 MHz
25°C = 1,075 MHz
30°C = 1,05 MHz
35°C = 1,025 MHz
40°C = 1 MHz
45°C = 0,975 MHz

Nur paßt das irgendwie nicht mit dem Diagramm überein :(

Trotzdem bei 20°C wären es ca. 278 Sekunden mehr pro 30 Minuten !
Bei 40°C die besagte 1 Sekunde weniger.

Die drei Prozent Schwankung macht bei den angenommenen 25kHz/5° ca. +/- 
750Hz aus, wäre also vernachlässigbar ;)

Also die Idee mit der konstanten Temperatur ist ja schon ganz nett ;)
Fragt sich jetzt nur auf wieviel °C ich den µC temperieren soll ?

Danke,
Markus
Gast #432167
Lesenswert?

du hast ja 1 MHz also bei mir auf Seite 277

bei 5V VCC ?! hat ist er auf 1MHz kalibriert,
und bei 45°C sinds etwa 0,99MHz (im schlechtesten Fall).
der Fehler liegt als0 bei max 1% (mit etwas Glück sinds 0,5%.
1% von 30min sind 18 sec, wie mans dreht und wendet ;-)
Beheizen würde ich Ihn auf mind 45°C, dann musst du deine Software aber 
darauf abstimmen)

Die Temperatur auf +-5°C einzuhalten müsste einfach machbar sein,
dann bist du in deinem Genauigkeitsbereich.

Peter
Gast #432279
Lesenswert?

Ist sonst 'nen I2C Baustein möglich? z.B. ein Uhrenbaustein. Dann müßte 
der Atmega nur einmal als master reagieren und könnte über Pin
ein mal programmieren, dann kann er in 30 min 'nen "int" geben und z.B. 
PC6 auf low ziehen lassen.
problem: der Atmel tritt halt eben als zweiter master am I2C bus auf, 
was vom prinmzip aber kein problem sein sollte. (ist der andere master 
multimasterfähig oder kann man irgendwie realisieren, dass der master zu 
der zeit, wenn der atmel als master auftreten will, definitiv nicht auf 
den bus schreibt?)

Alternative:
über PC6 signalisieren, dass man in 30 min 'nen I2C datum bekommen 
möchte, die Uhr kann dann auf dem I2C master laufen.
#432471
Lesenswert?

Markus wrote:

> - PortB komplett durch 8bit ADC verwendet
> - PortD komplett durch 8bit ADC verwendet


Oh Gott, wer denkt sich denn bloß sowas aus.

Soll das ein Schildbürgerstreich sein ?

Reiß einfach die ollen 8Bit-ADCs raus und zieh nen Draht zu den internen 
ADC, schon hast Du 14 Portpins übrig.


Peter
Gast #434662
Lesenswert?

... was haltet ihr von einem I2C Thermometer (z.B. LM75 oder DS1621). 
Das koennte man an die schon vorhandenen TWI-Pins haengen. Den Timer 
koennte man denn an die Temperatur anpassen.
Ob sowas funktioniert, habe ich keine Ahnung. ;-)

Karsten
Gast #434841
Lesenswert?

Bevor du den Aufwand mit der Temperaturkompensation betreibst, überleg' 
lieber ob du nicht 'n Quarz dranhängst! Dann ist das Teil sehr genau. 
Mit Timer1 (16 bit), CTC-Mode, Teiler /1024 (16MHz) und OCRxA auf 15624 
(nicht 15625, es wird von 0 ab gezählt!) und der OC-Interrupt kommt 
exakt jede Sekunde!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren