Arduino - Sinus erstellen?

3 Antworten

Jedoch hat der Sinus den ich bekommen nur Positive Spannung.

Ein Transformator oder ein in Reihe geschalteter Koppelkondesator (für kleinere Leistungen) kann dazu dienen den DC Offset zu entfernen.

Der aktuelle Kondensator ist 200µF groß. Vielleicht benötige ich einen größeren 

Entweder das, oder einfach die PWM Frequenz deutlich erhöhen (x10 oder mehr), oder die Belastung des Kondensators reduzieren.

Statt den Kondensator größer zu machen, könnte man natürlich auch den Widerstand vergrößern (z.Zt vermutlich irgendwas kleiner 50 Ohm?). Der Nachteil an der Zeitkonstante zu drehen ist natürlich, dass auch die Amplitude abnimmt. Insofern ist die einzig sinnvolle Lösung eine höhere PWM Frequenz.

andere Möglichkeit einen Sinus ohne der Funktion "sin" zu erstellen

Ja, das macht man vor allem damit nicht so lange gerechnet werden muss. Früher als die Dinger nur wenige "Kilo-Instructions per Second" konnten, hat das Sinusrechnen viel zu lange gedauert.

Dazu berechnest Du einfach die Sinuskurve am PC und hinterlegst die als Tabelle. Das lässt sich leicht mit Excel machen und dann im Programm als Array hinterlegen. Da man heutzutage massig Speicher in so einem µC hat, kann man das mit hoher Auflösung machen. Zwischenwerte kann man wenn man das braucht linear interpolieren.

Man braucht aber nur ¼ des Sinus als Tabelle. Danach geht die Tabelle rückwärts und dann macht man das vorwärts dann rückwärts einfach mit negativem Vorzeichen. So braucht man nur ¼ der Daten und kann im Umkehrschluss 4x feiner auflösen.

ein PWM Signal so erzeugt

Ja, bei sehr langsamen Frequenzen ist das auch in Ordnung. Aber wenn man hohe Frequenzen braucht, ist die PWM zu langsam. Auch kann man den Filter nur für eine einzige Frequenz optimieren. Bei variablen Frequenzen hat man man immer "unschönheiten", entweder durch zu wenig oder zu viel Filterung.

Heutzutage nimmt man einfach einen D/A Wandlerchip. Die gibt es mit mehreren Kanälen und es gibt auch welche die direkt symmetrische Signale erzeugen können.

Möchtest Du das "selber basteln", dann nimm das klassische R2R Netzwerk. Da gehst Du mit beliebig vielen Ports parallel dran und legst einen Binärwert an der sofort ohne Verzögerung dann in ein Spannungsverhältnis, also einen echten Analogwert umgewandelt wird. Die Anzahl der Portpins bestimmt dann die Auflösung des Signales.

https://de.wikipedia.org/wiki/R2R-Netzwerk

Jedoch hat der Sinus den ich bekommen nur Positive Spannung.

D/A Wandler benutzen der symmetrische Signale erzeugen kann oder Du schaltest einen Operationsverstärker nach und baust da einen Offset ein so dass "Halber Wert" dann 0V ergibt. Du kannst aber auch über eine Zusätzliche Leitung eine Verstärkerschaltung zwischen "normal" und "invertierend" hin und herschalten. Diese Leitung ist dann einfach dein "Signed Bit" deiner Variable.

Als Ausgangstreiber eignet sich der TDA2030 richtig gut. Der verhält sich wie ein LM741 Operationsverstärker, kann aber bis zu 2A an Strom liefern. So bekommst Du dann ein sehr belastbares Signal und kannst damit als OPV auch Anpassungen wie Offset oder Pegel direkt in einem machen.

Woher ich das weiß:Berufserfahrung
Gibt es jedoch noch eine andere Möglichkeit einen Sinus ohne der Funktion "sin" zu erstellen?

Ja entweder über Wertetabellen, also eine Tabelle mit zb 100 Einträgen in der die Sinuswerte von 0 bis 90° drinnen stehen und dann eben ausnutzen der Periodizität. Oder indem du die Taylorapproximation für den Sinus rechnest was dir dann aber keinen Vorteil zur sin Funktion bringt.

Jedoch hat der Sinus den ich bekommen nur Positive Spannung.

Du kannst das Signal Hochpassfiltern. Also einen großen Elko in Serie und danach einen Widerstand gegen Masse. Die Spannung am Widerstand ist dann symmetrisch zur Masse.

Habt ihr Tipps wie ich ihn verbessern kann.

Mehr Filtern, also entweder höhere Filterordnung oder kleinere Grenzfrequenz am Tiefpass.

Oder direkt einen DAC verwenden.