Forum: Mikrocontroller und Digitale Elektronik Wie viele PWM am ATmega16?


von Zucker (Gast)


Lesenswert?

Hallo,

wie viele PWM Signale kann ich den mit dem Mega16 erzeugen? Ich wollte
mir eine Lüftersteuerung für meinen PC bauen. Ich möchte vier Lüfter
ansteuern können und ein LCD zum anzeigen der Lüfterdrehzahl usw.
Welchen AVR sollte ich nehmen?
Wie könnte die Hardware ausehen, d.h. langt ein FET in Reihe zum
jeweiligen Lüfter und das Gate an den µC?

von Ronny Schulz (Gast)


Lesenswert?

Der hat 4 PWM-Kanäle. Steht ganz oben im Datenblatt. Sonst wäre
vieleicht die Seite interessant:

http://www.atmel.com/dyn/products/param_table.asp?family_id=607&OrderBy=part_no&Direction=ASC

Und hier mein Projekt zum Thema Lüftersteuerung mittels PWM. Vielleicht
hilft dir das weiter:

http://www.mikrocontroller.net/forum/read-1-107326.html

von Zucker (Gast)


Lesenswert?

Also laut Datenblatt hat er nur 3 PWM Kanäle. Dann könnte ich auch den
ATmega8 nehmen der hat auch nur 3.

Funktioniert jetzt deine Schaltung ohne Probleme?
http://www.mikrocontroller.net/attachment.php/112901/schematic_fan_pwm_fet.png

In welchem Bereich liegt den die PWM Frequenz?

von Matthias (Gast)


Lesenswert?

Hi

also wies bei deinen ATMega16 ist weiß ich nicht aber meine haben alle
4 Hardware-PWM-Kanäle. Für einen Lüfter reichen aber auch 100Hz und die
kannst du mit dem Mega auch in Software machen.

Matthias

von Zucker (Gast)


Lesenswert?

@Matthias
Was meinst du mit "meine haben alle 4 ...."? Was für ein µC
verwendest du?

@Ronny
Mit welchem Programm machst du eigentlich diese Schaltpläne?

von DerInder (Gast)


Lesenswert?

Hallo,
also Softwaremässig sind beim Mega8 22/23 PWM-Kanäle ein Witz (sprich
simpel zu proggen). Beim 8535 bin ich z.Zt. bei 30 Kanälen :)

von Zucker (Gast)


Lesenswert?

Also ich programmiere nur in Assembler, wie kann man das realisieren?
Über Zeitschleifen aber dann wäre der µC ja immer mit einem Kanal
beschäftigt. kopfkratz

von Tobi (Gast)


Lesenswert?

sehr schneller timer int. jeden kanal nach einer bestimmten anzahl int
ändern

von DerInder (Gast)


Lesenswert?

Hallo,
wie Tobi schon schreibt, eine Timer mit Interrupt verwenden und für
jeden PWM-Kanal eine Variable hochzählen, bei Erreichen des gewünschten
PWM_Wertes den Portpin setzen (also Ist mit Soll vergleichen), bei
Nulldurchgang des Timers alle Portpins zurücksetzen.

von Zucker (Gast)


Lesenswert?

@Tobi

Kannst du das etwas ausführlicher beschreiben? Also so weit ich weiss
funktioniert die PWM über einen Timer der einen bestimmten Wert
raufzählt und dann wieder runter. Bei einem bestimmten Wert beim
raufzählen wird der PWM Ausgang High und beim runterzählen wird der
Wert wieder erreicht und der Ausgang wird Low.
Aber man hat doch nur 3 Timer zur Verfügung.(beim ATmega16)

von Matthias (Gast)


Lesenswert?

Hi

ein ATmega16 hat 4 Hardware-PWM-Kanäle.

Software PWM funktioniert wie Hardware-PWM. Nur das man das was die
Hardware macht in Software nachbildet. Also schnellen Timer-INT und
darin dann Variable hochzählen. Erreicht die Variable einen bestimmten
Wert -> Pin setzen. Erreicht die Variable ihren Maximalwert -> Pin
löschen, Variable 0 setzen. Die Frequenz ist dann zwar nicht beliebig
hoch aber für Beleuchtung oder Motorsteuerung reicht es allemal.

Matthias

von Zucker (Gast)


Lesenswert?

Also ich weiss nicht wo du das her hast aber laut Atmel hat der ATmega
16 nur 3! -->
http://www.atmel.com/dyn/products/param_table.asp?family_id=607&OrderBy=part_no&Direction=ASC
Vielleicht meinst du den ATmega 162, der hat 4 Kanäle.

Das mit der Softwarelösung betrifft dann nur einen Kanal pro Timer oder
hab ich was falsch verstanden?

von DerInder (Gast)


Lesenswert?

Hallo Zucker,
also per Software kannst du soviele PWM-Kanäle programieren wie dein MC
Ausgänge hat. Allerdings haben bei Verwendung eines Timers alle die
gleiche Zeitbasis.
Zu meinem vorherrigen Posting:
natürlich zählt man mit dem Timer nur eine Variable hoch und vergleicht
dann mit den Soll-Werten der einzelnen PWM-Kanälen.

von Branko (Gast)


Lesenswert?

Hi
ein ATmega16 hat 4 Hardware-PWM-Kanäle:
OC0/AIN1(PB3)
OC1A(PD5)
OC1B(PD4)
OC2(PD7)

von Matthias (Gast)


Lesenswert?

Hi

natürlich zählt man nur eine Variable hoch und vergleicht dann mit dem
PWM-Wert pro Kanal. So war mein Posting eigentlich auch gemeint.

@Zucker
Nicht in der Tabelle kucken. Die schreibt $WERBEFUZZI. Datenblatt
lesen. Da steht zwar teilweise auch flasches drinn aber zumindest auf
die Basisinformationen kann man sich verlassen. Und im Datenblatt zum
ATmega16(L) steht ganz eindeutig "Four PWM Channels". Und wenn mich
mein Englisch jetzt nicht gerade komplett verlassen hat heißt "Four
PWM Channels" sowas wie "vier PWM Kanäle".

Matthias

von Zucker (Gast)


Lesenswert?

@derInder

Ja, das ist ja das Problem, ich möchte die ja alle unerschiedlich
ansteuern können.

@Branko
Du hast Recht, Atmel hat bei der Liste einen Fehler eigebaut. Dort
steht 3 aber im eigentlichen Datenblatt steht 4. ;-)

von Matthias (Gast)


Lesenswert?

Hi

du kannst die Software-PWM ja alle unterschiedlich "ansteuern". Nur
deren Frequenz und, je nach Implementierung, auch eine Schaltflanke
sind dann identisch.

Matthias

von DerInder (Gast)


Lesenswert?

@Zucker:
was meinst du mit "unterschiedlich ansteuern"?
Nur unterschiedliche Geschwindigkeiten? Das ist auch bei gleicher
Zeitbasis kein Problem. Übrigens Zeitbasis: die Hardware-PWM-Kanäle 1
und 2 arbeiten auch mit gleicher Zeitbasis.

von Zucker (Gast)


Lesenswert?

@DerInder

Naja wenn ich z.B. 8 Lüfter ansteuern will brauch ich doch acht PWM
Signale und die sollen sich alle getrennt steuern lassen. Damit mein
ich das die Lüfter alle unterschiedliche Drehzahlen haben können und
ich die auch einstellen kann.
Ich verstehe nur nicht wie das gehen soll. Ich muss doch in der Lage
sein 8 unterschiedliche PWM Frequenzen gleichzeitig erzeugen zu können.
Aber wie soll das gehen? Sorry wenn ich es noch nicht gerafft habe!

von DerInder (Gast)


Lesenswert?

Hallo,
ganz einfach, mit einem Timer zählst du eine Variable hoch, immer wenn
die sich ändert, vergleichst du deren Wert mit den Soll-Werten deiner
PWM-Kanälen(für jeden Kanal ein Geschwindigkeitswert/PWM-Wert). Wenn
Timer-Variable und PWM-Wert übereinstimmen setzt du den Ausgangsport.
Wenn die Timer-Variable gleich Null ist löscht du die Ausgänge. Ich
hoffe so ist´s verständlich.

von Zucker (Gast)


Lesenswert?

Hmm,
also wenn ich dich richtig verstanden habe lass ich einen Timer einen
bestimmten Wert hochzählen. Meine Sollwerte der Kanäle liegen innerhalb
des Timerwertes. Sobald der jeweilige Wert erreicht wird geht der
Ausgang des jeweiligen Kanals auf High.
Aber wie bekomme ich wieder auf Low? Wann wird der Timer Null? Sobald
er seinen "Timerwert" erreicht bzw. um eins überschritten hat?

von DerInder (Gast)


Lesenswert?

