Hallo Forum,
ich versuche nun schon seit 3 Wochen meinen Bot (rn-control mit zwei Getriebemotoren) mit einer eigenen PWM-Routine ans Laufen zu bringen.
Ich bin total verzweifelt !
Beispiel-Listings und Eure Hilfen hier in zahlreichen Themen haben leider noch nicht zum Ziel geführt.
Also .... das board scheint alles zu machen, was es soll (flashen und so) Beispielprogramme in Bascom laufen auch (UART und so). Allerdings drehen sich die Motoren keinen Millimeter.
Wenn ich eigene Funktionen teste, bei denen die PWM-Pins PD4 und PD5 auf 1 gesetzt werden, dann laufen die Motoren sehhr langsam. Irgendwie habe ich den Verdacht, dass da was kaputt ist im Controller oder im Motortreiber-Baustein.
Kann das denn sein ? Entweder funktionierts oder eben nicht. Aber nicht halb oder ?
Ich hab leider keinen Oskar mit dem ich mir was anschauen könnte.
Hier ist der Construktor meiner Robotter-Klasse in C++:
Die Timer1-Einstellungen sehen bei mir so aus:Code:// -------------------------------------------------------------------------------- // Konstruktor // -------------------------------------------------------------------------------- rncboard::rncboard() { // PORT B: Motortreiber: PB0 und PB1 // 7 6 5 4 3 2 1 0 DDRB = 3; // 0 0 0 0 0 0 1 1 PORTB = 0; // PORT C: Motortreiber: PC7 und PC6 // 7 6 5 4 3 2 1 0 DDRC = 0xff; // 1 1 1 1 1 1 1 1 PORTC = 0; PORTC |= 0x3f; // 0 0 1 1 1 1 1 1 // PORTC: 0 0 1 1 1 1 1 1 // PORT D: Motor-PWM: PD4 und PD5 // 7 6 5 4 3 2 1 0 // Sound - PWM Mot1 PWM Mot0 INT1 INT0 TXD RS232 RXD RS232 // 1 0 1 1 0 0 1 0 // 7 6 5 4 3 2 1 0 DDRD = 0xb2; // 1 0 1 1 0 0 1 0 PORTD = 0; // 0 0 0 0 0 0 0 0 // PORTD |= 0x0c; // PORTD: 0 0 0 0 1 1 0 0 initTimer1(); }
Und die Motor-Richtungs- und Steuerungs-Funkion sieht im Moment noch so aus:Code:// -------------------------------------------------------------------------------- // Timer1-Einstellung fr PWM-Betrieb // -------------------------------------------------------------------------------- void initTimer1(void) { TCCR1A = 0; TCCR1B = 0; // sel. inv. sel. inv. 8-Bit-fast-PWM TCCR1A |= (0<<COM1A1)|(1<<COM1A0)|(0<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10); // 8-Bit-fast-PWM ---- Takt / 1024 ---- TCCR1B |= (1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10); // TIMSK |= (0<<TICIE1)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1); sei(); }
Hier werden in Abhängigkeit vom Wert der Geschwindigkeit (und dem Vorzeichen) die Drehrichtung und der speed gesetzt.Code:void rncboard::motor(uint8_t i, int8_t speed) { if ((i!=0) || (i!=1)) return; // Entweder 0 oder 1 if (i==0) { // linker Motor: Motor0 OCR1A = abs(speed); if (speed==0) { // Stop cbi(PORTC, 6); // Kanal1 = 0 cbi(PORTC, 7); // Kanal2 = 0 } else if (speed>0) { // vorw�ts drehen sbi(PORTC, 6); // Kanal1 = 1 cbi(PORTC, 7); // Kanal2 = 0 } else { // rckw�ts drehen cbi(PORTC, 6); // Kanal1 = 0 sbi(PORTC, 7); // Kanal2 = 1 } } if (i==1) { // rechter Motor: Motor1 OCR1B = abs(speed); if (speed==0) { // Stop cbi(PORTB, 0); // Kanal1 = 0 cbi(PORTB, 1); // Kanal2 = 0 } else if (speed>0){ // vorw�ts drehen sbi(PORTB, 0); // Kanal1 = 1 cbi(PORTB, 1); // Kanal2 = 0 } else { // rckw�ts drehen cbi(PORTB, 0); // Kanal1 = 0 sbi(PORTB, 1); // Kanal2 = 1 } } }
Soweit jedenfalls meine Überlegungen.
Wenn ich das Register TIMSK auf 1 setze um alle 4 Interrupts zu setzen scheint allerdings gar nix mehr zu gehen. Also hab ich das besser gelassen.
Würde mich echt freuen, wenn Ihr mir dazu was sagen könntet.
Ich habe übrigens versucht, aus den Datenblättern den PWM-Modus 11 (Phasenkorrekt) zu benutzen. Eventuell ist hier ja was grundlegendes faul.
Bis denn.... Klaus![]()
Lesezeichen