www.mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).
  Gesamtzeit = EndTime - StartTime;

  if (GesamtzeitSicherung > (Gesamtzeit-512) && (GesamtzeitSicherung < (Gesamtzeit+512))){
    PORTLED &= ~( 1 << LED); // wenn die Zeit in dem Bereich liegt, LED einschalten
  }
  else{
    PORTLED |= ( 1 << LED ); // sonst LED ausschalten
  }
  
  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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
ulTimer1Software += 65536;  // Variable ist 32-bit    

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

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

im Anschluss wird nach einer Messung der Startzeit die Endzeit 
zugewiesen:
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...

Autor: Peter R. (pnu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.