Hallo Leute, ich habe folgendes Problem. Ich beschäftige mich seit kurzem mit Atmegas und der PWM von Timer1. Ich möchte ein Sinussignal erzeugen. Dazu habe ich schon einiges in Foren gelesen, jedoch wird es mir einfach nicht richtig klar. Dann dachte ich, ich probiere es einfach mal so, wie ich es machen würde. Also habe ich in Excel eine Formel für eine Sinuserzeugung eingegeben und diese dann halt 360 mal nach unten kopiert um auch eine vollständige Sinusperiode zu durchlaufen. Das funktionierte. Wenn ich aber jetzt diese Formel (mit kleineren Anpassungen für C) nehme und in mein Programm in AVR eingebe um sie mit PWM zu durchlaufen, dann bekomme ich zwar einen Sinus, jedoch immer nur die positive Halbwelle. Jedenfalls ist das nichts halbes und nichts ganzes. Kann mir jemand klar verständlich machen, wie man sowas am besten angeht? Vielleicht hat jemand einen verständlichen Code, an dem ich das lernen kann. Vielen Dank schon mal.
Stefan schrieb: > Naja ein yC-Ausgang kann nicht negativ werden, ganz einfach. Dem würde ich widersprechen. Um einen Sinus am einen Ausgang anzuzeigen, benötigst du einen Controller mit einem DAC (intern, notfalls halt extern über eine Interface), dann zusätzlich zur positiven Referenzspannung (Bspw. +5V) eine äquivalente negative Referenzspannung (hier -5V). Dann kannst du dem DAC die Ergebnisse aus deiner Formel senden und du hast die gewünschte Sinuskurve mit Nulldurchgang ;) Gruß, Björn
also ich würde versuchen ein Sinus Signal auf eine gleichspannung zu legen quasi brummstrom ,das mit einen Transistor zu verstärken und mit einen Kondensator als dc blocker als reine Wechselspannung zu benutzen :)
Jens schrieb: > 360 mal nach unten kopiert Du brauchst aber nur ein 'viertel' Sinusfunktion weil der Rest Kopien davon sind. Damit hast Du bei Deiner Tabelle nur noch 90 diskrete Werte, was sehr grob aufgelöst ist. Sinustabellen sind üblich, aber eben mit ein paar einfachen Tricks um nicht brachial Speicher zu verschwenden und trotzden eine gute Auflösung zu erreichen. Björn G. schrieb: > Stefan schrieb: >> Naja ein yC-Ausgang kann nicht negativ werden, ganz einfach. > > Dem würde ich widersprechen. Kannst Du gerne, aber der MCU Ausgang selbst kann einfach nicht negativ werden. Man kann nur ein entsprechendes MCU Signal durch externe Beschaltung im Bereich verschieben, so das z.B. 50% Duty = 0V werden und 0% Duty = -xxV
Hallo, schon mal danke für die Antworten. :) Das ein Ausgang am Atmega sich nur von 0 bis 5V bewegen kann, ist mir klar. Daher gehe ich davon aus, dass aber trotzdem ein Sinussignal mit PWM erzeugen kann, dass sich irgendwo zwischen 0 und 5 Volt in einem Sinus bewegt, oder? Die Stufe 128 in einem 8 Bit PWM, was ja bis 255 läuft, wäre dann zum Beispiel die Mitte (Mittelwert oder auch der 0-Durchgang). Nur wie realisiert man sowas in einem Code? Ich komm da nicht weiter.. Ich möchte ganz einfach rein durch die Software-Programmierung alle Pulsweiten erzeugen können, die nötig sind um nachher ein Signal am Atmega anliegen zu haben, dass ich nur noch durch geeignete Tiefpässe die Pulsweiten so glätten muss, dass ein vollständiger Sinus auf meinem Oszilloskop erscheint.
Jens schrieb: > Daher gehe ich davon aus, dass aber trotzdem ein Sinussignal mit PWM > erzeugen kann, dass sich irgendwo zwischen 0 und 5 Volt in einem Sinus > bewegt, oder? Die Stufe 128 in einem 8 Bit PWM, was ja bis 255 läuft, > wäre dann zum Beispiel die Mitte (Mittelwert oder auch der 0-Durchgang). > Nur wie realisiert man sowas in einem Code? Ich komm da nicht weiter.. Das berücksichtigst du am besten schon in deiner Excel Tabelle. Der PWM Wert zu einem bestimmten Winkel ist dann nicht einfach
1 | PWM_Wert = 255 * sin( Winkel ) |
sondern
1 | PWM_Wert = 128 + 127 * sin( Winkel ) |
(WInkel läuft dann wieder von 0 bis 360. Wenn du mit Quadranten arbeitest, dann musst du eben eine Tabelle mit PWM-Werten im Bereich 0 bis 127 vordefinieren und dann dementsprechend von 128 abziehen oder dazuzählen)
:
Bearbeitet durch User
Das hört sich so einfach an. Aber wo ist der Unterschied zwischen 255 und 128 + 127??? Ist das nicht das gleiche in einem Code? Was meinst Du mit, wenn ich mit Quadranten arbeite? Sorry, für meine ganzen Fragen, aber ich bin da echt noch ziemlich neu in dem ganzen. Gruss Jens
Jens schrieb: > Das hört sich so einfach an. Aber wo ist der Unterschied zwischen 255 > und 128 + 127??? Setz halt einfach mal ein paar Zahlen für Winkel ein. > Ist das nicht das gleiche in einem Code? ? Du kennst die Vorrang Regeln in arithmetischen Ausdrücken? Punkt vor Strich - und so? Das ist nicht anderes als das was du in der 4. oder 5. Klasse gelernt hast. Zuerst wird multipliziert und dann die Teilergebnisse addiert. Multiplikation hat eine höhere Priorität
1 | a + b * c |
ist etwas anderes als
1 | (a + b) * c |
:
Bearbeitet durch User
Jetzt verstehe ich, danke.. :) Klar kenne ich Punkt vor Strichrechnung. Es ist mir nur nicht direkt ins Auge gefallen. Aber das macht Sinn. Ok ich werde das direkt heute Abend mal an meinem Controller testen. Vielen Dank.
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.