-         

Ergebnis 1 bis 7 von 7

Thema: Schrittmotoransteuerung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    24.01.2006
    Alter
    39
    Beiträge
    6

    Schrittmotoransteuerung

    Anzeige

    Hallo Leute,

    ich versuch einen Programm zu schreiben das einen Schrittmotor zum laufen bringt.
    Beim Ansteuern eines Getriebemotors hat alles geklappt, aber bei Schrittmotoren setzt es bei mir total aus. Hab schon mehrere Tutorials durchgelesen und werd aber nicht schlau daraus.
    Ich hab das RN-Control Board und einen Unipolaren Schrittmotor (6 Anschlusskabel).
    Ich hab wie in dem Tutorial
    http://www.roboternetz.de/wissen/ind...Schrittmotoren
    beschrieben die Leitungen identifiziert und dann angeschlossen (die Mittelanzapfung hab ich nicht angeschlossen).
    Ich hab folgendes Prog
    Code:
    #include <avr/io.h> 
    
    void init(void); 
    void timer1_init(void); 
    void delay_ms(unsigned int ms); 
    
    int main(void) 
    { 
       init(); 
        
       timer1_init(); 
         
    
    while(1)
    {    
       
       OCR1AL = 60; 
       OCR1BL = 60; 
       
       //Schritt1	
       PORTC |= (1<<PC6); 		
       PORTC &= ~(1<<PC7);			
       
       PORTB |= (1<<PB0); 	    
       PORTB &= ~(1<<PB1);     	
       
       //Schritt2
       PORTC |= (1<<PC6); 		   	
       PORTC &= ~(1<<PC7);			
       
       PORTB &= ~(1<<PB0); 	
       PORTB |= (1<<PB1);			
       
       //SChritt3
       PORTC &= ~(1<<PC6); 	   	
       PORTC |= (1<<PC7);			
       
       PORTB &= ~(1<<PB0); 		
       PORTB |= (1<<PB1);			 
       
       //SChritt4
       PORTC &= ~(1<<PC6); 	
       PORTC |= (1<<PC7);		
       
       PORTB |= (1<<PB0); 			
       PORTB &= ~(1<<PB1);		
      
    }
       return 0;    
    } 
    
    
    void init(void) 
    { 
       /* Port A als Eingang deklarieren ( A/D-Wandler Eingänge ) */ 
       DDRA = 0x00; 
       PORTA = 0x00; 
        
       /* Port B als Ausgang deklarieren */ 
       DDRB = 0xff; 
       PORTB = 0x00; 
        
       /* Port C als Ausgang deklarieren */ 
       DDRC = 0xff; 
       PORTC = 0x00; 
        
       /* Port D als Ausgang deklarieren */ 
       DDRD = 0xff; 
       PORTD = 0x00; 
    } 
    
    
    /* Timer1 initialisieren */ 
    void timer1_init(void) 
    { 
       /* normale 8-bit PWM aktivieren ( nicht invertiert ), 
          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; 
        
       OCR1A = 0; 
       OCR1B = 0; 
    }
    Bin totaler Anfänger auf dem Gebiet und würde mich über jeden Denkanstoss freuen.

    Gruss
    Torsten

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Hi,
    obwohl der Thread schon ein bisschen älter ist stelle ich doch mal meine Frage hier rein.
    Hast du das Problem in den Griff bekommen? Ich habe gestern versucht einen Schrittmotor aus einem Diskettenlaufwerk anzusteuern und hab mir glatt mal meinen Motortreiber zerhauen. Mein Programm hat dabei sogut wie dasselbe gemacht wie deins.
    Und gleich noch eine Frage .. zu dem Diskettenmotor gibts kein Datenblatt, gibt es da ungefähre Werte von den ganzen Kenndaten?

    Viele Grüße
    CsT

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    Hi,
    wenns einer aus nem uralt-riesen-Diskettenlaufwerk war, dann gib doch einfach dem seine Seriennummer oder was sonst so draufsteht bei google ein, hab ich auch so gemacht

    (wahrscheinlich der:

    KP39HM2-025
    12V Unipolar 4 phase 1.8 degree Stepper from Japan servo
    Red = Common
    Bl = Phase A
    Ye = Phase B
    Br = Phase C
    Or = Phase D
    )

    Wiederstand der Spulen muss man wohl selber messen, falls das geht.
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Steht leider nix drauf auf dem Motor .. das ist das Problem. Steht nur eine 6-stellige Nummer drauf, aber da find ich bei google nichts zu
    Naja, ich gehe mal davon aus, dass der auch 12 V benötigt. Werde den Widerstand der Spulen mal messen, dann kann ich ja I berechnen, oder?
    Spätestens wenn der neue Motortreiber da ist, werde ich mich dann nochmal melden. Oder kann mir jetzt schon jemand helfen?
    Und zwar habe ich das RN-Control und programmiere in C. Mein Programm sieht in etwa so aus wie das von torax. Meine Versorgungsspannung beträgt ~14,5V.
    Wie kann ich dann daraus die 12V gewinnen? Muss ich da PWM nutzen? Und wie kann ich sicher gehen, dass mein Treiber nicht wieder durchfliegt? Getriebemotoren habe ich schon erfolgreich laufen gehabt ..

    Viele Grüße und vielen Dank schonmal!
    CsT

    EDIT:
    So, hab mal den Widerstand zwischen Spule 1a und 1b bzw. 2a und 2b gemessen. Dieser beträgt je 17,2 Ohm.
    Mit I = U / R hätten wir dann I = 12 V / 17,2 Ohm = 0,70 A
    Das würde der Motortreiber ja noch aushalten. Aber das ganze habe ich ja an 2 Spulen, wird das ganze da addiert? Dann hätte ich ja 1,4 A und das hält der L293D ja nicht mehr aus. Muss ich mich auf die Suche nach einem anderen Motor machen?

    EDIT 2:
    Hier noch die wichtigen Teile aus meinem Programm:
    Code:
    void init(void)
    {
    	//Port A als Eingang deklarieren ( A/D-Wandler Eingänge )
    	DDRA = 0x00;
    	PORTA |=  (1<<7);	// Taster-Eingang Pullup an
    	
    	//Port B als Ausgang deklarieren
    	DDRB = 0xff;
    	PORTB = 0x00;
    	
    	//Port C als Ausgang deklarieren
    	DDRC = 0xff;
    	PORTC = 0xff;
    	
    	//Port D als Ausgang deklarieren
    	DDRD = 0xff;
    	PORTD = 0x00;
    	
    	// Timer 0 bzw. 2 Interrupt aktivieren
    	TIMSK |= (1<<TOIE0);
    	
    	// Anfangswert auf 0 setzen
    	TCNT0 = 0x00; 
    	// Prescaler
    	TCCR0 |= (1<<CS00)|(1<<CS02);	// Timer 0: Prescaler 1024
    }
    
    
    void SM_init(void)
    {
    	PORTB &= ~(1<<PB0);
    	PORTB &= ~(1<<PB1);
    	PORTC &= ~(1<<PC6);
    	PORTC &= ~(1<<PC7);
    	
    	PORTD |= (1<<PD4);
    	PORTD |= (1<<PD5);
    }
    
    void TIMER0_OVF_vect(void)
    {
    	Schritt++;		// Fuer Schrittmotor
    	switch(Schritt)
    	{
    		case 0: break;
    		case 1: PORTB |= (1<<PB0); PORTB &= ~(1<<PB1); PORTC |= (1<<PC6); PORTC &= ~(1<<PC7); break;
    		case 2: break;
    		case 3: PORTB |= (1<<PB0); PORTB &= ~(1<<PB1); PORTC &= ~(1<<PC6); PORTC |= (1<<PC7); break;
    		case 4: break;
    		case 5: PORTB &= ~(1<<PB0); PORTB |= (1<<PB1); PORTC &= ~(1<<PC6); PORTC |= (1<<PC7); break;
    		case 6: break;
    		case 7: PORTB &= ~(1<<PB0); PORTB |= (1<<PB1); PORTC |= (1<<PC6); PORTC &= ~(1<<PC7); Schritt=0; break;
    		default: break;
    	}
    }
    
    int main(void)
    {
    	// Ports initialisieren
    	init();
    	// Motor initialisieren
    	SM_init();
    	Schritt=0;
            sei();
    	for(;;) // Endlosschleife fuer main
    	{
            }
            return 0;
    }
    Habe noch eine zweite Version probiert gehabt mit PWM, da ist der Motortreiber dann flöten gegangen .. Mit dieser Version hat der Motor sich gedreht gehabt, wurde aber sehr warm.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    Tach nommal,
    bei den Spulenwiederständen bin ich mir nur nicht so sicher, ob man die so einfach messen kann, da sich der Strom in der Spule durch das Magnetfeld ja glaub auch selber noch beeinflusst. oder so, ich weis es nicht genau...

    ansonsten hilft vlt nochn enfacher Verstärker weiter, mit nem PNP Transistor zu Plus und nem NPN Transistor zu minus , deren Basen dann verbinden und an den Ausgang von deinem Motortreiber hängen. Das dann für jeden Ausgang.

    Hoffe, dass ich nicht NPN mit PNP verwechselt hab...


    *Latein am Ende*
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Hmm .. das hört sich schonmal nicht schlecht an mit den Transistoren. Ich bräuchte dann also je 2 x NPN bzw. PNP?

    Und hast du zufällig mal in mein Programm geschaut? Hat das so gestimmt? Ich habe mal hier nach einem Schrittmotor geschaut:
    http://www.shop.robotikhardware.de/s...roducts_id=124

    Der hat ganz ähnliche Kenndaten und dort steht, dass man ihn ohne Probleme mit RN-Control ansteuern kann?!? Alles ganz schön kompliziert mit den Schrittmotoren ..

    Viele Grüße
    CsT

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    Öööhm, also mitm Proggen hab ichs auch noch net so raus, vor allem mit microcontrolllern.

    Wenn bei dem Motor steht, dasser fürs Board geeignet is, sollte es stimmen.
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

Berechtigungen

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