Forum: Mikrocontroller und Digitale Elektronik such hilfe für mein CNC Stepper Libery


von R. B. (kenny-gun) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi Leute

Brauch eure Hilfe und zwar hab eine CNC fräse die NUR mit ATmega644 
steuere +G-code per SD-Karte (Steuer L298 an, ohne L297)

und zwar bekomme Schrägen Linien  Fahrten nicht hin.Habe denn 
Algorithmus  von von Wikipedia 
http://de.wikipedia.org/wiki/Bresenham-Algorithmus. Denn hab ihn in 6 
Richtungen angepasst irgend wo ist da der wurm drin finde ihn aber 
nicht.

1
uint8_t XYZstep(int16_t x, int16_t y,int16_t z,uint8_t lcd)
2
{
3
if(z!=0){
4
if(zkorr==0){zkorr=anschlagfrage();}
5
6
  if((z<=-1) && (zkorr==2)){ z-=85; zkorr=1; }// Z aktzen korektur  korrektur wert 85
7
  if((z>=1) && (zkorr==1)){ z+=85; zkorr=2; }
8
 }
9
10
11
// line berechnung intialisirung
12
uint8_t counter=0;
13
uint8_t counter2=0;
14
int16_t x0, y0, x1, y1, dx, dy , sx, sy;
15
x0=0;
16
y0=0;
17
dx= 0;
18
dy= 0;
19
if((x<y) && (x>0) && (y>0)){            //Postiv
20
 dx =  abs(x), sx = x0<x ? 1 : -1;
21
 dy =  abs(y), sy = y0<y ? 1 : -1;}
22
if((x>y) && (x>0) && (y>0)){
23
 dx =  abs(x), sx = x0<x ? 1 : -1;
24
 dy =  abs(y), sy = y0<y ? 1 : -1;}
25
26
if((x>y) && (x<0) && (y<0)){            // Negativ
27
 dx =  -abs(x), sx = x0<x ? 1 : -1;
28
 dy =  -abs(y), sy = y0<y ? 1 : -1;}
29
if((x<y) && (x<0) && (y<0)){
30
 dx =  -abs(x), sx = x0<x ? 1 : -1;
31
 dy =  -abs(y), sy = y0<y ? 1 : -1;}
32
33
 if((x<y) && (x<0) && (y>0)){           //X Negativ Y Positiv
34
 dx =  -abs(x), sx = x0<x ? 1 : -1;
35
 dy =  abs(y), sy = y0<y ? 1 : -1;}
36
if((x>y) && (x>0) && (y<0)){            //Y Negativ  X Positiv
37
 dx =  abs(x), sx = x0<x ? 1 : -1;
38
 dy =  -abs(y), sy = y0<y ? 1 : -1;}
39
40
int16_t err = dx+dy;
41
int16_t e2;
42
43
if(x==y || dx<=0 || dy<=0 ){x1=x;y1=y;}
44
45
//Motor Aktiviern
46
if(x!=0){  POM1_E |=(1<<PIM1_E);} // X Motor1 Aktivieren
47
if(y!=0){  POM2_E |=(1<<PIM2_E);} // Y Motor2 Aktivieren
48
if(z!=0){  POM3_E |=(1<<PIM3_E);} // Z Motor3 Aktivieren
49
50
while(((x!=0) || (y!=0) || (z!=0)) && (error==0) )
51
{
52
if(error==1){
53
break;
54
}
55
if(tasteload()=='A'){
56
if(menue_taster()){error=1;}else{error=0;}
57
}
58
59
if(x==y){x=Xstep(x); y=Ystep(y);  x0=x1-x; y0=y1-y;  }  // Gleiche werte
60
if(x==0){y=Ystep(y); y0=y1-y; }
61
if(y==0){x=Xstep(x); x0=x1-x; }
62
63
if((x>y) && (x>0) && (y>0) ){               // +X größer als +Y
64
    if(x0<x1){ x1=x0; Xstep(-1);}
65
    if(y0<y1){ y1=y0; Ystep(-1);}
66
    if(x0>x1){ x1=x0; Xstep(1);}
67
    if(y0>y1){ y1=y0; Ystep(1);}
68
    if (x0>=x && y0>=y && z==0){ x=x-x0; y=y-y0; break; }
69
    e2 = 2*err;
70
71
    if (e2 > dy) { err -= dy; x0 += sx; }
72
    if (e2 < dx) { err += dx; y0 += sy; }
73
}
74
75
if((x<y) && (x>0) && (y>0) ){               // +X  kleiner als +Y
76
    if(x0<x1){ x1=x0; Xstep(-1);}
77
    if(y0<y1){ y1=y0; Ystep(-1);}
78
    if(x0>x1){ x1=x0; Xstep(1);}
79
    if(y0>y1){ y1=y0; Ystep(1);}
80
    if (x0>=x && y0>=y && z==0){ x=x-x0; y=y-y0; break; }
81
    e2 = 2*err;
82
83
    if (e2 < dy) { err += dy; x0 += sx; }
84
    if (e2 > dx) { err -= dx; y0 += sy; }
85
}
86
if((x>y) && (x<0) && (y<0) ){               // -X größer als -Y
87
    if(x0<x1){ x1=x0; Xstep(-1);}
88
    if(y0<y1){ y1=y0; Ystep(-1);}
89
    if(x0>x1){ x1=x0; Xstep(1);}
90
    if(y0>y1){ y1=y0; Ystep(1);}
91
    if (x0<=x && y0<=y && z==0){ x=x-x0; y=y-y0; break; }
92
    e2 = 2*err;
93
94
    if (e2 > dy) { err -= dy; x0 += sx; }
95
    if (e2 < dx) { err += dx; y0 += sy; }
96
}
97
98
if((x<y) && (x<0) && (y<0) ){             // -X kleiner als -Y
99
    if(x0<x1){ x1=x0; Xstep(-1);}
100
    if(y0<y1){ y1=y0; Ystep(-1);}
101
    if(x0>x1){ x1=x0; Xstep(1);}
102
    if(y0>y1){ y1=y0; Ystep(1);}
103
    if (x0<=x && y0<=y && z==0){ x=x-x0; y=y-y0; break; }
104
    e2 = 2*err;
105
106
    if (e2 < dy) { err += dy; x0 += sx; }
107
    if (e2 > dx) { err -= dx; y0 += sy; }
108
}
109
110
if((x>y) && (x>0) && (y<0) ){           // +X größer als -Y
111
    if(x0<x1){ x1=x0; Xstep(-1);}
112
    if(y0<y1){ y1=y0; Ystep(-1);}
113
    if(x0>x1){ x1=x0; Xstep(1);}
114
    if(y0>y1){ y1=y0; Ystep(1);}
115
    if (x0>=x && y0<=y && z==0){ x=x-x0; y=y-y0; break; }
116
    e2 = 2*err;
117
118
    if (e2 > dy) { err -= dy; x0 += sx; }
119
    if (e2 < dx) { err += dx; y0 += sy; }
120
}
121
122
if((x<y) && (x<0) && (y>0) ){           // -X kleiner als +Y
123
    if(x0<x1){ x1=x0; Xstep(-1);}
124
    if(y0<y1){ y1=y0; Ystep(-1);}
125
    if(x0>x1){ x1=x0; Xstep(1);}
126
    if(y0>y1){ y1=y0; Ystep(1);}
127
    if (x0<=x && y0>=y && z==0){ x=x-x0; y=y-y0; break; }
128
    e2 = 2*err;
129
130
    if (e2 < dy) { err += dy; x0 += sx; }
131
    if (e2 > dx) { err -= dx; y0 += sy; }
132
}
133
134
135
136
//x=Xstep(x);
137
//y=Ystep(y);
138
z=Zstep(z);
139
 if(stepspeed<=400 ){stepspeed=400;}
140
 counter++;
141
 counter2++;
142
if(counter2==20 && (lcd==1 || lcd==2)){
143
144
if(lcd==1){lcdupdate(x0,y0,z,zkorr);}
145
if(lcd==2){lcdupdate2(x0,y0,z,zkorr,stepspeed);}
146
147
_delay_us(stepspeed-30); counter2=0;
148
149
}else{_delay_us(stepspeed);}
150
//if((x==0) || (y==0) || (z==0)){ return ;}
151
152
//schleife ende
153
}
154
if(lcd==1){lcdupdate(x0,y0,z,zkorr);}
155
if(lcd==2){lcdupdate2(x0,y0,z,zkorr,stepspeed);}
156
_delay_ms(10);
157
//alles off
158
POM1_E &=~(1<<PIM1_E); // X Motor1 Deaktivieren
159
POM2_E &=~(1<<PIM2_E); // Y Motor2 Deaktivieren
160
POM3_E &=~(1<<PIM3_E); // Z Motor3 Deaktivieren
161
POM1_1 &=~((1<<PIM1_1)|(1<<PIM1_2));
162
POM1_2 &=~((1<<PIM1_3)|(1<<PIM1_4));
163
POM2_1 &=~((1<<PIM2_1)|(1<<PIM2_2));
164
POM2_2 &=~((1<<PIM2_3)|(1<<PIM2_4));
165
POM3_1 &=~((1<<PIM3_1)|(1<<PIM3_2));
166
POM3_2 &=~((1<<PIM3_3)|(1<<PIM3_4));
167
return error;
168
}

