Guten Tag in die Runde. Ich bin neu im Forum und bräuchte Hilfe im Bezug auf folgendes Verständnisproblem: Ich sitze gerade an einem Projekt, bei dem ich mit einem Atmega8A ein PWM -Signal erzeugen muss. Das ganze soll dann später eine Vollbrücke mit entsprechend kompatiblen MOSFET Treiber + MOSFET ansteuern und eine sinusförmige Ausgangsspannung erzeugen mit dem ein einphasiger Klauenpolmotor (Auslegung auf ~8V) betrieben werden soll. Jetzt hab ich schon häufiger in diversen Foren gelesen, dass für sowas eine hohe Schaltfrequenz benötigt wird, um eine störende Geräuschentwicklung beim Motor zu vermeiden. Jetzt zu den Fragen: Nehmen wir mal an ich bräuchte eine 50Hz Ausgansfrequenz meines Sinus. Muss ich dann für eine Halbwelle bei dem der Duty-Cycle entsprechend von kleinen zu großen Werten und wieder zurück läuft 10000mal Schalten(20kHz)? Wenn dem so sein sollte, so reicht meine Taktfrequenz je nach Timerauflösung ja hinten und vorne nicht.
@Peter A. (elkopeter) >Nehmen wir mal an ich bräuchte eine 50Hz Ausgansfrequenz meines Sinus. >Muss ich dann für eine Halbwelle bei dem der Duty-Cycle entsprechend von >kleinen zu großen Werten und wieder zurück läuft 10000mal >Schalten(20kHz)? Kommt drauf an. Die PWM-Frequenz richtet sich nach der Motorinduktivität. Je höher die Induktivität, umso kleiner kann die PWM-Frequenz sein. 10000 Stützpunkte pro Sinusperiode sind sehr viel, real braucht man eher 100-1000, je nach Anwendung. Beim Motor sind zwei Zeitkonstanten vorhanden. 1. Zeitkonstante kommt von den Spulen, diese glätten den Strom. 2. Zeitkonstante kommt vom Rotor und der angeschlossenen Last. Diese Trägheit glättet die Rotationsbewegung.
20kHz sind imho ein guter Anfang,und auch durchaus noch mit dem Atmega möglich da seine Timer mit voller Taktfrequenz laufen können. Das Datenblatt erlaubt 20MHz bei 5V, damit lässt sich eine 10bit PWM mit bis zu 19,53kHz machen, oder eine 9bit PWM mit bis zu 39kHz. 9 bit Auflösung reichen für diesen Zweck locker.
Danke für die schnelle Antwort Falk. Also ist meine Annahme richtig, dass ich für einen halbwegs "sauberen" Sinus häufig schalten muss. Generell noch eine Frage zur Programmierung der Mikrocontrollers. Ich bin noch recht grün hinter den Ohren, was Mikrocontroller angeht aber ein PWM Signal kann ich schon an beiden Ausgängen mit dem Timer1 und Comparematch erzeugen. Ich verwende das myAVR mk2 board und atmelstudio 6.1. Gibt es ein generelles Vorgehen wie der Duty-Cycle geändert werden muss? Momentan läuft das bei mir über zwei for-Schleifen, die einen int-Wert von 0 auf 255 und wieder zurück laufen lassen. Ich habe gehört man verwendet für sowas in der Regel Interrupt Subroutinen. Aber da kenn ich mich noch nicht sonderlich gut aus. Wie stelle ich sicher, dass meine beiden Transistorpaare mit einem gewissen Versatz schalten? Wird das über eine _delay - Funktion gemacht, oder wird hier ebenfalls eine subroutine verwendet?
Gerhard W. schrieb: > 20kHz sind imho ein guter Anfang,und auch durchaus noch mit dem Atmega > möglich da seine Timer mit voller Taktfrequenz laufen können. Das > Datenblatt erlaubt 20MHz bei 5V, damit lässt sich eine 10bit PWM mit bis > zu 19,53kHz machen, oder eine 9bit PWM mit bis zu 39kHz. 9 bit Auflösung > reichen für diesen Zweck locker. Ok das verwirrt mich jetzt wieder. Nehmen wir mal an ich hab ne Taktfrequenz von 20Mhz. Dann ist meine Timer Zykluszeit bei 50ns. Bei 10-Bit Auflösung brauch ich also 51,2 us um einmal meinen Timer durchlaufen zu lassen. Verwende ich Comparematch zur erzeugung kann ich also einmal pro 51,2 us schalten. Wie komme ich jetzt auf die 19,53kHz?
Peter A. schrieb: > Gerhard W. schrieb: >> 20kHz sind imho ein guter Anfang,und auch durchaus noch mit dem Atmega >> möglich da seine Timer mit voller Taktfrequenz laufen können. Das >> Datenblatt erlaubt 20MHz bei 5V, damit lässt sich eine 10bit PWM mit bis >> zu 19,53kHz machen, oder eine 9bit PWM mit bis zu 39kHz. 9 bit Auflösung >> reichen für diesen Zweck locker. > > Ok das verwirrt mich jetzt wieder. > Nehmen wir mal an ich hab ne Taktfrequenz von 20Mhz. Dann ist meine > Timer Zykluszeit bei 50ns. Bei 10-Bit Auflösung brauch ich also 51,2 us > um einmal meinen Timer durchlaufen zu lassen. Verwende ich Comparematch > zur erzeugung kann ich also einmal pro 51,2 us schalten. Wie komme ich > jetzt auf die 19,53kHz? Entschuldigung ich hatte gerade ein Brett vorm Kopf ist natürlich der Kehrwert.
Für einen Motor muss der Sinus nicht so gut sein. Einiges Glättet auch noch die Induktivität. Da reichen dann auch schon weniger als 100 Stützstellen für eine Periode. Auch die PWM Auflösung muss nicht so hoch sein - auch da sind 8 Bit ausreichend, mehr ist aber auch kein Nachteil. Bei der Frequenz wären so ab 10-15 kHz schon gut um die Geräuschentwicklung klein zu halten. Mehr bedeutet aber auch mehr Wirbelstromverluste im Motor und Schaltverluste an den MOSFETs und auch mehr HF Störungen.
Ulrich schrieb: > Für einen Motor muss der Sinus nicht so gut sein. Einiges Glättet auch > noch die Induktivität. Da reichen dann auch schon weniger als 100 > Stützstellen für eine Periode. Auch die PWM Auflösung muss nicht so hoch > sein - auch da sind 8 Bit ausreichend, mehr ist aber auch kein Nachteil. > Bei der Frequenz wären so ab 10-15 kHz schon gut um die > Geräuschentwicklung klein zu halten. Mehr bedeutet aber auch mehr > Wirbelstromverluste im Motor und Schaltverluste an den MOSFETs und auch > mehr HF Störungen. Ich hab jetzt leider noch keine Motordaten, da der Motor kein Serienteil ist. Mein Motor bügelt mir ja wie zuvor schon erwähnt meinen Sinus etwas gerade. Ich brauch aber doch dennoch einen Filter am Ausgang wegen EMV-Problematik oder?
@ Peter A. (elkopeter) >gerade. Ich brauch aber doch dennoch einen Filter am Ausgang wegen >EMV-Problematik oder? Keine Ahnung. Kommt auf deine Endstufe, den Motor und den Rest drumherum an.
Danke an alle Thread Teilnehmer. Eure Antworten haben mir weitergeholfen. Zu den Programmierfragen werde ich einen seperaten Thread öffnen.
Peter A. schrieb: > Ich habe gehört man verwendet für sowas in der Regel Interrupt > Subroutinen. Aber da kenn ich mich noch nicht sonderlich gut aus. > Wie stelle ich sicher, dass meine beiden Transistorpaare mit einem > gewissen Versatz schalten? Wird das über eine _delay - Funktion gemacht, > oder wird hier ebenfalls eine subroutine verwendet? Das ist eigentlich der interessante Teil an der Aufgabe. Am einfachsten lässt man den Timer bei Überlauf oder compare Match einen Interrupt auslösen, und schreibt da das Tastverhältnis für die nächste Periode in das Compare Register. Die Atmega Serie hat keine Deadtime Control, und geben dir pro Timer nur 2 Ausgänge, also nur einen pro Paar. Die Lösungen für die Totzeit werden daher mehr oder weniger pfuschig, sofern die Brücken unabhängig voneinander gesteuert werden sollen. Am einfachsten wären wohl Halbbrückentreiber mit einstellbarer Totzeit. Reicht eine invertierte Ansteuerung, könntest du für die eine Brücke einen invertierenden Treiber nehmen, und dann die komplementären Transistoren über die beiden PWM kanäle eines Timers steuern.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.