اطلاعیه

Collapse
No announcement yet.

اندازه گیری پهنای پالس

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

    اندازه گیری پهنای پالس

    سلام

    فرض کنید مداری داریم که هر لحظه دلخواهی ممکن است بهش پالسی را ارسال کنیم . پهنای این پالس رو چگونه می توان محاسبه کرد؟
    البته ایده ای برای محاسبه پهنای پالس وجود دارد . مثلا تعداد پالس ها رو در یک ثانیه بشماریم و سپس فرکانس و از آن پهنای پالس رو محاسبه کنیم ولی این ایده در این مورد جواب نمی ده . زیرا یک تغییر سطح بیشتر نداریم . ممنون می شوم اگر در مورد برنامه نویسی آن به زبان سی مرا یاری بفرمایید.

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

    عالمی دیگر بباید ساخت و از نو آدمی
    پردازش تصویر با FPGA از صفر تا انتها
    http://www.eca.ir/forum2/index.php?topic=74299.0

    #2
    پاسخ : اندازه گیری پهنای پالس

    سلام..... شما میتونی وردی پالست رو به اینتراپت میکرو بدی و با توجه به پالست که با کدوم لبه شروع میشه اینتراپت رو به همون لب(مثلا بالا رونده)ه فعال کنی اونوقت هر زمان که پالست اومد تو زیر برنامه وقفه تایمر ت رو روشن میکنی و و اینتراپت رو به لبه پایین رونده فعال میکنی با اینتراپت بعدی تایمر رو خاموش میکنی و مقدارش رو میخونی...

    دیدگاه


      #3
      پاسخ : اندازه گیری پهنای پالس

      ممنون از راهنماییتان
      این کار رو می خواهم با میکرو کنترلر ATtiny15 انجام بدهم ولی کدویژن اون رو ساپورت نمی کنه . منم هم فقط به زبان سی مسلط هستم . چه پیشنهادی برای حل این مشکل دارین ؟
      اگر نشد می خواهم از تایمر 16 بیتی استفاده کنم ولی مثالی در زمینه کد های آن پیدا نمی کنم . قبل از این از تایمر های ساده هشت بیتی استفاده می کردم . مجموعه دستورات آن با تایمر های هشت بیتی ساده فرق دارند؟
      آدمی از عالم خاکی نمی آید بدست

      عالمی دیگر بباید ساخت و از نو آدمی
      پردازش تصویر با FPGA از صفر تا انتها
      http://www.eca.ir/forum2/index.php?topic=74299.0

      دیدگاه


        #4
        پاسخ : اندازه گیری پهنای پالس

        در ابتدا سعی کردم فرمایش شما را با تایمر هشت بیتی امتحان کنم . دستورات زیر را برای شروع نوشتم . از مگا 32 با 16 مگاهرتز استفاده می کنم . تقسیم فرکانسی 1024 رو برای تایمر در نظر گرفتم . برای این گه لبه بالا رونده رو تشخیص بدم طبق فرمایش شما از وقفه استفاده کردم ولی برای تشخیص لبه پایین رونده پالس از دستور شرطی استفاده کردم تا بعد از فراخوانی وقفه ورودی رو برای تغییر سطح چک کنه .با علم به این که پهنای پالس آزمایش شونده 500 میلی ثانیه است ولی جواب صحیح نمی گیرم . ورودی رو هم int0 در نظر گرفتم .
        آدمی از عالم خاکی نمی آید بدست

        عالمی دیگر بباید ساخت و از نو آدمی
        پردازش تصویر با FPGA از صفر تا انتها
        http://www.eca.ir/forum2/index.php?topic=74299.0

        دیدگاه


          #5
          پاسخ : اندازه گیری پهنای پالس

          #include <mega32.h>
          #include <delay.h>
          #include <stdio.h>
          #include <lcd.h>

          #asm
          .equ __lcd_port=0x1B;PORTA
          #endasm

          unsigned char lcd_buffer[25];
          unsigned int i=0;
          void main(void){
          lcd_init(16);
          DDRB=0b11111111;
          PORTB=0;
          TCNT0=0;
          GICR|=0x40;
          MCUCR=0x03;
          TCNT0=0;
          #asm("sei"
          while(1){
          lcd_clear();
          sprintf(lcd_buffer,"i=%d",i);
          lcd_puts(lcd_buffer);
          }
          }

          interrupt [2] void ext_int0(void){
          TCCR0=0b00000101;
          while(PIND.2==0){
          if(TCNT0==255){
          i++;
          }
          }
          }
          آدمی از عالم خاکی نمی آید بدست

          عالمی دیگر بباید ساخت و از نو آدمی
          پردازش تصویر با FPGA از صفر تا انتها
          http://www.eca.ir/forum2/index.php?topic=74299.0

          دیدگاه


            #6
            پاسخ : اندازه گیری پهنای پالس

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

            فرکانس پالس :
            16MHZ/1024=15625

            مدت زمان یک شمارش:
            معکوس فرکانس پالس = 64 میکرو ثانیه

            تعداد پالس برای سر ریز شدن:
            با توجه به این که مقدار اولیه TCNT0 برابر صفر است =256

            مدت زمان شمارش تایمر:
            256 در 64 میکرو ثانیه = 16.384 میلی ثانیه

            با توجه به شمارنده i که تعداد سرریز شدن تایمر در وقفه رو می شمارد در نهایت عرض پالس برابر است با:
            width=i*16.384e-3

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

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

            عالمی دیگر بباید ساخت و از نو آدمی
            پردازش تصویر با FPGA از صفر تا انتها
            http://www.eca.ir/forum2/index.php?topic=74299.0

            دیدگاه


              #7
              پاسخ : اندازه گیری پهنای پالس

              سلاموقفه پایین رونده رو بلافصله بعد از تشخیص لبه بالا رونده به غیر از راهی که من رفتم می شه تشخیص داد ؟ مثلابعد از رخ دادن وقفه در ISR نوشت :
              if(MCUCR==2){
              i=TCNT0;
              }
              آدمی از عالم خاکی نمی آید بدست

              عالمی دیگر بباید ساخت و از نو آدمی
              پردازش تصویر با FPGA از صفر تا انتها
              http://www.eca.ir/forum2/index.php?topic=74299.0

              دیدگاه


                #8
                پاسخ : اندازه گیری پهنای پالس

                سلام......شما اگه با فرکانس 16 کار کنی هر شمارش تایمرت 1/16000000=62.5 نانو ثانیه طول میکشه....حالا اگه با تایمر 16 بیتی کار کنی تعداد شمارش تا سرریز شدن 65536 تاست.....که هینجوری با دقت خوبی میتونی پالس رو اندازه بگیری.....در مورد تشخیص لبه بالارونده یا پایین رونده.....شما نمیدونی پالست با چه لبه ای شروع میشه....؟اگه بدونی که قاعدتا نباید مشکلی باشه .....چون اگه اشروعش رو بدونی پایانش مشخصه و وقتی اینتراپتت رو به لبه مورد نظر فعال میکنی به محض اومدن اینتراپت . حساسیت اینتراپت رو به اونیکی لبه فعال میکنی و نیازی نیست با دستور شرطی لبه رو تشخیص بدی.....

                دیدگاه


                  #9
                  پاسخ : اندازه گیری پهنای پالس

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

                  عالمی دیگر بباید ساخت و از نو آدمی
                  پردازش تصویر با FPGA از صفر تا انتها
                  http://www.eca.ir/forum2/index.php?topic=74299.0

                  دیدگاه


                    #10
                    پاسخ : اندازه گیری پهنای پالس

                    شما از کپچر هم می توانید استفاده کنید.که خیلی راحتر.به سایت اتمل برید application noteکه نامش avr135را دانلود کنید نمونه بسیار خوبی.

                    دیدگاه


                      #11
                      پاسخ : اندازه گیری پهنای پالس

                      ممنونم راهنمایی ارزنده ای بود .
                      به محض این که متوجه ایرادم شدم آموزشی در همین تایپیک برای دیگر دوستان فراهم می کنم .

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

                      عالمی دیگر بباید ساخت و از نو آدمی
                      پردازش تصویر با FPGA از صفر تا انتها
                      http://www.eca.ir/forum2/index.php?topic=74299.0

                      دیدگاه


                        #12
                        پاسخ : اندازه گیری پهنای پالس

                        سلام
                        همان طوری که قول داده بودم به محض یافتن جواب آموزشی برای استفاده دیگر دوستان قرار می دهم .
                        در زیر برنامه و شماتیک مداری است که با آن می توانید Duty Cycle پالس ورودی رو اندازه گیری کنید .
                        البته یه ایراد کوچیک داره که ممنون می شوم اگر کسی بتونه برطرفش کنه . بعد از یک و نیم ثانیه جواب دقیق تا دو رقم اعشار نمایش داده می شود . این تاخیر ممکنه برای بعضی ناخوشایند باشه . در طول این تاخیر مقادیر تایمر از دو رخ داد جمع می شود سپس در فرمول محاسبه D.C قرار داده می شود . اگر بخواهید فقط پهنای یکی پالس رو اندازه بگیرید از مقدار متغیر t1 به تنهایی استفاده کنید .
                        آدمی از عالم خاکی نمی آید بدست

                        عالمی دیگر بباید ساخت و از نو آدمی
                        پردازش تصویر با FPGA از صفر تا انتها
                        http://www.eca.ir/forum2/index.php?topic=74299.0

                        دیدگاه


                          #13
                          پاسخ : اندازه گیری پهنای پالس

                          در این برنامه از تایمر یک 8MHZ میکرو mega 16 با کریستال خارجی 8MHZ و وقفه صفر استفاده شده است .

                          #include <mega16.h>
                          #include <stdio.h>
                          #include <delay.h>
                          #include <stdlib.h>
                          #include <lcd.h>
                          #asm
                          .equ __lcd_port=0x15 ;PORTC
                          #endasm

                          float t1,t2;
                          bit edge=0;

                          void main(void)
                          {
                          float dc;
                          char strt[16],str[8];

                          TCCR0=0x00;
                          TCNT0=0x00;
                          OCR0=0x00;

                          TCCR1A=0x00;
                          TCCR1B=0x01;
                          TCNT1H=0x00;
                          TCNT1L=0x00;
                          ICR1H=0x00;
                          ICR1L=0x00;
                          OCR1AH=0x00;
                          OCR1AL=0x00;
                          OCR1BH=0x00;
                          OCR1BL=0x00;

                          ASSR=0x00;
                          TCCR2=0x00;
                          TCNT2=0x00;
                          OCR2=0x00;

                          GICR|=0x40;
                          MCUCR=0x02;
                          MCUCSR=0x00;
                          GIFR=0x40;

                          TIMSK=0x00;
                          ACSR=0x80;
                          SFIOR=0x00;

                          lcd_init(16);

                          #asm("sei&quot

                          while(1){
                          dc=t1/(t1+t2);
                          lcd_clear();
                          ftoa(dc,2,str);
                          sprintf(strt,"D.C=%s",str);
                          lcd_puts(strt);
                          };
                          }
                          interrupt [EXT_INT0] void ext_int0_isr(void)
                          {
                          if(edge){
                          t2=TCNT1;
                          TCNT1=0;
                          MCUCR=0x02;
                          edge=0;
                          }
                          else{
                          t1=TCNT1;
                          TCNT1=0;
                          MCUCR=0x03;
                          edge=1;
                          }
                          }
                          آدمی از عالم خاکی نمی آید بدست

                          عالمی دیگر بباید ساخت و از نو آدمی
                          پردازش تصویر با FPGA از صفر تا انتها
                          http://www.eca.ir/forum2/index.php?topic=74299.0

                          دیدگاه


                            #14
                            پاسخ : اندازه گیری پهنای پالس

                            این هم شماتیک مدار در پروتئوس 7.1 :

                            http://iranupload.net/file.php?file=b270f249b4228a791ac6794ac7e08a3e

                            اگر کسی مشکلی داشت خوشحال می شوم کمکی کنم .

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

                            عالمی دیگر بباید ساخت و از نو آدمی
                            پردازش تصویر با FPGA از صفر تا انتها
                            http://www.eca.ir/forum2/index.php?topic=74299.0

                            دیدگاه


                              #15
                              پاسخ : اندازه گیری پهنای پالس

                              سلام
                              اگر این مدار و برنامه رو برای اندازه گیری Duty Cycle اتسفاده کنید تا دو رقم اعشار هیچ خطایی نخواهین داشت . ولی اگر برای اندازه گیری پهنای پالس مورد استفاده قرار بدهید به اندازه هفت میلی ثانیه خطا خواهیم داشت . یعنی برای مثلا پهنای 0.5 ثانیه باید مقدار t1 که منتاظر با TCNT1 است 62500 باشد ولی 61577 است . نمی دونم راهی هست تا دقت را بیشتر کنیم یا نه . به نظر شما می شه دقت رو افزایش داد ؟
                              آدمی از عالم خاکی نمی آید بدست

                              عالمی دیگر بباید ساخت و از نو آدمی
                              پردازش تصویر با FPGA از صفر تا انتها
                              http://www.eca.ir/forum2/index.php?topic=74299.0

                              دیدگاه

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