Forum: Mikrocontroller und Digitale Elektronik Schrittmotoransteuerung,Schritte passen nicht


von Ka I. (banditoka)


Lesenswert?

Hallo,

Ich habe ein kleines Programm geschrieben um einen Schrittmotor 
anzusteuern,jedoch muss ich ein vielfaches an Schritten machen als man 
rechnerisch machen müsste.
Laut Datenblatt brauche ich 64 Schritte pro Umdrehung
Ich schalte die Spulen im Halbschritt durch.
Statt 32 mal muss ich das aber ganze 256 mal machen für eine halbe 
Umdrehung.

Habe ich mich vielleicht mit meinen while-Schleifen verzettelt? Oder 
versteh ich das Konstrukt Treiber mit Schrittmotor noch nicht ganz.

Wäre nett wenn einer mal drüberschauen könnte.
PS: vollSchritt muss ich noch in halbSchritt ändern vom Namen her.

Freundliche Grüße.


1
unsigned char vollSchrittPB[8] = {0b0000,0b0010,0b0010,0b0110,
2
                0b0100,0b0100,0b0000,0b0000};
3
                
4
unsigned char vollSchrittPD[8] = {0b01000000,0b01000000,0b00000000,0b00000000,
5
                  0b00000000,0b00100000,0b00100000,0b01100000};              
6
int i = 0;
7
int DrehRichtung=0;  
8
9
10
int main(void)
11
{
12
    DDRD |= 0x60; //PORT D BITS 0..3 auf Ausgabe 
13
  DDRB |= 0x06; //PORT B BITS 1 und 2 auf Ausgabe
14
  
15
  
16
    while (1) 
17
    {
18
    {  
19
      if(DrehRichtung==0){
20
        int stepsRechts = 0;
21
      while(stepsRechts<=256){
22
      i=0;
23
      while(i<=7){
24
      PORTD = (PORTD & 0x00) | vollSchrittPD[i];
25
      PORTB = (PORTB & 0x00) | vollSchrittPB[i];
26
      i++;
27
      _delay_ms(1);}
28
      stepsRechts++;}
29
      DrehRichtung=1;
30
      _delay_ms(10);}
31
      
32
      
33
      
34
    else{
35
      int stepslinks = 0;
36
      while ( stepslinks<=256){
37
        i=7;
38
        while (i>=0)
39
        {
40
          PORTD = (PORTD & 0x00) | vollSchrittPD[i];
41
          PORTB = (PORTB & 0x00) | vollSchrittPB[i];
42
          i--;
43
          _delay_ms(1);}
44
        stepslinks++;}
45
        DrehRichtung=0;
46
        _delay_ms(10;}
47
      
48
      
49
            }
50
    
51
    
52
  
53
  
54
}
55
}

von K. S. (the_yrr)


Lesenswert?

Ka I. schrieb:
> DDRD |= 0x60; //PORT D BITS 0..3 auf Ausgabe
das sind BITS 5 und 6

wie ist der Motor verschaltet?
also zwischen welchen Pins liegen die Spulen?
was für ein Typ Motor hast du?
dreht der Motor rund? oder vibriert der?

Ausgangsspannung, x=1, _=0:
1
    0      7
2
PD7 xx_____x
3
PD6 _____xxx
4
PB3 ___xxx__
5
PB2 _xxx____
edit: codeblock weil sonst die x unterstrichen werden
Wellenform is nen halfstepp, das Passt zumindest, die Frage ist ob der 
Motortyp passt und ob er richtig angeschlossen ist.

(müsste ein 2 Phasen unipolar sein und 1 bedeuted Phase bekommt Strom, 
Reihenfolge der Phasen sollte der Tabelle oben entsprechen, oder genau 
andersrum)

von Ka I. (banditoka)


Lesenswert?

Vielen Dank K.S.

Ja die Kommentare muss ich noch ändern. Habe das Programm erst für ein 
Standardboard geschrieben und danach für meine selbsterstellte Hardware 
umgeschrieben.

Ich habe meinen Fehler gefunden! Der Motor hat ein Getriebe mit der 
Übersetzung 1:64. 8x256=2048  2048/64 = 32 Schritte = halbe Drehung.

Das heißt nächstesmal das Datenblatt ein paar mal lesen.

Danke trotzdem für deine Zeit und deine Hilfe.

Nachdem der Fehler gefunden ist kann ich mein Programm jetzt umschreiben 
damit ich Interrupts nutzen kann.

Freundliche Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.