PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM mit Timer 1 will nicht klappen



Speedking
29.07.2006, 02:02
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++:

// --------------------------------------------------------------------------------
// 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();
}

Die Timer1-Einstellungen sehen bei mir so aus:


// --------------------------------------------------------------------------------
// 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();
}


Und die Motor-Richtungs- und Steuerungs-Funkion sieht im Moment noch so aus:


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
}
}
}

Hier werden in Abhängigkeit vom Wert der Geschwindigkeit (und dem Vorzeichen) die Drehrichtung und der speed gesetzt.

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 O:)