Forum: Mikrocontroller und Digitale Elektronik Frequenzgenauigkeit ohne Quarz mit int. Oszillator


von Daniel (Gast)


Lesenswert?

Hallo,

ich habe folgende Frage:
Mein momentaner Versuchsaufbau:
Atmega8 interner Oszi gibt einen Takt vor und toggelt einen Pin mit 
20Hz.
Ein weitere Atmega8 mit interem Oszi liest das Signal des getoggelten 
Pins über ICP ein und misst die Zeit in Timerwerten (Endzeit-Startzeit).

Nun habe ich zur Genauigkeitsprüfung eine einfaches Programm 
geschrieben. Es berechnet sich die Zeit  zwischen 2 Flanken, speichert 
die berechnete Zeit in einer weiteren Variable. Im nächsten Durchgang 
wird geprüft ob die neue Zeit in einem Bereich der alten Messzeit liegt.
Ich bekomme hier allerdings nur in einen Genauigkeitsbereich von 1024 
(Gesamtzeit-512 bis Gesamtzeit+512). Alles was einen engeren Bereich 
definiert leuchtet die LED nur sporadisch (z.B. Gesamtzeit +/- 64).
1
  Gesamtzeit = EndTime - StartTime;
2
3
  if (GesamtzeitSicherung > (Gesamtzeit-512) && (GesamtzeitSicherung < (Gesamtzeit+512))){
4
    PORTLED &= ~( 1 << LED); // wenn die Zeit in dem Bereich liegt, LED einschalten
5
  }
6
  else{
7
    PORTLED |= ( 1 << LED ); // sonst LED ausschalten
8
  }
9
  
10
  GesamtzeitSicherung = Gesamtzeit;   // Zeit ist nun die neue Zeit für den Vergleich der nächsten Messung

Nun ist meine Frage, ob man mit dem internen Oszi einfach keine 
genaueren Ergebnisse erwarten kann (es geht hier nicht um Absolutzeiten, 
sondern um relativen Zeiten von einer Messung zur darauf folgenden) oder 
ob irgendwo in meiner Zeitberechnung der Wurm drin steckt.
Ich habe im Moment leider keinen Quarz zur Hand, um das auszutesten.

Danke und einen guten Rutsch.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1. Man sieht ja deine Definition der Variablen nicht, deshalb: Bist du 
sicher, dass die Datentypen so definiert sind, dass bei den Berechnungen 
und Vergleichen keine Überläufe passieren und keine Probleme mit dem 
Vorzeichen auftreten?

2. Man sieht ja nicht wie die Zeitmessung (Herkunft von EndTime und 
StartTime) implementiert ist: Bist du sicher, dass die richtig ist, z.B. 
mit einer unabhängigen Quelle funktioniert die Messung?

von Daniel (Gast)


Lesenswert?

Hallo Stefan,

ich habe das Programm in der Tat sinngemäß vereinfacht.
Ich habe mich dem 32-bit Software Timer-Modell von PeterDanegger 
bedient. Die OVF Routine sieht daher so aus:
1
ulTimer1Software += 65536;  // Variable ist 32-bit

Ich lese das Input Capture dann aus:
1
usTimer1Stand = ICR1;

und berechnete daraus meine Endzeit:
1
EndTime = ulTimer1Software+usTimer1Stand; // EndTime ebenfalls 32-bit

im Anschluss wird nach einer Messung der Startzeit die Endzeit 
zugewiesen:
1
StartTime = EndTime //(da die Startzeit für die nächste Messung die Endzeit der alten Messung ist); Startzeit ebenfalls 32-bit

Ich rechne daher die Zeiten komplett in 32-bit, sodass ich diese nur 
voneinander subtrahieren muss.
Selbst den Fall, dass OVF und ICP gleichzeitig auftauchen habe ich 
berücksichtigt, so wie es PeterDanegger in dem Beispiel getan hat.

Mir geht es eigentlich nur um das Prinzip, ob man sagen kann, dass ein 
interner Oszi so genau sein kann oder nicht. Im Prinzip misst das ganze 
ja auf 1024 Timertakte genau, was bei 32-bit "relativ" gering ist. Daher 
sollte das Programm zur Messung eigentlich korrekt sein und ich vermute 
tatsächlich das Problem an den beiden interenen Oszis.
Werde mir wohl im neuen Jahr schnell einen Quarz besorgen und das 
durchsimulieren...

von Peter R. (pnu)


Lesenswert?

Die Messung von zwei atmegas gegeneinander ist Mist.

Bei zwei ungenau laufenden Kontrollern kann es passieren, dass beide den 
gleichen spannungs-und temperaturabhängigen Frequenzfehler haben.

Richtiger wäre, einen davon mit Quarz zu takten, da ist er sicher 
konstanter als 0,01% im Temp- und Spannungsbereich.
Dann kann  man den zweiten (mit internem Takt) glaubhaft messen.

Wenn EIN Kontroller alleine irgendwelche Konstanz bzw. Abweichungen 
zeigt, hat das  aber garnichts zu besagen.

Der sorgfältige Mensch studiert das Datenblatt und schaut nach, wie groß 
die Abweichung sein KANN. Nur auf diese Angaben sollte man sich 
verlassen, nicht auf den aus einem oder wenigen Exemplaren gewonnenen, 
die womöglich aus der gleichen Charge sind.

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.