Forum: Mikrocontroller und Digitale Elektronik timer/counter 1+pwm auf pin ausgeben


von unbekannt (Gast)


Lesenswert?

hallo, ich versuche mit dem timer/counter 1
zwei unteschiedliche PWM signale auf die pins/ports PD4 PD5 
auszugeben...
aber irgendwie klappt das ganze noch nicht so wie es soll...
das ganze soll mit der fast PWM mode laufen

von Rolf Magnus (Gast)


Lesenswert?

Das ist ja interessant. Hast du auch eine Frage?

Spaß beiseite.: Wie versuchst du es denn? Was tut sich? Um welchen 
Controller geht's überhaupt?

von unbekannt (Gast)


Lesenswert?

dabei handelt es sich um einen atmega32,
das problem ist, das auf beide pins immer ein und dieselbe PWM 
ausgegeben wird, resultat dessen ist, das die beiden motoren immer 
gleich schnell drehen und man den einen motor nicht halb so schnell wie 
den anderen laufen lassen kann...
und das ganze passiert obwohl die vergleichswerte unterschiedlich sind
z.b.
OCR1A = 1024;
OCR1B = 512;

dabei ist der prescaler auf 1 gesetzt und wir haben einen externen takt 
von 16MHz

////////////////////////////////////////
////  Variablendefinition      ////
////////////////////////////////////////

OCR1A = 1024;
OCR1B = 512;

//////////////////////////////////////
//  Timer / Counter        //
//////////////////////////////////////

TCCR1A   = 0xA3;  //Startet Timer/Counter 1
TCCR1B   = 0x19;  //Startet Timer/Counter 1
ICR1=0x03FF;

von johnny.m (Gast)


Lesenswert?

Der Wert "1024" liegt außerhalb des Bereiches der 10-Bit-PWM! Die geht 
nur bis 1023 (0x3FF)...

von johnny.m (Gast)


Lesenswert?

Ach ja, Du würdest hilfswilligen Lesern Deines Codes (und nicht zuletzt 
auch Dir selbst) einen großen Gefallen tun, wenn Du Sachen wie
1
TCCR1A   = 0xA3;  //Startet Timer/Counter 1
2
TCCR1B   = 0x19;  //Startet Timer/Counter 1
mit den Bitnamen in der Art
1
TCCR1A = (1 << BITNAME1)|(1 << BITNAME2)|(1 << BITNAME3); //usw....
schreibst. Dann kann man nämlich sofort sehen, welche Steuerbits Du da 
gesetzt hast.

von johnny.m (Gast)


Lesenswert?

BTW: Wenn Du als TOP-Wert eh 0x3FF verwendest (10-Bit-PWM), dann kannst 
Du auch den PWM-Modus 3 (phase correct 10-Bit) oder 7 (fast 10-Bit) 
nehmen und brauchst das ICR1 nicht zu behelligen...

von Rolf Magnus (Gast)


Lesenswert?

Hmm, also wenn ich die Bits richtig auseinandergefummelt hab, dann sind 
alle WGM-Bits 1 (PWM-Mode 15). Das heißt, dass der TOP-Wert OCR1A ist. 
Der Timer läuft also immer nur bis zu dem Wert hoch, den du in OCR1A 
speicherst. Der Wert von ICR1 ist dann eh wurscht.
Ich nehme an, du wolltest PWM-Mode 14 haben.

von unbekannt (Gast)


Lesenswert?

ok ich habs mal lesbarer gemacht...

OCR1A = 1000;
OCR1B = 50;
wert =0;
//////////////////////////////////////
//  Timer / Counter       ///
//////////////////////////////////////
TCCR1A =   (1 << COM1A1)|(0 << COM1A0)|(1 << COM1B1)|(0 << COM1B0)
       |(0 << FOC1A)|(0 << FOC1B) |(1 << WGM11)|(1 << WGM10);
TCCR1B =   (0 << ICNC1)|(0 << ICES1)|(0 << WGM13)
       |(1 << WGM12)|(1 << CS12) |(0 << CS11)|(1 << CS10);

Fahrt_vorwaerts();



////hier die funktion ///////
#define  MRR  PORTC  &=  0x7F;
#define  MRV  PORTC  |=  0x80;
#define  MLR  PORTC  &=  0xBF;
#define  MLV  PORTC  |=  0x40;

void Fahrt_vorwaerts(void)
{
  MLV;
  MRR;
}

so aber weiterhin besteht das problem, das auf beide ports (D4 D5)
das gleiche PWM geliefert wird, obwohl
OCR1A = 1000;
OCR1B = 50;
einen unterschiedlichen wert enthalten....

muss ich noch irgendein register setzten oder geht es generell nicht, 
das man mit einem Timer/counter 2 unterschiedliche PWM auf die dafür 
zuständigen PWM-Ports geben kann ???

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>(0 << FOC1A)

multosenseful...

von johnny.m (Gast)


Lesenswert?

Lass die "0 << irgendwas" besser weg... Die bringen nichts. Die 
Reihenfolge ist ebenfalls egal. Hauptsache, man muss sich nicht erst das 
komplette Bitmuster aufmalen und alles auseinandertüddeln.

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>und alles auseinandertüddeln.

Vielleicht gibt es dafür ja irgendwo im Netz eine JAVA-Applet ... ;-)

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.