pwm

Gast #563961
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;
}
Gast #564036
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?
Gast #564271
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.
Gast #565892
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;
}
Gast #566283
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?
Gast #566383
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).
Gast #566448
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.

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