Multichannel PWM bei Atmega128

OP #4502037
Hallo Kenner des Fachs !

Ich weiss ich nerve, aber ich komme einfach nicht weiter, 2 Tage habe 
ich schon im Web und in den ATmel Chip Unterlagen recherchiert und 
probiert.
Ich bekomme einfach mit dem 16-Bit Timer 1 beim ATM128 kein PWM 
gebacken.

Ja es rächt sich die Arduinozeit, wo schon alles fast "Vorgebacken" ist.

Mein Ziel ist es 4 Motoren unabhängig von einander per PWM anzusteuern.
Mit dem Timer0 u.2 (8-Bit) bekomme ich es ja hin, aber ich brauche ja 4 
PWM Ausgänge .

Ich habe dafür  so ein LC-MCU-Board extra mit dem Atm128 gekauft ...

Es kann sein das ich die ganze Sache etwas dumm angegangen bin , bzw 
ganz falsch. Ich weiss es nicht wie ich es richtig angehen soll, da ich 
mit der Chip Doku auch nicht so ganz richtig zu Rande komme.

Ich möchte OC1A, OC1B, OC1C, und OC3A später nutzen .

Habe meinen Anfang mal in eine HTML Datei gelegt und sie hoch geladen:

http://oderlachs.de/forum/code/pwm128.html

