Forum: Mikrocontroller und Digitale Elektronik Nema 17 mit Treiberstufe A4988 antreiben mit µC XMEGA-E5 Xplained


von J. S. (king_dschulian)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe folgendes Problem:
ich möchte gerne einen NEMA 17 (1,5A DC, 12-36V, 1,8°) mit einem 
Stromtreiber A4988 betreiben.

Meine Schaltung habe ich wie folgt aufgebaut. (Siehe beigefügtem Bild)
Als Spannungsquelle benutze ich ein Labornetzteil welches ich auf 12V 
eingestellt habe. Von dort gehe ich auf einen Festspannungswandler 
L7805C der mir aus den 12V die 5V für meinen µC (XMEGA-E5 Xplained) und 
die Versorgung für meinen A4988 wandelt. Die Motorspannung greife ich 
bei den 12V ab und führe sie auf den Treiber.

Jetzt habe ich durch das Datenblatt und einiger Recherche herausgefunden 
das mein A4988 schon mal keine internen Pullup oder Pulldown Widerstände 
besitzt.

Jetzt versuche ich mal mein Problem zu schildern.

ich schließe wie oben beschrieben meine Schaltung an. Überprüfe per 
Multimeter anschließend meine Spannungen an den PINS.
GND-VMot --> 12V
GND-VDD --> 5V
GND-Enable --> 0V
GND-DIR --> 5V
GND-STEP --> 5V
GND --> SLEEP --> 5V
GND --> RESET --> 5V
die Microsteps sind mir erstmal egal denn ich würde ihn gerne im 
Vollschrittbetrieb betreiben.

So wenn ich nun die Spannung wegnehme um den Motor anzuschließen, 
anschließend dann die Versorgungsspannung wieder einschalte surrt der 
Motor. Wenn ich nun eine Brücke wie in vielen Foren auch steht von 
SLEEP-->RESET mache beginnt der Motor sich zu drehen (Clockwise --> da 
laut meiner Messung an DIR ja ein HIGH-Pegel anliegt) ziehe ich den 
DIR-PIN mit einer Leitung auf Masse dreht er sich anticlockwise.
Mein Problem ist aber ich möchte nicht das der Motor sich sofort dreht 
sondern per µC über den STEP-PIN steuern.

Das wäre mein Code mit dem ich ausprobieren wollte ob der Motor macht 
was ich von ihm möchte (vorerst drehen nur in eine Richtung). Daran 
scheitert es aber, da er wie oben beschrieben sofort losdreht wenn ich 
die Brücke setze.

Programm wurde mit Eclispe erstellt
1
#include <avr/io.h>          
2
#include <util/delay.h>        
3
4
5
int main( void )          
6
{
7
  int x,y;
8
  PORTD.DIRSET = PIN4_bm;
9
  PORTD.DIRSET = PIN5_bm;
10
  PORTD.DIRSET = PIN6_bm;      
11
12
13
14
15
  while(1){             
16
17
    PORTD.OUTSET = PIN6_bm;
18
    PORTD.OUTCLR = PIN4_bm;
19
20
    for(x=0; x<4; x++)
21
    {
22
      for(y=0; x<50;y++)
23
      {
24
        PORTD.OUTSET = PIN5_bm;
25
        _delay_ms(700);
26
        PORTD.OUTCLR = PIN5_bm;
27
        _delay_ms(700);
28
      }
29
      _delay_ms(1000);
30
    }
31
  }
32
}

Nun meine Frage muss ich meinen STEP-PIN und DIR-PIN mit einem Pullup 
oder Pulldown Widerstand versehen, denn im Datenblatt steht man 
muss/kann STEP & DIR, SLEEP auf HIGH oder LOW ziehen. Wenn ja wäre es 
mit Erklärung sehr hilfreich.
Woran könnte des sonst liegen das der Motor sich sofort dreht. Oder was 
muss ich abändern damit sich der Motor von dem µC ansteuern lässt.

