PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schrittmotoransteuerung



toraX
17.02.2006, 14:01
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
https://www.roboternetz.de/wissen/index.php/Schrittmotoren
beschrieben die Leitungen identifiziert und dann angeschlossen (die Mittelanzapfung hab ich nicht angeschlossen).
Ich hab folgendes Prog


#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

CsT
10.04.2007, 10:39
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

AlKI
10.04.2007, 12:14
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.

CsT
10.04.2007, 12:38
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:



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.

AlKI
10.04.2007, 13:33
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*

CsT
10.04.2007, 14:12
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/shop/catalog/product_info.php?cPath=69&products_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

AlKI
10.04.2007, 18:33
Ööö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.