pwm

Gast #563961
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
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
> 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
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
> 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
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
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.