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
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
/* .......................... */
Und hier, um die Pulsweite zu setzen:
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;
/*.............................*/
Ich bin für jede Hilfe dankbar!!
LG
Matthias
Lesezeichen