mikrocontroller.net

Forum: Compiler & IDEs pwm


pwm
Autor: huskiwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Selbstverständlich müssen die Portpins als Ausgänge konfiguriert werden!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Muss ich den Ausgang noch irgendwie initialisieren

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

Autor: huskiwr (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: huskiwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: internet suchmaschine gefunden, google (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: huskiwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: huskiwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.