Hey Leute,
Ich hab ein Problem mit PWM Ausgängen, genauer gesagt beim AtMega32u4.
Ich nutze den Timer1 als 16-bit Timer um 3 PWM Ausgänge anzusprechen.
Das funktioniert alles!
Nur wenn ich den Timer3 exakt gleich konfiguriere, und den einzigen PWM
Ausgang der bei diesem Timer verfügbar ist, verbinde, dann wird dort
offenbar ein anderes Signal erzeugt.
Ich habe leider kein Oszi zur Verfügung, ob zu messen ob und falls ja,
welches Signal anliegt.
Hier mal die Codeausschnitte die Betroffen sind (ist Teil von meinem
Quadrocopter, ich portier das ganze von Arduino zu AVR GCC ohne die
Arduino Librarys)
Initialisierung
Und hier, um die Pulsweite zu setzen:Code:#define MFRONT_L COM1A1 // PB5 #define MFRONT_R COM1B1 // PB6 #define MBACK_L COM1C1 // PB7 #define MBACK_R COM3A1 // PC6 - Ich geh davon aus, dass hier kein Fehler ist /* ................................. */ // Set motor pins as output DDRB |= ( (1<<PB5) | (1<<PB6) | (1<<PB7) ); DDRC |= (1<<PC6); // Hier schon der Fehler? /*Setup Timer 1 - Das funktioniert einwandfrei*/ TCCR1A |= (1<<WGM11); // phase correct mode & no prescaler TCCR1A &= ~(1<<WGM10); TCCR1B &= ~(1<<WGM12) & ~(1<<CS11) & ~(1<<CS12); TCCR1B |= (1<<WGM13) | (1<<CS10); ICR1 |= 0x3FFF; // TOP to 16383; /*Setup Timer 3 - Hier gibts offenbar Probleme ?*/ TCCR3A |= (1<<WGM31); // phase correct mode & no prescaler TCCR3A &= ~(1<<WGM30); TCCR3B &= ~(1<<WGM32) & ~(1<<CS31) & ~(1<<CS32); TCCR3B |= (1<<WGM33) | (1<<CS30); ICR3 |= 0x3FFF; // TOP to 16383; /*Associate Motor Pins*/ TCCR1A |= (1 << MFRONT_L); // connect pin MFRONT_L to timer 1 channel A TCCR1A |= (1 << MFRONT_R); // connect pin MFRONT_R to timer 1 channel B TCCR1A |= (1 << MBACK_L); // connect pin MBACK_L to timer 1 channel C // Hier ist offenbar ein Fehler? Kompiliert allerdings problems // || // || // v TCCR3A |= (1 << MBACK_R); // connect pin MBACK_R to timer 3 channel A /* .......................... */
Ich bin für jede Hilfe dankbar!!Code:/*.............................*/ // Motor front left OCR1A = ((FRONT_L<<4) - 16000) + 128; // Motor front right OCR1B = ((FRONT_R<<4) - 16000) + 128; // Motor back left OCR1C = ((BACK_L<<4) - 16000) + 128; // Motor back right - Wieder, ist hier eventuell ein Fehler?? Ich finde leider nichts OCR3A = ((BACK_R<<3) - 16000) + 128; /*.............................*/
LG
Matthias







Zitieren

Lesezeichen