Forum: Mikrocontroller und Digitale Elektronik fast PWM mit c


von ATmega8 (Gast)


Lesenswert?

Hey!
Hab folgenden Programcode:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
int main(void){
5
  DDRB = DDRB | (1<<PB1);
6
  
7
  // Clear OC1A on Compare Match, set OC1A at Bottom
8
  TCCR1A = TCCR1A | (1<<COM1A1);
9
  // Fast PWM: TOP = OCR1A
10
  TCCR1A = TCCR1A | (1<<WGM10) | (1<<WGM11);
11
  TCCR1B = TCCR1B | (1<<WGM12) | (1<<WGM13);
12
  // selected clock: prescaler 1024
13
  TCCR1B = TCCR1B | (1<<CS12) | (1<<CS10);
14
  // Set TOP = OCR1A
15
  OCR1A = 0x0000;    //0xFFFF, 0x7FFF auch schon probiert --> immer das gleiche
16
  // Enable Timer/Counter1 Output Compare match interrupt
17
  TIMSK = TIMSK | (1<<OCIE1A);
18
 
19
   sei();
20
   while(1){}
21
  return 0;
22
}
Möchte eine Led mithilfe von PWM dimmen... Erklärungen habe ich mithilfe 
von Kommentaren eingefügt!
Wenn ich das Program laufen lasse leuchtet die LED immer gleich hell! 
auch wenn ich in OCR1A 0x0000 schreibe, wonach die LED meiner meinung 
nach überhaupt nicht leuchten dürfte!?
Die LED habe ich übrigens an die masse geschalten! dh. wenn 5V an PB1 
anliegen muss die Led leuchten...

Ich hoffe ihr könnt mir helfen!
Danke

von Julian B. (julinho)


Lesenswert?

Hi!

Mit Timermode 15 kannst Du an OC1A kein Fast PWM machen, weil das OCR1A 
Register als Top-Wert verwendet wird.
Nimm Timer-Mode 14, dann ist ICR1 dein TOP-Wert und mit OCR1A kannst du 
das Tastverhältnis einstellen.

Gruss

von ATmega8 (Gast)


Lesenswert?

OK danke! es funktioniert auf jeden Fall... Mit Tastverhältnis 
einstellen ist wahrscheinlich gemeint, wann der Compare Match ausgelöst 
werden soll oder?

von Jon (Gast)


Lesenswert?

ICR1 ist die Periodendauer und OCR1A ist die ON(OFF)Zeit.

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.