Hochgenaue Impulse erzeugen
Hallo zusammen,
ich habe eine grundsätzliche Frage!
In meinem Projekt brauche ich sehr genaue Impulse mit einem AtMega328P Mikrokontroller zu erzeugen. Die Genauigkeit soll besser sein wie 0,5 us.
Meine Frage ist, kann man diese Genauigkeit diesen Mikrokontroller überhaupt erreicht werden und wenn ja, geht es auch bei den internen Taktquellen von dem Mikrokontroller und bei welchem Timer-Mode?
Und meine zweite Frage: Ist die Genauigkeit generell besser wenn man einen externen Oszillator hat?
Danke im Voraus für Eure Tipps!
Liste der Anhänge anzeigen (Anzahl: 2)
Nur ais eigenem Interesse
Offenbar waren unsere Kommentare nicht der Hoppen . . . egal. Hat mich mal selbst interessiert. Daher:
Breadboard, n rumliegender 328, ein x-belieber 20 MHz-Quarz, ein kurzes Progrämmchen, ne LED und der PC-Oskar (WaveForms fürs DISCOVERY-ANALOG2).
Für eine leere while ( 1 ) -Schleife diese Initialisierung
Code:
// ============================================================================= =
// === Initialisierung fuer Timer2 mega328 ==================================== =
void TC2TMR_init ( void ) // Init 8bitTC2-Irupt Zeitbasis 20 kHz
{ //
TCCR2A |= (1<<WGM21); // Timer im CTC-Mode, Top=OCR2A
TCCR2B |= (1<<CS20); // NO Prescaler 1/1 / Clock <- CPU
OCR2A = 100; // Preset 100 für 5µs bei 20Mhz
TIMSK2 |= (1<<OCIE2B); // Tmr/Cntr2 Comp Match B Intrpt Enabl
} // Ende void TC2TMR_init ( void )
// ============================================================================= =
und diese Interrupt-Routine
Code:
// ============================================================================= =
// === Nicht unterbrechbare ISR für Timer2 - COMPB-vect ====================== =
// - Routine toggelt PC3
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ISR (TIMER2_COMPB_vect) // Tmr/Cntr2, @20kHz
{ //
PORTC ^= (1<<PC3); // blLED PC3 toggeln
return;
} // Ende ISR (TIMER2_COMPA_vect) ... Vektor...
// ============================================================================= =
bringen mir dieses Oscar-Bildchen - die Anzeige schwankt zwischen 5,044 und 5,046 µs.
Bleistift und Papier sagen dazu SCHWANKUNGSbreite ist hier 0,4 %. Für die Vorgabe von "GENAU" 0,5 µs also schon ausreichend. Für Aufgaben im ppm-Bereich leider aber mau. UND wenn ich sehe, dass die PTB für ne hochgenaue Temperaturmessung (beispielsweise) gute drei Wochen Akklimatisierung der Messeinrichtung sinnvoll hält . . . Übrigens habe ich nicht nach der ppm-Abweidung der Atomuhr gefragt.
Klar ist, dass sich dieser hübsche Wert mit zusätzlichen Rechneraktivitäten je nach Priorisierung von Interrupts etc verschlechtern wird.
......Anhang 36023
Grüße
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
danke an @oberallgeier und @Holomino für Eure Beiträge und diese Diskussion.
In Meinem Projekt möchte ich ein genaues Puls mit der Hilfe von einem AtTinay85 (ich habe es anderes überlegt!) zu erzeugen. Das Signal muss etwa 20 ms Sekunden "High! bleiben und dann nochmal auf Low gesetzt werden. Dieses Signal wird als externer Interrupt an einem AtMega328P geführt und dort verschiede Funktionen aufgerufen.
Das Interrupt von AtMega328P muss möglichst genau alle Sekunde aufgerufen werden. Deswegen hier Definition der Genauigkeit ist: Der Abstand zwischen zwei nach einander erzeugten Pulse möglichst genau 1 Sekunde sein. Fehlertoleranz ist 0,5 us.
Ich habe ehrlich gesagt, in der Konzeptionsphase und deswegen habe ich noch nichts programmiert. Meine Frage ist einfach, brauche ich unbedingt einen externen Quarz oder geht es bei dem internen Oszillator?
Und außerdem habe ich in Microchip Studion bemerkt, dass die Option von 20 MHz gar nicht gibt. Könntet Ihr bitte mir einen Tipp geben, woran es liegen könnte?
Viele Grüße,
Anhang 36024