اطلاعیه

Collapse
No announcement yet.

مشکل در چپگرد و راستگرد موتور پله ای

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

    مشکل در چپگرد و راستگرد موتور پله ای

    سلام . من میخوام که یه موتور پله ای رو از صفر درجه به اندازه b به راست بچرخونم ( b در برنامه محاسبه میشه) و بعدش در آخر دوباره به اندازه b به چپ بچخونم و به جای اولش بر گردونم.
    برنامه زیر رو نوشتم ولی موقع برگشت تا صفر نمیاد و مثلا تا 5+ درجه میاد.

    چی کار کنم؟
    ........................................
    // Searching

    ................
    a=0b00001000;
    b=0;
    .................
    for (i=0;i<=361;i++) {
    PORTD=a;
    ................
    b=i;
    ................
    // Stepper movement functions
    if (i%4==0) {
    a=0b00001000; }
    else {
    a=a>>1; };
    delay_ms(20);};
    ..................................
    ادامه برنامه...
    .................................
    for (z=0;z<=360;z++) {
    PORTD=a;
    if (a==0b00010000) {
    a=0b00000001; }
    else {
    a=a<<1; };
    b--;
    if (b==0) {
    break;};
    delay_ms(40); };
    As long as you can stand and see don't give up
    تا جایی که می توانی ببینی و می توانی بایستی ، مقاومت کن.
    مثل انگلیسی به نقل از پروفسور سید محمود حسابی - پدر علم فیزیک و مهندسی نوین ایران

    #2
    پاسخ : مشکل در چپگرد و راستگرد موتور پله ای

    مطمئن نیستم که درست میگم یا ن
    ببینید شما وقتی اول موتور رو میچرخونید از 0 شروع میکنید
    و وقتی برمیگردونید به محضی که b صفر شد از حلقه خارج میشین
    یعنی در برگشت 0 حساب نمیشه
    یا حلقه اول رو از یک شروع کنید
    یا حلقه دوم رو طوری تغییر بدین که 0 هم حساب بشه
    فکر کنم اگه دستور b-- رو به بعد از شرط آخر(Break) منتقل کنین مشکل حل بشه
    اگه اشتباه کردم دوستان راهنمایی کنن
    آموزش ساخت جعبه برای مدار با نرم افزار Corel Draw - آموزش طراحی تابلو ثابت با Corel Draw و LED Tool - آموزش کرک LED Tool

    116 کتابخانه مورد نیاز برای Altium Designer

    از دروغ متنفرم؛ هرچند در این مملکت به جرم صداقت، کودن نامیده شوم.

    دیدگاه


      #3
      پاسخ : مشکل در چپگرد و راستگرد موتور پله ای

      نوشته اصلی توسط masoud_m_bf
      مطمئن نیستم که درست میگم یا ن
      ببینید شما وقتی اول موتور رو میچرخونید از 0 شروع میکنید
      و وقتی برمیگردونید به محضی که b صفر شد از حلقه خارج میشین
      یعنی در برگشت 0 حساب نمیشه
      یا حلقه اول رو از یک شروع کنید
      یا حلقه دوم رو طوری تغییر بدین که 0 هم حساب بشه
      فکر کنم اگه دستور b-- رو به بعد از شرط آخر(Break) منتقل کنین مشکل حل بشه
      اگه اشتباه کردم دوستان راهنمایی کنن
      ممنون.
      با انجام راهنمایی شما فقط یک درجه بهتر عمل کرد ! :agree:

      b برنامه میتونه متفاوت باشه چرا که یک دستور break داخل یک شرط وجود داره که ننوشتم و در صورت اجرا شدن حلقه اول رو که راستگرد موتور هست قطع می کنه ضمن اینکه b=i رو هم انجام میده. :nerd:
      پس b یه زمانی 70 هست و یه زمانی 5 و . . .
      و جالبه که وقتی مثلا 5 شده ؛ چپگرد موتور تا 1+ درجه میاد و وقتی 70 شده چپگرد تا 14+ میاد !!!!! oo:

      و من نمیفههم که چرا تا صفر درجه چپگرد نمیکنه و اصلا چرا هر دفعه تا یه جای متفاوتی چپگرد میشه !!!!؟؟؟ :cry: :angry:
      As long as you can stand and see don't give up
      تا جایی که می توانی ببینی و می توانی بایستی ، مقاومت کن.
      مثل انگلیسی به نقل از پروفسور سید محمود حسابی - پدر علم فیزیک و مهندسی نوین ایران

      دیدگاه


        #4
        پاسخ : مشکل در چپگرد و راستگرد موتور پله ای

        پس اگه میشه کل برنامه رو بذارید تا بشه بهتر راهنماییتون کرد
        آموزش ساخت جعبه برای مدار با نرم افزار Corel Draw - آموزش طراحی تابلو ثابت با Corel Draw و LED Tool - آموزش کرک LED Tool

        116 کتابخانه مورد نیاز برای Altium Designer

        از دروغ متنفرم؛ هرچند در این مملکت به جرم صداقت، کودن نامیده شوم.

        دیدگاه


          #5
          پاسخ : مشکل در چپگرد و راستگرد موتور پله ای

          راستی یه چیزی یادم اومد
          ببینید موتور شما 5سیمه هست
          یعنی 4تا گام داره
          حالا فرض کنیم شما فرمان حرکت 13 گام رو ب اون دادین
          یعنی در حرکت آخر استپر تو گام سوم هست
          حالا وقتی شما میخواین استپر رو برگردونین اگه از گام اول شروع کنین به فرمان دادن استپر اول یک گام به جلو میره(چون نزدیکتره) و بعد شروع ب حرکت ب سمت عقب میکنه
          یعنی در اینجا عملا دوگام برگشت شما از بین میره
          راه چاره اینه که وقت رفت پایه های خروجی رو ذخیره کنید و موقع برگشت دقیقا از یک پایه قبلش شروع به برگشت کنین
          البته فکر میکنم شما این موضوع رو مورد توجه قرار دادین اما در جای نامناسب(برنامتون دستورایی داره ک به نظر میاد میشه سادتر هم نوشتشون)
          حالا اگه برنامه رو بذارین بهتون میگم
          در ضمن برای اینکه برنامتون جمع و جورتر بشه از *2 و /2 برای تعیین پین "یک" استفاده کنید
          امیدوارم توضیحاتم کافی باشه و متوجه بشین
          آموزش ساخت جعبه برای مدار با نرم افزار Corel Draw - آموزش طراحی تابلو ثابت با Corel Draw و LED Tool - آموزش کرک LED Tool

          116 کتابخانه مورد نیاز برای Altium Designer

          از دروغ متنفرم؛ هرچند در این مملکت به جرم صداقت، کودن نامیده شوم.

          دیدگاه


            #6
            پاسخ : مشکل در چپگرد و راستگرد موتور پله ای

            نوشته اصلی توسط masoud_m_bf
            راستی یه چیزی یادم اومد
            ببینید موتور شما 5سیمه هست
            یعنی 4تا گام داره
            حالا فرض کنیم شما فرمان حرکت 13 گام رو ب اون دادین
            یعنی در حرکت آخر استپر تو گام سوم هست
            حالا وقتی شما میخواین استپر رو برگردونین اگه از گام اول شروع کنین به فرمان دادن استپر اول یک گام به جلو میره(چون نزدیکتره) و بعد شروع ب حرکت ب سمت عقب میکنه
            یعنی در اینجا عملا دوگام برگشت شما از بین میره
            راه چاره اینه که وقت رفت پایه های خروجی رو ذخیره کنید و موقع برگشت دقیقا از یک پایه قبلش شروع به برگشت کنین
            البته فکر میکنم شما این موضوع رو مورد توجه قرار دادین اما در جای نامناسب(برنامتون دستورایی داره ک به نظر میاد میشه سادتر هم نوشتشون)
            حالا اگه برنامه رو بذارین بهتون میگم
            در ضمن برای اینکه برنامتون جمع و جورتر بشه از *2 و /2 برای تعیین پین "یک" استفاده کنید
            امیدوارم توضیحاتم کافی باشه و متوجه بشین
            آقا دمت گرم.
            اون که گفتی آخرین گام ذخیره بشه رو لحاظ کرده بودم ولی توضیحاتت باعث شد که بفهمم یه چیزی رو جا انداختم! :agree:
            و با اضافه کردن دو دستور زیر به دستور if قسمت چپگرد هم درست شد. :wow: :applause:
            PORTD=a;
            a=a<<1;

            کل برنامه قسمت چپگرد:

            //Left Movement back to zero steps
            for (z=0;z<=360;z++) {
            PORTD=a;
            if (a==0b00010000) {
            a=0b00000001;
            PORTD=a;
            a=a<<1; }
            else {
            a=a<<1; };
            lcd_gotoxy(6,0);
            lcd_putsf("Backward"
            lcd_gotoxy(3,1);
            sprintf(l,"Angle=%d Steps ",b);
            lcd_puts(l);
            if (b==0)
            break;
            b--;
            delay_ms(20); };

            این مربوط به برنامه ای هست که بعنوان پروژه برای درس 3 واحدی معماری کامپیوتر انجام دادم :nerd:و حدود 195 خط شده!!! :read:

            بیخودی حجمش زیاد شده . oo:

            راستی اون قسمتی رو که گفتی از *2 و /2 برای تعیین پین "یک" استفاده کنم رو نفهمیدم :question:
            As long as you can stand and see don't give up
            تا جایی که می توانی ببینی و می توانی بایستی ، مقاومت کن.
            مثل انگلیسی به نقل از پروفسور سید محمود حسابی - پدر علم فیزیک و مهندسی نوین ایران

            دیدگاه


              #7
              پاسخ : مشکل در چپگرد و راستگرد موتور پله ای

              نوشته اصلی توسط J a v a d
              آقا دمت گرم.
              اون که گفتی آخرین گام ذخیره بشه رو لحاظ کرده بودم ولی توضیحاتت باعث شد که بفهمم یه چیزی رو جا انداختم! :agree:
              و با اضافه کردن دو دستور زیر به دستور if قسمت چپگرد هم درست شد. :wow: :applause:
              PORTD=a;
              a=a<<1;

              کل برنامه قسمت چپگرد:

              //Left Movement back to zero steps
              for (z=0;z<=360;z++) {
              PORTD=a;
              if (a==0b00010000) {
              a=0b00000001;
              PORTD=a;
              a=a<<1; }
              else {
              a=a<<1; };
              lcd_gotoxy(6,0);
              lcd_putsf("Backward"
              lcd_gotoxy(3,1);
              sprintf(l,"Angle=%d Steps ",b);
              lcd_puts(l);
              if (b==0)
              break;
              b--;
              delay_ms(20); };

              این مربوط به برنامه کنترل هوشمند آنتن های تلویزیونی هست که بعنوان پروژه برای درس 3 واحدی معماری کامپیوتر انجام دادم :nerd:و حدود 195 خط شده!!! :read:

              بیخودی حجمش زیاد شده . oo:

              راستی اون قسمتی رو که گفتی از *2 و /2 برای تعیین پین "یک" استفاده کنم رو نفهمیدم :question:
              خب خدا رو شکر
              ببین همینطور که میدونی هر پین یک پورت ی ارزش خاص داره
              مثلا عدد یک یعنی پین 0
              یا عدد دو یعنی پین 1
              چهار میشه 2
              و...
              تا 128 که میشه پین 7
              حالا شما به جای این همه صفر و یک و شیف دادن عدد میتونستی مثلا برای گردش اول پورت رو برابر یک قرار بدی(یعنی پین 0 یک و بقیه پینها صفر) بعد اونو در 2 ضرب کنی و باز هم ضرب در 2 و...
              تا جایی که میرسی به عدد 16
              اینجا دوباره عدد رو یک میکنی(با IF)
              و برای برعکس چرخیدن دقیقا این کار رو برعکس انجام میدی(یعنی تقسیم بر 2)
              خب ی جایی میرسی که یک باید تقسیم بر دو بشه ک برنامه ارور میده(چون متغیر ها عدد صحیح باشن)
              اینجا باید حواست باشه ک شرط "اگر یک بود بشه 16" رو قبل از تقسیم بذاری
              با این کار حجم تایپ شدنت خیلی کمتر میشه
              چقدر بیخودی حرف زدم
              آقا منظورم این بود به جای عدد باینری عدد مبنای ده بذار!!!

              یا مثلا ببین تو برنامه زیر این دستور رو هم تو IF نوشتی هم تو ELSE
              a=a<<1;
              چرا این رو از شرط نمیاری بیرون و فقط یکبار بنویسی؟

              ببخشید خیلی حرف زدم
              موفق باشی
              آموزش ساخت جعبه برای مدار با نرم افزار Corel Draw - آموزش طراحی تابلو ثابت با Corel Draw و LED Tool - آموزش کرک LED Tool

              116 کتابخانه مورد نیاز برای Altium Designer

              از دروغ متنفرم؛ هرچند در این مملکت به جرم صداقت، کودن نامیده شوم.

              دیدگاه


                #8
                پاسخ : مشکل در چپگرد و راستگرد موتور پله ای

                نوشته اصلی توسط masoud_m_bf
                خب خدا رو شکر
                ببین همینطور که میدونی هر پین یک پورت ی ارزش خاص داره
                مثلا عدد یک یعنی پین 0
                یا عدد دو یعنی پین 1
                چهار میشه 2
                و...
                تا 128 که میشه پین 7
                حالا شما به جای این همه صفر و یک و شیف دادن عدد میتونستی مثلا برای گردش اول پورت رو برابر یک قرار بدی(یعنی پین 0 یک و بقیه پینها صفر) بعد اونو در 2 ضرب کنی و باز هم ضرب در 2 و...
                تا جایی که میرسی به عدد 16
                اینجا دوباره عدد رو یک میکنی(با IF)
                و برای برعکس چرخیدن دقیقا این کار رو برعکس انجام میدی(یعنی تقسیم بر 2)
                خب ی جایی میرسی که یک باید تقسیم بر دو بشه ک برنامه ارور میده(چون متغیر ها عدد صحیح باشن)
                اینجا باید حواست باشه ک شرط "اگر یک بود بشه 16" رو قبل از تقسیم بذاری
                با این کار حجم تایپ شدنت خیلی کمتر میشه
                چقدر بیخودی حرف زدم
                آقا منظورم این بود به جای عدد باینری عدد مبنای ده بذار!!!

                یا مثلا ببین تو برنامه زیر این دستور رو هم تو IF نوشتی هم تو ELSE
                a=a<<1;
                چرا این رو از شرط نمیاری بیرون و فقط یکبار بنویسی؟

                ببخشید خیلی حرف زدم
                موفق باشی

                che jaleb!!! :surprised:

                pas man cheghadr Amator boodam!!!

                dadash dastet dard nakone
                As long as you can stand and see don't give up
                تا جایی که می توانی ببینی و می توانی بایستی ، مقاومت کن.
                مثل انگلیسی به نقل از پروفسور سید محمود حسابی - پدر علم فیزیک و مهندسی نوین ایران

                دیدگاه

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