- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 11

Thema: Schrittmotoren

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51

    Schrittmotoren

    hallo,
    ich steure einen Schrittmotor mit einem CTC Modus, und der Motor soll nur 100 Schritte machen,
    ich habe das so realisiert:

    ISR(TIMER1_OVF_vect)
    {
    zx++;
    }

    ISR(PCINT1_vect)
    {
    if(!(PINC&(1<<PC0)))
    {
    if(zx<<100)
    { OCR1A= xxxxxx;
    PORTB|=(1<<PB0); EN
    PORTB|=(1<<PB1);RICHT
    }
    else
    PORTB&=~(1<<PB0);
    }


    }

    wird das so funktionieren? übrigens ich starte das Prog mit einem Taster, der mit einem PCINT verbunden ist

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Nein. Zuerst solltest du deinen Code aber Mal mit Code-Tags versehen und vernünftig Einrücken, so bekommt man davon ja Augenkrebs.

    Dann stell dir Mal die Frage, was du alles machen musst.
    • Den Zähler zurücksetzen
    • Den Timer starten
    • Nach 100 Schritten den Timer wieder ausschalten (sonst läuft dein Motor weiter)

    Die letzten beiden Punkte betreffen den Timer-Interrupt, der erste das Ereignis "Knopf gedrückt".
    Außerdem solltest du noch eine Entprellung einbauen, sonst gibt es möglicherweise eine unangenehme Überraschung wenn du den Taster drückst.

    Was machst du momentan?
    • Zähler im Interrupt inkrementieren (und sonst gar nix!)
    • Auf einen Knopfdruck reagieren und dabei in irgend einer omniösen Fallunterscheidung entweder den Timer starten oder einen Port bis auf einen Ausgang auf 0 setzen.


    Was Fehlt? Irgendwas was sich um den Ablauf der 100 Schritte kümmert!

    mfG
    Markus

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    hallo,
    ich brauche bitte Eure Hilfe, ich weiß nicht in welche Stelle soll ich den Timer einschalten, und in welche Stelle solle ich den ausschalten, was ich weiß dass mein Timer geht in die fct ISR(OVF), wenn er den Wert von OCR1A erreicht hat. hier mein Code bitte um Korrektur danke
    #include <avr/io.h>
    #include <avr/interrupt.h>





    unsigned int zx=0,zy=0;
    void motorxR(unsigned int schr);
    void motorxL(unsigned int schr);





    int main()
    {


    DDRB=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)| (1<<PB5); // PIN0-5 als Ausgang für die Motoren definieren // PortB als Ausgang definieren
    DDRC = 0; //PORTC als Eingang für PCINT MASK 1 definieren


    // Timer 1 einstellen
    //
    // Modus 4:
    // CTC , Top von OCR1A
    //
    // WGM13 WGM12 WGM11 WGM10
    // 0 1 0 0
    //
    // Timer Vorteiler: 1
    // CS12 CS11 CS10
    // 0 0 1
    //
    // Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
    // COM1A1 COM1A0
    // 0 1
    // OCR1A=(fclk/2*N)-1 N: Vorteiler
    TCCR1A = (1<<COM1A0) | (0<<WGM11);
    TCCR1B = (0<<WGM13) | (1<<WGM12) | (1<<CS10);
    OCR1A=18432;


    //****************** Interrupt initialisieren *************************************
    PCMSK1 = (1 << PCINT|(1 << PCINT9)|(1 << PCINT10)|(1 << PCINT11)|(1 << PCINT12)|(1 << PCINT13); //Pin C0-5 für Pin Change Interrupt in Maske 1 setzen
    PCICR |= (1 << PCIE1); //Pin Change Interrupt Control Register - PCIE3 setzen für PCINT30

    //*********** TIMER1 OVF *****************

    TIMSK1|=(1<<TOIE1);
    TCNT1=30;
    zx=0;


    sei();






    while (1) {}
    }



    ISR(TIMER1_OVF_vect)
    {
    zx++;

    if(zx>100)
    {
    PORTB&=~(1<<PB0);}

    TCNT1=0;
    zx=0;
    }
    ISR(PCINT1_vect) //Interrupt Service Routine
    {

    if(!(PINC&(1<<PC0)))
    {
    motorxR(zx);
    }

    if(!(PINC&(1<<PC1)))
    {
    motorxL(zx);
    }


    }


    void motorxR(unsigned int schr)
    {
    PORTB|=(1<<PB3);
    PORTB|=(1<<PB0);
    }
    void motorxL(unsigned int schr)
    {
    PORTB&=~(1<<PB3);
    PORTB|=(1<<PB0);
    }
    danke

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    also laut datenblatt wenn der Timer ausschalten muss dann muss ich den Vorteiler auf null setzen, richtig?
    Geändert von amal (27.07.2011 um 15:47 Uhr)

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    kann bitte jemand einen Typ geben, wie ich meinen Motor nach 100 Schritte ausschalten kann
    #include <avr/io.h>
    #include <avr/interrupt.h>
    unsigned int zx=0,zy=0;
    void motorxR(unsigned int schr);
    void motorxL(unsigned int schr);

    int main()
    {
    DDRB=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)| (1<<PB5); // PIN0-5 als Ausgang für die Motoren definieren // PortB als Ausgang definieren
    DDRC = 0; //PORTC als Eingang für PCINT MASK 1 definieren



    TCCR1A = (1<<COM1A0) | (0<<WGM11);
    TCCR1B = (0<<WGM13) | (1<<WGM12) | (1<<CS10);
    OCR1A=18432;


    //****************** Interrupt initialisieren *************************************
    PCMSK1 = (1 << PCINT|(1 << PCINT9)|(1 << PCINT10)|(1 << PCINT11)|(1 << PCINT12)|(1 << PCINT13); //Pin C0-5 für Pin Change Interrupt in Maske 1 setzen
    PCICR |= (1 << PCIE1); //Pin Change Interrupt Control Register - PCIE3 setzen für PCINT30

    //*********** TIMER1 OVF *****************

    TIMSK1|=(1<<TOIE1);
    sei();

    while (1) {}
    }

    ISR(TIMER1_OVF_vect)
    {
    zx++;
    if(zx>100)
    {
    PORTB&=~(1<<PB0);
    TCCR1B&=~(1<<CS10);
    }
    zx=0;
    }

    ISR(PCINT1_vect) //Interrupt Service Routine
    {
    if(!(PINC&(1<<PC0)))
    {motorxR(zx);
    }
    if(!(PINC&(1<<PC1)))
    {motorxL(zx);
    }
    }

    void motorxR(unsigned int schr)
    {
    PORTB|=(1<<PB4);
    PORTB|=(1<<PB0);
    }
    void motorxL(unsigned int schr)
    {
    PORTB&=~(1<<PB4);
    PORTB|=(1<<PB0);
    }
    ich glaube der geht gar nicht in ISR(OVF) rein
    Geändert von amal (27.07.2011 um 15:31 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    OVF steht ja Overflow (Überlauf), und durch den CTC-Betriebsmodus läuft dein Zähler im Regelfall NICHT bis zum Überlauf, es überrascht daher nicht, dass der Interrupt auftritt. Bei einem Compare-Match dürfte einer der Output-Compare-Interrupts ausgelöst werden, also OCsonstwas.

    mfG
    Markus

Ähnliche Themen

  1. Schrittmotoren
    Von amal im Forum Motoren
    Antworten: 2
    Letzter Beitrag: 30.05.2011, 11:21
  2. Schrittmotoren
    Von sahra im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 19.05.2010, 10:28
  3. Schrittmotoren
    Von noNeed 4 aNick im Forum Motoren
    Antworten: 6
    Letzter Beitrag: 06.02.2005, 13:42
  4. Schrittmotoren
    Von Genesis-Zeby im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 19
    Letzter Beitrag: 23.12.2004, 14:01
  5. Schrittmotoren? Was ist das??
    Von luxor im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 23.04.2004, 23:34

Berechtigungen

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

Solar Speicher und Akkus Tests