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