اطلاعیه

Collapse
No announcement yet.

اندازه گیری اختلاف فاز توسط AVR

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

    اندازه گیری اختلاف فاز توسط AVR

    با سلام و خسته نباشید
    دوستان من میخواستم بدونم در مورد اندازه گیری اختلاف فاز 2 شکل موج سینوسی با استفاده از میکرو کنترلر AVR کسی از دوستان میتونه من رو راهنمائی کنه
    یعنی با استفاده از میکرو بتونم اختلاف فاز 2 سیگنال سینوسی رو اندازه گیری کنم
    ممنون

    #2
    پاسخ : اندازه گیری اختلاف فاز توسط AVR

    اگر شکل موج های سینوسی شما دارای مقدار dc نباشد و از نظر دامنه هم دارای مقدار مناسبی باشد، می توانید برای هر یک از مدارات آشکار ساز عبور از صفر یا Zero crossing detector استفاده کنید و با فرمان یکی از آنها یک تایمر شروع به شمارش کند و دومی تایمر را متوقف کند و با اطلاع از این اختلاف زمانی و فرکانس موج سینوسی، اختلاف فاز قابل محاسبه است. اختلاف فاز بر حسب رادیان برابر زمان اندازه گیری شده ضرب در فرکانس ضرب در 2pi خواهد بود.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : اندازه گیری اختلاف فاز توسط AVR

      با سلام
      من این برنامه رو که البته فقط مربوط به کسینوس فی متر یک کنتر تکفاز می شه رو برای
      ساخت یک کنتر سه فاز نوشته ام :
      /************************************************** ***
      This program was produced by the
      CodeWizardAVR V2.05.0 Professional
      Automatic Program Generator
      © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com

      Project :
      Version :
      Date : 2011/05/05
      Author :
      Company :
      Comments:


      Chip type : ATmega16
      Program type : Application
      AVR Core Clock frequency: 8.000000 MHz
      Memory model : Small
      External RAM size : 0
      Data Stack size : 256
      ************************************************** ***/

      #include <mega16.h>
      #include <stdio.h>
      #include <math.h>
      #include <stdlib.h>
      // Alphanumeric LCD Module functions
      #include <alcd.h>

      // External Interrupt 0 service routine
      interrupt [EXT_INT0] void ext_int0_isr(void)
      {
      // Place your code here
      TCNT1=45536;
      TCCR1B=0x02;
      }
      unsigned int tcount1;
      float rad,pf;
      char str[10],str1[10];
      // External Interrupt 1 service routine
      interrupt [EXT_INT1] void ext_int1_isr(void)
      {
      // Place your code here
      tcount1=TCNT1;
      TCCR1B=0x00;
      tcount1=tcount1-45536;
      rad=tcount1;
      rad=(rad/20000)*6.28;
      pf=cos(rad);
      }

      // Declare your global variables here

      void main(void)
      {
      // Declare your local variables here

      // Input/Output Ports initialization
      // Port A 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
      PORTA=0x00;
      DDRA=0x00;

      // Port B 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
      PORTB=0x00;
      DDRB=0x00;

      // Port C 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
      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
      // Mode: Normal top=0xFF
      // OC0 output: Disconnected
      TCCR0=0x00;
      TCNT0=0x00;
      OCR0=0x00;

      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: 1000.000 kHz
      // Mode: Normal top=0xFFFF
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer1 Overflow Interrupt: Off
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x02;
      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: On
      // INT1 Mode: Rising Edge
      // INT2: Off
      GICR|=0xC0;
      MCUCR=0x0F;
      MCUCSR=0x00;
      GIFR=0xC0;

      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x00;

      // 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 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 4
      // D5 - PORTC Bit 5
      // D6 - PORTC Bit 6
      // D7 - PORTC Bit 7
      // Characters/line: 16
      lcd_init(16);
      lcd_clear();
      // Global enable interrupts
      #asm("sei&quot

      while (1)
      {
      // Place your code here
      lcd_gotoxy(0,0);
      ftoa(pf,6,str1);
      sprintf(str,"pf=%s",str1);
      lcd_puts(str);
      }
      }
      موفق باشید

      دیدگاه


        #4
        پاسخ : اندازه گیری اختلاف فاز توسط AVR

        نوشته اصلی توسط mojtaba_led
        با سلام
        من این برنامه رو که البته فقط مربوط به کسینوس فی متر یک کنتر تکفاز می شه رو برای
        ساخت یک کنتر سه فاز نوشته ام :
        /************************************************** ***
        This program was produced by the
        CodeWizardAVR V2.05.0 Professional
        Automatic Program Generator
        © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
        http://www.hpinfotech.com

        Project :
        Version :
        Date : 2011/05/05
        Author :
        Company :
        Comments:


        Chip type : ATmega16
        Program type : Application
        AVR Core Clock frequency: 8.000000 MHz
        Memory model : Small
        External RAM size : 0
        Data Stack size : 256
        ************************************************** ***/

        #include <mega16.h>
        #include <stdio.h>
        #include <math.h>
        #include <stdlib.h>
        // Alphanumeric LCD Module functions
        #include <alcd.h>

        // External Interrupt 0 service routine
        interrupt [EXT_INT0] void ext_int0_isr(void)
        {
        // Place your code here
        TCNT1=45536;
        TCCR1B=0x02;
        }
        unsigned int tcount1;
        float rad,pf;
        char str[10],str1[10];
        // External Interrupt 1 service routine
        interrupt [EXT_INT1] void ext_int1_isr(void)
        {
        // Place your code here
        tcount1=TCNT1;
        TCCR1B=0x00;
        tcount1=tcount1-45536;
        rad=tcount1;
        rad=(rad/20000)*6.28;
        pf=cos(rad);
        }

        // Declare your global variables here

        void main(void)
        {
        // Declare your local variables here

        // Input/Output Ports initialization
        // Port A 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
        PORTA=0x00;
        DDRA=0x00;

        // Port B 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
        PORTB=0x00;
        DDRB=0x00;

        // Port C 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
        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
        // Mode: Normal top=0xFF
        // OC0 output: Disconnected
        TCCR0=0x00;
        TCNT0=0x00;
        OCR0=0x00;

        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: 1000.000 kHz
        // Mode: Normal top=0xFFFF
        // OC1A output: Discon.
        // OC1B output: Discon.
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        // Timer1 Overflow Interrupt: Off
        // Input Capture Interrupt: Off
        // Compare A Match Interrupt: Off
        // Compare B Match Interrupt: Off
        TCCR1A=0x00;
        TCCR1B=0x02;
        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: On
        // INT1 Mode: Rising Edge
        // INT2: Off
        GICR|=0xC0;
        MCUCR=0x0F;
        MCUCSR=0x00;
        GIFR=0xC0;

        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x00;

        // 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 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 4
        // D5 - PORTC Bit 5
        // D6 - PORTC Bit 6
        // D7 - PORTC Bit 7
        // Characters/line: 16
        lcd_init(16);
        lcd_clear();
        // Global enable interrupts
        #asm("sei&quot

        while (1)
        {
        // Place your code here
        lcd_gotoxy(0,0);
        ftoa(pf,6,str1);
        sprintf(str,"kwh=%s",str1);
        lcd_puts(str);
        }
        }
        موفق باشید
        ممنون دوست عزیز
        میشه در مورد این جمله توضیحی بهم بدید که نوشتید که دقیقا یعنی چی
        این برنامه رو که البته فقط مربوط به کسینوس فی متر یک کنتر تکفاز می شه رو برای
        ساخت یک کنتر سه فاز
        و اینکه این رو شبیه سازی شده تو پرتیوس هم دارید نقشه رو که بتونم تست کنم و نتیجه رو ببینم
        ممنون میشم راهنمایی کنید باز هم

        دیدگاه


          #5
          پاسخ : اندازه گیری اختلاف فاز توسط AVR

          سلام
          راستش آلان که خودمم خوندم نفهمیدم چی گفتم -حق داری -

          در کل چیز مهمی نبود بیخیال
          اینم برنامه پروتئوس
          https://rapidshare.com/#!index|deletefiles|489329965165636287|461345832|C OS_PHI.rar

          دیدگاه


            #6
            پاسخ : اندازه گیری اختلاف فاز توسط AVR

            نوشته اصلی توسط mojtaba_led
            سلام
            راستش آلان که خودمم خوندم نفهمیدم چی گفتم -حق داری -

            در کل چیز مهمی نبود بیخیال
            اینم برنامه پروتئوس
            https://rapidshare.com/#!index|deletefiles|489329965165636287|461345832|C OS_PHI.rar
            ممنون داداش
            اما این لینک مربوط به حذف فایل هست و نتونستم دانلودش کنم
            باز که میکنم میگه میخوای حذف بشه فایل
            ممنون میشم دوباره لینک بدی
            شاد باشی

            دیدگاه


              #7
              پاسخ : اندازه گیری اختلاف فاز توسط AVR

              آقا من واقعا معذزت میخوام مثل اینکه پاک قاطی کردم
              بفرمایید این هم لینک اصلی رو وبلاگ خودم ، ایندفعه دیگه خودم امتحانش کردم
              http://engrostami.persiangig.com/COS PHI.rar/download
              موفق باشید

              دیدگاه


                #8
                پاسخ : اندازه گیری اختلاف فاز توسط AVR

                نوشته اصلی توسط mojtaba_led
                آقا من واقعا معذزت میخوام مثل اینکه پاک قاطی کردم
                بفرمایید این هم لینک اصلی رو وبلاگ خودم ، ایندفعه دیگه خودم امتحانش کردم
                http://engrostami.persiangig.com/COS PHI.rar/download
                موفق باشید
                ممنون لطف کردی
                خوب حالا یه توضیح هم واسم میدی در مورد نحوه کار و ....
                ممنون میشم

                دیدگاه


                  #9
                  پاسخ : اندازه گیری اختلاف فاز توسط AVR

                  سلام .
                  اگه شما دوتا شکل موج رو به شکل موج مربعی تبدیل کنید ( توسط اشمیت تریگر با اپ امپ ) و سپس اونا رو به یک عدد گیت xor که نقش یک Phase Detector رو بازی میکنه بدی و بعد خروجی xor رو به یک فیلتر RC ساده بدی و ولتاژ خروجی فیلتر رو به ADC میکرو بدی دقیقا همون چیزی هست که میخوای .این اساس کار مدارات PLL هست و ساده ترین کاره .
                  اما اگه بخوای مستقیم شکل موج ها رو به میکرو بدی و اختلاف رو اندازه بگیری ، یه خورده برنامه نویسیش سخته .
                  [glow=blue,2,300]آنقدر به تاریکی لعنت نفرستید ، یک شمع روشن کنید. [/glow]

                  دیدگاه


                    #10
                    پاسخ : اندازه گیری اختلاف فاز توسط AVR

                    نوشته اصلی توسط dadash_ari
                    خوب حالا یه توضیح هم واسم میدی در مورد نحوه کار و ....
                    راستش توضیح رو آقای طراح به صورت کامل دادن من دقیقا همین کار رو کردم
                    نوشته اصلی توسط dadash_ari
                    اگر شکل موج های سینوسی شما دارای مقدار dc نباشد و از نظر دامنه هم دارای مقدار مناسبی باشد، می توانید برای هر یک از مدارات آشکار ساز عبور از صفر یا Zero crossing detector استفاده کنید و با فرمان یکی از آنها یک تایمر شروع به شمارش کند و دومی تایمر را متوقف کند و با اطلاع از این اختلاف زمانی و فرکانس موج سینوسی، اختلاف فاز قابل محاسبه است. اختلاف فاز بر حسب رادیان برابر زمان اندازه گیری شده ضرب در فرکانس ضرب در 2pi خواهد بود

                    دیدگاه


                      #11
                      پاسخ : اندازه گیری اختلاف فاز توسط AVR

                      ممنون ازتون دوستان
                      فقط من متوجه نشدم چیز زیادی از توضیحاتتون

                      به طورت گزارشی و مفصل اگه بدونم نحوه کار و عملکرد رو طوریکه اگه بخوام مقادیر رو تغییر بدم بدونم باید چه کاری کنم
                      گزارش کاری
                      این شکلی اگه برام توضیح بدین ممنون میشم
                      چون الان یه مداری دارم که نمیدونم چی به چی هست
                      ممنون میشم

                      دیدگاه


                        #12
                        پاسخ : اندازه گیری اختلاف فاز توسط AVR

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

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

                        خوب کار این مدار گذر از صفر همونطور که از اسمش پیداست به محض اینکه سیگنال ورودی از مقدار صفر گذر کرد
                        خروجی اش متناسب با اینکه کدام یک از پایه های اوپ امپ از اون یکی بزرگتر می شه ، برابر با مقدار Vcc یا Vcc- خواهد شد ؛ بنابراین خروجی این مدارت یک سیگنال مربعی با همان فرکانس ودامنه متناسب با ولتاژ تغذیه خواهد بود .
                        البته یکی از دوستان در یکی از تایپک ها رو این کار می کرد که با استفاده از قابلیت << مقایسه کننده آنالوگ >>
                        میکرو و بدون نیاز به این مدار آشکارساز عبور از صفر به سیگنال مربعی برسه ( اگه یه چرخ تو انجمن بزنی حتما پیداش میکنی این جوری هزینه هات میاد پایین )
                        خوب پس از بدست آوردن سگینال مربعی ما می تونیم سیگنال مون رو بدیم به میکرو و نکته اصلی اینکه
                        فاصله بین شروع دو سیگنال رو بدست بیاریم
                        برای این منظور ما باید زمان شروع دو موج رو سنس کنیم برای این کار میایم از اینتراپت های
                        خارجی میکرو استفاده می کنیم : int0 , int1

                        حالا میگیم برای اینکه لحظه شروع دو موج رو سنس کنیم میاییم اینتراپت ها رو ، هر دوشون را یا حساس
                        به لبه ی بالا رونده یا پایین رونده ( اینجا من حساس به لبه بالا رونده تنظیم کردم ) تنظیم میکنیم و به این ترتیب با اعمال سیگنال ها به این پایه های
                        میکرو ( من ولتاژ رو به int0 , جریان رو به int1 دادم )
                        ما دو وقفه در لبه بالا رونده دو سیگنال خواهیم داشت
                        حالا ما دو تا وقفه داریم ، توی وقفه صفر باید تایمر رو روشن کنیم ؛ حالا درمورد اینکه چه تایمری رو روشن کنیم
                        باید به فرکانس تایمر نگاه کنیم خوب من توی اینجا prescal رو برابر 8 و Fosc رو برابر 8MHZ گرفتم پس فرکانس تایمر برابر می شه با 1 مگا هرتز
                        حالا میگیم که یک پریود ما برابر با 20میلی ثانیه پس باید تایمر مقدراش به 20000 برسه
                        پس من با توجه به مقادیری که در نظر گرفتم و توضیحاتی که دادم تایمر 1 رو انتخاب کردم
                        خوب به این ترتیب با اجرای وقفه صفر ما به تایمر 1 میگیم که روشن بشه
                        ( اگه دقت کنی من توی برنامه توی این وقفه مقدار تایمر رو برابر45536 قرار دادم شما میتونی این رو برابر صفر کنی اما اگر این کار رو کردی
                        باید این خط رو در وقفه 1 پاک کنی : tcount1=tcount1-45536
                        سپس با آمدن سیگنال جریان وقفه 1 اجرا میشه و حالا به تایمر میگیم بایسته و طبق رابطه زیر ابتدا مقدار
                        زاویه رو بر حسب رادیان بدست میاریم چون آرگومان توابع مثلثاتی در زبان C باید برحسب رادیان باشد
                        سپس مقدار ضریب قدرت رو محاسبه می کنیم :
                        rad=tcount1;
                        rad=(rad/20000)*6.28;
                        pf=cos(rad);
                        به این ترتیب کسینوسفی متر ما آماده سرو میشه
                        نوش جان










                        دیدگاه


                          #13
                          پاسخ : اندازه گیری اختلاف فاز توسط AVR

                          نوشته اصلی توسط mojtaba_led
                          با سلام بله حتما :

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

                          خوب کار این مدار گذر از صفر همونطور که از اسمش پیداست به محض اینکه سیگنال ورودی از مقدار صفر گذر کرد
                          خروجی اش متناسب با اینکه کدام یک از پایه های اوپ امپ از اون یکی بزرگتر می شه ، برابر با مقدار Vcc یا Vcc- خواهد شد ؛ بنابراین خروجی این مدارت یک سیگنال مربعی با همان فرکانس ودامنه متناسب با ولتاژ تغذیه خواهد بود .
                          البته یکی از دوستان در یکی از تایپک ها رو این کار می کرد که با استفاده از قابلیت << مقایسه کننده آنالوگ >>
                          میکرو و بدون نیاز به این مدار آشکارساز عبور از صفر به سیگنال مربعی برسه ( اگه یه چرخ تو انجمن بزنی حتما پیداش میکنی این جوری هزینه هات میاد پایین )
                          خوب پس از بدست آوردن سگینال مربعی ما می تونیم سیگنال مون رو بدیم به میکرو و نکته اصلی اینکه
                          فاصله بین شروع دو سیگنال رو بدست بیاریم
                          برای این منظور ما باید زمان شروع دو موج رو سنس کنیم برای این کار میایم از اینتراپت های
                          خارجی میکرو استفاده می کنیم : int0 , int1

                          حالا میگیم برای اینکه لحظه شروع دو موج رو سنس کنیم میاییم اینتراپت ها رو ، هر دوشون را یا حساس
                          به لبه ی بالا رونده یا پایین رونده ( اینجا من حساس به لبه بالا رونده تنظیم کردم ) تنظیم میکنیم و به این ترتیب با اعمال سیگنال ها به این پایه های
                          میکرو ( من ولتاژ رو به int0 , جریان رو به int1 دادم )
                          ما دو وقفه در لبه بالا رونده دو سیگنال خواهیم داشت
                          حالا ما دو تا وقفه داریم ، توی وقفه صفر باید تایمر رو روشن کنیم ؛ حالا درمورد اینکه چه تایمری رو روشن کنیم
                          باید به فرکانس تایمر نگاه کنیم خوب من توی اینجا prescal رو برابر 8 و Fosc رو برابر 8MHZ گرفتم پس فرکانس تایمر برابر می شه با 1 مگا هرتز
                          حالا میگیم که یک پریود ما برابر با 20میلی ثانیه پس باید تایمر مقدراش به 20000 برسه
                          پس من با توجه به مقادیری که در نظر گرفتم و توضیحاتی که دادم تایمر 1 رو انتخاب کردم
                          خوب به این ترتیب با اجرای وقفه صفر ما به تایمر 1 میگیم که روشن بشه
                          ( اگه دقت کنی من توی برنامه توی این وقفه مقدار تایمر رو برابر45536 قرار دادم شما میتونی این رو برابر صفر کنی اما اگر این کار رو کردی
                          باید این خط رو در وقفه 1 پاک کنی : tcount1=tcount1-45536
                          سپس با آمدن سیگنال جریان وقفه 1 اجرا میشه و حالا به تایمر میگیم بایسته و طبق رابطه زیر ابتدا مقدار
                          زاویه رو بر حسب رادیان بدست میاریم چون آرگومان توابع مثلثاتی در زبان C باید برحسب رادیان باشد
                          سپس مقدار ضریب قدرت رو محاسبه می کنیم :
                          rad=tcount1;
                          rad=(rad/20000)*6.28;
                          pf=cos(rad);
                          به این ترتیب کسینوسفی متر ما آماده سرو میشه
                          نوش جان
                          ممنون آقا مجتبی گل گلاب
                          لطف کردی بسیار عالی بود
                          ممنونم داداش
                          میخواستم برای استاد توضیح بدم هیچی نمیدونستم اما خوب الان میدونم چی به چی هست خیلی لطف کردی
                          چیز دیگه ای به نظرت میرسه که اگه استاد پرسید ازم گیر نکنم و بتونم جواب بدم ؟
                          اگه چیزی هست بگی بهم ممنون میشم و نکته بعدی اینکه این برنامه رو با بسکام ( زبان بیسیک ) هم میشه نوشت و چیزی هست بتونم تبدیلش کنم به بیسیک
                          چون که ازمون بیسیک خواسته و خوب من اصلا زبان سی هم کار نکردم
                          یا اینکه خودت داشته باشی
                          بازم ممنون از پاسخگویی و لطف خوبت
                          شاد و سلامت باشی

                          دیدگاه


                            #14
                            پاسخ : اندازه گیری اختلاف فاز توسط AVR

                            سلام
                            بفرمایید این هم به زبان بیسیک:
                            کد:
                            $regfile = "m16def.dat"
                            $crystal = 8000000
                            '------------------------------------
                            Config Lcd = 16 * 1
                            Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7_
                              , E = Portc.2 , Rs = Portc.0
                            '-----------------------------------------
                            Config Timer1 = Timer , Prescale = 8
                            Stop Timer1
                            '---------------------------------------
                            Config Int0 = Rising
                            Enable Int0
                            On Int0 Ilable0
                            '----------------------
                            Config Int1 = Rising
                            Enable Int1
                            On Int1 Ilable1
                            '-------------------------------------
                            Enable Interrupts
                            '----------------------------------------------------------
                            Dim Tcount1 As Word
                            Dim Rad As Single , Pf As Single , Pf2 As String * 16
                            '--------------------------------------------------------------------
                            Tcnt1l = 0
                            Tcnt1h = 0
                            Spl = 0
                            Sph = 2
                            '------------------------------
                            Cls
                            Cursor Off
                            '---------------------------
                            Do
                            Locate 1 , 1
                            Pf2 = Fusing(pf , "#.####")
                            Lcd "pf=" ; Pf2
                            Loop
                            End                             'end program
                            '----------------------------------------------------------------------
                            Ilable0:
                            Timer1 = 45536
                            Start Timer1
                            Return
                            '-----------------
                            Ilable1:
                            Stop Timer1
                            Tcount1 = Timer1
                            Tcount1 = Tcount1 - 45536
                            Rad = Tcount1
                            Rad = Rad / 20000 : Rad = Rad * 6.28
                            Pf = Cos(rad)
                            Return
                            موفق باشید

                            دیدگاه


                              #15
                              پاسخ : اندازه گیری اختلاف فاز توسط AVR

                              سلام اقا مجتبی برای اندازه گیری اختلاف فاز 3فاز کمکم میکنین ممنون
                              bamesefid.ir

                              دیدگاه

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