mfg Kenny-gun

von g457 (Gast)


Lesenswert?

> irgend wo ist da der wurm drin finde ihn aber nicht.

Äussert sich der Wurm auch irgendwie(tm)? Compilerfehler? Linkerfehler? 
Laufzeitfehler? Unerwartete Bewegungsmuster? ..

von Michael (Gast)


Lesenswert?

R. B. schrieb:
> Denn hab ihn in 6
> Richtungen angepasst irgend wo ist da der wurm drin finde ihn aber
> nicht.

Was heißt 6 Richtungen? Bei zwei Achsen hast du 8 Oktanten.

von guest 2016 (Gast)


Lesenswert?

Hi R.B.
Guess, you are no german guy, so I'll try to answer in english.
Why inventing the wheel again?
Look at this project:
Video:
http://dank.bengler.no/-/page/show/5470_grbl?ref=mst
Code:
https://github.com/simen/grbl

von MaWin (Gast)


Lesenswert?

a) Es ist kein Bresenham

b) Auch ein (3-Achsen) Bresenham nützt bei CNC Fräsen wenig.

Man will den ZEITPUNKT der Schritte bestimmen, DAS ist die Aufgabe beim 
CNC, und dazu gehört langsame Beschleunigung und langsames Abbremsen.

Angenommen man muß eine Distanz von 10cm mit 1m/min zurücklegen,
und braucht dazu 1000 Schritte in X Richtung und 300 in Y Richtung,
und der Fräser wäre bereits in Fahrt und soll das auch bleiben,
dann braucht man alle 6ms einen Schritt in X Richtung und alle 20ms 
einen Schritt in Y Richtung.
Obwohl man diese Zeiten auch per Bresenham (DDA-Algorithmus) ausrechnen 
kann, ist es nicht so wichtig, ein Schritt darf auch 1ms früher oder 
später kommen. Aber es ist wichtig, daß die Beschleunigung 
berücksichtigt wird, also die erste Ableitung der zu fräsenden Kurve. 
Also muß man das nächste Stück des Fahrwegs schon kennen.

Vergiss also deinen Ansatz, er ist zu wenig. Er müsste sowieso auch 
Kurven ausrechnen können.

von stru_aus (Gast)


Lesenswert?

bresenham in 3 dimensionen war anfangs gefragt.

ich hab darüber auch schon einmal nachgedacht und kam zum schluss: man 
muss noch die zeitdimension dazu nehmen - macht dann 4 dimensionen.

z.B.:
uint8_t XYZmoveto(int16_t x, int16_t y,int16_t z, int16_t steps) {...}

'steps' ist hier die zeitdimension, anzahl der schritte im algorithmus.

rechnerisch funktioniert hat es, aber mir mangelt es an passender 
hardware.
noch besser kann das mit bezierkurven werden, aber da tun sich dann neue 
probleme auf.

von R. B. (kenny-gun) Benutzerseite


Lesenswert?

HI leute

g457 schrieb:
>> irgend wo ist da der wurm drin finde ihn aber nicht.
>
> Äussert sich der Wurm auch irgendwie(tm)? Compilerfehler? Linkerfehler?
> Laufzeitfehler? Unerwartete Bewegungsmuster? ..

keine Fehler in Compiler läuft auch auf der Maschine.
nur wenn zum Beispiel X0.06mm Y0.01mm Fahren lass geht und bei X0.06mm 
Y-0.01mm
fährt er mit X ins unendliche und bei X0.6mm Y-0.1mm fährt X0.4mm 
Y-0.1mm...


