Forum: Mikrocontroller und Digitale Elektronik Atmega32u4 PWM


von xvzf (Gast)


Lesenswert?

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
1
#define MFRONT_L COM1A1 // PB5
2
#define MFRONT_R COM1B1 // PB6
3
#define MBACK_L  COM1C1 // PB7
4
#define MBACK_R  COM3A1 // PC6 - Ich geh davon aus, dass hier kein Fehler ist
5
6
/* ................................. */
7
8
// Set motor pins as output
9
DDRB |= ( (1<<PB5) | (1<<PB6) | (1<<PB7) );
10
11
DDRC |= (1<<PC6); // Hier schon der Fehler?
12
   
13
/*Setup Timer 1 - Das funktioniert einwandfrei*/
14
TCCR1A |= (1<<WGM11); // phase correct mode & no prescaler
15
TCCR1A &= ~(1<<WGM10);
16
TCCR1B &= ~(1<<WGM12) &  ~(1<<CS11) & ~(1<<CS12);
17
TCCR1B |= (1<<WGM13) | (1<<CS10);
18
ICR1   |= 0x3FFF; // TOP to 16383;
19
   
20
/*Setup Timer 3 - Hier gibts offenbar Probleme ?*/
21
TCCR3A |= (1<<WGM31); // phase correct mode & no prescaler
22
TCCR3A &= ~(1<<WGM30);
23
TCCR3B &= ~(1<<WGM32) &  ~(1<<CS31) & ~(1<<CS32);
24
TCCR3B |= (1<<WGM33) | (1<<CS30);
25
ICR3   |= 0x3FFF; // TOP to 16383;
26
  
27
   
28
/*Associate Motor Pins*/
29
TCCR1A |= (1 << MFRONT_L); // connect pin MFRONT_L to timer 1 channel A
30
TCCR1A |= (1 << MFRONT_R); // connect pin MFRONT_R to timer 1 channel B
31
TCCR1A |= (1 << MBACK_L); // connect pin MBACK_L to timer 1 channel C   
32
 
33
//  Hier ist offenbar ein Fehler? Kompiliert allerdings problems
34
//    ||
35
//    ||
36
//    v
37
TCCR3A |= (1 << MBACK_R); // connect pin MBACK_R to timer 3 channel A   
38
39
/* .......................... */

Und hier, um die Pulsweite zu setzen:
1
/*.............................*/
2
// Motor front left
3
OCR1A = ((FRONT_L<<4) - 16000) + 128;
4
// Motor front right
5
OCR1B = ((FRONT_R<<4) - 16000) + 128;
6
// Motor back left
7
OCR1C = ((BACK_L<<4) - 16000) + 128;
8
9
10
// Motor back right - Wieder, ist hier eventuell ein Fehler?? Ich finde leider nichts
11
OCR3A = ((BACK_R<<3) - 16000) + 128;
12
/*.............................*/


LG
Matthias

von xvzf (Gast)


Lesenswert?

Rückruf!!! Fehler gefunden, muss (...<<4) sein anstatt (...<<3)

LG

von Zack (Gast)


Lesenswert?

Thank you for  your code, the useful range for the ESC is from 1ms to 
2ms . With your code seems to be   9750 <= value <= 10150  [400 values]
OCR1A = ((value<<4) - 16000) + 128;
  // Motor front right
  OCR1B = ((value<<4) - 16000) + 128;
  // Motor back left
  OCR1C = ((value<<4) - 16000) + 128;
    // Motor back right - Wieder, ist hier eventuell ein Fehler?? Ich 
finde leider nichts
  OCR3A = ((value<<4) - 16000) + 128;


Is there a way to extend the range?  I need more granularity

Thanks

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
Noch kein Account? Hier anmelden.