GCC Code PWM Sinusfunktion

Gast #3967489
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.
#3967543
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
Gast #3967618
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
Gast #3974465
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.
#3974477
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)
#3974654
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren