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?
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
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?
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
@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?
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 :)
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
sehr schneller timer int. jeden kanal nach einer bestimmten anzahl int ändern
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.
@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)
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
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?
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.
Hi ein ATmega16 hat 4 Hardware-PWM-Kanäle: OC0/AIN1(PB3) OC1A(PD5) OC1B(PD4) OC2(PD7)
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
@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. ;-)
Hi du kannst die Software-PWM ja alle unterschiedlich "ansteuern". Nur deren Frequenz und, je nach Implementierung, auch eine Schaltflanke sind dann identisch. Matthias
@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.
@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!
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.
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?
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.
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.
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?
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 :)
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.
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?
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
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.
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???
Nein, aber wenn der µC nebei noch andre Dinge machen muss, wirds eng bei der Software-Lösung
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
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
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
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
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
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.
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
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
@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.
@Zucker Meinte ja nicht speziell dich sondern eher die Spezialisten hier mit ihren 8 - 30 PWM-Kanäle. Nix für Ungut! Gruß Andi
'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?
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
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.
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...
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.