Forum: Mikrocontroller und Digitale Elektronik PWM auf dem ATMEGA2560


von Mithrandir (Gast)


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

von Conny G. (conny_g)


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.

von Mithrandir (Gast)


Lesenswert?

Ok, danke für die Antwort!

Meine ürsprüngliche Idee war ja dass ich ein Art Knight-Rider Lauflicht 
baue, bei dem die LEds verschieden hell leuchten.

von Conny G. (conny_g)


Lesenswert?

Der Atmega2560 hat lt. Datenblatt 12 PWM Kanäle, aber nicht Port B, 
sondern andere Pins.
Musst Dir halt aus dem Datenblatt zusammensuchen, welche Du brauchst.

von Amplifier (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
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.