Forum: Compiler & IDEs pwm


pwm
von huskiwr (Gast)


Lesenswert?

Hallo ihr Experten. Ich habe folgendes Problem: Ich möchte mit einem 
Atmega128 zwei Servos mittels PWM ansteuern. Leider habe ich am Ausgang 
(PB5,PB6) kein Signal. Muss ich den Ausgang noch irgendwie 
initialisieren oder was habe ich vergessen?
Danke für eure Antworten.

( 16MHz Taktfrequenz, 50Hz Ausgabe -> übergebene Zahlen entsprechen ms)


#include <avr/io.h>

void initPWM(void)
{
TCCR1A  = (1<<COM1A0) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B  = (1<<CS11);
ICR1     = 20000;
}

void output(int Motor_1,int Motor_2)
{
OCR1A = Motor_1;
OCR1B = Motor_2;
}

 int main()
{

initPWM();
for(;;){
output(1500,2000);
}
return 0;
}

von Johannes M. (johnny-m)


Lesenswert?

Selbstverständlich müssen die Portpins als Ausgänge konfiguriert werden!

von Rolf Magnus (Gast)


Lesenswert?

> Muss ich den Ausgang noch irgendwie initialisieren

Ja. Nach dem Einschalten sind alle I/O-Ports als Eingang geschaltet.

von huskiwr (Gast)


Lesenswert?

habe DDRB = 0xff; in den code eingefügt, läuft immer noch nicht??

von Rolf Magnus (Gast)


Lesenswert?

Deine Compare-Match-Werte sind zu groß. Du hast 10-bit-PWM eingestellt. 
Da geht der Zähler nur bis 1024.

von huskiwr (Gast)


Lesenswert?

Danke bisher.
Nun habe ich ICR1 und die übergebenen Werte angepasst (auch 8bit mode 
ausprobiert und mit OCR1xH und L rumgespielt). Läuft immer noch nicht. 
Findet jemand noch weiter Amateurfehler?

von internet suchmaschine gefunden, google (Gast)


Lesenswert?

> Nun habe ich ICR1 und die übergebenen Werte angepasst

Was meinst du damit genau? Im obigen Programm wird der Wert von ICR1 
ignoriert. Wenn du diesen als TOP-Wert haben willst, mußt du die 
WGM-Bits anders einstellen.

von huskiwr (Gast)


Lesenswert?

hallo Leute.  Mein PWM läuft immer noch nicht. Ich habe nun mein 
eigentliches Problem erkannt, und zwar dass der Counter nicht hochzählt. 
Ich denke TCNT1 sollte von 0 bis 255 zählen und retour. Während dessen 
bei 100 PB5 ein und ausschalten. In TCNT1 steht aber immer 0x0200 was 
soll das??

der Code sieht mitlerweile da vereinfacht so aus.

#include <avr/io.h>

void initPWM(void)

{
TCCR1A  = (1<<COM1A0) | (1<<COM1B0)  | (1<<WGM10);
TCCR1B  = (1<<CS01);
DDRB = 0xff;
}

void output(int Motor)

{
OCR1A = Motor;
}
int main()
{
initPWM();
for(;;){
output(200);
}
return 0;
}

von Rolf Magnus (Gast)


Lesenswert?

> Ich denke TCNT1 sollte von 0 bis 255 zählen und retour.

Ja.

> Während dessen bei 100 PB5 ein und ausschalten.

Nein. Deine COM-Bits sind so eingestellt, daß PB5 als normaler 
non-PWM-Port arbeitet.

> In TCNT1 steht aber immer 0x0200

Wie ermittelst du das?

von huskiwr (Gast)


Lesenswert?

TCNT1 ermittlung via Simulator;
Ich sehe dass COM1B0 für nichts ist da ich nur ein Motor ansteure aber 
das tut ja nichts zur Sache.
Aber wie muss ich dann die com bits setzen? Datenblatt:

COMnA1/COMnB1/COMnC1COMnA0/COMnB0/COMnC0 Description
0 0 Normal port operation, OCnA/OCnB/OCnC
disconnected.
0 1 Toggle OCnA/OCnB/OCnC on compare
match.
1 0 Clear OCnA/OCnB/OCnC on compare
match (set output to low level).
1 1 Set OCnA/OCnB/OCnC on compare match
(set output to high level).

von Rolf Magnus (Gast)


Lesenswert?

Das steht bei mir unter: "Table 58. Compare Output Mode, non-PWM"
Du benutzt aber "Phase Correct PWM", für die Table 60 gilt, und da steht 
für 01:

WGMn3:0 = 9 or 14: Toggle OCnA on Compare Match, OCnB/OCnC disconnected
(normal port operation).
For all other WGMn settings, normal port operation, OCnA/OCnB/OCnC 
disconnected.

Für dich gilt der zweite Satz, da WGM13:0 weder 9 noch 14 ist. Du 
brauchst entweder 10 oder 11.

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.