-         

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 47

Thema: Mit Atmega8 Hardware PWM mit Timer2

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388

    Mit Atmega8 Hardware PWM mit Timer2

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Guten Tag

    Ich habe auf einem Atmega8, mit 16mhz getacktet, 3 Hardware PWM's am laufen.
    Die des Timer 1 laufen auch richtig:
    Code:
    TCCR1A= (1<<Com1A1) | (1<<COM1B1);
    TCCR1B = (1<<WGM13) | (1<<CS11);
    
    ICR = 20000;           //Dauer 20ms
    OCR1A = 1000;        //Dauer 1ms
    OCR1B = 1000;        //"
    Jetzt brauche ich aber noch den 3 PWM kanal.
    Code:
    TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS21)
    OCR2 = 250;
    Das ist der Teil von dem ich ausging das er stimmt,
    Durch herumspielen habe ich aber gemerkt das hier die Frequenz nicht stimmt.
    Mir fehlt hier irgendwie auch die möglichkeit ICR1 aus dem Timer 1.

    Nun meine Frage, hat sich jemand mit dem Timer 2 schonmal beschäftigt und weis vieleicht eine lösung?
    Danke

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.06.2008
    Ort
    Rösrath
    Alter
    33
    Beiträge
    332
    Timer2 ist, wenn ich mich recht erinnere, ein 8-Bit-Timer. Deshalb kann OCR2 nicht den Wert 1000 annehmen.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    Richtig, der Wert war zum rumspielen.

    Was mich Wundert ist, dass das Signal von Timer2 gegenüber Timer1 invertiert ist. Obwohl ich nach Einstellungen den selben Modus benutzen müsste.

    Auch ist bei 250 die low flanke gerade mal 5microSekunden. Was eigentlich auch nicht stimmen dürfte?

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    Code:
    TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS20) | (1<<CS21) | (1<<CS22);
    OCR2 = 30;
    Ich krieg mit obigem code einen 1ms High Impuls(Sehr gut)

    Aber mir fehlt einfach ein ICR1 damit ich die 20ms Periodendauer bestimmen kann. Das sollte doch möglich sein, ich habe jetzt das Datenblatt mehrmals gelesen aber ich find nichts. (Leider spreche/lese ich nicht gerade fliessend Englisch)

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    hat keiner eine Idee?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    28
    Beiträge
    607
    du kannst versuchen, mit dem Prescaler (und Fast PWM oder Phase Correct PWM) einen Wert für TOP (0xFF) zu generieren, der den 20ms, die du brauchst ähnelt.

    Gruß, Yaro

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    28
    Beiträge
    607
    Ich habe das mal kurz durchgerechnet.....
    Mit einem Takt von 16Mhz geht das leider nicht auf...
    was du aber machen könntest ist: Du hast doch einen 16bit Timer, der im 20ms-Rhythmus wieder von vorne anfängt. Dies kannst du dir zunutze machen, und diesen Takt für deinen 8bit Timer verwenden, indem du jedes mal, wenn der 16bit Timer bei TOP angekommen ist, einen Interrupt generierst, der deinen 8bit Timer wieder auf 0 setzt.
    Du musst nur darauf aufpassen, dass der 8bit Timer etwas länger als 20ms für seinen durchlauf braucht.

    Ich hoffe, ich konnte dir helfen.
    Gruß, Yaro

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    Besten dank für deine Antwort,

    Nur das Problem ist, wen ich den Timer so laufen lasse das ich über 20ms komme(mit dem 8bit Timer). Dann ist die Auflösung um zwischen 1 und 2 ms zu variieren extrem tief.

    Oder verrechne ich mich da?
    Vieleicht hast du dazu eine Idee

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    28
    Beiträge
    607
    Du hast Recht.....die Auflösung ist wirklich extrem schlecht!
    Hier ist dann eine andere Idee, sie kommt zwar einem software-PWM näher, als einem Hardware-PWM, aber so sollte es trotzdem funktionieren:
    du stellst ein, dass dein TOP(0xFF) etwas über 2ms liegt.
    Du stellst OCR so ein, wie du es brauchst. Nun hast du einen Timer, der deine 2ms am Anfang bedienen kann. Als overflow-interrupt machst du dann folgendes: du stellst deinen 8bit Timer aus!
    Und in dem input-capture-interrupt bei deinem 16bit timer(der jede 20ms auftritt) machst du deinen 8bit-timer wieder an.

    Es sieht dann folgendermaßen aus: der 16bit timer mach den 8bit-timer an, dieser durchläuft seine 2ms und geht aus.

    Vergiss nicht darauf zu achten, dass OC2 nachdem der Timer aus ist auf GMD liegt, und nicht HIGH ist.

    So erzielst du eine 10mal höhere Auflösung. Wenn dir das immernoch nicht genug ist, dann ist auch noch mehr möglich, allerdings geht das dann schon deutlicher auf die Leistung des Controllers.

    Gruß, Yaro

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    Ist bestimmt ein Versuch wert, danke dir

    Code:
    TCCR1A= (1<<Com1A1) | (1<<COM1B1); 
    TCCR1B = (1<<WGM13) | (1<<CS11); 
    
    ICR = 20000;           //Dauer 20ms 
    OCR1A = 1000;        //Dauer 1ms 
    OCR1B = 1000;        //
    
    TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS22);
    OCR = .....
    Damit ist mein Timer knapp über 2ms.

    Code:
    ISR(TIMER2_OVF_vect)
    {
    
    ??
    };
    Wie schalte ich den Timer den nun aus?
    TCCR2 = 0? Resp. wie schalte ich ihn wieder ein. Es wäre toll wen du mir da mit etwas Code aushelfen könntest.

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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