Nun am einfachsten wenn der Timer seine Overflow-Interrupt erzeugt, dann
geht er nämlich von seinen max. Wert auf Null. Ansonsten würd ich sagen
alles korekt erfasst.

von Zucker (Gast)


Lesenswert?

Ja,
jetzt hab ichs verstanden. :-) Das heisst wenn ich eine geringe
Drehzahl haben will nehme ich einen hohen Sollwert, da die Dauer vom
Setzen bis zum Löschen dann am kürzesten ist und ich nur für eine kurze
Zeit ein High am Ausgang habe.

von Zucker (Gast)


Lesenswert?

Was mir jetz aufgefallen ist, ist dass wenn ich die Softwarelösung
anwende der µC doch voll beschäftigt ist. Also ich wollte ja noch ein
LCD anschliessen und mir Drehzahl anzeigen lassen usw.
Geht das dann noch?

von Tobi (Gast)


Lesenswert?

warum ist der voll beschäftigt. in der zeit zwischen den ints hat der
doch garnichts zu tun. die timer zählen auch von alleine hoch :)

von Ronny Schulz (Gast)


Lesenswert?

Ich halte von der Hardwarelösung allerings auch mehr. Wenn die Frequenz
sehr nierdig ist, dann geht das sicher auch so. Sonst wird es
schwierig, wenn da zu dem LCD noch weitere Sachen hinzukommen sollen.
Beispielsweise die Drehzahlauswertung der Lüfter, Tastenabfragen usw.

von Zucker (Gast)


Lesenswert?

Das Problem meine ich ja. Ich will die Drehzahl mit Tastern erhöhen bzw.
verringern also müsste ich die Taster ständig abfragen. Gut, vielleicht
könnte dies über Interrupt realisiert werden. Aber sobald ich den µC
mit den Tastern beschäftigen lasse, hat er wärend dieser Zeit keine
Zeit die Port's anzusteuern. Das würde bedeuten das die Lüfter
entweder ausgehen oder auf maximum laufen.
Oder liege ich mit meinen Überlegungen falsch?

von Tobi (Gast)


Lesenswert?

wenn du den taster über einen externen interrupt machst und in der int
routine nur ein flag setzt ob er nun gedrückt ist oder nicht, sollte
das kein problem sein. die auswertung und verarbeitung der
tastereingaben kannst du ja im hauptprogramm machen. da wird es auch
nicht weiter stören, wenn die reaktion auf einen tastendruck nun 20
anstatt 5ms sind

von Streff John (Gast)


Lesenswert?

Der ATMEGA16 hat 4 PWM Ausgänge
Timer0
Timer1l
Timer1h
und Timer2
die Taster kannst Du über normale Porteingänge abfragen und den Wert
in die PWMregister einschreiben. Die neuen Werte werden bei Top
übernommen. (glitchfree). Die PWM Ausgänge laufen unabhängig
vom Prozessor weiter.

von Steffen (Gast)


Lesenswert?

Einen kleineren Atmel µC mit 4 Hardware PWM's gibt es nicht oder?

von DerInder (Gast)


Lesenswert?

Nö,
aber wozu auch, ein Software PWM reicht für Motoren sowiso, oder kennt
jeman eine Mechanik die mit der Geschwindikeit eines AVRs mithalten
kann???

von Steffen (Gast)


Lesenswert?

Nein, aber wenn der µC nebei noch andre Dinge machen muss, wirds eng bei
der Software-Lösung

von Andi (Gast)


Lesenswert?

Hi Leute!

Habe mir das hier gerade durchgelesen und hätte da mal ne Frage:
Mit wieviel Herz habt Ihr den Timer zum Software-Pulsen eingestellt?
1KHz, 10KHz?
Möchte das gerne mit nen Tiny26 ausprobieren weil ich hier noch einige
habe und mir schwebt da schon ne Lösung vor.
Z. B. Timer 1 auf ca. 10KHz setzen, einen Zähler bis 100 hochzählen und
wenn 100, dann von vorne.
Den Sollwert in einem Register für die Drehgeschwindigkeit mit dem
Zähler vergleichen.
Ist der Sollwert gleich oder niedriger als der Zähler dann PinX ein ist
er höher, dann aus.
Möchte auch erst mal BC547 oder BC556 paarweise zum durchsteuern der
Lüfter-Ströme hernehmen.
Von der Last müsste das gehen.
Ist das bei 10KHz Timer-IRQ in Ordnung bzw. 100Hz Puls-Frequenz?
Oder geht es auch mit 1KHz wobei dann eine Puls-Frequenz von 10Hz
wäre?

Gruß
Andi

von Christian Schifferle (Gast)


Lesenswert?

Ich verstehe eure Diskussion echt nicht.

Selbst wenn ihr mittels Software-PWM 8 Lüfter ansteuern würdet hättet
ihr noch massig Zeit, jede Menge anderer Aktionen zu programmieren. Ihr
lasst je schliesslich den AVR nicht mit 32 kHz Takt laufen ;-).

Ich würde für den Timer-Interrupt einen vernünftigen Vorteiler wählen
und die Ausgangsspannung jeweils mit einem Kondensator ein wenig
glätten.

Ich habe auf diese Weise eine Lichsteuerung auf einem AVR90S2313 mit 4
Kanälen gebaut welche über einen MIDI-Eingang verfügt. Und wenn das
beides zusammen klappt dann sollte wohl das eingangs erwähnte Problem
wirklich ein Klacks sein.

Die Diskussion hier erinnert mich an einen Kumpel von mir. Der hat mal
gesagt, er müsse jetzt beginnen Platz auf seiner Festplatte zu sparen.
Es seien nämlich nur noch 8 GB (von 10) frei :-)).

Gruss
Christian

von Andi (Gast)


Lesenswert?

Wie schnell sollte man den Timer-IRQ für das Pulsen denn nun machen?
Was ist Sinnvoll?
in 10KHz und Pulszähler von 0 - 100 oder 0 - 64?
Oder wie am besten?
Ansonsten fang ich jetzt einfach mal an.
Läßt mir keine Ruhe mehr.

Gruß
Andi

von Andi (Gast)


Lesenswert?

Und funxioniert das auch mit NPN´s oder doch nur mit MOSFET´s richtig?
Kenn mich mit MOSFET´s leider noch nicht so richtig da und ein paar
NPN´s habe ich nich hier.

Gruß
Andi

von Andi (Gast)


Lesenswert?

Autsch, was tipp ich da!
Meinte, kenn mich mit MOSFET´s leider noch nicht so richtig aus und ein
paar NPN´s habe ich noch hier.

Gruß
Andi

von Philipp Sªsse (Gast)


Lesenswert?

Nur mal so von wegen "enge" Softwarelösung: Mit 1-Register-Zählern
(also Viertel-Prozent relative Pulsweitenvariation; wird ja meistens
reichen) nimmt man je ein Registerpaar für Zähler und Vergleichswert.
Wenn die Periodenlänge noch variabel sein soll, zählt man besser
runter, dann kann man die Periodenlänge auch aus dem RAM holen, wenn
man bei null ist. Dann bleibt der Interruptaufruf noch unter 60 Takten
für 8 PWM-Ausgänge (bei fester Periodenlänge noch weniger). Für max.
100 Hz verbrät man also 1,5 MTakte/s. Da ist also selbst in diesem Fall
noch genug Luft, um ein Display anzusteuern und Tasten abzufragen. Man
kann sich wirklich auch anstellen.

von Andi (Gast)


Lesenswert?

Genau meine Meinung :-)
Aber wie ist das denn nu mit dem Timer?
Wie oft sollte der pro Sekunde ausgeführt werden?
Und in wie vielen Stufen sollte eine Regelung sein?
Wie habt Ihr das gemacht?
Habe mir das so vorgestellt:
Timer läüft z. B. mit 1KHz.
Der Zähler bis 100 oder von 100 auf 0.
Bei Sollwert-Einstellung 30 z. B. bekommt der Lüfter dann für 30mS
Strom und für 70mS keinen Strom.
Und das dann 10 mal je Sekunde.
Liege ich da richtig mit dem Verfahren oder sollte der Timer lieber
schneller als 1KHz ablaufen?
Ansonsten kann man den max. Zähl- und Sollwert auf 20 für 20
Regelstufen oder 10 für 10 Regelstufen setzen.

Bitte um Auskunft!!!

Gruß
Andi

von Andi (Gast)


Lesenswert?

Finds echt traurig, das niemand "verraten" wollte, wie er sein
Software-PWM gemacht hat.
Habe PWM jetzt probehalber mit 8 LED´s auf meinem Testboard gemacht und
es läuft hervorragend.
Der Timer1 läuft mit 10KHz mit 100 Regelstufen also Zähler von 0 bis
100 woraus 100Hz entstehen.
Für die 8 LED´s (Pins) zum Dimmen (ein/aus schalten) werden ca. 70
Takte verbraten mal 10000 = 700000 Takte.
Bei 8MHz für den AVR sind das gerade mal 10% an Leistung für
Software-PWM.

Gruß
Andi

von Zucker (Gast)


Lesenswert?

@Andi
Sorry, ich hab noch nicht einmal angefangen die Schaltung auf meinem
Bord aufzubauen geschweige denn zu assemblen. Hatte einfach keine Zeit,
deshlab konnte ich dir deine Frage auch nicht beantworten.

von Andi (Gast)


Lesenswert?

@Zucker
Meinte ja nicht speziell dich sondern eher die Spezialisten hier mit
ihren 8 - 30 PWM-Kanäle.
Nix für Ungut!

Gruß
Andi

von Philipp Sªsse (Gast)


Lesenswert?

'Tschuldigung, was haben wir denn nun nicht verraten? Welche Periode Du
brauchst und wieviel Stufen, weißt ja nur Du selbst, denn das hängt
davon ab, was Du damit willst. Und das Prinzip hattest Du ja
verstanden, wie Deine geglückte Implementierung zeigt.

Also was? Willst Du von den 70 Takten runter? Du brauchst ein DEC (1),
ein BRNE (2 im Normalfall), dann pro PWM ein CP (1) mit BRNE (2, bei
Schaltwert kommen noch 2 für SBI dazu, dafür geht der Sprung auf 1
runter) und hinten ein RETI. Macht bei mir für 8 PWM 31 Takte plus noch
ein paar, wenn geschaltet werden muß.

Bist Du jetzt weniger traurig?

von Andi (Gast)


Lesenswert?

Um Himmels Willen, bin nicht traurig.
War ne kleine Randbemerkung da ich nach 3 Tagen meiner, vieleicht
blöden, Fragen keine Antwort erhielt.
Aber egal. Sich selbst den Kopf zu zerdeppern ist ja sowieso besser.
Das mit den 70 Taktzyklen für 8 PWM-Kanäle find ich auch völlig in
Ordnung da für jeden PWM noch eine Aus-Prüfung, also das niemals
eingeschaltet wird, stattfindet.
Die Regelstufen sind von 0 bis 100 wobei 0 immer aus ist, 100 immer an
und dazwischen in 1/100 Stufen geregelt.
Desweiteren war das erst mal ein Versuch und es wird auf 5 PWM-Kanäle
für 5 Lüfter gekürtzt.
Und 10% Leistung für 8 PWM-Kanäle wobei der Timer dafür 10000
mal/Sekunde abläuft ist ein Witz.
Vermutlich kann man die Timer-Frequenz für Lüfter sowieso noch um
einiges reduzieren.
Nur wenns um Licht (LED, Lampen) geht sollte eine Periode nicht länger
als 1/50 Sekunde (20mS) sein.

Gruß
Andi

von Tweet (Gast)


Lesenswert?

Hallo, Ich soll mit einem ATMEGA16 einen Motor steuern(PWM Signal mit
High und Low Phase), dazu  stehen am Motor Sensoren zur verfuegung die
bei jeder Umdrehung, 16 Impulse liefern, (die ich ueber nen Interupt
Pin einlese).
Mein Problem ist dass der Motor ob belasted oder nicht immer gleich
schnell(30%vom maximum) drehen soll, wenn er also belasted wird sollte
die High Phase verlaengert, und die Low Phase verkuertzt werden.
Wie kann ich nun aber diese Grenze zwischen Low und High  Phase
abhaengig von der SensorenImpusFrequenz verschieben.

von Enrico Binuya (Gast)


Lesenswert?

Hallo zusammen, hat jemand von euch die Deutsche version von dem
ATmega16 Datenblätter? Ich habe es nämlich auf englisch und ich
verstehe weit mehr als die Hälfte nicht. Wäre super wenn mir einer
helfen könnte...

von Rahul (Gast)


Lesenswert?

@Enrico:
Da wirst du Englisch lernen müssen!
Nimm dir das Datenblatt und ein Wörterbuchg (Englisch - Deutsch bietet
sich an) und alles, was du so nicht verstehst, guckst du im Wörterbuch
nach, und das, was du dadrin nicht findest, fragst du nach.
Google hat übrigens auch ein Übersetzungswerkzeug.

@Tweet:
Sowas nennt sich Drehzahlregelung...
ATMegas haben für die PWM-Erzeugung die Compare-Einheit, mit der man
eine konstante Frequenz bei variablem Tastgrad erzeugen kann.
(PWM-Modi...)

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.