اطلاعیه

Collapse
No announcement yet.

دو استپ موتور هم زمان

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    دو استپ موتور هم زمان

    سلام
    من یه موتور استپر دارم تونستم با میکرو راش بندازم .

    حالا می خوام دو تا موتور استپر رو هم زمان یجا با هم راه بیفته با میکرو avr

    با میکرو برنامه نوشتم نشد .
    مشکل این جاست که اول سیکل اول در برنامه اجرا میشه بعد میرسه به سیکل بعدی برنامه .......
    هیچ راهی نیست که بشه دو تا سیکل رو با هم اجرا کرد >؟؟؟؟؟؟؟؟؟؟؟

    نمونه برنامه ای که نوشتم میزارم ...

    در واقع می خوام دو تا محور مختصات رو داشته باشم ... مثل محور x y دستگاه cnc دو محوره

    کد:
    #include <mega16.h>       
    #include <delay.h>
      int i,j,v,b;
    
    void motor1(){
        
        for(j=1;j<=8;j=j*2)
        {
        for(i=1;i<=50;i++)
        {    
          PORTB=~j;
         
            delay_ms(1);
        }
        }
    
    
    
    }
    
    void motor2(){
        for(v=1;v<=8;v=v*2)
        {
        for(b=1;b<=100;b++)
        {    
           PORTD=~v;
         
            delay_ms(1);
        }
        }
    
    
    
    }
    
    
    void main(void)
    {
    
    
    DDRB=0xFF;
    PORTB=0x00;
    
    DDRD=0xFF;
    PORTD=0x00;
    while (1)
       {
       
       // Place your code here
         
       motor1();
       motor2();
        
         
        
         
        
       };
    }



    #2
    پاسخ : دو استپ موتور هم زمان

    STATE MACHINE

    [code=c]
    #include <delay.h>

    typedef unsigned char ubyte;
    typedef signed char byte;

    // the stepper port which containing following pins should be defined as output
    #define STEPPER_X_PIN_1 PORTA.0
    #define STEPPER_X_PIN_2 PORTA.1
    #define STEPPER_X_PIN_3 PORTA.2
    #define STEPPER_X_PIN_4 PORTA.3

    #define STEPPER_Y_PIN_1 PORTA.4
    #define STEPPER_Y_PIN_2 PORTA.5
    #define STEPPER_Y_PIN_3 PORTA.6
    #define STEPPER_Y_PIN_4 PORTA.7

    static unsigned int DELAY = 5;
    #define STEPS_SIZE 4
    flash ubyte stepper_state[STEPS_SIZE] = {0x01, 0x02, 0x04, 0x08}; // Full step single phase
    // flash ubyte stepper_state[STEPS_SIZE] = {0x05, 0x09, 0x0A, 0x06}; // Full step two phase

    void stepper_move(byte x, byte y){
    static byte axis_x = 0, axis_y = 0;
    if(x > 0){
    axis_x++;
    if (axis_x >= STEPS_SIZE) axis_x = 0;
    }
    if(x < 0){
    axis_x--;
    if(axis_x < 0) axis_x = (STEPS_SIZE - 1);
    }
    if(y > 0){
    axis_y++;
    if (axis_y >= STEPS_SIZE) axis_y = 0;
    }
    if(y < 0){
    axis_y--;
    if(axis_y < 0) axis_y = (STEPS_SIZE - 1);
    }

    STEPPER_X_PIN_1 = (stepper_state[axis_x] & 0x01);
    STEPPER_X_PIN_2 = (stepper_state[axis_x] & 0x02);
    STEPPER_X_PIN_3 = (stepper_state[axis_x] & 0x04);
    STEPPER_X_PIN_4 = (stepper_state[axis_x] & 0x08);

    STEPPER_X_PIN_1 = (stepper_state[axis_y] & 0x01);
    STEPPER_X_PIN_2 = (stepper_state[axis_y] & 0x02);
    STEPPER_X_PIN_3 = (stepper_state[axis_y] & 0x04);
    STEPPER_X_PIN_4 = (stepper_state[axis_y] & 0x08);

    delay_ms(DELAY);
    }

    int main(){
    // device_init();
    while(1){
    stepper_move(1, -1);
    stepper_move(1, 0);
    }
    }

    [/code]

    توجه داشته باشید که بیشینه حرکت استپرها یک پله به ازای هر بار فراخوانی تابع است.
    پس برای نمونه اگر نیاز است استپر پنج پله حرکت کند. تابع باید پنج بار فراخوانی شود.
    If the wind will not serve, take to the oars

    دیدگاه


      #3
      پاسخ : دو استپ موتور هم زمان

      آقا دمت گرم کلی حال دادی مشکل حله :wow: :wow: :wow: :wow:

      فقط چطوری سرعت هر کدوم رو کنترل میشه کرد ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

      اینطوری داره همزمان هر دو موتور کار میکنه حالا می خوام همین اصل سر جاش بمونه ولی ففط بتونم سرعت هر کدوم رو جداگانه کنترل کنم.؟؟؟ :read:
      فقط اگه میشه یه راهنمایی کوچیک بکنید... ممنون

      دیدگاه


        #4
        پاسخ : دو استپ موتور هم زمان

        نوشته اصلی توسط yoshig2
        آقا دمت گرم کلی حال دادی مشکل حله :wow: :wow: :wow: :wow:

        فقط چطوری سرعت هر کدوم رو کنترل میشه کرد ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

        اینطوری داره همزمان هر دو موتور کار میکنه حالا می خوام همین اصل سر جاش بمونه ولی ففط بتونم سرعت هر کدوم رو جداگانه کنترل کنم.؟؟؟ :read:
        فقط اگه میشه یه راهنمایی کوچیک بکنید... ممنون
        سرعت هر گام با تغییر مقدار DELAY انجام میشه. که مقدار پیش فرض رو من 5 دادم. (هر پنج میلی ثانیه یک گام حرکت)

        این یک STATE MACHINE هستش. در هر بار تغییر وضعیت فقط یک گام انجام میده (0 بی حرکت , 1 حرکت به جلو و 1- حرکت به عقب)
        پس مثلا برای اینکه محور x با دو برابر سرعت محور y حرکت کنه باید تابع رو اینگونه فراخوانی کنید:
        [code=c]
        byte x, y;
        x = 1;
        y = 1;

        while(1){
        stepper_move(x, y);
        y = !y;
        }
        [/code]
        (در حالت اول هر دو موتور یک گام تغییر وضعیت می دهند. و در حالت دوم تنها موتور x تغییر وضعیت می دهد. برآیند این کار برابر است با حرکت موتور x دو برابر سرعت موتور y) و ...

        این الگوریتم چه کاربردی دارد و چه زمانی باید آن را بکار برد:
        این الگوریتم مناسب دستورات ترسیم خطوط پیوسته در سیستم های رستری و وکتوری است. در این سیستم ها ترسیم خطوط در صفحه یا فضای سه بعدی با در اختیار داشتن تنها دو نقطه در صفحه آغاز می شود. الگوریتم از نقطه آغاز تا نقطه پایان پیش میرود و یک خط بر جای میگذارد. در هر وضعیت که Plot نامیده میشود نباید بیش از یک گام حرکت داشت تا پیوستگی خطوط حفظ شود.
        If the wind will not serve, take to the oars

        دیدگاه


          #5
          پاسخ : دو استپ موتور هم زمان

          آقا خیلی آقایی ... :applause: :applause: :applause: :applause: :applause:

          این حالت رو امتحان کردم ... الان فقط 2 برابر میشه سرعت اگ بخوایم سرعت چند برابر بشه .. چی ؟؟؟؟؟ به غیر از عدد 0 و 1 و -1 چی میشه گذاشت...

          یه سوال داشتم ..

          من حدود 4 سال برنامه نویسی c انجام میدم.. هنوز قدرتم زیاد نشده .

          میشه راهنمایی کنی چطوری برنامه نویسیم تو این راستا خوب بشه .... ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :read: :read:
          :nerd: :nerd: :nerd: :nerd:

          دیدگاه


            #6
            پاسخ : دو استپ موتور هم زمان

            آقا خیلی آقایی ... :applause: :applause: :applause: :applause: :applause:

            این حالت رو امتحان کردم ... الان فقط 2 برابر میشه سرعت اگ بخوایم سرعت چند برابر بشه .. چی ؟؟؟؟؟ به غیر از عدد 0 و 1 و -1 چی میشه گذاشت...

            یه سوال داشتم ..

            من حدود 4 سال برنامه نویسی c انجام میدم.. هنوز قدرتم زیاد نشده .

            میشه راهنمایی کنی چطوری برنامه نویسیم تو این راستا خوب بشه .... ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :read: :read:

            دیدگاه


              #7
              پاسخ : پاسخ : دو استپ موتور هم زمان

              نوشته اصلی توسط yoshig2
              آقا خیلی آقایی ... :applause: :applause: :applause: :applause: :applause:

              این حالت رو امتحان کردم ... الان فقط 2 برابر میشه سرعت اگ بخوایم سرعت چند برابر بشه .. چی ؟؟؟؟؟ به غیر از عدد 0 و 1 و -1 چی میشه گذاشت...

              یه سوال داشتم ..

              من حدود 4 سال برنامه نویسی c انجام میدم.. هنوز قدرتم زیاد نشده .

              میشه راهنمایی کنی چطوری برنامه نویسیم تو این راستا خوب بشه .... ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :read: :read:
              :nerd: :nerd: :nerd: :nerd:
              در واقع چون موتور ها پله ای هستن عملا حرکت پیوسته نداریم. و اگر بخوایم حرکت پیوسته مشاهده کنیم باید اونو شبیه سازی کنیم.
              و از طرفی تعداد حرکت ها هم محدود هستن:
              - هیچ کدام حرکت نمی کنند
              - اولی حرکت نمی کند و دومی حرکت میکند
              - اولی حرکت میکند و دومی حرکت نمی کند
              - هر دو حرکت میکنند

              با ترکیب مناسب این حالتها به نسبت های مورد نیاز دست میابید.

              منطق تابع جوری است که پیوستگی خطوط را حفظ کند. به صفر و یک حساس نیست. با توجه به بازه عمل میکند. اعداد مثبت - صفر - اعداد منفی
              -------------------------------------------------------------
              در زمینه افزایش اطلاعات برنامه نویسی مطمئنا باید کتاب ها و مخصوصا مثال های بیشتری را مطالعه کنید. (لازم نیست چیزی را حفظ کنید)
              سعی نکنید همه چیز رو حفظ کنید. از دید من این کار بیهوده ای ست. (و متاسفانه در دانشگاه ها و آموزشگاه ها این تنها ملاک یادگیری قرار گرفته است)
              تلاش کنید به جای به خاطر سپردن کد ها و .... منطق کلی و ماهیت کارکردی را یاد بگیرید.
              چه اهمیتی دارد که فلان الگوریتم در جزییات چگونه اجرا میشود. تنها با به یاد آوردن مراحل کار می توان الگوریتم را بازسازی کرد.
              روش درست برخورد با چالش است که اهمیت دارد. سپس می توان با اندوخته ها و کتاب ها به پاسخ رسید.
              If the wind will not serve, take to the oars

              دیدگاه


                #8
                پاسخ : دو استپ موتور هم زمان

                برای نمونه این یک الگوریتم ساده رسم خط است. که در آن همواره نقطه ی دوم در جایگاهی بیشتر از نقطه اول قرار دارد.
                [code=c]
                void lineDDA(int x1, int y1, int xn, int yn){
                int dx, dy, m, i;
                m = (yn - y1) / (xn - x1);
                for (i = x1; i <= xn; i++) {
                if (m <= 1) {
                dx = 1;
                dy = m * dx;
                }
                else {
                dy = 1;
                dx = dy / m;
                }
                x1 = x1 + dx;
                y1 = y1 + dy;
                stepper_move((byte)x1, (byte)y1);
                }
                }
                [/code]
                If the wind will not serve, take to the oars

                دیدگاه


                  #9
                  پاسخ : دو استپ موتور هم زمان

                  وقت بخیر

                  بنظر میرسه شرط if برای m بیرون حلقه for باید قرار بگیره !!!

                  دیدگاه


                    #10
                    پاسخ : دو استپ موتور هم زمان

                    نوشته اصلی توسط taktrashe
                    وقت بخیر

                    بنظر میرسه شرط if برای m بیرون حلقه for باید قرار بگیره !!!
                    ممنون از اینکه در این بحث همراه ما شدید :smile:

                    این شرط باید هر بار بررسی شود.
                    هر چند از آغاز تا پایان تنها یکی از آنها اجرا خواهند شد (IF یا ELSE) و این بستگی به شیب خط دارد.
                    این الگوریتم بسیار ساده که تنها در یک چهارم اول دستگاه مختصات اجرا می شود (x های مثبت و y های مثبت) آن را به دو بخش بالایی و پایینی محور X=Y تقسیم میکند.
                    در اینجا شیب همواره ثابت است ولی همیشه باید بررسی شود. مگر اینکه دو دستور FOR بنویسیم. یکی درون IF و دیگری درون ELSE
                    در این صورت در هر بار نیاز به بررسی دستور IF نیست. و این بازدهی و سرعت اجرای الگوریتم را بهتر میکند.
                    در واقع این الگوریتم اصلی است و بقیه ی خطوط را می توان با قرینه کردن بدست آورد
                    البته الگوریتم هایی با پیچیدگی بیشتر و بازدهی بهتری وجود دارند
                    If the wind will not serve, take to the oars

                    دیدگاه


                      #11
                      پاسخ : دو استپ موتور هم زمان

                      البته برنامه نویس نیز میتواند بهبود هایی در این الگوریتم ترسیم خط انجام دهد
                      حالت های زیر را در نظر بگیرید

                      محور X تغییری نکند ( تنها حرکت عمودی محور Y)
                      محور Y تغییری نکند ( تنها حرکت عمودی محور X)
                      نقطه ی دوم برابر نقطه ی اول باشد (هیچ حرکتی انجام نشود)
                      تغییرات محور X با تغییرات محور Y برابر باشد (هر دو محور با مقدار یکسانی تغییر می کنند)
                      اختلاف دو نقطه تنها یک واحد باشد

                      برای هر یک از این حالت ها می توان کد هایی نوشت که از درگیری الگوریتم اصلی جلوگیری کند که این سرعت اجرای الگوریتم را بهتر میکند و همچنین ضریب اطمینان را افزایش می دهد.
                      If the wind will not serve, take to the oars

                      دیدگاه


                        #12
                        پاسخ : دو استپ موتور هم زمان

                        سلام
                        من این برنامه رو نوشتم . از طریقی تو برنامه مختصات 2 نقطه رو معلوم می کنم و معادله ی شیب هم بدست میارم ... که جهت هر دو موتور تعیین بشه .. همه این کارا انجام میشه.
                        فقط مشکلم اینه که نمی تونم سرعت موتور ها رو به طور دقیق کم و زیاد کنم . نا هماهنگ البته .

                        اگر میشه تو این قسمت یه کمکی بکنین ..... :nerd:

                        از این حالت هم استفاده کردم ولی درست نیست اینکار دقت نداره ....
                        [code=c]
                        stepper_move(x1,y1);
                        stepper_move(!x1,y1);
                        [/code]




                        [code=c]


                        #include <mega16.h>
                        #include <delay.h>
                        #include <alcd.h>
                        #include <stdio.h>
                        #include <stdlib.h>


                        // typedef unsigned char ubyte;
                        typedef signed char byte;

                        char str[20];

                        // the stepper port which containing following pins should be defined as output
                        #define STEPPER_X_PIN_1 PORTA.0
                        #define STEPPER_X_PIN_2 PORTA.1
                        #define STEPPER_X_PIN_3 PORTA.2
                        #define STEPPER_X_PIN_4 PORTA.3

                        #define STEPPER_Y_PIN_1 PORTA.4
                        #define STEPPER_Y_PIN_2 PORTA.5
                        #define STEPPER_Y_PIN_3 PORTA.6
                        #define STEPPER_Y_PIN_4 PORTA.7

                        #define DELAY1 50
                        #define STEPS_SIZE 4

                        flash int stepper_state[STEPS_SIZE] = {0x01, 0x02, 0x04, 0x08}; // Full step single phase
                        // flash ubyte stepper_state[STEPS_SIZE] = {0x05, 0x09, 0x0A, 0x06}; // Full step two phase

                        int i;
                        float x1,y1,dx1,dy1,m,t1,t2,xn,yn;

                        void stepper_move(byte x, byte y)
                        {
                        static byte axis_x = 0, axis_y = 0;
                        if(x > 0){
                        axis_x++;
                        if (axis_x >= STEPS_SIZE) axis_x = 0;
                        }
                        if(x < 0){
                        axis_x--;
                        if(axis_x < 0) axis_x = (STEPS_SIZE - 1);
                        }
                        if(y > 0){
                        axis_y++;
                        if (axis_y >= STEPS_SIZE) axis_y = 0;
                        }
                        if(y < 0){
                        axis_y--;
                        if(axis_y < 0) axis_y = (STEPS_SIZE - 1);
                        }

                        STEPPER_X_PIN_1 = (stepper_state[axis_x] & 0x01);
                        STEPPER_X_PIN_2 = (stepper_state[axis_x] & 0x02);
                        STEPPER_X_PIN_3 = (stepper_state[axis_x] & 0x04);
                        STEPPER_X_PIN_4 = (stepper_state[axis_x] & 0x08);

                        STEPPER_Y_PIN_1 = (stepper_state[axis_y] & 0x01);
                        STEPPER_Y_PIN_2 = (stepper_state[axis_y] & 0x02);
                        STEPPER_Y_PIN_3 = (stepper_state[axis_y] & 0x04);
                        STEPPER_Y_PIN_4 = (stepper_state[axis_y] & 0x08);

                        delay_ms(DELAY1);
                        }

                        void line(float x1 , float y1 , float xn , float yn ){

                        y1 = (yn - y1);
                        x1 = (xn - x1);
                        m = y1 / x1;

                        stepper_move(x1,y1);
                        stepper_move(!x1,y1);

                        }



                        void main()
                        {

                        PORTA=0X00;
                        DDRA=0XFF;
                        lcd_init(16);


                        while(1)
                        {

                        line(0,0,1,1);

                        lcd_clear();

                        lcd_gotoxy(0,0);
                        ftoa(x1,1,str);
                        lcd_puts(str);

                        lcd_gotoxy(0,1);
                        ftoa(y1,1,str);
                        lcd_puts(str);

                        lcd_gotoxy(11,0);
                        ftoa(m,2,str);
                        lcd_puts(str);


                        }
                        }

                        [/code]

                        دیدگاه


                          #13
                          پاسخ : دو استپ موتور هم زمان

                          اینو توی یک فایل با نام stepper_lib.h ذخیره کن و بنداز توی پوشه ی پروژه ت

                          [code=c]

                          #ifndef _STEPPER_LIB_INCLUDED_
                          #define _STEPPER_LIB_INCLUDED_

                          #include <mega16.h>
                          #include <delay.h>

                          typedef unsigned char ubyte;
                          typedef signed char byte;

                          // the stepper port which containing following pins should be defined as output
                          #define STEPPER_X_PIN_1 PORTA.0
                          #define STEPPER_X_PIN_2 PORTA.1
                          #define STEPPER_X_PIN_3 PORTA.2
                          #define STEPPER_X_PIN_4 PORTA.3

                          #define STEPPER_Y_PIN_1 PORTA.4
                          #define STEPPER_Y_PIN_2 PORTA.5
                          #define STEPPER_Y_PIN_3 PORTA.6
                          #define STEPPER_Y_PIN_4 PORTA.7

                          static unsigned int DELAY = 5;
                          #define STEPS_SIZE 4
                          flash ubyte stepper_state[STEPS_SIZE] = {0x01, 0x02, 0x04, 0x08}; // Full step single phase
                          // flash ubyte stepper_state[STEPS_SIZE] = {0x05, 0x09, 0x0A, 0x06}; // Full step two phase

                          void stepper_move(int x, int y){
                          static byte axis_x = 0, axis_y = 0;
                          static int currX = 0, currY = 0;
                          if(x > currX){
                          axis_x++;
                          if (axis_x >= STEPS_SIZE) axis_x = 0;
                          }
                          if(x < currX){
                          axis_x--;
                          if(axis_x < 0) axis_x = (STEPS_SIZE - 1);
                          }
                          if(y > currY){
                          axis_y++;
                          if (axis_y >= STEPS_SIZE) axis_y = 0;
                          }
                          if(y < currY){
                          axis_y--;
                          if(axis_y < 0) axis_y = (STEPS_SIZE - 1);
                          }

                          currX = x;
                          currY = y;

                          STEPPER_X_PIN_1 = (stepper_state[axis_x] & 0x01);
                          STEPPER_X_PIN_2 = (stepper_state[axis_x] & 0x02);
                          STEPPER_X_PIN_3 = (stepper_state[axis_x] & 0x04);
                          STEPPER_X_PIN_4 = (stepper_state[axis_x] & 0x08);

                          STEPPER_X_PIN_1 = (stepper_state[axis_y] & 0x01);
                          STEPPER_X_PIN_2 = (stepper_state[axis_y] & 0x02);
                          STEPPER_X_PIN_3 = (stepper_state[axis_y] & 0x04);
                          STEPPER_X_PIN_4 = (stepper_state[axis_y] & 0x08);

                          delay_ms(DELAY);
                          }

                          int abs(int val){
                          if(val < 0) return -val;
                          return val;
                          }

                          void move_to(int x1, int y1){
                          static int x0 = 0, y0 = 0;
                          int dy = y1 - y0;
                          int dx = x1 - x0;
                          float t = (float) 0.5;
                          if(abs(dx) > abs(dy)){
                          float m = (float) dy / (float) dx;
                          t += y0;
                          if(dx < 0) dx = -1;
                          else dx = 1;
                          m *= dx;
                          while(x0 != x1){
                          x0 += dx;
                          t += m;
                          stepper_move(x0, (int) t);
                          }
                          }
                          else{
                          float m = (float) dx / (float) dy;
                          t += x0;
                          if(dy < 0) dy = -1;
                          else dy = 1;
                          m *= dy;
                          while(y0 != y1){
                          y0 += dy;
                          t += m;
                          stepper_move((int) t, y0);
                          }
                          }
                          }

                          void line_to(int x, int y){
                          // turn on actuator

                          // move to end point
                          move_to(x, y);

                          // turn off actuator

                          }

                          #endif
                          [/code]

                          [code=c]
                          #include <mega16.h>
                          #include "stepper_lib.h"

                          int main(){
                          int x, y;
                          // device_init();
                          while(1){
                          x = 10; y = 10;
                          move_to(x, y);
                          x = 20; y = 20;
                          line_to(x, y);
                          }
                          }

                          [/code]
                          If the wind will not serve, take to the oars

                          دیدگاه


                            #14
                            پاسخ : دو استپ موتور هم زمان

                            آقا
                            سلام
                            ممنون که جواب میدین .

                            ولی این برنامه فکر کنم یجا هاییش مبهم هستش..

                            مثلا
                            1 . متغیر static int currX = 0, currY = 0; کجا کاربرد داره ... اینطوری که همش صفر هستش ... همون صفر رو میزاشتیم بهتر نبود ..؟؟؟؟

                            2. متغیر static int x0 = 0, y0 = 0; همش مقدار صفر رو داره اینطوری این دستور چطوری کار میکنه آخه
                            [code=c]
                            int dy = y1 - y0;
                            int dx = x1 - x0;
                            [/code]

                            3. این کد دستوری هم متوجه نشدم ...
                            [code=c]
                            void line_to(int x, int y){
                            // turn on actuator

                            // move to end point
                            move_to(x, y);

                            // turn off actuator

                            }
                            [/code]

                            اینجا دو تا تابع مقدار های X , Y رو از برنامه اصلی دریافت میکنند .. ولی با هم که هم اسم هستند ... چطوری وارد دستورات فایل ضمیمه میشه برای محاسبات ...؟؟؟؟؟
                            این دستورات
                            [code=c]
                            void move_to(int x1, int y1){
                            static int x0 = 0, y0 = 0;
                            int dy = y1 - y0;
                            int dx = x1 - x0;
                            float t = (float) 0.5;
                            if(abs(dx) > abs(dy)){
                            float m = (float) dy / (float) dx;
                            t += y0;
                            if(dx < 0) dx = -1;
                            else dx = 1;
                            m *= dx;
                            while(x0 != x1){
                            x0 += dx;
                            t += m;
                            stepper_move(x0, (int) t);
                            }
                            }
                            else{
                            float m = (float) dx / (float) dy;
                            t += x0;
                            if(dy < 0) dy = -1;
                            else dy = 1;
                            m *= dy;
                            while(y0 != y1){
                            y0 += dy;
                            t += m;
                            stepper_move((int) t, y0);
                            }
                            }
                            }
                            [/code]

                            اگه میشه یه توضیح کوچیک بدین ؟؟؟
                            :read: :read: :read: :read: :read: :read:






                            دیدگاه


                              #15
                              پاسخ : دو استپ موتور هم زمان

                              نوشته اصلی توسط yoshig2
                              آقا
                              سلام
                              ممنون که جواب میدین .

                              ولی این برنامه فکر کنم یجا هاییش مبهم هستش..

                              مثلا
                              1 . متغیر static int currX = 0, currY = 0; کجا کاربرد داره ... اینطوری که همش صفر هستش ... همون صفر رو میزاشتیم بهتر نبود ..؟؟؟؟

                              2. متغیر static int x0 = 0, y0 = 0; همش مقدار صفر رو داره اینطوری این دستور چطوری کار میکنه آخه
                              [code=c]
                              int dy = y1 - y0;
                              int dx = x1 - x0;
                              [/code]

                              3. این کد دستوری هم متوجه نشدم ...
                              [code=c]
                              void line_to(int x, int y){
                              // turn on actuator

                              // move to end point
                              move_to(x, y);

                              // turn off actuator

                              }
                              [/code]

                              اینجا دو تا تابع مقدار های X , Y رو از برنامه اصلی دریافت میکنند .. ولی با هم که هم اسم هستند ... چطوری وارد دستورات فایل ضمیمه میشه برای محاسبات ...؟؟؟؟؟
                              این دستورات
                              [code=c]
                              void move_to(int x1, int y1){
                              static int x0 = 0, y0 = 0;
                              int dy = y1 - y0;
                              int dx = x1 - x0;
                              float t = (float) 0.5;
                              if(abs(dx) > abs(dy)){
                              float m = (float) dy / (float) dx;
                              t += y0;
                              if(dx < 0) dx = -1;
                              else dx = 1;
                              m *= dx;
                              while(x0 != x1){
                              x0 += dx;
                              t += m;
                              stepper_move(x0, (int) t);
                              }
                              }
                              else{
                              float m = (float) dx / (float) dy;
                              t += x0;
                              if(dy < 0) dy = -1;
                              else dy = 1;
                              m *= dy;
                              while(y0 != y1){
                              y0 += dy;
                              t += m;
                              stepper_move((int) t, y0);
                              }
                              }
                              }
                              [/code]

                              اگه میشه یه توضیح کوچیک بدین ؟؟؟
                              :read: :read: :read: :read: :read: :read:
                              این بحث همینجا منتفی هستش. تا زمانیکه شما یک خودآموز برنامه نویسی C رو مطالعه کنید :NO: :NO:
                              If the wind will not serve, take to the oars

                              دیدگاه

                              لطفا صبر کنید...
                              X