Sinus signal mit variable frequenz

ich habe dein programm auf ausprobiert und das kam im osci raus. Die frequenz bleibt bei 3,8hz stehen und ist leider nicht variable.

Jetzt sind wir in der Zwickmühle. Der Code ist reichlich tricky, insbesondere wegen der fehlenden Kommentare, sieht aber korrekt aus. Das Oszillogramm sagt aber tatsächlich etwas um 4Hz aus. Wo liegt der Fehler? Ein Faktor von etwa 13 zwischen Theorie und Praxis läßt sich nur schwer erklären.

Welche variable Frequenz erwartest Du, warum?

ich erwarte ein frequenz zwischen 45hz und 55hz.
und wenn er die 55hz erreicht hat muss dann zu 45hz zurück..
so ist die aufgabe

Na ja, einen kleinen Teil Deiner Aufgabe solltest Du schon selbst hinzufügen. Im Prinzip mußt Du nur aus const FREQUENCY eine Variable machen, die sich im 2s Rhythmus zwischen 45 und 55 ändert. Das geht z.B. mit BlinkWithoutDelay und einem Flag für rauf-/runterzählen.

Mein Mega gibt etwa 7Hz aus, in 8 Schritten (Phasenwinkeln). Mir scheint da irgendwas an der Initialisierung zu fehlen, und auch an der Berechnung der Schritte. Bei beiden Interruptquellen, daran liegt es nicht.

Hallo,

ich messe und sehe exakt einen 50Hz Sinus nach Filter und auch 45 oder 55Hz. Habe nochmal rückwärts den geposteten Code geladen, nicht das was verloren ging, kein Unterschied bei mir.

Habt ihr den richtigen Pin im Code gewählt? Ich habe derzeit keine Erklärung für die krasse Abweichung. Eure Arduinos laufen mit 16MHz? Obwohl das mit der Formel egal sein sollte.

Was messt ihr hiermit?

// Mega
// const byte Takt_Pin = 12;     // OC1B bzw. PB6, nicht invertiert

// Uno
const byte Takt_Pin = 10;  // OC1B bzw. PB2, nicht invertiert

void setup()
{
  pinMode(Takt_Pin, OUTPUT);
  set_Timer1();
}

void loop()
{

}  

// ****** Funktionen ******* //
void set_Timer1()   //  Fast-PWM, Mode 15
{
  TCCR1A = 0;    // Reset TCCR1A Register 
  TCCR1B = 0;    // Reset TCCR1B Register
  TIMSK1 = 0;    // Reset TIMSK1 Register (disable Timer Compare Interrupts)
  TCNT1  = 0;    // Start 0
  OCR1A = 19999; // TOP Wert bestimmt Auflösung und mit Prescaler den PWM Takt
  OCR1B = 10000; // Pulsweite, OCR1B <= OCR1A
  TCCR1A = (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);  // nicht invertiert
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11);    // Prescaler 8 
} 

Das gibt ein Rechteck mit 10ms.

Korrekt. Jetzt ist guter Rat teuer :thinking:

Hallo,

was mich wundert ist, dass du Dr. die doppelte Frequenz vom TO misst. Kann man daraus einen Zusammenhang ableiten? Mal blöd gefragt, eure Zeitbasis am Oszi ist nicht verstellt?

Mich wundert daß der alte Sketch inzwischen 12 Phasenschritte macht. Die Ausgabe im Setup legt da eigentlich was anderes nahe. Woher kann dieser Effekt kommen?

Hallo,

welche Werte werden Euch ausgegeben? Bei mir:
RESOLUTION 256
PWM 62500
FREQUENCY 50
PHASENDELTA 52
TOP 255

Du hast ein Phasendelta von 12?

Die gleichen wie bei Dir, wie ich auch von Hand nachgerechnet habe.

Hallo,

okay, wenigstens das ist gleich. Woher kommen die obigen besagten 12 Phasenschritte? Mit welchen alten Sketch?

Mit dem 2. Sketch in #31, wie gehabt.
Momentan ist der Oszi direkt an Pin 12 angeklemmt, ohne Filter.

Die Phasenschritte zähle ich ab den kleinsten Peeks. Die Impulsbreite erscheint mir aber sehr unsystematisch, als ob da höhere Bits verschlabbert werden. Möglicherweise sind es auch weniger Schritte.

Der Interrupt wird alle 20µs aufgerufen, die Pulsbreite ändert sich aber nur wesentlich seltener.

Inzwischen habe ich ein etwas übersichtlicheres Bild bekommen, das tatsächlich nach 50 Hz (20ms) aussieht. Auch wenn es wenig Ähnlichkeit mit einem Sinus hat.

Hallo,

Du hast doch einen Mega2560? Warum an Pin 10? Du musst an Pin 12. An Pin 10 sollte allerdings wiederum gar kein Signal rauskommen. Vertippt?

Tippfehler :frowning:

Hallo,

:thinking: deine 20µs machen mich stutzig. Ich messe 16µs.
Rechne ich nach passt das auch. 16µs / 62,5ns = 256
Mit 20µs komme ich auf 320 was zu viel ist.
Die 20µs sind auch recht präzise gemessen?
Die 320 würden die Aussetzer erklären, der Timer läuft erstmal bis Max durch.
Nur warum ist die Frage ... :thinking:
Deine PWM Signale sehen auch komisch aus. Die müßten vollen Spannungspegel haben.
Normalerweise muss da eine Pulsweite an der anderen zu sehen sein.
Die Spitzen über 5V und unter Masse im Bild einfach wegdenken. Kommt von Steckbrett und schlechter Masse usw..

Mal gesponnen. Hast du den Automode zur Signalsuche verwendet? Manchmal klappt das nicht und man bekommt Müll angezeigt. Stelle mal bitte das Oszi manuell ein.
Ich kann mir noch keinen Reim darauf machen. Leider.

bei mir auch!

Hallo,

was ist das? Ein paar nähere Infos zur Messung wären schon hilfreich.
Messe mal meinen Sketch aus #31 ohne Filter. Wie sieht das aus?

Mit dem ersten Sketch aus #31 mit Filter messe ich 245Hz Sinus. Was kommt bei euch raus? Vielleicht gibts einen Zusammenhang bzw. ist ein Verhältnis erkennbar.

Mit Probe x1 und 470k zum Pin sieht der Sinus ganz passabel aus :slight_smile:

Die seltsamen PWM-Pulse von vorhin kann ich mir auch nicht richtig erklären. Wenn ich nun auf den Sinus triggere, kann ich die Breite der PWM-Impulse mit dem Triggerlevel sauber ändern. Mit voller Amplitude 0-5V. Mit meinem analogen Hameg hätte ich sicher keine solchen Probleme gehabt.

Die Interrupts kommen wahlweise von 14µs bis derzeit 19µs, vom Overflow-Interrupt. Egal ob das am Scope oder am Arduino liegt, irgendeine Zeitbasis arbeitet da unzuverlässig.