اطلاعیه

Collapse
No announcement yet.

شمارنده RPM با وقفه INT1 (دور بر دقیقه)

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

    #16
    پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

    نوشته اصلی توسط evergreen نمایش پست ها
    با سلام مجدد
    اون خودش از ide آردوینو استفاده کرده و arduino core مربوط به میکروی خودش رو درش نصب کرده. شما با توجه به میکرویی که دارید میتونید core مربوطه رو از آدرس زیر دانلود کنید و در محیط آردوینو نصبش کنید. ممکن موقع نصب یه مقداری وقت گیر بنظر بیاد ولی بعدش دیگه راحتید.
    Arduino hardware package for ATmega1284, ATmega644, ATmega324, ATmega324PB, ATmega164, ATmega32, ATmega16 and ATmega8535 - MCUdude/MightyCore

    موفق باشید.

    یعنی کامپایلر و IDE میشه آردوینو؟ دیگه خبری از کدویژن نیست؟

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    نوشته اصلی توسط evergreen نمایش پست ها
    با سلام
    کد دوستمون رو اگر خواستی استفاده کنی فکر میکنم rpm=rps*60 را باید به rpm=rps*30 تبدیل کنی چون تا اونجایی که یادمه گفته بودید به ازای هر دور گردش دوبار پالس ارسال میشه.
    موفق باشید.
    آره اما فعلاً روی دستگاه نصب نیست. مشکل اینه که نمیشماره. عدد 0 میمونه.
    *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

    دیدگاه


      #17
      پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

      دوست عزیز

      توی کد قبلی یک عدد فراموش شده بود که اصلاحش کردم
      ocr1a باید ۷۸۱۲ باشه

      بعد گفتم دستورات نمایشگرت رو بیار در ساب روتین آخری ( اینتراپت تایمر ۱ )

      متغیرها اونجا آپدیت میشن !
      در حلقه while هیچی نداریم ( میکرو باید روی مد لو پاور بره )

      دیدگاه


        #18
        پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

        نوشته اصلی توسط shoniz نمایش پست ها
        من کدهارو آوردم توی کد ویژن. دقیقا همون چیزی که شما نوشتید. اما نمیشماره.

        کد:
        #include <mega32a.h>
        #include <delay.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <alcd.h>
        #include <stdbool.h>
        
        
        // Declare your global variables here
        
        
        unsigned char str[16];
        volatile unsigned int counter=0;    //Main pulse counter
        volatile unsigned int rpm=0;        //Revolution per minute
        volatile unsigned int rps=0;        //Revolution per second
        
        
        
        
        void main()
        {
         DDRD.3 = 0;
         PORTD.3 = 1;
        
        
        
        
        
        
           //Init INT1
         MCUCR|=(1<<ISC01);   //Falling edge triggers interrupt.
        
        
        
        
         GICR|=(1<<INT1);  //Enable INT1 IRQ
        
        
        
        
           //Timer1 set for 1 sec IRQ
           //Timer Clock = 1/1024 of sys clk
           //Mode = CTC (Clear Timer On Compare)
         TCCR1B|=((1<<WGM12)|(1<<CS12)|(1<<CS10));
        
        
        
        
           //Compare value=781
        
        
        
        
         OCR1A=781;
        
        
        
        
         TIMSK|=(1<<OCIE1A);  //Output compare 1A interrupt enable
        
        
        
        
           //Enable global interrupts 
           
         lcd_init(16);
         lcd_gotoxy(0,0);
         lcd_putsf("TEST COUNTER .CO");
         #asm("sei")
        
        
        
        
        
        
        
        
         while(1)
         {
          lcd_gotoxy(1,1);
          lcd_putsf("COUNT = ");
        
        
          sprintf(str,"%04d",count);
          lcd_puts(str);
          lcd_gotoxy(8,1);
        
        
        
        
         }
        }
        
        
        
        
        interrupt [EXT_INT1] void ext_int1_isr(void)
        {
           //INT1 pin detect a falling edge IRQ
           counter++;
        }
        
        
        
        
        interrupt [TIM1_COMPA] void timer1_compa_isr(void)
        {
           //1000ms Timer1 IRQ
           rps=count;
           rpm=rps*60;
           counter=0x0000;
        }
        با سلام
        توی روتین آخر بنظر میاد باید rps=counter باید باشه خط بعدش رو هم همونطور که قبلا نوشتم تغییر بدید. موقع نمایش هم rpm را بفرستید روی lcd. احتمالا با این تغییرات مشکل حل میشه.
        موفق باشید

        دیدگاه


          #19
          پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

          نوشته اصلی توسط Amie.s.m نمایش پست ها
          دوست عزیز

          توی کد قبلی یک عدد فراموش شده بود که اصلاحش کردم
          ocr1a باید ۷۸۱۲ باشه

          بعد گفتم دستورات نمایشگرت رو بیار در ساب روتین آخری ( اینتراپت تایمر ۱ )

          متغیرها اونجا آپدیت میشن !
          در حلقه while هیچی نداریم ( میکرو باید روی مد لو پاور بره )
          بله ممنون با این کار الان تغریباً داره انجام میده. و من یه تست باید بکنم. چون وسط شمارش هرازگاهی 0 میشه.

          دلیل: ادغام دو پست برای جلوگیری از اسپم

          نوشته اصلی توسط evergreen نمایش پست ها
          با سلام
          توی روتین آخر بنظر میاد باید rps=counter باید باشه خط بعدش رو هم همونطور که قبلا نوشتم تغییر بدید. موقع نمایش هم rpm را بفرستید روی lcd. احتمالا با این تغییرات مشکل حل میشه.
          موفق باشید
          بله متغیر رو اشتباه گذاشته بودم برای نمایش و مشکل نمایش حل شده.
          فقط ظاهرا یخورده باید روش کار کنم. چون بعضی وقتا صفر میشه.
          *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

          دیدگاه


            #20
            پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

            نوشته اصلی توسط shoniz نمایش پست ها
            بله ممنون با این کار الان تغریباً داره انجام میده. و من یه تست باید بکنم. چون وسط شمارش هرازگاهی 0 میشه.
            هر از گاهی صفر شدن ( اگر سرعت موتور بیشتر از ۶۰ دور در دقیقه در کیس شما ۳۰ دور در دقیقه است ) یا بخاطر اینه که دستوراتی که در روتین اینتراپت نوشتی توشون delay استفاده شده که اصلا استفاده از delay ممنوعه .

            یا برخورد اینتراپتی داری که جزو محدودیتهای میکروهای avr هست در روتین یکی از اینتراپتها ( اینتراپت اولی راحت تره ) باید اون یکی اینتراپت رو موقتا غیر فعال کنی ( دستور اول روتین اون یکی اینتراپت رو غیر فعال میکنی ، دستور آخر روتین دوباره فعالش میکنی )

            دیدگاه


              #21
              پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

              نوشته اصلی توسط Amie.s.m نمایش پست ها
              هر از گاهی صفر شدن ( اگر سرعت موتور بیشتر از ۶۰ دور در دقیقه در کیس شما ۳۰ دور در دقیقه است ) یا بخاطر اینه که دستوراتی که در روتین اینتراپت نوشتی توشون delay استفاده شده که اصلا استفاده از delay ممنوعه .

              یا برخورد اینتراپتی داری که جزو محدودیتهای میکروهای avr هست در روتین یکی از اینتراپتها ( اینتراپت اولی راحت تره ) باید اون یکی اینتراپت رو موقتا غیر فعال کنی ( دستور اول روتین اون یکی اینتراپت رو غیر فعال میکنی ، دستور آخر روتین دوباره فعالش میکنی )
              فکر کنم مشکل حل شد.
              محل خوندن و نمایش جای مناسبی نبود. الان ظاهرا خیلی خوب و حتی بهتر از قبلاً هم شده.

              حالا تا این تاپیک هست، چالش بعدی من کنترل دور موتور، مثلا روی 4000 دور هست. موتور از نوع یونیورسال هست که با یه اتوترانس 80 یا 90 ولت کار میکنه.
              کنترل جریان و ولتاژ بصورت AC و با BTA16 هست.

              نکته اینجاست که از PWM خود میکرو استفاده نشده. و از پایه PORTB.1 فرمان میگیره. و یه سری مدار روی بورد هست که ظاهرا از طریق اون فرکانسی دریافت میکنه که باعث میشه ازطریق اون پالس PWM ساخته بشه.
              *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

              دیدگاه


                #22
                پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

                اونی که میفرمایید ظاهرا فرکانس دریافت میکنه باید آشکارساز عبور از صفر باشه ( zero crossing detector )

                در هر صورت تا شماتیک سیستم رو نگذاری نمیشه بر مبنای حدس و گمان متوجه شد طراح سیستم سخت افزار رو چطور در نظر گرفته که بر مبناش فریمور نوشت

                دیدگاه


                  #23
                  پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

                  نوشته اصلی توسط Amie.s.m نمایش پست ها
                  اونی که میفرمایید ظاهرا فرکانس دریافت میکنه باید آشکارساز عبور از صفر باشه ( zero crossing detector )

                  در هر صورت تا شماتیک سیستم رو نگذاری نمیشه بر مبنای حدس و گمان متوجه شد طراح سیستم سخت افزار رو چطور در نظر گرفته که بر مبناش فریمور نوشت
                  آفرین دقیقاً همینه

                  دوستان عزیز.
                  بسیار ممنونم خیلی خوب عالی داره جواب میده و مشکلی نداره.
                  جدیدترین ویرایش توسط shoniz; ۱۲:۲۴ ۱۴۰۱/۱۰/۲۹.
                  *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

                  دیدگاه


                    #24
                    پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

                    همچنان داره جواب میده.
                    چندروز دیگه روی دستگاه 22 هزار دور بردقیقه تستش میکنم.

                    خیلی لطف کردید.
                    ممنون
                    جدیدترین ویرایش توسط shoniz; ۱۲:۲۵ ۱۴۰۱/۱۰/۲۹.
                    *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

                    دیدگاه


                      #25
                      پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

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

                      شما اول باید طرز کار سیستم رو بشناسی بعدا بری سراغ سیستم کنترل ( از هر نوعش )

                      فرمولش ساده است :
                      توان اعمالی به بار = انتگرال زمان روشن بودن ترایاک ( یا تریستور ) از صفر تا π.

                      مساله اینه اون صفر رو باید پیدا کرد ... هر ۱۰ میلی ثانیه دوباره صفر میشه ...بسته به توانی که لازمه بعد از پیدا کردن صفر تاخیر در زاویه آتش ترایاک ایجاد میکنیم ، وقتی دوباره به صفر رسید ترایاک قطع میشه و سیکل تکرار میشه ( که در کنترل دیجیتال مدار زیرو کراس لحظه عبور از صفر رو پیدا میکنه ، در هر ثانیه ۱۰۰ تا دونه عبور از صفر داریم ! در نتیجه اون کدی که دارید باهاش سرعت میخونید بدرد اینکار نمیخوره و دقت لازم بعنوان کنترل سرعت نداره ... طبق توضیحات اولتون بعنوان نمایشگر سرعت با رزولوشون پایین و تاخیر به روز سانی ۱ ثانیه ای نوشته شده )

                      الگوریتمش این شکلیه که :
                      ۱ - سرعت لحظه ای رو با فیدبک انکودر بخوانید .
                      ۲ - میزان لغزش از سرعت تنظیمی رو پیدا کنید ( یک عدد مثبت منفی یا صفره )
                      ۳- بسته به میزان لغزش زاویه آتش ترایاک رو تغییر دهید . ( در صورت صفر بودن لغزش زاویه آتش قبلی اعمال شود ) .
                      تبصره : اگر موتور قفل بود یا میزان لغزش خیلی زیاد شد تمهیدات لازم جهت عدم آسیب به موتور و اتصالات مکانیکی اعمال شود .

                      الان طبق الگوریتم میتونید کدش رو بنویسید ... اگر مشکلی بود دوستان تا حد ممکن کمک میکنن

                      دیدگاه


                        #26
                        پاسخ : شمارنده RPM با وقفه INT1 (دور بر دقیقه)

                        نوشته اصلی توسط Amie.s.m نمایش پست ها
                        دوست عزیز برداشت من اینه با روش کنترل دیمر دیجیتال آشنایی ندارید .

                        شما اول باید طرز کار سیستم رو بشناسی بعدا بری سراغ سیستم کنترل ( از هر نوعش )

                        فرمولش ساده است :
                        توان اعمالی به بار = انتگرال زمان روشن بودن ترایاک ( یا تریستور ) از صفر تا π.

                        مساله اینه اون صفر رو باید پیدا کرد ... هر ۱۰ میلی ثانیه دوباره صفر میشه ...بسته به توانی که لازمه بعد از پیدا کردن صفر تاخیر در زاویه آتش ترایاک ایجاد میکنیم ، وقتی دوباره به صفر رسید ترایاک قطع میشه و سیکل تکرار میشه ( که در کنترل دیجیتال مدار زیرو کراس لحظه عبور از صفر رو پیدا میکنه ، در هر ثانیه ۱۰۰ تا دونه عبور از صفر داریم ! در نتیجه اون کدی که دارید باهاش سرعت میخونید بدرد اینکار نمیخوره و دقت لازم بعنوان کنترل سرعت نداره ... طبق توضیحات اولتون بعنوان نمایشگر سرعت با رزولوشون پایین و تاخیر به روز سانی ۱ ثانیه ای نوشته شده )

                        الگوریتمش این شکلیه که :
                        ۱ - سرعت لحظه ای رو با فیدبک انکودر بخوانید .
                        ۲ - میزان لغزش از سرعت تنظیمی رو پیدا کنید ( یک عدد مثبت منفی یا صفره )
                        ۳- بسته به میزان لغزش زاویه آتش ترایاک رو تغییر دهید . ( در صورت صفر بودن لغزش زاویه آتش قبلی اعمال شود ) .
                        تبصره : اگر موتور قفل بود یا میزان لغزش خیلی زیاد شد تمهیدات لازم جهت عدم آسیب به موتور و اتصالات مکانیکی اعمال شود .

                        الان طبق الگوریتم میتونید کدش رو بنویسید ... اگر مشکلی بود دوستان تا حد ممکن کمک میکنن

                        همین من بیشتر همین توضیح رو میخواستم.
                        حالا میرم سراغش ببینم چطور میشه انجامش داد.

                        دیدم این بحث خیلی کلی هست، توی یه تاپیک دیگه مطرح کردم.
                        *\ وقتی ارزش ها عوض بشن، عوضی ها باارزش می شن /*

                        دیدگاه

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