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