PWM Pin entkoppeln und wieder ankoppeln

Gast #1961326
Lesenswert?
• ▲
▼
Hallo,

ich habe hier auf einem AT90CAN128 eine PWM als Fast-PWM (Mode 14) 
laufen.
Alles wunderbar.
Nun möchte ich periodisch für eine sehr kurze Zeit (ca 400us was kleiner 
als die PWM Frequenz ist (1000Hz bzw 250Hz) gerne den PWM Pin auf high 
legen, damit ich einen definierten high Pegel für eine bestimmte Aktion 
habe. Wenn ich den Dutycycle auf 100% setze bekomme ich ein 
unregelmäßiges Verhalten, da ich ja schneller als die PWM Frequenz sein 
will und der Wert für den Dutycycle ja immer erst nach Ablauf einer 
Periode umgeladen wird.

Meine Idee war nun den Portpin zu entkoppeln. Was ich mit dem Umschalten 
auf Mode 0 mit folgender Funktion beabsichtige.
1
void setPWM1mode(u08 channel, u08 mode) {
2
  //activates a PWM channel and sets Compare Output Mode
3
  //channel 1: A  |  mode 0: normal port operation, OCnx disconnected
4
  //        2: B  |       1,2,3: depends on PWM mode (CTC, fastPWM,phasefrequency correct), see datasheet page 136f
5
  //        3: C  |
6
  if (channel == CHANNEL_A) {
7
    //channel A
8
    TCCR1A &= ~( (1 << COM1A0) | ((1 << COM1A1)) ); //clear COM
9
    TCCR1A |= (mode << COM1A0);                     //set new COM
10
  }
11
  else if (channel == CHANNEL_B) {
12
    //channel B
13
    TCCR1A &= ~( (1 << COM1B0) | ((1 << COM1B1)) ); //clear COM
14
    TCCR1A |= (mode << COM1B0);                     //set new COM
15
  }
16
  else if (channel == CHANNEL_C) {
17
    //channel C
18
    TCCR1A &= ~( (1 << COM1C0) | ((1 << COM1C1)) ); //clear COM
19
    TCCR1A |= (mode << COM1C0);                     //set new COM
20
  }
21
}

Dann setze ich den Pin auf high (Ausgang ist er ja bereits).
Scheint alles auch zu klappen.

Wie bekomme ich nun wieder das PWM Signal?
Ich habe gedacht, ich muss nur den Pin wieder an den Timer koppeln und 
dafür den Mode mit obiger Funktion wieder auf 2 stellen, so wie er 
vorher war. Aber das scheint nicht zu klappen.
Vorm Funktionsaufruf setze ich den Pin wieder auf low und erhalte nun 
nur noch einen kurzen Puls entsprechend meines periodischen Aufrufs.
Muss ich die PWM komplett neu initialisieren?
Eigentlich habe ich das so verstanden, dass die PWM bzw. der Timer im 
Hintergrund einfach weiter läuft. Das Neuinitialisieren würde ja auch 
relativ lange dauern. Ich möchte den normalen PWM Ablauf so kurz wie 
möglich stören.

Über Hilfe wäre ich sehr dankbar, da ich jetzt hier schon einige Zeit 
rumprobiere.
Danke.

Gruß
Max

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.