Ich hoffe ich konnte halbswegs mein Problem und meine Ausgangssituation 
schildern, denn das ich mein erster Forumsbeitrag. Falls es Fragen gibt 
die sich aus der Beschreibung oder Problemstellung auftun werde ich mein 
bestes geben es besser zu formulieren.

Danke schon mal im vorraus.

Mit freundlichen Grüßen

Julian Stahl

von Wolfgang (Gast)


Lesenswert?

Julian S. schrieb:
> ich möchte gerne einen NEMA 17 (1,5A DC, 12-36V, 1,8°) mit einem
> Stromtreiber A4988 betreiben.

Der Motor kann keinen derart breiten Nennspannungsbereich besitzen. 
Welche Nennspannung ist wirklich für deinen Motor angegeben bzw. wie 
groß ist der Wicklungswiderstand?

Welche Pins des µC hast du an welche Pins des A4988 angeschlossen? 
Solange dein µC Push-Pull Endstufen hat, brauchst du dir an der Stelle 
um Pull-Irgendwas keine Gedanken zu machen.

Welche Mikroschrittauflösung hast du gewählt?
Was für Sense-Widerstände hast du eingebaut und was hast du als 
Referenzspannung angelegt? Ohne funktioniert die Stromregelung nicht.

von J. S. (king_dschulian)


Angehängte Dateien:

Lesenswert?

Wolfgang schrieb:
> Julian S. schrieb:
>> ich möchte gerne einen NEMA 17 (1,5A DC, 12-36V, 1,8°) mit einem
>> Stromtreiber A4988 betreiben.
>
> Der Motor kann keinen derart breiten Nennspannungsbereich besitzen.
> Welche Nennspannung ist wirklich für deinen Motor angegeben bzw. wie
> groß ist der Wicklungswiderstand?

Laut Datenblatt 1.6 Ohm +-10% bei 25°C
Laut Datenblatt unter 2.6 Voltage: 12-36V
Datenblatt im Anhang auch wenn das nicht so gerne gesehen ist 
Datenblätter mit hochzuladen.

>
> Welche Pins des µC hast du an welche Pins des A4988 angeschlossen?
> Solange dein µC Push-Pull Endstufen hat, brauchst du dir an der Stelle
> um Pull-Irgendwas keine Gedanken zu machen.

ich habe mich beim µC für die Headerleiste J4 entschieden und dort nehme 
ich die  PINS PD4 (TXD on J4)  für meinen Enable-PIN am A4988
              PD5 (SS on J4)   für den STEP-PIN
              PD6 (MISO on J4) für den DIR-PIN

Woran erkenn ich ob mein µC eine Push-Pull Endstufe hat?

>
> Welche Mikroschrittauflösung hast du gewählt?

Ich habe keine Mikroschrittauflösung gewählt, da ich den Motor im 
Vollschrittmodus betreiben möchte --> alle meine Microstep-PINs haben 
ein LOW-Pegel.

> Was für Sense-Widerstände hast du eingebaut und was hast du als
> Referenzspannung angelegt? Ohne funktioniert die Stromregelung nicht.

Auf der Treiberstufe waren die Sense-Widerstände schon drauf gelötet 
(ich muss da doch keine selber drauflöten oder?) ich habe sie gerade 
eben mit dem Multimeter den Wert bestimmt und sie sind beide 0,2 Ohm 
groß.

wenn ich über meinem Poti die VREF messe, VREF = 0,724V an (ich könnte 
das Drehpoti noch ändern, es ist erst kurz über die Hälfte). Das 
entspricht laut Formel

Imax = VREF / 8 x Rsense (Formel aus Datenblatt A4988)
würde in meinem speziellen Fall heißen:
0,4525A = 0,724V / 8 x 0,2 Ohm
--> im Datenblatt ist auch vermerkt das im Vollschritt nur 70% des Imax 
fließen. Der Strom erscheint mir jetzt doch auch bisschen klein aber 
drehen tut sich der Motor ja.

: Bearbeitet durch User
von sascha_focus (Gast)


Lesenswert?

Hi,

du hast den EN-Pin ja beschaltet. Dann nutze ihn doch zum 
Ein-/Ausschalten.
Bei High werden die Ausgänge abgeschaltet. Somit dreht sich der Motor 
nicht.
Bist du dir mit den 0.2 Ohm sicher? Hab da eher was von max. 0-1 Ohm im 
Kopf.
Vom Typ des Motors, hat dieser 2V und 1.3A, laut Google. Bei den von dir 
angegebenen 1.5A müsste VREF 8*1.5A*0.2 Ohm=2.4V sein.

Gruß Sascha

von Einer K. (Gast)


Lesenswert?

Der  A4988 benötigt einen (dicken) Low ESR Elko.
Bitte nochmal Datenblatt lesen.

Steckbretter sind bei 1A meist schon an der Grenze der Belastbarkeit 
angekommen.

von J. S. (king_dschulian)


Lesenswert?

sascha_focus schrieb:
> Hi,
>
> du hast den EN-Pin ja beschaltet. Dann nutze ihn doch zum
> Ein-/Ausschalten.

Das hatte ich mir auch gedachte, das wenn ich auf den EN einen 
HIGH-Pegel gebe müssten doch eigentlich meine Outputs für Motor 
abgeschalten werden. Wieso auch immer Pustekuchen da passiert rein gar 
nichts aber diese Treiberstufen gibt es ja meist im 5er Pack und das ist 
bei allen 5 Treibern so und ich dachte mir die können doch nicht alle 
einen Treffer haben

> Bei High werden die Ausgänge abgeschaltet. Somit dreht sich der Motor
> nicht.

Wie schon oben erwähnt Pustekuchen dachte ich laut Datenblatt auch

> Bist du dir mit den 0.2 Ohm sicher? Hab da eher was von max. 0-1 Ohm im
> Kopf.

Naja in anderen Forumsbeiträgen habe ich auch was mit 0,1 Ohm gelesen, 
sogar schon mit 0,05 Ohm aber wenn ich die Rsense auf der Platine messe 
steht auf meinem Multimeter 0,2 Ohm.

> Vom Typ des Motors, hat dieser 2V und 1.3A, laut Google. Bei den von dir
> angegebenen 1.5A müsste VREF 8*1.5A*0.2 Ohm=2.4V sein.

Die 1,3A stehen das er die bei einem Haltemoment von 360mN.m hat in der 
Suchleiste ist mit 1,5A angegeben. Mit der errechneten VREF stimme ich 
dir zu.


Bloß so richtig weiter hilft mir das aktuell auch noch nicht.
Aber danke fürs Gedanken drüber machen

von sascha_focus (Gast)


Lesenswert?

Hi,

für unser Techniker-Projekt haben wir zwei Schrittmotoren mit dem 
A4988/DRV8825 und einem ATXmega128A4U eingesetzt. Der EN Pin ist zum 
Strom sparen beschaltet und funktioniert auch.


    PORTD.OUTCLR = PIN4_bm;

Du setzt den Pin dauerhaft auf Low, somit ist immer eingeschaltet.

Gruß Sascha

von Wolfgang (Gast)


Lesenswert?

Julian S. schrieb:
> Woran erkenn ich ob mein µC eine Push-Pull Endstufe hat?

An der allgemeinen GPIO-Pinbeschreibung im Datenblatt des µC ;-)

Julian S. schrieb:
> ich die  PINS PD4 (TXD on J4)  für meinen Enable-PIN am A4988
>               PD5 (SS on J4)   für den STEP-PIN
>               PD6 (MISO on J4) für den DIR-PIN

Julian S. schrieb:
> Mein Problem ist aber ich möchte nicht das der Motor sich sofort dreht
> sondern per µC über den STEP-PIN steuern.

Julian S. schrieb:
> for(y=0; x<50;y++)
>       {
>         PORTD.OUTSET = PIN5_bm;
>         _delay_ms(700);
>         PORTD.OUTCLR = PIN5_bm;
>         _delay_ms(700);
>       }

Solange du im Programm fleißig mit dem STEP-PIN wackelst und sonst alles 
frei gegeben ist, muss der Motor doch immer weiter steppen.

Julian S. schrieb:
> Der Strom erscheint mir jetzt doch auch bisschen klein aber
> drehen tut sich der Motor ja.
Das passt schon, um zu sehen, ob er überhaupt steuerbar ist. Wenn du 
mehr Drehmoment brauchst, wirst du den Strom allerdings hochdrehen 
müssen.

von J. S. (king_dschulian)


Lesenswert?

Wolfgang schrieb:
> Julian S. schrieb:
>> Woran erkenn ich ob mein µC eine Push-Pull Endstufe hat?
>
> An der allgemeinen GPIO-Pinbeschreibung im Datenblatt des µC ;-)

Ich habe das Datenblatt gewälzt und bin nicht darauf gestoßen kannst du 
mir eventuell einen Tipp mit der Seitenzahl geben oder einen Tipp wo ich 
das man sinnvollsten finden kann?
>
> Julian S. schrieb:
>> ich die  PINS PD4 (TXD on J4)  für meinen Enable-PIN am A4988
>>               PD5 (SS on J4)   für den STEP-PIN
>>               PD6 (MISO on J4) für den DIR-PIN
>
> Julian S. schrieb:
>> Mein Problem ist aber ich möchte nicht das der Motor sich sofort dreht
>> sondern per µC über den STEP-PIN steuern.
>
>
> Solange du im Programm fleißig mit dem STEP-PIN wackelst und sonst alles
> frei gegeben ist, muss der Motor doch immer weiter steppen.

Naja mehr oder weniger dreht er sich dauerhaft --> er macht vermutlich 
dauerhaft Steps oder? also er läuft komplett rund ohne wirkliche 
"Steppause"

von Volker K. (tobel)


Lesenswert?

Ist die Zeile in deiner Software OK?

>> for(y=0; x<50;y++)

... oder soll es evtl. y<50 sein?

: Bearbeitet durch User
von J. S. (king_dschulian)


Lesenswert?

Volker K. schrieb:
> Ist die Zeile in deiner Software OK?
>
>>> for(y=0; x<50;y++)
>
> ... oder soll es evtl. y<50 sein?

Sie haben Recht da ist definitiv von mir ein Fehler das muss y<50 heißen 
vielen Dank

von Wolfgang (Gast)


Lesenswert?

Auch wenn das eigentliche Problem geklärt ist:

Julian S. schrieb:
> Ich habe das Datenblatt gewälzt und bin nicht darauf gestoßen kannst du
> mir eventuell einen Tipp mit der Seitenzahl geben oder einen Tipp wo ich
> das man sinnvollsten finden kann?

Die Ausgangstreiber sind konfigurierbar:
Kapitel 16. "I/O Ports" unter 16.3 "Output Drive"

http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8153-8-and-16-bit-AVR-Microcontroller-XMEGA-E-ATxmega8E5-ATxmega16E5-ATxmega32E5_Datasheet.pdf

von J. S. (king_dschulian)


Lesenswert?

Wolfgang schrieb:
> Auch wenn das eigentliche Problem geklärt ist:
>
> Die Ausgangstreiber sind konfigurierbar:
> Kapitel 16. "I/O Ports" unter 16.3 "Output Drive"
>
> 
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8153-8-and-16-bit-AVR-Microcontroller-XMEGA-E-ATxmega8E5-ATxmega16E5-ATxmega32E5_Datasheet.pdf

vielen Dank


Also mal ein kurzer Zwischenstand und vielen Dank für euere 
Unterstützung.

Mir ist es gelungen mit der Ansteuerung des Enable Pins den Motor auch 
anhalten zu können. Aber das ist doch eigentlich nicht der Sinn dieses 
Treibers oder?

*Wunschfunktion:*
Mein Ziel wäre es mit einem Taster den Linkslauf zu starten für eine 
vorgegebene Zeit und mit einem zweiten Taster den Rechtslauf für eine 
vorgegebene Zeit.

Meinen Programmcode den ich "versuche" zu schreibe teste ich vorher 
immer erst mit LEDs um meinen Motor und Treiber zu schonen.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
5
int main( void )
6
{
7
  int x,y,z=0;
8
  PORTA.DIRSET = PIN4_bm;  //STEP-PIN
9
  PORTA.DIRSET = PIN5_bm;  //DIR-PIN
10
  PORTA.DIRSET = PIN6_bm;  //Enable-PIN
11
12
  while(z<=0)
13
  {
14
    PORTA.OUTSET = PIN5_bm;  //HIGH-LEVEL für DIR-PIN
15
    PORTA.OUTCLR = PIN6_bm;  //LOW-LEVEL für Enable um Motoroutputs     freizugeben
16
17
    for(x=0; x<4; x++)      //360°/1,8°=200 Steps --> 4x die innere 50er for-Schleife für eine Umdrehung
18
    {
19
      for(y=0; y<50;y++)
20
      {
21
        PORTA.OUTSET = PIN4_bm;
22
        _delay_ms(700);
23
        PORTA.OUTCLR = PIN4_bm;
24
        _delay_ms(700);
25
      }
26
      _delay_ms(1000);      
27
    }
28
    z=1;        //damit While-Schleife nur 1x ausgeführt wird
29
    PORTA.OUTSET = PIN6_bm;    //Enable-PIN High um Motoroutputs zu sperren
30
  }
31
}

Kurze Erklärung hinter meinem Gedanken zu dem Code.

ich deklariere mein Pins des µC --> anschließend setze ich meine DIR-PIN 
auf HIGH für die Drehrichtung im Uhrzeigersinn, Enable auf LOW um 
Outputs freizuschalten --> möchte dann eine Umdrehung in 4 Quadraten 
teilen, und jedes Viertel mit 50 Schritten durchlaufen --> danach setze 
ich z=1 um While-Schleife zu beenden und Enable-PIN auf High um Outputs 
zu sperren.

Aber leider macht der Motor mit diesem Code nicht was ich möchte, bei 
den LEDs klappt mein Vorhaben.

Wo liegt hier der Fehler?
Dieser Code soll dazu führen das ich verstehe wie ich den Motor 
ansteure, mit meiner eigentlichen Wunschfunktion hat das noch nichts 
zu tun, aber wie ich schon erwähnt habe bin ich ja ein Neuling und 
schaffe nicht alles auf einmal sondern möchte mich Stück für Stück an 
mein Ziel heranarbeiten

von Volker K. (tobel)


Lesenswert?

Julian S. schrieb:
> Aber leider macht der Motor mit diesem Code nicht was ich möchte, bei
> den LEDs klappt mein Vorhaben.

... was macht dein Motor nicht ?

von Wolfgang (Gast)


Lesenswert?

Julian S. schrieb:
> Mein Ziel wäre es mit einem Taster den Linkslauf zu starten für eine
> vorgegebene Zeit und mit einem zweiten Taster den Rechtslauf für eine
> vorgegebene Zeit.

Löse dich von der Vorstellung, dass ein Schrittmotor "läuft".
Normalerweise ist immer mindestens eine Wicklung bestromt, d.h. der 
En-Pin wird für den Betrieb schön in Ruhe gelassen und gibt den Treiber 
immer frei. Mit jedem Step-Impuls wird das Strommuster für die 
Wicklungen umgeschaltet und der Anker des Motors richtet sich 
entsprechend dem Feld neuen aus.

Ein Drehwinkel hat also nichts mit irgendeiner vorgegebenen Zeit zu tun, 
sondern einzig mit der Anzahl der Schritt-Pulse. Die Abfolge der 
Strommuster wird durch den DIR-Steuerpin und durch die Microstep 
Konfigurationseingänge festgelegt.

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.