PWM auf dem ATMEGA2560

Gast #3557316
Lesenswert?

Hallo liebes Forum!

Ich habe letztens folgendes C-Programm geschrieben:
1
/********************************************
2
* PWM
3
* author: Mithrandir
4
*********************************************/
5

6
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <avr/delay.h>
9
#include <stdint.h>
10
#include <avr/signal.h>
11
uint8_t pwm = 0;
12

13
static void PWM(void) {
14

15
 DDRB=0xFF;  // Port B as output
16

17
ICR1 = 100;        // Set top for timer 1
18
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
19
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
20

21
OCR1A = 100;
22
OCR1B = 0;
23

24
}
25

26
int main(void) {
27

28
  PWM();
29

30
  while(1) {
31
  
32
  for (pwm = 0; pwm < 100; pwm = pwm + 10) {
33
  OCR1B = pwm;
34
  _delay_ms (200);
35
  }
36

37
  for (pwm = 100; pwm > 0; pwm = pwm - 10) {
38
  OCR1B = pwm;
39
  _delay_ms (200);
40
  }  
41
                  
42
  }
43
  return(0);
44
}

Jetzt bekomm ich ja am PB6 ein veränderliches PWM-Signal.

Meine Frage: Wie kann ich jedem Pin vom PORTB ein individuelles 
PWM-Signal zuweisen?

Freue mich auf Eure Antworten!

MfG Mithrandir
#3557789
Lesenswert?

Jedes Pin von Port B als PWM wird nicht funktionieren, nur PB3, PB5, 
PB6.
PB6 hast schon angesteuert mit OCR1B, jetzt musst noch die anderen 
entsprechend initialisieren, OC1A (PB5), OC2A (PB4).
OC1A hängt noch am Timer 1, OC2A braucht dem Timer2.
Musst ebenso vorgehen wie für das Pin PB6, also die Register-Bits 
suchen, die einstellen, dass der Counter das Pin umschalten soll.
Und im Falle von Timer2 den ebenso initialisieren wie Timer1.
Wobei Timer2 ein 8 Bit Timer ist und Timer1 ein 16-Bit Timer.

Das alles gibt's im Datenblatt:
http://www.atmel.com/images/doc2549.pdf

Pinout-Diagramm , da siehst Du die OCRnx-Bezeichnungen, das sind die 
PWM-Pins. und dabei steht das n für den Timer an dem das Pin hängt und x 
ist A/B/C für die Counter, die ein Timer hat.
#3564938
Lesenswert?

Amplifier schrieb:
> Ich hätte da eine Frage: Ist es eigendlich normal dass ich, wenn ich ein
> PWM am PORTB programmiere lediglich am OCR1B (PB6) ein PWM bekomme und
> PB5 und PB3 jeweils nur 0V und 5V ausgeben?

Deine Frage ist ein wenig seltsam.
Du kriegst genau an den Pins eine PWM, die an einen Timer gekoppelt sind 
und dessen Timer du so programmiert hast, dass er eine PWM erzeugt und 
du diese PWM auch mit dem Pin gekoppelt hast.
Bei welchen Pins das möglich ist und an welchen Timer man sie koppeln 
kann, das steht im Datenblatt bzw. das kann man bereits erkennen, wenn 
man sich die Bezeichnungen der möglichen Zusatzfunktionen jedes Pins in 
der Pin-Übersichtszeichnung am Anfang des Datenblatts ansieht.
Wenn es bei einem Pin keine Zusatzfunktion gibt, die mit "OC.." anfängt, 
dann kann man auf diesem Pin auch keine PWM erzeugen. Also - mit 
Hardware-PWM. Händisch in der Software mittels einer ISR kann man 
natürlich auf jedem Pin eine PWM erzeugen. Eine PWM ist ja auch nichts 
anderes als ein zeitlich geordnetes High-Low Schalten eines Pins. Aber 
darum geht es ja nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren