Hallo wkrug,
Zitat von
wkrug
Mein Vorschlag wäre den Timer 1 ... Auflösung von 1µs pro Zählerstand - TCNT1 ... 2000 - 1000 Stufen. So genau geht kein Servo.
ohhh - und ich schlage mich mit einer 8bittigen PWM herum, die für meine Zwecke (fast) zu grob ist.
Folgende Initialisierung habe ich - vorzugsweise auf dem mega16 - laufen:
Code:
/* #####>>>>> Hier müssen die Motorports der RNControl umbenannt werden. Sie sind
definiert nach altem (RN/Mega32) und neuem (tiny2313) Stand:
Pin auf L293(D) RN/Mega32 tiny2313
EN1, EN2 1, 8 alt auf PD4, PD5 (OC1B,OC1A) neu: PB4, PB3
IN1, IN2 7, 2 alt auf PC6, PC7 neu: PB2, PB5
IN3, IN4 10,15 alt auf PB0, PB1 neu: PB0, PB1 << bleibt
#### */
void init_timer1(void) //Initialisierung des Timers für Erzeugung des PWM-Signals
{
/* normale 8-bit PWM aktivieren ,
Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
/* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);
/* Interrupts für Timer1 deaktivieren
Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
// TIMSK &= ~0x3c; //Versuche ÄHNLICHE Register zu setzten im tiny2313
/* M32: Bit 7 6 5 4 3 2 1 0
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
im M32 gesetzt 0 0 1 1 1 1 0 0 entspr. 3C
t2313 TOIE1 OCIE1A OCIE1B - ICIE1 OCIE0B TOIE0 OCIE0A
im tiny gesetzt 1 1 1 - ? ? 0 ? entspr. E0 od. ED
*/
// TIMSK &= ~0xe8; // dies gilt für tiny2313
TIMSK &= ~0x3c; // dies gilt für mega16(+32)
}
Das läuft ganz gut, mit etwa 30 µs Zyklusdauer. Aber ich kann eben nur in 254 Schritten differenzieren.
Code:
void setPWM1(uint8_t speed)
{OCR1BL = speed;}
void setPWM2(uint8_t speed)
{OCR1AL = speed;}
Wie bitte macht man das nach DEINER Methode? Hättest Du da bitte einen Vorschlag? Geht das dann auch mit dem L293D? Übrigens ist der Timer0 schon mit einer anderen Aufgabe belegt (50µs-Takt für eine Zykluszeitmessung zur Drehzahlbestimmung).
Lesezeichen