Entschuldigt Hab vergessen zu schreiben das Z Achse aussen vor lass da 
keine große Dreidimensionale Objekte erstmals fräse.

Somit Geht Algorithmus erstmal nur für X und Y. Z wollte ich später dann 
hin zufügen.


Vielleicht bin sache etwas falsch angegangen hätte das mit dem L298 
Schrittmotortreibern besser erklären sollen. Ich hab keine Zeitsteuerung
 drin und zwar geht nur Rastersystem. Lass wie bei Display Pixel für 
Pixel fahren Problem ist nur das Display bei x0 y0 anfängt und ich 
negative Bereiche drin hab.

Weiß das keine schöne Lösung ohne den Zeit faktor da keine 100% genauen 
Linien raus kommen aber so um geh ich mir denn 2 teuren Schaltkreis. und 
Arbeit mit Timer'n.

hoffe konnte damit etwas genaue mein problem beschreiben
mfg Kenny-gun

dank euch

von MaWin (Gast)


Lesenswert?

> hoffe konnte damit etwas genaue mein problem beschreiben

Ja, schon,
alles was du nicht verstehst und nicht kannst,
lässt du einfach weg und berücksichtigst es nicht.

Ob das eine zielführende Einstellung ist,
um im Leben klarzukommen ?

von R. B. (kenny-gun) Benutzerseite


Lesenswert?

keine Ahnung auf was hinaus willst!

aber gebe zu meine Beschreibung und ziel angaben sind etwas rar.

zwar will einfach nur  das mein CNC fräse Linien in allen Richtung 
fahren kann.
zwar tut sie das aber nicht mit allen werten zwei positive werte gehen 
also liegt der Fehler nur an der um Stellung des Codes für Negative 
werte.
und da bräuchte eure Hilfe das ihr euch denn Code anschaut "sie ersten 
beitrag" und vielleicht mein fehler eindecken da ich ihn nach 1000 ma 
drüber schauen nicht finde


mfg Kenny-gun

von Robby (Gast)


Lesenswert?

R. B. schrieb:
> nur wenn zum Beispiel X0.06mm Y0.01mm Fahren lass geht und
> bei X0.06mm Y-0.01mm fährt er mit X ins unendliche und
> bei X0.6mm Y-0.1mm fährt X0.4mm Y-0.1mm...

R. B. schrieb:
> und vielleicht mein fehler eindecken da ich ihn nach 1000 ma
> drüber schauen nicht finde

Wenn 1000 mal drüber schauen nicht hilft, dann probiere doch mit dem 
Simulator, was by X0.06mm Y-0.01mm nicht richtig funktioniert.

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.