- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
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
    ich habe jetzt den COMP Interrupt benutzt, ich möchte jetzt zum beispiel
    100schritte machen dann auf einem PIN eine PWM signal ausgeben, dann
    nochmal 100 Schritte, das ganze 10mal,das heißt der Motor soll sich 1000
    Schritte machen und 10 mal pwm signal ausgeben. und das habe ich so
    realisiert, ich bitte um Korrektur.
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    volatile uint16_t zx=0,zy=0;
    void motorxR(void);
    
    void sleep_ms(unsigned int ms);
    
    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 15:
      //    Fast PWM, 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)| (0<<WGM10);
             TCCR1B = (0<<WGM13) | (1<<WGM12) | (1<<CS10);
             OCR1A=18432;
    
    
    //******************               Interrupt initialisieren             *************************************
        PCMSK1 = (1 << PCINT8)|(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 COMP *****************
    
            TIMSK1|=(1<<OCIE1A);
            TCNT1=0;
    
        
    
    sei();    
    
            
        
    
    
     
      while (1) {}
    }
    
    
    
    ISR(TIMER1_COMPA_vect)
    {
           if(zx>100)
            {
            PORTB&=~(1<<PB0);
            }
        zx++;
      
    }
    
    ISR(PCINT1_vect)            //Interrupt Service Routine
    {
    
            sei();
            //*******************************       MESSUNG STARTEN    ********************************************
    //*****************************************************************************************************
    
      if(!(PINC&(1<<PC0)))
         {
        
                 for(unsigned int j=0;j<10;j++)
                {    
                      motorxR();
                    PORTB|=(1<<PB5);        //
                    sleep_ms(5);            //   TRIGGERN
                    PORTB&=~(1<<PB5);        //
                    sleep_ms(2);*/
                    zx=0;            // WARTEN 2ms
                }
        }
    
    void motorxR(void)
    {
      PORTB|=(1<<PB3);
      PORTB|=(1<<PB0);
      //PORTB&=~(1<<PB2);
    
    }
    
    
    
    void sleep_ms(unsigned int ms)
    {
      for (unsigned int s=0; s<ms; s++)
       {
        for (long int i=0; i<461; i++) 
      {
          asm volatile("nop"); 
        }
       }
    }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Hey Amal,

    warum probierst du es nicht einfach Mal aus? Es hilft dir wenig, deinen Code ständig hier abzuladen und darauf zu warten, dass jemand nach Fehlern sucht. Zum Programmieren gehört auch das (gezielte) Testen und die darauf unweigerlich folgende Fehlersuche. Und alle drei Disziplinen profitieren von der Erfahrung die du dabei sammeln kannst.

    mfG
    Markus

    PS: Warum hast du sleep_ms reimplementiert, es gibt bereits eine entsprechende Funktion in der avr-libc (util/delay.h).

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    [QUOTE=markusj;519616]Hey Amal,

    warum probierst du es nicht einfach Mal aus?

    das habe ich gemacht, aber leider der Motor dreht sich nur 100 Schritte statt 1000?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    a) Das hattest du nicht geschrieben
    b) Sieh dir Mal die Interruptroutine des Timers genau an, und dann such Mal, wo denn da 10x100 Schritte gemacht werden. Nirgends!
    c) Ich kann auch nicht erkennen, wo da PWM gemacht werden soll ...

    Du solltest dir Mal angewöhnen, etwas strukturierter zu Arbeiten. Plane vorher auf dem Papier, was in welcher Reihenfolge ablaufen soll, und wie du diese Funktionalität verteilst. So durcheinander geht das nicht gut.

    mfG
    Markus

Ähnliche Themen

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

Berechtigungen

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

12V Akku bauen