PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei Timer gleichzeitig nutzen



brundle
16.08.2005, 13:35
Hallo,

um die Frequenz für (einen Schrittmotor) zu erhöhen will ich zwei
(8-Bit) Timer gleichzeitig benutzen.

Für den einen Timer läuft das bis jetzt so ab:



SIGNAL (SIG_OVERFLOW2) {





s++;

if(s==20)
{
s=0;

if(i<299)
{
i++;
}

}



TCNT2=ramp_up[i];


PORTA^=(1<<PA0); //PULS: PortA: BIT PA0 invertieren (toggeln)
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
PORTA^=(1<<PA0); //PULS: PortA: BIT PA0 invertieren (toggeln)



}


//wobei ramp_up[] ein Zahlen-Array von 0...254 ist und s die Steilheit ist


Jetzt will ich den zweiten Timer "phasenversetzt" mit dazuschalten.



Die eigentliche Frage ist es:

Kann ich Zwei Timer gleichzeitig nutzen?


Vielen Dank für jeden Hinweis


Stichworte für Suchfunktion:
frequency multiplier
frequencymultiplier
frequenzverdoppler
Motion Control
Motioncontrol

RCO
16.08.2005, 13:38
Du willst die Frequenz erhöhen? Warum lässt du den Timer nciht einfach früher überlaufen? Oder erhöst den Prescaler?
Deine Vorgehensweise verstehe ich erlich gesagt nicht, wie genau funktiniert das?

brundle
16.08.2005, 14:15
...also


Habs einfach mal ausprobiert:

Ich lasse jetzt zusätzlich den zweiten Timer laufen




SIGNAL (SIG_OVERFLOW0) {





t++;

if(t==20)
{
t=0;

if(j<299)
{
j++;
}

}



TCNT0=ramp_up[j];


PORTB^=(1<<PB0);
PORTA^=(1<<PA0); //PULS: PortA: BIT PA0 invertieren (toggeln)
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
PORTB^=(1<<PB0);
PORTA^=(1<<PA0); //PULS: PortA: BIT PA0 invertieren (toggeln)



}


und es läuft:
an Port A PA0 habe ich jetzt mehr Impulse.
(und zum Testen an PORTB PB0 habe ich jetzt unabhängige Impulse von Timer-0.)

Nächstes Problem:
Die Timer müssen 90Grad Phasenverschoben arbeiten.
Jemand ´ne Idee?



@RCO
Ich bin mit dem Timer voll am Limit, ich brauche mehr speed

RCO
16.08.2005, 14:47
Ich bin mit dem Timer voll am Limit, ich brauche mehr speed

Was benutzt du denn für einen AVR (MHZ?). UNd wie sind die Prescaler eingestellt. DU kriegst duch sicher locker 50 Khz hin, oder?

brundle
17.08.2005, 07:10
Ich habe einen ATMEGA32@16MHz der Timer läuft mit dem Prozessortakt.

Ich habe einen Stepper-Motor mit 10000 Steps/Vollumdrehung.
Im Vollgasmode will ich mit ca. 80kHz, also 8 Umdrehungen/Sekunde fahren. (Reserve: besser bis 100kHz)
Die Beschleunigungs Rampe läuft auch 100pro
Das Problem ist es:
Weil ich mit dem Timer am Limit arbeite habe ich ein Rucken in der Rampe:
Wenn der Timer Startwert von 0 an hochgezählt wird, so läuft der Motor
am langsamsten, klar. Ich habe sinusförmige, lineare und e-Funktions Rampen ausprobiert. -ABER- wenn der Timer Startwert von 253 auf 254 erhöht wird, so ist das ein gewaltiger Sprung. Also muss ich insgesamt mit den variabelen Timer Startwertten (Rampenwerten) runter, dann komme ich abe nicht mehr auf 80kHz.

Die Idee ist es zwei 8-Bit Timer um exakt 90 Grad phasenverschoben laufen zu lassen um mit der Frequenz wieder höher zu kommen.
Hier ist das Problem: Woher weiß ich, dass ich zwischen zwei Takten (besser gesagt: genau zwischen den Interrupt-Routinen) bin?
Oder gibt es eine andere Möglichkeit mit nur einem Timer einen Zwischen-Impuls zu generieren, der genau in der Mitte liegt, das Puls-Pausen-Verhältnis soll konstant sein.

RCO
17.08.2005, 11:15
Also eine Möglichkeit, ich weiß nicht ob sie noch offen ist, wäre einfach den Timer1 zu nehmenm, der hat 2 Compareregister. AUßerdem kannst du den Oberwert festlege und den Fast-PWM benutzten, dann ist der TImer doppelt so schnell, wenns dir was bringt.

Mir ist auf ehrlich gesagt nicht ganz klar, was dein Programm macht. Wenn ich das richtig sehe, dann wird es durch einen Interrupt ausgelöst (nach wieviel Takten?) invertiert ein Bit dann für 4 Takte und invertiert es wieder. Wenn es also um die reine takterzeugung geht, wäre es doch sicher besser/schneller, wenn du nicht extra in die IRQ springen und alles "von Hand" ausführen musst.