Hallo, für eine Testschaltung benötige ich einen RS232-steuerbaren Rechteckgenerator. Dieser soll 20kHz bis etwa 80kHz, einstellbar möglichst auf 10Hz genau, bei einer variablen Pulsbreite von ca. 5%-60% erzeugen. Dazu möchte gern einen ATmega verwenden. Im Anbetracht der feinen Frequenzeinstellung dachte ich zunächst an Software DDS. Das Problem bei DDS mit direktem digitalem Ausgang (also einfach das MSB des Phasenakkus ausgeben) ist ja bekanntlich der Jitter um plus/minus eine DDS-Taktzeit. Wenn ich jetzt mal von 500kHz "Taktrate" für den DDS ausgehe (oder ist mehr in Software realistisch?) würde man das ja schon ziemlich stark merken. Die sauberste Methode, zuerst einen Sinus, daraus Rechteck, daraus Dreieck, Vergleich mir Analogwert (mit zweitem DAC), wäre mir zu umständlich. Eine etwas abgespeckte Lösung, am DDS-DAC schon einen Dreieck auszugeben, ist leider immer noch viel umständlicher als einfach einen digitalen Ausgang am Controller zu nehmen. Nun hab ich mir überlegt, ob man nicht einfach den einen 16-Bit-Timer in PWM-Betreibsart nehmen kann, und bei jedem Erreichen des Vegleichswerts diesen neu setzen kann (indem man DDS-mäßig die Zeit zum nächsten Umschalten berechnet). AFAIK kann doch beim Erreichen des Vergleichswerts ein Interrupt ausgelöst werden. Somit hätte ich die Taktfrequenz meiner DDS auf die des Controllers erhöht -> geringerer Jitter bei direktem Digitalausgang. Meint ihr das wäre so realisierbar? Stefan
Hi Nimm einen Mega bei 8MHz und Timer 1 im FastPWM Mode. Den TOP Wert des Timers (und damit die Frequenz) bestimmst du über ICR1. Dein Tastverhältnis bestimmst du über OCR1x. Du mußt dann nur bei jedem Ändern der Frequenz auch den Wert von OCR1x neu berechnen. Damit sollte sich das Puls/Pausen-Verhältnis auf 1% Genauigkeit einstellen lassen. Matthias
Hallo Matthias, erstmal vielen Dank für die Infos. Ich wusste bis jetzt noch nicht, dass man bei den Megas im FastPWM-Modus nicht nur den Vergleichswert (OCR1x) sondern auch den TOP-Wert, und damit eine variable Frequenz, einstellen kann.Das Problem ist nur: Selbst wenn der PWM-Zähler mit 16MHz läuft, bekomme ich z.B. bei ca. 50kHz eine Einstellegenauigkeit von ca. 150Hz, was mir noch zuviel ist, ich hätte gerne 10-20Hz. Deshalb dachte ich daran, bei jedem Flankenwechsel am PWM-Ausgang (oder zumindest einmal pro Periode des PWM-Signals) die beiden Werte OCR1x und TOP neu zu setzen. Dadurch ändert sich zwar nix an der Genauigkeit eines einzelnen Durchlaufs, aber im Mittel nähert sich die Frequenz der gewünschten an. Z.B. ich will 50050Hz erzeugen, kann aber nur saubere 50000Hz bzw. 50150Hz erzeugen. Also lasse ich zwei Perioden mit 50000Hz und eine mit 50150Hz laufen -> Im Durchschnitt erhalte ich 50050Hz. Dazu müsste ich aber für jede Periode bzw. für jeden Flankenwechsel einen Interrupt auslösen, k.A. ob das so geht wie ich es mir vorstelle. Im Prinzip ist es dasselbe wie eine Software-DDS mit Rechteckausgang, wenn ich da eine krumme Frequenz einstelle, d.h. ein Pegelwechsel am Ausgang müßte z.B. genau zwischen zwei DDS-Takten kommen, wird eben abwechselnd ein halber Takt davor und ein halber Takt dahinter geschaltet. Ich hoffe, meine Idee ist so einigermaßen verständlich rübergekommen ;-).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.