Frage zu CNC shield v4 und Stepper an Arduino UNO

OP #5356109
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
Angehängte Dateien:
#5356692
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.
#5356863
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

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