Hallo zusammen, ich bin gerade dabei ein PWM Signal zu erzeugen. Das Signal an sich ist aber nicht mein Problem. Das Problem liegt darin, dass ich gerne jede beliebige Frequenz einstellen möchte. Ist das generell möglich? Wenn ja, wie sieht das dann in C aus? Danke für eure Hilfe!
Steffen wrote: > ich bin gerade dabei ein PWM Signal zu erzeugen. Das Signal an sich ist > aber nicht mein Problem. > Das Problem liegt darin, dass ich gerne jede beliebige Frequenz > einstellen möchte. > Ist das generell möglich? Generell nein. Jede beliebige Frequenz kann keine Hardware auf der ganzen Welt, Du mußt sie schon in Bereich und Auflösung eingrenzen. Mußt Du nur die Frequenz einstellen, dann ist PWM falsch. Mußt Du Frequenz und Pulsweite einstellen, dann gehts aufm AVR nur in Software. Peter
>Ist das generell möglich? Mit ein paar Analogbausteinen problemlos. >Wenn ja, wie sieht das dann in C aus? Gar nicht:-) Ist ja schließlich Analogtechnik. Falls du da auf einem Mikrocontroller machen möchtest, hängt das C-Programm sehr stark vom gewählten Modell ab. Wie soll man das beantworten? Ausserdem haben die allemreisten Controller so etwas wie ein diskretes Register zur Frequenzeinstellung. Das hat dann 256 oder auch 32768 diskrete Werte, vielleicht in Kombination auch mehr. "Beliebige" Frequenzen lassen sich damit trotzdem nicht einstellen. Oliver
Danke schon mal für eure Antworten. Aber meines Wissens kann ich vorgeben (beim ATMega32)ob ich ein 8, 9 oder 10 Bit PWM Signal haben will. Auf diese Weise ist meine Frequenz ja schon fast festgelegt. Nun kann ich sie nur noch über den Prescaler teilen. Aber ist es vielleicht irgendwie möglich auch ungefähr 1,5 kHz einzustellen. Sprich einen Wert der nicht in dem Teilungsverhältnis liegt?
1. Welcher µC ? 2. Was verstehst Du unter "beliebiger Frequenz" ? 3. Geht es um's Tastverhältnis oder Anzahl Peaks ? 4. Warum muß die Frequenz "beliebig" sein ?
> Mußt Du Frequenz und Pulsweite einstellen, dann gehts aufm AVR nur in > Software. Das stimmt nicht. Einige AVRs bieten bei ihre 16-bit-Timern die Möglichkeit, einen TOP-Wert einzustellen. Damit kann ich ihn im 16-bit-Bereich bis zu jedem beliebigen Wert zählen lassen und damit die PWM-Frequenz im Prinzip verstellen. Man muß natürlich den OCR-Wert immer mit anpassen, wenn sich die Frequenz, aber nicht das Tastverhältnis sich ändern soll.
> 1. Welcher µC ? ATMega 32 > 2. Was verstehst Du unter "beliebiger Frequenz" ? War vielleicht von mir ein wenig schlecht ausgedrückt. Ich meinte damit ob ich die Frequenz der PWM die durch die Bit-Auflösung und den Prescaler definiert ist, z.B. über irgendein Vergleichsregister beeinflussen kann. > 3. Geht es um's Tastverhältnis oder Anzahl Peaks ? Es geht erstmal nur um die Frequenz des PWM-Signals! > 4. Warum muß die Frequenz "beliebig" sein ? Ich brauche eine Frequenz im Bereich von 1,5 kHz und diese kann ich nicht über die Bitauflösung und den Prescaler einstellen.
> Aber meines Wissens kann ich vorgeben (beim ATMega32)ob ich ein 8, 9 > oder 10 Bit PWM Signal haben will. Auf diese Weise ist meine Frequenz > ja schon fast festgelegt. Nun kann ich sie nur noch über den Prescaler > teilen. Du kannst auch einen der WGM-Modi 8 bis 11, 14 oder 15 verwenden. Das sind dann die Modi, in denen du genau einstellen kannst, wie weit er zählen soll, bevor der Zählerwert auf 0 gesetzt (bei "fast PWM") oder die Zählrichtung umgekehrt ("phase correct PWM") wird. > Aber ist es vielleicht irgendwie möglich auch ungefähr 1,5 kHz > einzustellen. Also willst du gar nicht "jede beliebige Frequenz" einstellen, sondern eine ganz bestimmte. Warum muß es eigentlich gerade die Frequenz sein? > Sprich einen Wert der nicht in dem Teilungsverhältnis liegt? Ob der da liegt, hängt auch von der Taktfrequenz deines Mega32 ab.
Ich brauch nun mal im Moment noch diese Frequenz. Mit beliebiger wollt ich mich auch einfach mal schlau machen, ob es generell möglich ist. Weil wenn nicht muss ich das in Zukunft schon früher brücksichtigen! Meine Taktfrequenz liegt bei 16 MHz. Wie muss ich das mit dem WGM Modi genau verstehen? Könntest du mir dazu ein kurzes Programm Beispiel geben?
Die Frage ist, brauchst Du nur die Frequenz oder auch die PWM ? Wenns nur die Frequenz ist, also Tastverhältnis 1:1, dann nimm einfach den Toggle on Compare Mode. Peter
Ja das weiß ich, auf diese Weise hab ich mir auch schon ein 250 kHz Signale erzeugt. Das Problem liegt bei der PWM, weil die bräuchte ich eigentlich!
Bei 16-bit-PWM ist der TOP-Wert 65535. Bei 10 bit ist er 1024, u.s.w. Du kannst aber auch bestimmen, daß der TOP-Wert ein Register-Wert ist. Dann kannst du jeden Wert von 0 bis 65535 einstellen. Welchen WGM du nimmst, kommt dann drauf an, ob du "fast PWM", "phase correct PWM" oder "phase and frequency correct PWM" brauchst. Was die bedeuten, steht im Datenblatt. Außerdem mußt du entweder das OCR1A-Register oder das ICR1-Register auswählen, d.h. du mußt entweder einen der zwei PWM-Kanäle des Timers oder die input-capture-Funktion opfern. Wenn du keine von beiden brauchst, ist es egal. Dann wählst du den entsprechenden Modus aus und schreibst in das OCR1A- oder ICR1-Register den Teiler, den du für deine Frequenz haben willst. Im Modus 14 (fast PWM mit ICR1 als TOP) könntest du den Prescaler auf 1 einstellen und das ICR1-Register auf 10666. Dann wäre die PWM-Frequenz ca. 1,5001 kHz. Wenn's nicht ganz so genau sein muß, kannst du auch einen weniger krummen Wert (10000 oder 10240 oder sowas) verwenden. Dein OCR-Wert für die Pulsweite muß dann natürlich auch an diesen Bereich angepaßt werden.
Ich glaub ich habs verstanden. Danke für deine ausführliche Erklärung!
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.