Hallo ski7777,
das Thema das angeschnitten hast ist seeehr interessant!
Ich fürchte aber, daß du da noch in ein paar Probleme laufen wirst.
Was du vorhast, ist im grunde genommen einen 3-Phasen Drehstrommotor - denn nichts weiter ist so ein flachgedrückter Linearantrieb, zu bestromen (die Fachleute sagen auch "kommutieren" dazu.
Aber der Reihe nach:
Erstmal als grobes und einfaches Denkmodell:
U(t) = 1/2 * sin (PI(t)) *512 //besser 511, wenn's je nach Registerbreite dumm kommt ist 512 = 2x8bit = 0...
mit t als Winkel in Abhängigkeit deiner Frequenz. Die Werte kannste dir vorab mal mit nem Basic-Programm oder mit Python zur Kontrolle ausgeben lassen. die zehn Zeilen Code sollten in ein paar Minuten zu erschlagen sein.
512 Werte bei realistischen 50Hz und drei Phasen macht zusammen = 50 x 3 x 512 = 76800 Berechnungen. Fließpunkt-Berechnungen wohlgemerkt.
Weniger rechenintensiv (und somit schneller) wäre, anstatt mit einem Fließpunkt-PI mit Integern zu rechnen: PI = 314 / 100.
Hinzu kommt das Updaten der Ausgangsregister und vielleicht noch das Reagieren auf die Schnittstelle um Werte vom PC zu empfangen. Und die notwendige Zeit für diverse interne Interrupts hab ich noch nicht mal in Betracht gezogen. Good Luck!
Für eine Spannung die mit Hilfe eines echten DAC, einem Digital-Analog-Wandler der ein sauberes Gleichspannungssignal variabler Höhe auf einem schnellen Controller ausgegeben wird (Arduino Due, STM32F4 Discovery Board), könnte man nun anfangen in die Praxis überzugehen. Apropos Praxis: Zu überlegen wäre ob die Leistung die die Ausgänge des Controllers zur Verfügung stellen ausreichen um z.B. - realistisch - 100g um 2 mm anheben können. Andernfalls müßte man mit nem Transistorverstärker nachhelfen. Vorschlag : Transistor in Emitterschaltung. Google ist dein Freund.
Jetzt aber kommen wir zum interessanten Teil:
Wenn ich das richtig sehe hat der Controller PWM-Ausgänge - mit all den damit verbundenen Problemen. Sprich: was für eine LED oder ein Glühbirnchen gelten mag und funktioniert gilt noch lange nicht für einen Motor.
In diesem Thread ist eine PWM-Frequenz von 200Hz genannt worden. Wenn das als maximale Grenzfrequenz zutrifft ist die ganze Sache eigentlich schon zum Scheitern verurteilt bevor es überhaupt losgeht.
Warum? Schauen wir uns die Sache mal genauer an: Ein Sinus-Signal aus Rechtecken zu erzeugen bedeutet, die Rechtecke im Bruchteil der Frequenz zu modulieren, hier also die Breite zu variieren. Man nennt das Frequenz-Synthese, kurz: DDS.
Bei f_max = 200Hz könntest du bei 50Hz nur vier variable Rechtecke erzeugen - aber da du alleine schon vier Quadranten in einem Sinus hast ist die Sache jetzt schon tot. Du bräuchtest stattdessen (zwei) schnelle Timer die alle paar Mikrosekunden einen neuen Wert in die Register des PWM-Moduls laden und auf diese Weise einen Sinus mathematisch abbilden.
Auf dieser Webseite hier:
Arduino DDS Sinewave Generator
http://interface.khm.de/index.php/lab/i ... generator/
lässt sich Hilfreiches für Einsteiger finden. Auch wenn dir der Arduino fremd sein sollte (einen Arduino sollte man immer in der Hosentasche haben) - lies das mal durch und versuche im Groben zu verstehen was der Autor macht. Die Aufgabenstellung ist von der Hardware erstmal unabhängig, was für einen Arduino gilt, gilt auch für jedes andere Mikroprozessor-System.
Ich habe vor einiger Zeit die Software auf einen STM32 angepasst und den beschriebenen Filter nachgeschaltet. Voilá, das kam bei einem Test mit 1020Hz dabei heraus:
http://www.bilder-upload.eu/show.php?fi ... 078362.jpg
Der Sinus ist bereits in der Mitte des Filters (lastfrei) sauber detektierbar, das PWM-Gezuckel habe ich am Eingang gemessen.
Könnte sein, daß es auch ohne Filter geht, die induktive Wirkung einer Spule (deines Magnetantriebs) wirkt manchmal Wunder.
Viel Glück bei deinem Vorhaben!