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; }
> Muss ich den Ausgang noch irgendwie initialisieren
Ja. Nach dem Einschalten sind alle I/O-Ports als Eingang geschaltet.
Deine Compare-Match-Werte sind zu groß. Du hast 10-bit-PWM eingestellt. Da geht der Zähler nur bis 1024.
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?
> 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.
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; }
> 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?
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.