Forum: Mikrocontroller und Digitale Elektronik GCC Code PWM Sinusfunktion


von Jens (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

Naja ein yC-Ausgang kann nicht negativ werden, ganz einfach.

von Björn P. (bjrn_g)


Lesenswert?

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

von unwissend (Gast)


Lesenswert?

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

von Michael K. (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von Jens (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
von Jens (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.