Vielleicht sind meine Gedanken ja wirklich irre dazu ich wollte Testen 
ob ich die LEDs an den drei Ausgängen (PB5,PB6,PB7) unterschiedlich hell 
zu leuchten bekomme...
Die LEDs leuchten zwar aber keine Veränderungen machbar... :(

Vielleicht  findet sich ja ein netter Helfer, der mir mal unter die Arme 
hilft und mir einen Denkanstoss weiter gibt.

Gruss und Danke

Gerhard
Gast
Was soll denn genau passieren und was passiert?
1
    TCCR1A |= (1<< WGM10);  //Fast PWM 8 Bit
2
    TCCR1B |= (1<< WGM12);   //Fast PWM 8 Bit
3
   
4
    OCR1AH = 0xFF;
5
    OCR1AL = 0xFF;
6
    _delay_ms(1000);
7
    OCR1BH = 0x7F;
8
    OCR1BL = 0xFF;
9
    _delay_ms(1000);
10
    OCR1CH = 0x00;
11
    OCR1CL = 0x00;
12
    _delay_ms(1000);
Im 8-Bit Timer 1 Mode macht nur OCR1xL beschreiben Sinn und würde 
Wirkung zeigen. OCR1A ohne L oder H versteht der Compiler auch und macht 
die Sache einfacher.
OP
Danke ,
soll das heissen das ich das hier falsch verstanden habe und nur bei den 
8 Bit Timern geht??

Dann muss ich sagen das ich nun da gar nicht mehr durchsehe was im 
Datenblatt steht...

Hätt denn nicht jemand ein Beispiel bitte, für eine 16-Bit-Timer PWM ?

Da würde ich vielleicht erkennen wo mein Fehler liegt. Ich denke schon 
das ich da was Grundlegend falsch mache...

Gerhard
Die entsprechenden Ports auch als Ausgänge geschaltet?

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=0x00FF
// OC1A output: Non-Inverted PWM
// OC1B output: Non-Inverted PWM
// OC1C output: Non-Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,032 ms
// Output Pulse(s):
// OC1A Period: 0,032 ms Width: 0 us
// OC1B Period: 0,032 ms Width: 0 us
// OC1C Period: 0,032 ms Width: 0 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | 
(1<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | 
(0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
Gast
Gerhard H. schrieb:
> Dann muss ich sagen das ich nun da gar nicht mehr durchsehe was im
> Datenblatt steht...
1
    TCCR1A |= (1<< WGM10);  //Fast PWM 8 Bit
2
    TCCR1B |= (1<< WGM12);   //Fast PWM 8 Bit

Im Datenblatt steht, daß obige Zeilen den 8-Bit Modus am 16-Bit Timer 
einstellen nämlich den Mode 5.

Wenn du PWM mit 16-Bit Auflösung haben möchtest, dann mußt du das 
entsprechend dem Datenblatt entnehmen und hinschreiben.

> Hätt denn nicht jemand ein Beispiel bitte, für eine 16-Bit-Timer PWM ?

Ich habe keins.
Gerhard H. schrieb:
> Danke ,
> soll das heissen das ich das hier falsch verstanden habe und nur bei den
> 8 Bit Timern geht??
>
> Dann muss ich sagen das ich nun da gar nicht mehr durchsehe was im
> Datenblatt steht...
>
> Hätt denn nicht jemand ein Beispiel bitte, für eine 16-Bit-Timer PWM ?
>
> Da würde ich vielleicht erkennen wo mein Fehler liegt. Ich denke schon
> das ich da was Grundlegend falsch mache...
>
> Gerhard

Hey, Du stellst 8bit PWM ein, was erwartest Du?
Damit zählt er eben nur bis 255.
Fast PWM geht nicht mit 16bit.

Gruß,
Norbert
H.Joachim S. schrieb:
> Fast-PWM geht auch mit 16bit, top ICR1.

Oh, natürlich.

Gerhard:
Guckst Du "Table 20-5 Waveform Generation Mode Bit Description", Seite 
163 im Datenblatt vom 128A.
Dort stehen alle Modi und wie Du die WGM-Bits setzen musst.

16 Bit Fast PWM wäre Mode 14, wenn Du ICR1 auf 0xFFFF setzt.

Edit: julius war schneller...

Gruß,
Norbert
OP
Hallo Freunde !

Habt alle vielen herzlichen dank für Eure Mühen mit mir. Ich gebe ja zu 
das es auch das erste mal ist das ich da was mit mehreren PWM Ausgängen 
machen möchte. Nun ich behersche das english so gut wie gar nicht, nie 
gelernt habe. Darum sind die Datenblätter auch schwer zu lesen, aber es 
ist wirklich nur das mit der PWM  wo ich da nicht mit klar komme.

Nun habe ich wenigstens es soweit gebracht , um einen PWM Port zu 
gebrauchen.
Nur eben es geht nur der eine nicht aber die anderen beiden:
1
#ifndef F_CPU
2
#define F_CPU 8000000UL
3
#endif
4

5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <util/delay.h>
8
void pwm_init()
9
{   // Atmega128 16-Bit Counter1
10
  // 3 PWM-Ports als Ausgang schalten
11
     DDRB |= (1<< PB5)|(1<<PB6)|(1<< PB7);
12
     TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
13
     TCCR1B = (1<<WGM13)  | (1<<WGM12)  | (1<<CS10);
14
     
15
     ICR1 = 0xFFFF;
16
}  
17

18

19
int main()
20
{  pwm_init();
21
  
22
  while(1){
23
  OCR1A = 0x00ff;  // PB5  aendert sich Helligkeit mit Hexwert
24
  OCR1B = 0x00ff;  // PB6  keine Aenderung !! voll hell
25
  OCR1C = 0x000f;  // PB7  Keine Aenderung !! voll hell
26
}
27
  return 0;
28
}

Mir brummt auch heute schon der Schädel da habe ich nicht mehr solche 
Auffassungsgabe...

Morgen mehr..

Nochmals Vielen Dank Euch allen !!!!

Gerhard
Gast
Gerhard H. schrieb:
> Nur eben es geht nur der eine nicht aber die anderen beiden:
>
1
>      TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
2
> 
3
>   OCR1A = 0x00ff;  // PB5  aendert sich Helligkeit mit Hexwert
4
>   OCR1B = 0x00ff;  // PB6  keine Aenderung !! voll hell
5
>   OCR1C = 0x000f;  // PB7  Keine Aenderung !! voll hell
6
>

Must auch die anderen COM1xy Bits setzen um die Compareausgänge auf auf 
PB6 und PB7 durchzuschalten.
julius schrieb:
> Gerhard H. schrieb:
>> Nur eben es geht nur der eine nicht aber die anderen beiden:
>>
1
>>      TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
2
>>
3
>>   OCR1A = 0x00ff;  // PB5  aendert sich Helligkeit mit Hexwert
4
>>   OCR1B = 0x00ff;  // PB6  keine Aenderung !! voll hell
5
>>   OCR1C = 0x000f;  // PB7  Keine Aenderung !! voll hell
6
>>
>
> Must auch die anderen COM1xy Bits setzen um die Compareausgänge auf auf
> PB6 und PB7 durchzuschalten.

Ätsch, diesmal war ich schneller ;-)

Gruß,
Norbert
OP
Daaaaanke !!!

Super Leute es geht jetzt !!!!

Ja wie gesagt das war ein typisches Fallstrick für einen Einsteiger auf 
dieser Ebene...Hatte ja sonst nur mal mit einem oder zwei PWM Ports 
gearbeitet....

Es hat mich wirklich sehr gefreut, hier soviel Unterstützung zu 
erfahren.

Gerhard

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.