- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 23

Thema: PWM mit ATMega8 und Timer2

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22

    Frage PWM mit ATMega8 und Timer2

    Hallo zusammen,

    ich bin ein blutiger Anfänger in diesem Bereich, deshalb entschuldigt bitte, falls ich doof frage und seid geduldig mit euren Erklärungen
    Nachdem ich in einem anderem Forum keine Hilfe mehr bekam (Die letzte Antwort war "Nimm dir das Datenblatt und werd flügge"), habe ich mir zwar das Datenblatt angeguckt (hatte ich auch schon davor :-D), doch so richtig schlau werde ich da leider immer noch nicht draus....

    Nach einigen Googlen habe ich dann dieses Forum hier gefunden und einige Beiträge durchgelesen und ich denke, hier sind viele nette und kompetente Köpfe

    So, nun zu meinem Problem, bei dem ihr mir hoffentlich helfen könnt

    Ich habe eine kleine Schaltung mit einem ATMega8 entworfen, mit der ich die Gartenbeleuchtung meiner Mutter etwas "Pepp" verleihen will (also nicht nur doof leuchten, sondern bisschen dimmen, lauflicht, etc...).
    Dazu benutze ich derzeit 2 Timer. Timer1 wechselt durch die verschiedenen Programme durch (Timer1, weil 16bit-Timer und jedes Beleuchtungs-Programm ja schon etwas andauern sollte...) und Timer0 z.B. für einige Beleuchtungsprogramme selber: Aufsteigende oder Absteigende Reihenfolge des Anschaltens der LEDs.

    Diese 2 Timer sind also schonmal weg und nun wollte ich die LEDs mittels PWM dimmen und im zweiten Schritt die Helligkeit mittels Timer0 variieren lassen.
    Die LEDs benutzen übrigens komplett PORTB und D.

    Ich denke ich muss hier erstmal keinen Code posten, da ich ja die Hardware-PWM benutzen will, falls ich mich irre, sagt Bescheid.

    So, ich hab mir also das Datenblatt durchgelesen und da steht drin, dass Timer2 über eine phasenkorrekte PWM verfügt und die wollte ich dann also benutzen. Ist das allgemeine Vorgehen dafür so?
    1. Im TIMSK die entsprechenden Interrupts "erlauben". Ich denke ich werde die brauchen, siehe (*)
    2. LSB von WGM21 auf 1 setzen, um die phasenkorrekte PWM zu benutzen
    3. Im OC2 die Helligkeit einstellen oder eben wie hoch der Timer zählen soll
    4. (Über eine COM21 kann man eine (nicht)invertierte PWM benutzen)
    5. Nun wird hoffentlich die entsprechende Waveform am OC2-Pin (muss auf output geschaltet sein) erzeugt. Da hier ja nur eine Waveform am OC2-Pin erzeugt wird und ich jedoch PORTB und D brauche, werde ich wohl um die Interrupts nicht herum kommen, oder? (siehe (*))


    Nun einige Fragen, die mir auf der Seele brennen
    1. Ist das Vorgehen oben überhaupt korrekt?
    2. Wird die Waveform am OC2-Pin ohnen irgendwelchen Code im InterruptHandler erzeugt (Vermutung Ja, da ja Hardware PWM)?
    3. Wie kann ich damit meine Ports pulsweitenmodellieren, was ja mein eigentlich Ziel ist. Eine Waveform nur an einem Pin bringt mir nicht sooo viel...


    Ihr würdet mir einen riesigen Gefallen tun, wenn ich ihr euch mal einige Momente Zeit für mich nehmen könntet

    Vielen Dank im Voraus,
    Eroli

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    [QUOTE=Eroli;509131]Hallo zusammen,
    ...
    So, ich hab mir also das Datenblatt durchgelesen und da steht drin, dass Timer2 über eine phasenkorrekte PWM verfügt und die wollte ich dann also benutzen. Ist das allgemeine Vorgehen dafür so?
    1. Im TIMSK die entsprechenden Interrupts "erlauben". Ich denke ich werde die brauchen, siehe (*)
    2. LSB von WGM21 auf 1 setzen, um die phasenkorrekte PWM zu benutzen
    3. Im OC2 die Helligkeit einstellen oder eben wie hoch der Timer zählen soll
    4. (Über eine COM21 kann man eine (nicht)invertierte PWM benutzen)
    5. Nun wird hoffentlich die entsprechende Waveform am OC2-Pin (muss auf output geschaltet sein) erzeugt. Da hier ja nur eine Waveform am OC2-Pin erzeugt wird und ich jedoch PORTB und D brauche, werde ich wohl um die Interrupts nicht herum kommen, oder? (siehe (*))


    Nun einige Fragen, die mir auf der Seele brennen
    1. Ist das Vorgehen oben überhaupt korrekt?
    2. Wird die Waveform am OC2-Pin ohnen irgendwelchen Code im InterruptHandler erzeugt (Vermutung Ja, da ja Hardware PWM)?
    3. Wie kann ich damit meine Ports pulsweitenmodellieren, was ja mein eigentlich Ziel ist. Eine Waveform nur an einem Pin bringt mir nicht sooo viel...


    > Ihr würdet mir einen riesigen Gefallen tun, wenn ich ihr euch mal einige Momente Zeit
    > für mich nehmen könntet
    >
    Hallo,

    ich befasse mich gerade mit dem Timer0 des ATtiny13. Bin also auch nicht so Sattelfest, aber hoffe trotzdem Dir helfen zu können. Meistens gesellen sich dann auch andere dazu, so das doch etwas vernünftiges dabei herauskommt.
    Für mich reichen leider einige Momente Zeit nicht aus um Dir komplett helfen zu können.
    Aber egal ich will mal anfangen.

    Zu 1 bei deinem allgemeinem Vorgehen.

    Um ein Phase Correct PWM-Signal zu erzeugen bedarf es keines Interrupts. Es wird bei einem Match zwischen TCTN2 und OCR2 der Pin
    OC2 ( Pin 17 => PortB3 ) je nach Konfiguration durch die Bits COM21 und COM20 ( Tabelle 17.5 Seite 122 ) gesteuert.

    Zu 2. korrekt.

    Zu 3. OCR2 enthält den Wert für den MATCH. OC2 ist der Pin. Der Zähler zählt dann trotzem weiter bis MAX und danach bis BOTTOM usw.

    Zu 4. Ja mit den Bits COM21 und COM20 siehe Tabelle 17.5 Seite 122 wird dies eingestellt.

    Zu 5. Ist mir nicht ganz klar wie Du das meinst. Dein PWM-Signal wird ja an PortB3 ausgegeben. Um dies zu vervielfachen, muß extern noch ein Baustein angefügt werden.

    Ich denke hiermit auch die Fragen die Dir auf der Seele brennen wenigstens Teilweise beantwortet zu haben.

    Bernd_Stein
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Hallo Bernd,

    Danke für deinen Beitrag, damit ist jetzt schon einiges klarer. Vorallem das mit den Registern und Pins und Ports, aber ich muss schon sagen, dass ich gar nicht sooo weit daneben war :-D

    Zitat Zitat von Bernd_Stein
    Dein PWM-Signal wird ja an PortB3 ausgegeben. Um dies zu vervielfachen, muß extern noch ein Baustein angefügt werden.
    Hmm, das scheint ein größeres Problem für mich zu werden, als zuerst gedacht.
    Doch verfolgen wir mal einen anderen Denkansatz, quasi eine Software-Hardware-PWM-Mischung.
    Der Timer zählt ja immer hoch und runter und schaltet bei einem MATCH den PORTB3 um. Jedoch wird bei einem MATCH doch auch ein Interrupt geworfen und an dieser Stelle könnte ich doch manuell auch den kompletten PORTB und D - so wie ich es brauche - umschalten, oder nicht?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    Zitat Zitat von Eroli Beitrag anzeigen
    Hallo Bernd,
    ...
    Hmm, das scheint ein größeres Problem für mich zu werden, als zuerst gedacht.
    Doch verfolgen wir mal einen anderen Denkansatz, quasi eine Software-Hardware-PWM-Mischung.
    Der Timer zählt ja immer hoch und runter und schaltet bei einem MATCH den PORTB3 um. Jedoch wird bei einem MATCH doch auch ein Interrupt geworfen und an dieser Stelle könnte ich doch manuell auch den kompletten PORTB und D - so wie ich es brauche - umschalten, oder nicht?
    Nein das heißt Ja. Es ist gar kein Problem, so wie Du es schreibst, hast Du es schon gelöst. Habe Dich da wohl etwas auf den Holzweg geschickt mit dem zusätzlichen Baustein.

    Bernd_Stein

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Hallo Bernd,

    Es ist gar kein Problem, so wie Du es schreibst, hast Du es schon gelöst. Habe Dich da wohl etwas auf den Holzweg geschickt mit dem zusätzlichen Baustein.
    Gut, schonmal beruhigend.

    Ich bin gerade dabei alles auszutesten und hier mal ein Snippet:
    Code:
    	ldi temp, 0x01	; Zur Kontrolle die ersten beiden LEDs einschalten
    	out PORTB, temp
    	out PORTD, temp
    
    	ldi temp, 1<<OCIE2 | 1<<TOIE1 | 1 <<TOIE0	; Timer0-Overflow und Timer1-Overflow und Timer2-Compare "erlauben"
    	out TIMSK, temp
    	ldi temp, 1 << WGM21 | 1 << CS22 | 1 << CS21 | 1 << CS20	; Phasenkorrekte PWM und Prescaler setzen
    	out TCCR2, temp
    	ldi temp, 0xFF	; Irgendein Startwert fuer OCR2 (Unsere Helligkeit: 0xFF entspricht volle Helligkeit)
    	out OCR2, temp
    Leider bleibt die LED an PortB3 die ganze Zeit aus (auch wenn ich OCR2 mit 0x00 lade)...

    Irgendeine Idee?


    EDIT: Ich musste COM20 noch auf 1 setzen, damit beim CompareMatch auch getoggled wird....Ein Erfolgserlebnis
    Geändert von Eroli (19.04.2011 um 17:20 Uhr)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Hallo nochmal,

    ich weiß nun, dass es eigentlich klappen müsste, denn wenn ich den Prescaler entsprechend hochsetze, z.B. 1024, dann sehe ich die LED flackern. Wenn ich den Prescaler soweit runtersetze, dass ich kein flackern mehr sehe (derzeit Prescaler 64), dann kann ich leider keine Helligkeitsunterschiede feststellen, egal ob ich OCR2 mit 0xFF oder 0x00 lade...
    Das wird wohl an der logarithmischen Helligkeitswahrnemung unseres Auges liegen, was ich auf Mikrocontroller.net gelesen habe, damit unser Auge einen möglichst großen Helligkeitsbereich wahrnehmen kann.

    Gibt es da vielleicht noch einen Trick um doch irgendwie deutlichere Ergebnisse zu erzielen?

    Mein Code sieht derzeit so aus:
    Code:
    	ldi temp, 0x01	; Zur Kontrolle die ersten beiden LEDs einschalten
    	out PORTB, temp
    	out PORTD, temp
    
    	ldi temp, 1<<OCIE2 | 1<<TOIE1 | 1 <<TOIE0	; Timer0-Overflow und Timer1-Overflow und Timer2-Compare "erlauben"
    	out TIMSK, temp
    	ldi temp, 1 << COM20 | 1 << WGM21 | 0 << CS22 | 1 << CS21 | 0 << CS20	; Phasenkorrekte PWM und Prescaler setzen
    	out TCCR2, temp
    	ldi temp, 0x00	; Irgendein Startwert fuer OCR2 (Unsere Helligkeit)
    	out OCR2, temp
    Vielen Dank im Voraus

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    Hallo,

    in deinem Programm wo das OCR2-Register mit dem Wert Null lädst, wird dadurch ein Dauer-Low-Signal oder je nachdem ob invertiert oder nicht ein Dauer-High-Signal erzeugt.
    Im Datenblatt auf Seite 116 nach einer Formel steht dazu folgendes.

    The extreme values for the OCR2 Register represent special cases when generating a PWM
    waveform output in the phase correct PWM mode. If the OCR2 is set equal to BOTTOM, the output
    will be continuously low and if set equal to MAX the output will be continuously high for noninverted
    PWM mode. For inverted PWM the output will have the opposite logic values.

    Bernd_Stein

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Das ist allerdings seltsam, dann müsste bei 0x00 die LED immer aus sein und bei 0xFF immer an, aber genau das ist nicht der Fall. Die LED leuchtet immer mit derselben Helligkeit.
    Stimmt vielleicht doch etwas mit meiner PWM nicht?
    Warum konnte ich denn ganz klar ein blinken/flackern mit größerem Prescaler feststellen?

Ähnliche Themen

  1. Atmega8 PWM - Timer2 - Pin17 ?
    Von hellraider im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 03.07.2011, 16:23
  2. Mit Atmega8 Hardware PWM mit Timer2
    Von hosti im Forum C - Programmierung (GCC u.a.)
    Antworten: 46
    Letzter Beitrag: 12.07.2009, 18:16
  3. Timer2 Atmega8
    Von Brantiko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 17.03.2009, 07:13
  4. Problem mit dem Timer2 eines ATMega8
    Von sloti im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 01.07.2008, 21:48
  5. Servosteuerung mit Timer2 Atmega8
    Von apfeldieb im Forum Motoren
    Antworten: 0
    Letzter Beitrag: 05.04.2008, 17:29

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen