Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage - PWM Frequenz - Sinusausgangssignal


von Peter A. (elkopeter)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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.

von Gerhard W. (gerhard86)


Lesenswert?

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.

von Peter A. (elkopeter)


Lesenswert?

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?

von Peter A. (elkopeter)


Lesenswert?

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?

von Peter A. (elkopeter)


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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.

von Peter A. (elkopeter)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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.

von Peter A. (elkopeter)


Lesenswert?

Danke an alle Thread Teilnehmer. Eure Antworten haben mir 
weitergeholfen. Zu den Programmierfragen werde ich einen seperaten 
Thread öffnen.

von Gerhard W. (gerhard86)


Lesenswert?

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