-         

Ergebnis 1 bis 6 von 6

Thema: Zwei Timer gleichzeitig nutzen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2005
    Beiträge
    25

    Zwei Timer gleichzeitig nutzen

    Anzeige

    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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    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?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2005
    Beiträge
    25
    ...also


    Habs einfach mal ausprobiert:

    Ich lasse jetzt zusätzlich den zweiten Timer laufen


    Code:
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    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?

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2005
    Beiträge
    25
    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.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •