Forum: Mikrocontroller und Digitale Elektronik Frage zu CNC shield v4 und Stepper an Arduino UNO


von Jens-Peter B. (blaine109)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe folgende Frage bzw. Schwierigkeit:

Ich habe einen Arduino UNO R3, den CNC-Shield und den A4988 Treibern.

link zum Artikel:
https://www.amazon.de/Kuman-Engraver-Expansion-Arduino-Heatsink/dp/B06XHC8D16/ref=sr_1_1?ie=UTF8&qid=1521376086&sr=8-1&keywords=cnc+shield+v3&dpID=61nZvmDbo-L&preST=_SY300_QL70_&dpSrc=srch

dazu zwei Stepper Motoren von Quimat, NEMA 17 0,4A/30 Ohm/200 Sschritt 
pro U

ich möchte das Programm mit dem AVR Studio 7 in C# schreiben. Was mich 
erst mal irritiert ist das Pinout vom UNO und vom CNC-Shield irgendwie 
sich beißt. Der X-Step Anschluss liegt beim UNO auf PD2. Dieser kann 
aber gar kein PWM Signal. Ich frage mich hier wie das gehen soll diese 
Achse dann mit PWM anzusteuern. Oder habe ich hier einen Denkfehler?

Das Funktionsprinzip dieses CNC-Shields ist mir irgendwie nicht ganz 
klar.
Die Pins 2, 3 und 4 müssen doch eigentlcih das PWM Signal bekommen um 
die Umdrehungszahl zu bestimmen. 5, 6 und 7 sind doch entweder mit HIGH- 
oder LOW-Signal zu belegen um die Drehrichtung zu bestimmen. Der Rest 
sollte doch erst mal uninteressant sein. Mir ist erst mal wichtig die 
Stepper zum Drehen zu bringen. Das Programm muss ich noch schreiben und 
da Frage ich mich welcher PWM Modus hier einzustellen bzw. korrekt ist.
Könnt ihr mir vielleicht ein paar Infos bzw. Hilfe geben?
Ich danke euch schon mal im Voraus.

Hier mal mein zusammengebastelter Code im Anhang.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
void pwm_init();
5
#define X_DIR DDRD |= 1<<PD5  //Ansteuerung Richtung X-Achse
6
#define Y_DIR DDRD |= 1<<PD6  //Ansteuerung Richtung Y-Achse
7
#define Z_DIR DDRD |= 1<<PD7  //Ansteuerung Richtung Z-Achse
8
#define X_END DDRB &= ~(1<<PB1)  //Endanschlag X-Achse
9
#define X_END DDRB &= ~(1<<PB2)  //Endanschlag Y-Achse
10
#define X_END DDRB &= ~(1<<PB3)  //Endanschlag Z-Achse
11
12
int main(void)
13
{
14
  pwm_init();
15
    while (1) 
16
    {  
17
    
18
    /*if (OCR1A >1000)
19
      {
20
        OCR1A = 100;
21
      }
22
      else
23
      {
24
        OCR1A = OCR1A + 30;
25
      }
26
      _delay_ms(50);
27
    */
28
    
29
    }
30
}
31
32
void pwm_init(void)
33
{
34
  #define X_AXIS DDRD |= 1<<PD2;  //Ansteuerung X-Achse 
35
  #define Y_AXIS DDRD |= 1<<PD3;  //Ansteuerung Y-Achse
36
  #define Z_AXIS DDRD |= 1<<PD4;  //Ansteuerung Z-Achse
37
  DDRB |= 1<<PB7;
38
  TCCR1A = (1<<COM1A1)|(1<<COM1A0)(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(0<<WGM10); //COM1C1=1 COM1C0=0 -> Set on up-count/ matchclear on down-count  WGM - Mode 10 (PWM Phase Correct) TOP=511
39
  OCR1A = 1000;
40
  OCR1B = 1000;
41
  ICR1 = 256000;
42
  TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10)|(1<<WGM13)|(0<<WGM12); // Prescaler = 1024 / ICR1 = TOP
43
}

Liebe Grüße
Jens-Peter

von Christopher J. (christopher_j23)


Lesenswert?

Jens-Peter B. schrieb:
> Der X-Step Anschluss liegt beim UNO auf PD2. Dieser kann
> aber gar kein PWM Signal. Ich frage mich hier wie das gehen soll diese
> Achse dann mit PWM anzusteuern. Oder habe ich hier einen Denkfehler?

Wie der Name schon sagt, verändert man bei PWM die Pulsbreite. Die ist 
so einem Schrittmotortreiber aber eigentlich ziemlich egal, so lange sie 
eine bestimmte Zeit nicht unterschreitet (meist so ~1µs). Was man jedoch 
verändern möchte ist die Pulsfrequenz. Das kann man z.B. mit einem 
Timer-Interrupt realisieren, wobei dann in der ISR die GPIOs 
entsprechend gesetzt werden.

von Jens-Peter B. (blaine109)


Lesenswert?

Hallo Christopher,

Vielen Dank für diedie Info. Ich habe mich da vlol verrant :)

Mal doofe Frage. Könnt es du mir Beispiel code zeigen für eine timer 
interrupt pulsfrequenz?
Liebe Grüße
Jens-Peter

von Christopher J. (christopher_j23)


Lesenswert?

Hallo Jens-Peter,
Beispielcode findest du zum Beispiel hier: 
Die Timer und Zähler des AVR
Ich empfehle aber unbedingt auch noch das Datenblatt dazu zu nehmen um 
die Hardware besser zu verstehen. Für gewöhnlich finden sich dort 
schematische Darstellungen, welche das prinzipielle Verständnis eines 
Timers vereinfachen. Es ist keinesfalls trivial Schrittmotoren bzw. 
deren Treiber sauber mit Step-Impulsen zu versorgen, erst recht nicht, 
wenn man mehrere Achsen hat und zwischen diesen interpolieren will bzw. 
muss. Als fertige Software für bis zu drei Achsen bietet sich GRBL an. 
Das läuft auch auf dem ATMega 328p, also auf dem Arduino Uno. Es läuft 
stabil und schnell, allerdings nutzt es die Ressourcen des 328p wirklich 
aufs äußerste aus, d.h. es ist im Prinzip kein Flash-Speicher mehr für 
eigene Erweiterungen verfügbar. Das Projekt findest du hier: 
https://github.com/gnea/grbl

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.