Atmega32u4 PWM

Gast #3553473
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
Gast #4023851
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.