اطلاعیه

Collapse
No announcement yet.

علت عدم شمارش انکودر

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

    علت عدم شمارش انکودر

    با سلام

    در این پروژه انکودر به صورت دستی به موتور کوپل شده و خروجی اپتو کانتر به INT0 وصل شده.
    موتور با PWM میکرو کنترل میشه.
    یک LCD کاراکتری مقدار PWM و تعداد شمارش رو انجام میده.

    مشکل:عدم شمارش در سرعت های بالا(وفتی OCR1A بیشتر از تقریبا 80 باشه).بنظرتون :
    1.مشکل سخت افزاریه یا نرم افزاری؟
    2.اگه سخت افزاریه،مشکل از اپتو کانتر است یا INT میکرو؟(یعنی در سرعت بالا اپتوکانتر کم میاره یا INT میکرو)

    با تشکر

    #2
    پاسخ : علت عدم شمارش انکودر

    منظورتون از سرعت بالا چیه ؟

    سانتریفیوژ که نیست .
    برای دور موتور اپتو کم نمیاره ! اما حالا اگه شماره قطعه رو بگید یه نگاه به دیتاشیتش بکنیم بهتره .
    کدتون باید یررسی بشه .
    چقدر تو زیر روال وقفه میمونید ؟ کدتون رو بزارید با هم تحلیل کنیم .
    اِنَّ الَّذِینَ یُحِبُّونَ أَنْ تَشِیعَ الْفاحِشَهُ فِی الَّذِینَ آمَنُوا لَهُمْ عَذابٌ أَلِیمٌ فِی الدُّنْیا وَ الْآخِرَهِ وَ اللَّهُ یَعْلَمُ وَ أَنْتُمْ لا تَعْلَمُونَ.
    کسانى که دوست دارند زشتی ها در میان مردم با ایمان شیوع یابد عذاب دردناکى براى آنها در دنیا و آخرت است، و خداوند میداند و شما نمی‏دانید. (نور19)

    دیدگاه


      #3
      پاسخ : علت عدم شمارش انکودر

      نوشته اصلی توسط cortex-m3
      با سلام

      در این پروژه انکودر به صورت دستی به موتور کوپل شده و خروجی اپتو کانتر به INT0 وصل شده.
      موتور با PWM میکرو کنترل میشه.
      یک LCD کاراکتری مقدار PWM و تعداد شمارش رو انجام میده.

      مشکل:عدم شمارش در سرعت های بالا(وفتی OCR1A بیشتر از تقریبا 80 باشه).بنظرتون :
      1.مشکل سخت افزاریه یا نرم افزاری؟
      2.اگه سخت افزاریه،مشکل از اپتو کانتر است یا INT میکرو؟(یعنی در سرعت بالا اپتوکانتر کم میاره یا INT میکرو)

      با تشکر
      اگر قصد دارید rpm metr درست کنید باید عرض کنم من هم همین روش شما رو رفتم و پالسها رو به اینتراپت دادم و همین مشکل شما برام پیش اومد با این تفاوت که من با مادون قرمز کار کردم با مقایسه کننده آنالوگ داخلی هم تو سرعت بالا مشکل داشتم در نهایت از یک پین ورودی میکرو استفاده کردم که تا 10000 دور رو عملی باهاش تست کردم مشکلی نداشت .
      البته باید اضافه کنم شاید مشکل از برنامه نویسی من بوده ولی فکر میکنم وقفه ها تویه ایجادشون محدودیت سرعت دارند
      و یک نکته مهم دیگه اینکه وقتی شما به لیبل وقفه پرش کنید باید از حد اقل دستورات برنامه نویسی استفاده کنید و به برنامه اصلی برگردید در غیر این صورت در صورتی که وقفه دیگری روی دهد و شما هنوز تویه زیربرنامه وقفه باشید عملی انجام نمیشود :bye :bye
      عجب روزگاریست...! هیچکس به سکوت آدم نمیرسد،همه منتظرند به داد آدم برسند...!

      دیدگاه


        #4
        پاسخ : علت عدم شمارش انکودر

        شماره اپتو کانتر:WYO-H12A68
        کد برنامه:
        کد:
        [left]/*****************************************************
        This program was produced by the
        CodeWizardAVR V2.05.3 Standard
        Automatic Program Generator
        © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
        http://www.hpinfotech.com
        
        Project : 
        Version : 
        Date  : 8/27/2015
        Author : PerTic@n
        Company : If You Like This Software,Buy It
        Comments: 
        
        
        Chip type        : ATmega8
        Program type      : Application
        AVR Core Clock frequency: 8.000000 MHz
        Memory model      : Small
        External RAM size    : 0
        Data Stack size     : 256
        *****************************************************/
        
        #include <mega8.h>
        
        // Alphanumeric LCD functions
        #include <alcd.h>
        #include <stdio.h>
        #include <delay.h>
        
        volatile int count=0;
        
        // External Interrupt 0 service routine
        interrupt [EXT_INT0] void ext_int0_isr(void)
        {
        count++;
        
        }
        
        // Timer1 overflow interrupt service routine
        interrupt [TIM1_OVF] void timer1_ovf_isr(void)
        {
        // Place your code here
        
        }
        
        // Timer1 output compare A interrupt service routine
        interrupt [TIM1_COMPA] void timer1_compa_isr(void)
        {
        // Place your code here
        
        }
        
        // Declare your global variables here
        
        void main(void)
        {
        // Declare your local variables here
        unsigned char a=25;
        unsigned char str_a[16];
        unsigned char str_ocr[16];
        unsigned char str_count[16];
        // Input/Output Ports initialization
        // Port B initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In 
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=T 
        PORTB=0x00;
        DDRB=0x02;
        
        // Port C initialization
        // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
        // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
        PORTC=0x00;
        DDRC=0x00;
        
        // Port D initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
        PORTD=0x00;
        DDRD=0x00;
        
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: Timer 0 Stopped
        TCCR0=0x00;
        TCNT0=0x00;
        
        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: 125.000 kHz
        // Mode: Fast PWM top=0x00FF
        // OC1A output: Non-Inv.
        // OC1B output: Discon.
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        // Timer1 Overflow Interrupt: On
        // Input Capture Interrupt: Off
        // Compare A Match Interrupt: On
        // Compare B Match Interrupt: Off
        TCCR1A=0x81;
        TCCR1B=0x0B;
        TCNT1H=0x00;
        TCNT1L=0x00;
        ICR1H=0x00;
        ICR1L=0x00;
        OCR1AH=0x00;
        OCR1AL=0x00;
        OCR1BH=0x00;
        OCR1BL=0x00;
        
        // Timer/Counter 2 initialization
        // Clock source: System Clock
        // Clock value: Timer2 Stopped
        // Mode: Normal top=0xFF
        // OC2 output: Disconnected
        ASSR=0x00;
        TCCR2=0x00;
        TCNT2=0x00;
        OCR2=0x00;
        
        // External Interrupt(s) initialization
        // INT0: On
        // INT0 Mode: Rising Edge
        // INT1: Off
        GICR|=0x40;
        MCUCR=0x03;
        GIFR=0x40;
        
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x14;
        
        // USART initialization
        // USART disabled
        UCSRB=0x00;
        
        // Analog Comparator initialization
        // Analog Comparator: Off
        // Analog Comparator Input Capture by Timer/Counter 1: Off
        ACSR=0x80;
        SFIOR=0x00;
        
        // ADC initialization
        // ADC disabled
        ADCSRA=0x00;
        
        // SPI initialization
        // SPI disabled
        SPCR=0x00;
        
        // TWI initialization
        // TWI disabled
        TWCR=0x00;
        
        // Alphanumeric LCD initialization
        // Connections are specified in the
        // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
        // RS - PORTC Bit 0
        // RD - PORTC Bit 1
        // EN - PORTC Bit 2
        // D4 - PORTC Bit 3
        // D5 - PORTC Bit 4
        // D6 - PORTC Bit 5
        // D7 - PORTB Bit 7
        // Characters/line: 16
        lcd_init(16);
        
        // Global enable interrupts
        #asm("sei")
        
        while (1)
           {
           sprintf(str_a,"%d ",a);
           lcd_gotoxy(0,0); 
           lcd_puts(str_a);
           
           sprintf(str_ocr,"0CR1A=%d ",OCR1A);
           lcd_gotoxy(6,0); 
           lcd_puts(str_ocr);
           
           sprintf(str_count,"count=%d ",count);
           lcd_gotoxy(0,1); 
           lcd_puts(str_count);
           
           OCR1A=a;
           if(count==1000){
           count=0;
           OCR1A=0;
           delay_ms(2000);
           a=a+10;
            if(a>=75)a=25;
           }
           
           
        
           }
        }
        [/left]
        مدت زمان ماندن در وفقه:فقط یک خط کد برای شمارش هست.
        نوشته اصلی توسط ♥♫ حمید خان ♫♥
        اگر قصد دارید rpm metr درست کنید باید عرض کنم من هم همین روش شما رو رفتم و پالسها رو به اینتراپت دادم و همین مشکل شما برام پیش اومد با این تفاوت که من با مادون قرمز کار کردم با مقایسه کننده آنالوگ داخلی هم تو سرعت بالا مشکل داشتم در نهایت از یک پین ورودی میکرو استفاده کردم که تا 10000 دور رو عملی باهاش تست کردم مشکلی نداشت .
        البته باید اضافه کنم شاید مشکل از برنامه نویسی من بوده ولی فکر میکنم وقفه ها تویه ایجادشون محدودیت سرعت دارند
        و یک نکته مهم دیگه اینکه وقتی شما به لیبل وقفه پرش کنید باید از حد اقل دستورات برنامه نویسی استفاده کنید و به برنامه اصلی برگردید در غیر این صورت در صورتی که وقفه دیگری روی دهد و شما هنوز تویه زیربرنامه وقفه باشید عملی انجام نمیشود :bye :bye
        یعنی سرعت پایه های i/o با نوشتن کد بیشتر از وقفه است؟؟؟فک نکنم.

        البته این یه کد تست هستش و به خاطر همین چندتا کد و فقه اضافه توی کدها هست که جنبه تست داره و بعدا توسعه پیدا میکنه

        دیدگاه


          #5
          پاسخ : علت عدم شمارش انکودر

          نوشته اصلی توسط ♥♫ حمید خان ♫♥
          اگر قصد دارید rpm metr درست کنید باید عرض کنم من هم همین روش شما رو رفتم و پالسها رو به اینتراپت دادم و همین مشکل شما برام پیش اومد با این تفاوت که من با مادون قرمز کار کردم با مقایسه کننده آنالوگ داخلی هم تو سرعت بالا مشکل داشتم در نهایت از یک پین ورودی میکرو استفاده کردم که تا 10000 دور رو عملی باهاش تست کردم مشکلی نداشت .
          چجوری فهمیدید که این 10000 دور که دستگاه شما شمرده واقعا 10000 دوره؟

          نوشته اصلی توسط ♥♫ حمید خان ♫♥
          با این تفاوت که من با مادون قرمز کار کردم با مقایسه کننده آنالوگ داخلی هم تو سرعت بالا مشکل داشتم
          مگه اپتوکانترها با مادون قرمز کار نمیکنند؟
          مقایسه کننده آنالوگ اینجا چه کاربردی داره؟

          دیدگاه


            #6
            پاسخ : علت عدم شمارش انکودر

            میشه کدتون رو توضیح بدید ؟
            دور در ثانیه کجا محاسبه شده ؟
            25 و 75 انتهای کد چیه ؟
            چرا متغییر شمارش رو روی 1000 محدود کردید ؟
            اِنَّ الَّذِینَ یُحِبُّونَ أَنْ تَشِیعَ الْفاحِشَهُ فِی الَّذِینَ آمَنُوا لَهُمْ عَذابٌ أَلِیمٌ فِی الدُّنْیا وَ الْآخِرَهِ وَ اللَّهُ یَعْلَمُ وَ أَنْتُمْ لا تَعْلَمُونَ.
            کسانى که دوست دارند زشتی ها در میان مردم با ایمان شیوع یابد عذاب دردناکى براى آنها در دنیا و آخرت است، و خداوند میداند و شما نمی‏دانید. (نور19)

            دیدگاه


              #7
              پاسخ : علت عدم شمارش انکودر

              نوشته اصلی توسط ♥♫ حمید خان ♫♥
              در نهایت از یک پین ورودی میکرو استفاده کردم که تا 10000 دور رو عملی باهاش تست کردم مشکلی نداشت .
              البته باید اضافه کنم شاید مشکل از برنامه نویسی من بوده ولی فکر میکنم وقفه ها تویه ایجادشون محدودیت سرعت دارند
              سلام برو بچ :bye
              منم همین مشکلو دارم
              از انکودر و ماژول اپتوکانتر مادون قرمز استفاده کردم
              ولی سرعت موتور ک بالا میره دیگه نمیشمره
              نمیدونم ماژول اپتو وقت نمیکنه خاموشو روشن شه یا وقفه کم میاره
              حالا سوالم اینه شما چجوری از پین ورودی استفاده کردین ؟؟؟
              با توجه به این که شمارش این موتور یه قسمت از برنامس و هدف کنترل رباته شما چجوری بدون وقفه ، شمارش رو انجام میدین؟؟؟؟ :eek:
              یه خط نه یه خط پین ورودی رو چک میکنین؟
              میشه کدتونو بزارین؟؟

              دیدگاه


                #8
                پاسخ : علت عدم شمارش انکودر

                هم از اپتو و هم از مادون استفاده کردم
                مادون به این صورته که یک تکه چسب برق سیاه رویه شافت موتور وصل میکنید و با هر بار چرخش لبه بالا رونده یا پایین رونده رو توسط دستور بیتویت و یکی از پین هایه ورودی چک میکنید و همزمان توسط یک تایمر زمان یک پریود رو بدست میارید و با f=1/t فرکانس رو بدست میارید و rpm=60*f به همین سادگی شما یک تاکومتر ساختید دقت محاسبه بستگی به دقت تایمرتون و کریتال خارجی داره
                این روش تویه دور بالایه 30 دقت خوبی داره خیلی بیشتر از 10000 میتونه اندازهگیری کنه من با یک فن کوچیک 12 ولت که ولتاژ 25 اعمال کردم به دور 10000 رسیدم :agree: :agree: که فن هم حسابی داغ شد
                عجب روزگاریست...! هیچکس به سکوت آدم نمیرسد،همه منتظرند به داد آدم برسند...!

                دیدگاه


                  #9
                  پاسخ : علت عدم شمارش انکودر

                  عجب روزگاریست...! هیچکس به سکوت آدم نمیرسد،همه منتظرند به داد آدم برسند...!

                  دیدگاه


                    #10
                    پاسخ : علت عدم شمارش انکودر

                    من با سنسور اثر هال ugn3503 و وقفه خارجی هم به 5000 رسیدم. با اپتوکانتر که باید بشه به سرعتای خیلی بالاتر هم رسید.
                    من با اپتوکانتر کار کردم ولی سرعت موتورم در حدود 300 بود. سرعتای بالا رو تست نکردم. ولی میگن کانتر سرعت بالاتری نسبت به وقفه خارجی داره.
                    www.gam-co.blogsky.com

                    دیدگاه


                      #11
                      پاسخ : علت عدم شمارش انکودر

                      نوشته اصلی توسط " سید محمد "
                      میشه کدتون رو توضیح بدید ؟
                      چرا متغییر شمارش رو روی 1000 محدود کردید ؟
                      count تعداد پالسها رو میشماره.(توی روتین وقفه خارجی)
                      توی while مقدار OCR1A و count نمایش داده میشه.(a همون مقدار OCR1A هست)
                      گفتم برای تست این برنامه رو نوشتم پس میخاستم ببینم بعد از 1000 شمارش،موتور میایسته یا نه که شرط if(count==1000 )رو گذاشتم.
                      delay هم برای دیدن تغییرات بود.
                      و چون اگه PWM رو بیشتر 80 کنم نمیشماره.شرط آخر رو گذاشتم تا PWM از80 بالاتر نره.

                      نوشته اصلی توسط " سید محمد "
                      دور در ثانیه کجا محاسبه شده ؟
                      فعلا هیچ جا.مرحله به مرحله.من میخام اول مشکل نشمردن در سرعت بالا رو حل کنم .بقیه چند خط کد نویسیه!

                      نوشته اصلی توسط " سید محمد "
                      25 و 75 انتهای کد چیه ؟
                      a همون مقدار OCR1Aهست.توی عمل با OCR1A=25 موتور به نرمی حرکت میکنه و مقدار a=25 مقدار اولیه PWM هست.
                      اون 75 هم حد بالای PWM رو مشخص کرده که از 75 بالاتر نره.(چون بالای 80 دیگه شمارش انجام نمیشه)

                      دیدگاه


                        #12
                        پاسخ : علت عدم شمارش انکودر

                        نوشته اصلی توسط vahidabedi
                        من با سنسور اثر هال ugn3503 و وقفه خارجی هم به 5000 رسیدم. با اپتوکانتر که باید بشه به سرعتای خیلی بالاتر هم رسید.
                        من با اپتوکانتر کار کردم ولی سرعت موتورم در حدود 300 بود. سرعتای بالا رو تست نکردم. ولی میگن کانتر سرعت بالاتری نسبت به وقفه خارجی داره.
                        1.سرعت اپتوکانتر بیشتر از سنسور اثر هاله؟
                        2.من برعکس حرفتونو شنیدم که:سرعت INT بیشتر از counter هست(؟)
                        3.روش نصب سنسور اثز هال برای سنس انکودر موتور چیه؟

                        دیدگاه


                          #13
                          پاسخ : علت عدم شمارش انکودر

                          در ضمن اخساس میکنم ،در مورد انکودر اشتباه میکنید.
                          چیزی که من متوجه شدم اپتوکانتر در مدار شما هر بار موتور یه دور بزنه میکرو یه با میشمره ولی انکودری که من دارم یه صفحه دایره ای با تعداد زیادی سوراخه.یعنی در هر دور میکرو چندین بار میشمره.
                          اینم عکسش:
                          [img]http://********/wp-content/uploads/%D8%A7%D9%86%DA%A9%D9%88%D8%AF%D8%B1-%D9%86%D9%88%D8%B1%DB%8C.jpg?c29590[/img]

                          دیدگاه


                            #14
                            پاسخ : علت عدم شمارش انکودر

                            +
                            بعد از چند بار تست اپتوکانتر سوخت...چرا؟(از قسمت فرستندش تست دیود گرفتم،overload بود)
                            من فرستنده اپتو رو با مقاومت 330 اهم بستم و امیتر گیرنده رو زمین و کلکتورشو با مقاومت 10 کیلو اهم به5v وصل کردم و از کلکتور گیرنده به INT میکرو وصل کردم.
                            روش بالا مشکلی که نداره؟اشمیت تریگر نذاشتم

                            دیدگاه


                              #15
                              پاسخ : پاسخ : علت عدم شمارش انکودر

                              نوشته اصلی توسط cortex-m3
                              در ضمن اخساس میکنم ،در مورد انکودر اشتباه میکنید.
                              چیزی که من متوجه شدم اپتوکانتر در مدار شما هر بار موتور یه دور بزنه میکرو یه با میشمره ولی انکودری که من دارم یه صفحه دایره ای با تعداد زیادی سوراخه.یعنی در هر دور میکرو چندین بار میشمره.
                              اینم عکسش:
                              [img]http://********/wp-content/uploads/%D8%A7%D9%86%DA%A9%D9%88%D8%AF%D8%B1-%D9%86%D9%88%D8%B1%DB%8C.jpg?c29590[/img]
                              عرض کردم با اپتو هم بستم
                              برایه این کار کافیه یک برنامه فرکانس متر داشته باشید و فرکانس ورودی رو تقسیم بر تعداد سوراخهایه انکودر ضرب در 60 میشه دور موتور
                              مقاومتتون کم بوده بهترین کار اینه کا با یک منبع تغذیه متغیر و میلی آمپرمتر جریان و واتاژ رو بگیرید و بهترین مقاومت رو براش انتخاب کنید
                              عجب روزگاریست...! هیچکس به سکوت آدم نمیرسد،همه منتظرند به داد آدم برسند...!

                              دیدگاه

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