Schrittmotoransteuerung mit ATmega 128

#1294559
Lesenswert?

Hey,

Ich hab micht mit der ansteuerung eines Schrittmotors beschäftigt. Und 
ein ganz einfaches Programm geschrieben-- aber er dreht sich einfach 
nicht.
Könnt ihr mir bitte helfen.
Danke im Vorraus.
Angehängte Dateien:
Moderator Persönliche Seite #1294622
Lesenswert?

Kay L. schrieb:
> Hey,
>
> Ich hab micht mit der ansteuerung eines Schrittmotors beschäftigt. Und
> ein ganz einfaches Programm geschrieben-- aber er dreht sich einfach
> nicht.
> Könnt ihr mir bitte helfen.
> Danke im Vorraus.

Als Erstes solltest Du uns mitteilen, welche Leitungen Du wo 
angeschlossen hast und was für ein Schrittmotor das ist - wir haben 
keine Glaskugel :-)

Ein Fehler ist schonmal, dass Du das Datenrichtungsregister (DDRD) mit 
den Werten des Arrays beschreibst. Das sollte aber wohl eher PORTD, also 
das Ausgangsregister, sein.

Außerdem enthält Dein Array nur vier Werte, Du liest aber in jeder 
Schleife zehn Werte aus.

Und: i kann als unsigned int nie kleiner als 0 werden, die zweite 
Schleife wird also nie beendet ...

Näheres gibt es bei mehr Infos :-)

Chris D.
Moderator Persönliche Seite #1295045
Lesenswert?

Kay L. schrieb:
> Hey,
> Stimmt sorry, im Anhang liegen noch die Daten vom Schrittmotor vom QMOT
> Motor QSH2818
>
> Port D 2  schwarz
> Port D 3  grün
> Port D 4  rot
> Port D 5  blau

Ok, also gehören PD2 und PD3 und PD4 und PD5 je zu einer Spule.

Offensichtlich handelt es sich um einen bipolaren Motor. Du musst also 
die Spannungsrichtungen jeder Spule umschalten können.
Laut Datenblatt arbeitet der Motor mit max. 0,7A - Du benötigst also 
einen Treiberbaustein, da der AVR das nicht packt; beispielsweise einen 
L298, L6219 etc.

Im Vollschrittbetrieb (bei Deinem Motor also 1,8°-Schritte) werden immer 
beide Spulen bestromt und dann entsprechend nacheinander umgeschaltet:

1.Schritt: PD2=ein, PD3=aus, PD4=ein, PD5=aus
2.Schritt: PD2=aus, PD3=ein, PD4=ein, PD5=aus
3.Schritt: PD2=aus, PD3=ein, PD4=aus, PD5=ein
4.Schritt: PD2=ein, PD3=aus, PD4=aus, PD5=ein

Dual sieht das für Deinen Port D also so aus:
1.Schritt: 0b00010100 = 0x14
2.Schritt: 0b00011000 = 0x18
3.Schritt: 0b00101000 = 0x28
4.Schritt: 0b00100100 = 0x24

Ich nehme mal an, dass Du an PA0 einen Taster hängen hast, der die 
Drehrichtung ändern soll.
Im Prinzip ist es schon ok, das Array einmal von links nach rechts und 
dann von rechts nach links zu durchlaufen. Ich würde aber einfach i auf 
Unterlauf abfragen:

1
#include <avr/io.h>
2

3
void warten(void);
4

5
// char reicht - wir haben ja nur vier Werte
6
unsigned char i;
7

8
// Die Werte von oben eingesetzt
9
unsigned char tab1[] = {0x14, 0x18, 0x28, 0x24};
10

11
int main (void)
12
{
13
  DDRA = 0x00;  // IN 
14
  DDRD = 0xff;  // OUT
15

16
  while (1)
17
  {
18
    if (PINA & (1 << PA0)) 
19
    {
20
      for (i=0; i<4; i++)
21
      {
22
        PORTD = tab1 [i];
23
        warten (); 
24
      }
25
    }
26
    else
27
    {
28
      // Wenn wir bei i=0 eins abziehen, wird i=255
29
      for (i=3; i<255; i--)
30
      {  
31
        PORTD = tab1 [i];
32
        warten ();
33
      }
34
    }
35
  }
36
  return 0;
37
}
38

39
// Warteschleife
40
// (nicht schön - so etwas macht man besser mit _delay_us etc.)
41
void warten (void)
42
{
43
  unsigned long p;
44
  for (p=0; p<0x1fff; p++);
45
}


Ich hoffe, ich hab nix vergessen - ist einfach so runtergeschrieben ;-)

Chris D.
Moderator Persönliche Seite #1295478
Lesenswert?

Kay L. schrieb:
> Hey du,

Redet man sich bei Euch so an?
Hier sagt man "Hallo Kay"

> ich hab das Programm abgeschrieben, aber es tut nicht--langsam bin ich
> am verzweifeln.
>
> Ich hab den L298 als Treiberbaustein auf einer Externen Platine gelötet.
> Anbei häng ihr dir den Schaltplan von meiner Platine. Ich habe alles
> durch gemessen Ein und Ausgänge sollten gehn.

Natürlich kann das so auch nicht funktionieren, weil Du nicht erwähnt 
hattest, dass PD0 und PD1 die Enable-Eingänge für den L298 sind und 
dementsprechend gesetzt (=1) sein müssen, damit der Motor überhaupt 
irgendetwas macht.
Bit 0 und Bit 1 von PORTD müssen also immer gesetzt sein, wenn der Motor 
sich bewegen soll. Die Array-Werte musst Du dementsprechend anpassen.

Chris D.
Gast #1295513
Lesenswert?

>// Warteschleife
>// (nicht schön - so etwas macht man besser mit _delay_us etc.)
>void warten (void)
>{
>  unsigned long p;
>  for (p=0; p<0x1fff; p++);
>}

Das ist nicht nur unschön, es wird auch nicht funktionieren, der 
Optimizer schmeisst die ganze Warteschlaufe raus, weil sie aus 
Optimizersicht nichts bewirkt! Der Schrittmotor wird mit Sicherheit viel 
zu schnell getaktet und kommt gar nicht zum drehen...

Wenn es schon sein muss, das Zauberwort heisst "volatile"

void warten (void)
{
  volatile unsigned long p;
  for (p=0; p<0x1fff; p++);
}

Oder wie Du selber im Kommentar vorschlägst, verwende doch besser mal 
die _delay_us() oder _delay_ms() Funktion!

=> _delay_ms(2) // 500Hz Schrittfrequenz ist für den Anfang sicher ok
Moderator Persönliche Seite #1295514
Lesenswert?

Dann würde ich zuallererst einmal die Leitungen "durchklingeln", also 
ein kleines Programm schreiben, dass die Ausgänge PD0-PD7 setzt, z.B. so

unsigned char by;
while (1)
{
  PORTD = by;
  by++;
}

und dann mal mit dem Oszilloskop gucken, ob die entsprechenden Eingänge 
des L298 auch wirklich angesteuert werden.
Wenn kein Oszi vorhanden, dann eine Warteschleife einbauen und per 
Leuchtdiode messen.

Ansonsten sehe ich keinen Fehler.

Chris D.

@Peter: Recht haste - ich mache das immer ganz sauber über 
Timerinterrupts, dann stimmen die verzögerungen auch halbwegs :-)
#1295521
Lesenswert?

Moin (Das sagt man bei uns, den ganzen Tag und auch die Nacht ;) )

Also zum Thema, bei solchen Problem nehme ich immer ein paar LED´s und 
gucke mal ob überhaupt was aus dem AVR rauskommt.

Besonders gern laß ich nen Timer (wenn frei) einfach laufen und toggle 
in einer Interruptroutine einen Pin. Da kommt auch eine LED dran und 
schon weiß man, dass der µC prinzipiell läuft. Weiter ist so recht 
sicher, dass das Programm fehlerfrei auf dem AVR gelandet ist.


Evtl. ist das alles selbstverständlich, evtl aber auch nicht ;)


Vielleicht hilft es ja

Grüße aus Hamburg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren