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)
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
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.