Wie viele PWM am ATmega16?

Gast #115034
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?
Gast #115037
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
Gast #115042
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.
Gast #115043
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)
Gast #115044
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
Gast #115046
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.
Gast #115048
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
Gast #115049
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. ;-)
Gast #115051
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.
Gast #115052
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!
Gast #115053
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.
Gast #115054
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?
Gast #115056
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.
Gast #115057
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?
Gast #115059
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.
Gast #115060
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?
Gast #115061
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
Gast #115062
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.
Gast #115066
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
Gast #115067
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
Gast #115068
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
Gast #115071
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.
Gast #115072
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
Gast #115073
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
Gast #115074
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.
Gast #115076
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?
Gast #115077
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
Gast #115078
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.
Gast #115079
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...
Gast #115080
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...)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren