# تحريك ثلاث محاور والوصول بهم إلى نقطة ما في نفس الوقت



## عثمان عبدالعاطي (14 نوفمبر 2007)

السلام عليكم ورحمة الله
كيف يمكن تحريك ثلاث محاور (X, Y, Z) عن طريق (Stepper motors) والوصول بهم إلى نقطة واحدة في نفس الوقت مع اختلاف القيم؟

إذا كانت القيم مضاعفات لبعضها لا توجد مشكلة هنا ,مثلا:
X=15, Y=10, z=5.
المحرك X يتحرك ثلاث أضعاف المحرك Z والمحرك Y يتحرك ضعفي المحرك Z
لكن إن لم يكن كذلك مثلا (X=17, Y=10, z=3) ستواجهني مشكلة هنا وهي كيف أعطي قيم كسرية كنبضات (Pulses) للمحركات؟ (تتحرك Stepper Motors بناء على النبضات, كل نبضة من الكمبيوتر أو الكنترولر تساوي خطوة).
بارك الله فيكم.


----------



## وليد الحديدي (19 نوفمبر 2007)

أخي الكريم ، لا أعرف أين المشكلة ألا يمكنك أن تعطي مثلاً 3 نبضات لأحد المحركات و في نفس الوقت تعطي 10 للآخر و 17 للثالث من خلال برنامجك ؟
أرجو توضيح السؤال 
و على العموم إذا كنت تريد التحكم بماكنة بثلاثة محاور فهناك الكثير من البرامج الجاهزة لهذا الغرض و يمكنها التحكم باكثر من 3 محاور


----------



## حسام الحلبي (28 نوفمبر 2007)

يمكن ذلك عن طريق استخدام مخفضات (كل 100 دورة من المحرك تعادل دورة واحدة على خرج المخفض مثلاً) وهذا أمر ضروري جداً في تطبيقات التحكم.

ومن الممكن أيضاً أن يكون هناك خطأ ولكنه سيصبح صغير ويمكن اهماله.


----------



## عثمان عبدالعاطي (3 ديسمبر 2007)

ممكن أن توضح يا أخي ماهي المخفضات وكيف تعمل؟
بارك الله فيك.


----------



## m_saeed_soliman (3 ديسمبر 2007)

جزاكم الله خيرا


----------



## نزار ابوفاتح (12 ديسمبر 2007)

مزيد من الوضوح لو سمحتم


----------



## عثمان عبدالعاطي (13 ديسمبر 2007)

السلام عليكم
ما هي مشكلتك أخي نزار مع السؤال؟ أعتقد أنه واضح.
هل يمكن أن توضح ما هو الشيء الذي لا تفهمه من السؤال؟
بارك الله فيك على اهتمامك!


----------



## hammoda (2 مايو 2008)

السلام عليكم :6:
فهمت عليك أخ عثمان
وأنا أبحث عن الحل مثلك
والمشكلة أن الأوامر عندي تخرج من Plc
أما ان كانت تخرج من كمبيوتر فيمكن أن يوجد برامج جاهزة لهذا العمل كما قال الأخ وليد


----------



## abadazah (15 يناير 2009)

انسى موضوع النبضات الان وركز على خوارزمية تعطيك قيم مطلقة وليس نبضات حيث ان الخوارزمية تحتاج منك ادخال (الموقع الحالي للثلاث محاور , الموقع المطلوب للثلاث محاور) وهذايعبر عنه بقيمة طبعا لتعطيك خرج مثلا على هذا النحو

اذا كان الموقع الحالى للثلاث محاور صفر والموقع المطلوب(x = 10 , y = 5 , z = 1) فإن الخرج سوف يكون على النحو التالي:

x=1 y=1 z=0
x=2 y=1 z=0
x=3 y=2 z=0
x=4 y=2 z=0
x=5 y=3 z=0
x=6 y=3 z=1
x=7 y=4 z=1
x=8 y=4 z=1
x=9 y=5 z=1
x=10 y=5 z=1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
الكود 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
يتبع ......................


----------



## abadazah (15 يناير 2009)

void 3D_line(long int x1, long int y1, long int z1, long int x2, long int y2, long int z2)
{
long int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2;

dx = x2 - x1;
dy = y2 - y1;
dz = z2 - z1;
x_inc = (dx < 0) ? -1 : 1;
l = abs(dx);
y_inc = (dy < 0) ? -1 : 1;
m = abs(dy);
z_inc = (dz < 0) ? -1 : 1;
n = abs(dz);
dx2 = l << 1;
dy2 = m << 1;
dz2 = n << 1;

if ((l >= m) && (l >= n)) {
err_1 = dy2 - l;
err_2 = dz2 - l;
for (i = 0; i < l; i++) {
output(x1,y1,z1);
if (err_1 > 0) {
y1 += y_inc;
err_1 -= dx2;
}
if (err_2 > 0) {
z1 += z_inc;
err_2 -= dx2;
}
err_1 += dy2;
err_2 += dz2;
x1 += x_inc;
}
} else if ((m >= l) && (m >= n)) {
err_1 = dx2 - m;
err_2 = dz2 - m;
for (i = 0; i < m; i++) {
output(x1,y1,z1);
if (err_1 > 0) {
x1 += x_inc;
err_1 -= dy2;
}
if (err_2 > 0) {
z1 += z_inc;
err_2 -= dy2;
}
err_1 += dx2;
err_2 += dz2;
y1 += y_inc;
}
} else {
err_1 = dy2 - n;
err_2 = dx2 - n;
for (i = 0; i < n; i++) {
output(x1,y1,z1);
if (err_1 > 0) {
y1 += y_inc;
err_1 -= dz2;
}
if (err_2 > 0) {
x1 += x_inc;
err_2 -= dz2;
}
err_1 += dy2;
err_2 += dx2;
z1 += z_inc;
}
}
output(x1,y1,z1);
}
/// end
اي شروحات اضافية انا في خدمة المسلمين/// 
​


----------

