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
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?
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;
Der Wert "1024" liegt außerhalb des Bereiches der 10-Bit-PWM! Die geht nur bis 1023 (0x3FF)...
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.
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...
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.
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 ???
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.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.