Forum: Mikrocontroller und Digitale Elektronik PWM Pin entkoppeln und wieder ankoppeln


von Max (Gast)


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

von Max (Gast)


Lesenswert?

Ach Mist, ich habe beim Funktionsaufruf beim Wiederankoppeln nur den 
falschen Channel übergeben. Jetzt geht es.

von I. L. (Gast)


Lesenswert?

Hmm... Was willst du denn eigentlich machen damit?
Scheint mir etwas umstädlich dein Vorhaben.


Gruß Knut

von Max (Gast)


Lesenswert?

Ich möchte periodisch den Status eines BTS HS-Treibers auswerten.
Dieser zeigt immer einen Fehler an, wenn er den gleichen Zustand wie der 
Treiber-Eingang hat. Scheint so zu funktionieren...

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
Noch kein Account? Hier anmelden.