PWM mit ATmega88

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

Antworten
Robert W.
User
User
Beiträge: 43
Registriert: Di, 02.12.08, 15:01

So, 24.01.10, 10:34

Hi,

ich hab grade mit programmieren angefangen (1 monat ungef.), vorzugsweise mit assembler.
kleinere Geschichten sind kein problem (blinklichter, taster abfragen...).
Jetzt würd' ich gern was mit PWM machen, der mega88 soll ja 6 PWM kanäle haben.
wie kann ich die den beeinflussen,(anschalten, an / aus abstände einstellen, und so zeug...)

könnte mir da jemand Helfen? :?: (datenblatt ist asig kompliziert und unverständlich)

Gruss Ro
Falo
Mega-User
Mega-User
Beiträge: 119
Registriert: Fr, 15.01.10, 23:46

So, 24.01.10, 11:19

Benutzeravatar
Doc_McCoy
Hyper-User
Hyper-User
Beiträge: 1962
Registriert: Sa, 03.06.06, 15:49
Wohnort: Neualbenreuth
Kontaktdaten:

So, 24.01.10, 13:13

In den Datenblätter von Atmel sind auch kurze Codeschnippsel und Tabellen mit den ganzen Registern zu finden.
Robert W.
User
User
Beiträge: 43
Registriert: Di, 02.12.08, 15:01

So, 24.01.10, 18:37

Vielen dank erst mal,
ich habs natürlich immer noch nicht ganz gepeilt, die ganzen geschichten im datenblatt +/- verstanden (siehe bild)
aber wie steuer ich jetzt einzelne Ports mit PWM an. im bild hab ich jetzt erst mal die ganzen einstellungen getroffen,
aber wie setze ich das ganze ein :?:
Am besten wär so ne art beispiel, wie man beliebige ports (auf einmal) ansteuern kann, mit einstellbarer puls weite...

Gruss Ro

PS: vielen dank für die schnellen antworten.
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

So, 24.01.10, 18:44

Ich empfehle Dir, auf C umzusteigen. Das ist zwar erstmal etwas weniger durchschaubar als Assemnbler, aber dafür muss man auch nicht jeden noch so kleinen Pups selbst machen, das macht es doch deutlich komfortabler --- und so ein Atmel AVR ist für fast alles locker schnell genug, Assembler braucht man heutztage nur noch in ganz wenigen Spezialfällen und dann lässt es sich auch in C-Code integrieren.

AVRStudio (kostenlos von Atmel runterladbar, liegt außerdem jedem AVR ISP Stk 500 mk II bei) + WinAVR (kostenlos, Open soruce, wird automatisch von AVRStudio erkannt und macht AVRStudio damit C-fähig) oder CodeVisionAVR (bis 4 kB Programmcode kostenlos nutzbar) könnte ich empfehlen. Atmel bevorzugt den IAR C-Compiler, der kostet jedoch ca. 3000€.

Wenn man die Hardware-PWM-Ports nutzt (das sind beim Mega88 nur 3, alle wo OCR oder sogar PWM mit dransteht), dann muss man letzlich nur noch ein oder 2 Byte schreiben, um das PWM-Tastverhältnis zu ändern und das ganze läuft mit exakt 0 CPU-Last, man hat also 100% Rechenleistung für's Programm über. Damit erreicht man auch problemlos sehr hohe PWM-Frequenzen und Flackern kann auch nicht auftreten.

Hierzu ist CodeVisionAVR auch in der kostenlosen Variante ganz gut, denn dort kann man mit dem CodeWizard bequem den Code erzeugen lassen, der die Register passend initialisiert. (Allerdings macht einen das auch etwas doof, weil man nicht mehr sieht, was da warum wie initialisiert wird, anders als wenn man das aus dem Datenblatt abliest)
Robert W.
User
User
Beiträge: 43
Registriert: Di, 02.12.08, 15:01

So, 24.01.10, 19:30

@ CRI 93+ / Ra 93+:

Gut, ich denk mal ich nehm dann das avr studio + WinAVR, mit C hab ich nur ein mal was gemacht, das war Asuro.
was die Hardware-PWM-Ports betrifft, das sind aber nur 3 einzelne pins oder?
falls ja dann ist das für mich ungeeignet.
mal schaun wie ich mit C zurecht komme

Gruss Ro
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

So, 24.01.10, 19:57

Die Hardware-PWM-Kanäle sind fest 6 Pins zugeordnet, jedoch benötigen die einen Timer/Counter zum funktionieren und davon gibt's nur 3, d.h. mehr als 3 Hardware-PWM-Kanäle kann man nicht wirklich nutzen und dann sind auch schon alle 3 Timer/Counter "aufgebraucht".

Wenn Du mehr als 3 PWM-Kanäle benötigst, dann wird ein Timer-Interrupt das beste sein, damit kann man aber schon nur noch ein Zehntel bis hundertstel oder weniger PWM-Frequenz erreichen wie mit Hardware, aber immer noch im Bereich 500 bis 5000 Hz bleiben, im Interrupt sollte der Code so kurz und effizient wie möglich sein, d.h. z.B. keine Berechnungen dort durchführen, die dann hunderte mal pro Sekunde ablaufen, obwohl sie genausogut außerhalb des Interrupts gemacht werden können.

(Beispiel: die Einschaltdauer eines Kanals ändert sich, weil mehrere LEDs über den gleichen Vorwiderstand angeschlossen sind (z.B. gemeinsamer Vorwiderstand für alle Segmente einer 7-Segment-Anzeige), so dass man die Einschaltdauer mit jeder zusätzlichen LED minimal verlängern muss: dann berechnet man die immer nur dann neu, wenn sich die Anzahl eingeschalteter LEDs bzw. der anzuzeigende Wert ändert und nicht unnötigerweise in jedem PWM-Zyklus, wie sogar mancher Doktor das macht... hier ging's allerdings um Display-Multiplexing, aber mit Software-PWM-Dimmung ist das relativ artverwandt)
Borax
Star-Admin
Star-Admin
Beiträge: 11993
Registriert: Mo, 10.09.07, 16:28

Mo, 25.01.10, 11:44

mehr als 3 Hardware-PWM-Kanäle kann man nicht wirklich nutzen
So würde ich das nicht sagen. Die 6 Hardware-PWM-Kanäle lassen sich bei Mega88 (o.ä.) schon nutzen. Ok, je zwei Kanäle hängen am gleichen Timer, aber meist verwendet man ja für alle Kanäle die gleiche PWM-Frequenz so dass das auch keine Rolle spielt. Und pro Timer gibt es zwei unabhängige Compare-Register um die Pulsbreite vorzugeben. Den 6 PWM Kanälen kann man also durchaus auch 6 verschiedene Werte zuweisen.
Ich würde aber auch nicht versuchen, dass in ASM zu schreiben. Die reine PWM Ausgabe ginge ja noch (ist ja fast sprachunabhängig weil ja nur Werte in Register geschrieben werden), aber Farbübergänge o.ä. für 6 unabhängige PWM Kanäle in ASM Schleifen zu programmieren... Nein danke :)
Antworten