اطلاعیه

Collapse
No announcement yet.

پروژه کامل فرکانس متر دقیق با AVR

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

    پروژه کامل فرکانس متر دقیق با AVR

    سلام به همه دوستان
    این یه فرکانس متره که از 4 میلی هرتز تا 500 کیلو هرتز را دقیق دقیق اندازه میگیره که در عمل پاسخ میده ولی تو پروتئوس درست نیست و من فایل پروتئوس را فقط واسه این میزارم که که سیم کشی ها معلوم باشه ورودی این مدار پایه capture تایمر 1 هست(PIND.6) و من واسه تست از خروجی تایمر صفر به ورودی این تایمر وصل مردم و فکر میکنم این مدار تا 2 مگا هرتز جواب بده با دقت فوق العاده بالا
    اینم فایلها
    http://www.4shared.com/file/108614239/c55f98c7/_3__1.html
    http://www.4shared.com/file/108614339/c49df2f0/_2__1.html
    دوستان بزگوار فقط لطف کنید نظرتون را در مورد برنامه بدید ودر صورتیکه اشکالی دیدید بیان کنید با تشکر
    فرزندم در راه است

    #2
    پاسخ : پروژه کامل فرکانس متر دقیق با AVR

    با سلام
    من همین برنامه رو خواستم بنویسم ولی دقت و صحت مطلوب را نداره بخصوص با افزایش فرکانس، اگر می شود دوباره فایلهای خود را پلود کنید. ممنون

    من با Avr studio 6 نوشتم و با MEGA32 DIP and 8MHZ Xtal تست کردم که نه توی عمل نه شبیه سازی جواب مناسبی نداد .
    راستی کسی میدونه تو AVR Studio چطور میشه عدد اعشاری رو چاپ کرد چون با %f علامت ؟ چاپ میکنه تو خروجی
    بازم ممنون

    کد:
    /*
     * Capture.c
     *
     * Created: 2012/09/20 01:15:00 ق.ظ
     * Author: Farshchian
     */ 
    #include <stdio.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #define F_CPU 8000000
    #define UART_BAUD_RATE 9600
    
    uint16_t period;
    
    static int uart_putchar(char c, FILE *stream)
    {
    	if (c == '\n') uart_putchar('\r', stream);
    	
    	loop_until_bit_is_set(UCSRA, UDRE);
    	UDR = c;
    	
    	return 0;
    }
    int init_uart()
    {
    	float UART_BAUD_REGISTERS = (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1);
    	static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
    	
    	stdout = & mystdout;
    	
    	UCSRB |= (1 << RXEN) | (1 << TXEN);
    	UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
    	UBRRL = UART_BAUD_REGISTERS;
    }
    
    ISR(TIMER1_CAPT_vect){ // handler for Timer1 input capture interrupt
    	period = ICR1; // period = value of Timer 1 stored in ICR1
    	TCNT1 = 0; // reset Timer 1
    }
    	
    
    
    void main(void) {
    	
    	init_uart();
    	DDRB = 0xFF; // set port B for output
    	DDRA = 0xFF; // set port A for output
    	TCCR1A = 0b00000000; // normal mode
    	TCCR1B = 0b11000001; // no prescaler, rising edge, noise canceller
    	TIMSK = 0b00100000; // enable Timer 1 input capture interrupt
    	sei(); // enable interrupt subsystem globally
    	
    while (1){
    	printf("freq=%u\n",8000000/period);
    	} // infinite loop
      
    }
    «اگر واقعيات با نظريات هماهنگي ندارند، واقعيتآ‌ها را تغيير بده.»
    آلبرت انشتين

    دیدگاه


      #3
      پاسخ : پروژه کامل فرکانس متر دقیق با AVR

      با سلام
      برنامه فرکانس متر دقیق با AVR studio و بیسیک را با شبیه سازی اینجا می گذارم لطفاً اساتید بررسی کنند تا ایراد آنرا پیدا کنیم.مشکل این هست که توی فرکانسهای بالا دقت و صحت خودشو از دست میده.
      با تشکر

      یکسری pdf مفید برای کار با تایمر

      http://www.4shared.com/rar/27oucWuI/Counter_PDF.html

      برنامه و شبیه ساز پرتئوس نوشته شده با بسکام

      http://www.4shared.com/rar/sLByX5f-/Avr_Studio_Capture01.html

      برنامه و شبیه ساز پرتئوس نوشته شده با زبان سی در AVR STUDIO 6

      http://www.4shared.com/rar/ACae1Xa_/Bascom_Capture.html
      «اگر واقعيات با نظريات هماهنگي ندارند، واقعيتآ‌ها را تغيير بده.»
      آلبرت انشتين

      دیدگاه


        #4
        پاسخ : پروژه کامل فرکانس متر دقیق با AVR

        فعال کردن Noise canceller موجب محدودیت بیشتر در فرکانس می شود. ضمنا منظور شما از "فرکانس بالا" تقریبا چه محدوده ای است؟
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #5
          پاسخ : پروژه کامل فرکانس متر دقیق با AVR

          سلام استاد
          ممنون که جواب دادید. من اینو برای بازه بین 10 کیلو تا 400 کیلو می خواهم بدون فعالسازی قسمت نویز کنسل هم تغییری محسوسی حاصل نشد. بالای 6 کیلو هرتز دقت و صحت شروع به کم شدن می کند مثلاً 6 کیلوهرتز را 7 کیلو هرتز و خورده ای نشان می دهد و اعداد پایدار نیست و در حد 100هرتز و حتی بیشتر هم تغییرات پیش می آید ولی در حد 2-3 کیلو هرتز اعداد فوق العاده صحیح و دقیق هستند و تغییرا از order یک هرتز است،جالب اینکه شبیه سازیش با و اقعیت تقریباً یکجور عمل می کنند. بالای 50 کیلو هرتز هم که بشدت دچار مشکل میشه و عملاً بدرد نمی خورد. تمام این موارد را با هر سه برنامه ای که نوشتم که یکیش با c و دوتاش با بیسیک هست، هم با فعال بودن واحد نویز کنسل هم بدون آن روی یک مگا 32 دیپ تست کردم. ودرعین حال پاسخ فوق العاده با شبیه سازی پرتئوس همخوانی دارد ولی متاسفانه اصلاً راضی کننده نیست.
          با AVR STUDIO که شبیه سازی می کنم با فرکانس 1 مگا هرتز زمان صرف شده در وقفه برای دستور اول period = ICR1 شش میکرو ثانیه است و برای دستور دوم TCNT1 = 0 برابر 2 میکو ثانیه است که با کریستال 8 مگاهرتز من در عمل باید یک میکرو ثانیه زمان ببرد و به طور تئوری باید بتوان بدون فعالسازی واحد نویز کنسل و بدون پری اسکیل برای تایمر باید بتوان زمان تناوب یک میکرو ثانیه را اندازه گیری کرد یعنی با کریستال موجود و با فرض خطای مثلاً یک ppm برای کریستال باید بتوان تا 8 مگاهرتز را بادقت 1 iهرتز اندازه گرفت ولی متاسفانه اینچنین نیست.
          استاد اگر میشود برای فهم من و سایر دوستانی که بعداً از این مطلب استفاده خواهند کرد در صورت امکان توضیح روشنی ارائه فرمایید نمی دانم استدلال من درست بود یا نه ولی در کل در عمل که جواب رضایت بخش نیست.
          ممنون از توجه شما
          «اگر واقعيات با نظريات هماهنگي ندارند، واقعيتآ‌ها را تغيير بده.»
          آلبرت انشتين

          دیدگاه


            #6
            پاسخ : پروژه کامل فرکانس متر دقیق با AVR

            مطابق توضیحات شما، مشکل بوجود آمده به دلیل طولانی بودن کدهای ایجاد شده توسط کامپایلر است که در مرحله اول می توانید از حداکثر optimization برای سرعت در کامپایلر استفاده کنید. اما روش اساسی برای رسیدن به حداکثر قدرت پردازشی و رسیدن به اندازه گیری دقیق در فرکانس های بالاتر، استفاده از برنامه نویسی اسمبلی است.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #7
              پاسخ : پروژه کامل فرکانس متر دقیق با AVR

              نوشته اصلی توسط farshchian
              سلام استاد
              ممنون که جواب دادید. من اینو برای بازه بین 10 کیلو تا 400 کیلو می خواهم بدون فعالسازی قسمت نویز کنسل هم تغییری محسوسی حاصل نشد. بالای 6 کیلو هرتز دقت و صحت شروع به کم شدن می کند مثلاً 6 کیلوهرتز را 7 کیلو هرتز و خورده ای نشان می دهد و اعداد پایدار نیست و در حد 100هرتز و حتی بیشتر هم تغییرات پیش می آید ولی در حد 2-3 کیلو هرتز اعداد فوق العاده صحیح و دقیق هستند و تغییرا از order یک هرتز است،جالب اینکه شبیه سازیش با و اقعیت تقریباً یکجور عمل می کنند. بالای 50 کیلو هرتز هم که بشدت دچار مشکل میشه و عملاً بدرد نمی خورد. تمام این موارد را با هر سه برنامه ای که نوشتم که یکیش با c و دوتاش با بیسیک هست، هم با فعال بودن واحد نویز کنسل هم بدون آن روی یک مگا 32 دیپ تست کردم. ودرعین حال پاسخ فوق العاده با شبیه سازی پرتئوس همخوانی دارد ولی متاسفانه اصلاً راضی کننده نیست.
              با AVR STUDIO که شبیه سازی می کنم با فرکانس 1 مگا هرتز زمان صرف شده در وقفه برای دستور اول period = ICR1 شش میکرو ثانیه است و برای دستور دوم TCNT1 = 0 برابر 2 میکو ثانیه است که با کریستال 8 مگاهرتز من در عمل باید یک میکرو ثانیه زمان ببرد و به طور تئوری باید بتوان بدون فعالسازی واحد نویز کنسل و بدون پری اسکیل برای تایمر باید بتوان زمان تناوب یک میکرو ثانیه را اندازه گیری کرد یعنی با کریستال موجود و با فرض خطای مثلاً یک ppm برای کریستال باید بتوان تا 8 مگاهرتز را بادقت 1 iهرتز اندازه گرفت ولی متاسفانه اینچنین نیست.
              استاد اگر میشود برای فهم من و سایر دوستانی که بعداً از این مطلب استفاده خواهند کرد در صورت امکان توضیح روشنی ارائه فرمایید نمی دانم استدلال من درست بود یا نه ولی در کل در عمل که جواب رضایت بخش نیست.
              ممنون از توجه شما
              برای ساخت یک فرکانس متر دقیق دیجیتال نیاز به سیستم اندازه گیری با فرکانس کار بالا داریم. با میکروکنترلر های 8 بیتی مثل AVR سری mega چنانچه فرکانس ورودی از چند ده کیلوهرتز بالاتر بره خطای اندازه گیری هم افزایش محسوسی پیدا میکنه. برای افزایش دقت همونطور که جناب کی نژاد فرمودند یک راه عملی استفاده از دستورات اسمبلی به طور مستقیم هست که البته این هم تا حد مشخصی پاسخگو هست.
              با این همه چنانچه یک فرکانس متر ساده در حد چند کیلو هرتز مورد نظر شماست بهترین راه اینه که روش اندازه گیری خودتون رو عوض کنید. در روشی که شما استفاده میکنید زمان یک دوره تناوب رو اندازه میگیرید که هم محاسبات بیشتری نیاز داره و هم به دلیل محدودیت سرعت میکرو، خطا افزایش پیدا میکنه. بهترین راه برای اندازه گیری فرکانس های بالا شمارش مستقیم تعداد پالس ها در یک بازه زمانی مثلا 1 ثانیه هست.در این حالت دقت اندازه گیری برای فرکانس های پائین نسبت به روش قبلی کاهش پیدا میکنه و برای کمتر از 1 هرتز قابل استفاده نیست. ولی در عوض در فرکانس های بالاتر دقت چند برابر داره.
              اگر اجازه بدید دو نمونه برنامه ساده قرار میدم که تا فرکانس 65535 Hz و با دقت بسیار خوبی فرکانس با پالس مربعی رو اندازه میگیره و با تغییرات کوچکی میتونید اون رو برای فرکانسهای بسیار بالاتر به کار ببرید. در این دو برنامه در طی زمان دقیقا یک ثانیه تعداد پالس های ورودی شمرده میشن. کار شمارش توسط تایمر1 انتجام میشه که در مود ساده شمارنده تنظیم شده. فرق برنامه اول با دومی در اینه که زمان 1 ثانیه مورد نظر توسط تایمر 0 ایجاد شده ولی در برنامه دوم این زمان از یک دستور تاخیر ساده بدست اومده.
              برنامه در محیط کدویژن و برای mega16 نوشته شده. به همراه هر دو برنامه فایل مربوط به شبیه سازی در محیط Proteus موجود است. توجه کنید که زمان اندازه گیری در شبیه ساز ممکنه طول بکشه ولی در عمل همون یک ثانیه هست.

              http://microcontroller.ir/files/Atmega16_freq_meter.rar

              http://microcontroller.ir/files/Atme...eq_meter_2.rar


              دیدگاه


                #8
                پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                دوست عزیز ممنون
                من قبلاً با متد شمارش در یک ثانیه برنامه رو نوشته ام و در کارهای مشابه با رزولوشن 1 هرتز در یک ثانیه استفاده کرده ام، که برای فرکانسهای چند صد کیلوهرتز هم بخوبی کار می کنه ولی در این مورد خاص هدف من اندازه گیری با دقتی در حد 1 هرتز و در زمان 0.1 ثانیه است.
                لذا از روش شمارش در یک ثانیه نمی توانم استفاده کنم. و مثلاً اگر شمارش در 0.1 ثانیه باشد دقت در حد 10 هرتز خواهد بود. لذا بنابه توصیه استاد کی نژاد از روش کپچر تایمر 1 استفاده کرده ام و برنامه های فوق را نوشته ام که دقت مطلوبی نداره، زمان صرف شده در رویداد وقفه به همراه زمانهای مورد نیاز برای انجام دستوراتی نظیر cli بعد از پایان وقفه با کریستال 8 مگاهرتز زمانی در حدود 1 میکروثانیه نیاز دارد که ظاهراً باید بشود تا فرکانس چند صد کیلوهرتز را براحتی اندازه گیری کرد. احتمالاً دستوراتی مثل Print در خارج اینتراپت دچار ایجاد اختلالاتی در این زمینه می شوند. اگر از دوستان کسی بتونه با روش کپچر یا هر روش دیگری که بتونه در هر ثانیه 10 بار با دقت 1 هرتز نمونه برداری انجام بشه را توضیح بده ممنون می شوم، آنهم برای فرکانسی در رنج 10 کیلو تا 400 کیلو هرتز با دقت 1 هرتز و 10 سمپل در ثانیه.
                با تشکر

                نمونه نوشته شده با دقت یک هرتز در یک ثانیه با روش شمارش

                کد:
                '--------------------------------------------------------------------------
                '        This Program Has Written By M.R. PourFarshchian
                '               Frequency Meter
                '                1386/7/16
                '                ver 1.01.1
                '                Accuracy 1 HZ
                '--------------------------------------------------------------------------
                '                Micro Setting
                
                $regfile = "M32def.dat"
                $crystal = 8000000
                Config Serialout = Buffered , Size = 250
                $baud = 9600
                
                '--------------------------------------------------------------------------
                '                Dim Variable
                Dim B As Byte
                Dim I As Integer
                Dim Count As Long
                Dim Mag As Single
                Dim Strmag As String * 30
                
                
                '--------------------------------------------------------------------------
                '                Timer Setting
                
                Config Timer0 = Timer , Prescale = 1
                Config Timer1 = Counter , Edge = Rising
                
                Enable Interrupts
                Enable Timer0
                Enable Timer1
                
                On Timer0 Timer0_isr
                On Counter1 Timer1_isr
                
                Do
                
                Loop
                
                End
                
                '--------------------------------------------------------------------------
                '
                
                Timer1_isr:
                  Incr B
                Return
                
                '--------------------------------------------------------------------------
                '
                
                Timer0_isr:
                
                  Incr I
                
                  If I = 31250 Then
                
                   Count = B * 65536
                   Count = Count + Counter1
                   Print Count
                
                   B = 0
                   I = 0
                   Counter1 = 0
                
                  End If
                
                Return
                «اگر واقعيات با نظريات هماهنگي ندارند، واقعيتآ‌ها را تغيير بده.»
                آلبرت انشتين

                دیدگاه


                  #9
                  پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                  سلام
                  دوستان منم خیلی دنبال یه فرکانس متر دقیق میگردم که بتونه رنج بالایی رو هم اندازه گیری کنه یکی از مدارات خوبی رو که پیدا کردم ماله سایت avr64 بود که پروژه فرکانس متر با mega 8 رو گذاشتن که تا 1GHz رو میتونه اندازه گیری کنه و به گفته خودشون دقت بالایی هم داره...
                  برای اندازه گیری تا این فرکانس اومدن از ای سی های تقسیم کننده فرکانس استفاده کردن تا فرکانس ورودی رو تقسیم کنه و میکرو اونو بخونه و در نهایت میکرو دوباره عدد فرکانس رو ضرب در مقدار تقسیم شده بکنه تا خروجی درست دربیاد اما یه مشکلی که من تو درست کردن این مدار دارم ای سی تقسیم کنندش به شماره SP8704 هست که من هرجارو گشتم نتونستم پیداش کنم این ای سی فرکانس ورودی رو بر 128 تقسیم میکنه بعد فرکانس وارد 2 ای سی 7490 میشه که اون ها هم هر کدوم فرکانس رو دوباره تقسیم بر 10 میکنن و به میکرو تحویل میدن و میکرو در نهایت عدد خروجی رو در 12800 ضرب میکنه و روی LCD نشون میده. برنامه هم با بسکام نوشته شده
                  تنها مشکل من پیدا نکردن ای سی اولی هست من مدار رو بدون مدار تقسیم فرکانس (فرکانس کم رو به ورودی میکرو دادم) تست کردم دقیق عمل میکنه و مشکلی نداره
                  اینم لینک مدار با سورس و تمام توضیحات:

                  http://dl.bargh20.com/Amin-Upload/2/...rgh20.com).rar

                  دوستان شما ای سی مشابه SP8704 میشناسید تا به جاش بزارم؟؟
                  شدیدا به این مدار نیاز دارم ممنون میشم کمکم کنید :sad:

                  دیدگاه


                    #10
                    پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                    نوشته اصلی توسط farshchian
                    زمان صرف شده در رویداد وقفه به همراه زمانهای مورد نیاز برای انجام دستوراتی نظیر cli بعد از پایان وقفه با کریستال 8 مگاهرتز زمانی در حدود 1 میکروثانیه نیاز دارد که ظاهراً باید بشود تا فرکانس چند صد کیلوهرتز را براحتی اندازه گیری کرد.
                    متغیر period در برنامه c را از نوع volatile تعریف کنید و نتیجه را اطلاع دهید.

                    نوشته اصلی توسط mahdi.7
                    دوستان شما ای سی مشابه SP8704 میشناسید تا به جاش بزارم؟؟
                    این شماره یک dual modulus prescaler است که بیشتر در ساخت سینتی سایزرهای فرکانس مورد استفاده دارد. شما از هر نوع Prescaler موجود در بازار که خروجی آن قابل اعمال به IC های TTL (برای تقسیم بیشتر) باشد می توانید استفاده کنید. البته از شماره های درحال حاضر موجود در بازار اطلاعی ندارم و باید سوال کنید.
                    اوژن: به معنای افکننده و شکست دهنده است
                    دانایی، توانایی است-Knowledge is POWER
                    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                    دیدگاه


                      #11
                      پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                      سلام استاد
                      با volatile فرقی نکرد .

                      کد:
                      /*
                       * Capture.c
                       *
                       * Created: 2012/09/20 01:15:00 ق.ظ
                       * Author: Farshchian
                       */ 
                      #include <stdio.h>
                      #include <avr/io.h>
                      #include <avr/interrupt.h>
                      #include <inttypes.h>
                      #define F_CPU 8000000
                      #define UART_BAUD_RATE 9600
                      
                       volatile period;
                      
                      static int uart_putchar(char c, FILE *stream)
                      {
                      	if (c == '\n') uart_putchar('\r', stream);
                      	
                      	loop_until_bit_is_set(UCSRA, UDRE);
                      	UDR = c;
                      	
                      	return 0;
                      }
                      int init_uart()
                      {
                      	float UART_BAUD_REGISTERS = (((F_CPU / (UART_BAUD_RATE * 16UL))) - 1);
                      	static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
                      	
                      	stdout = & mystdout;
                      	
                      	UCSRB |= (1 << RXEN) | (1 << TXEN);
                      	UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
                      	UBRRL = UART_BAUD_REGISTERS;
                      }
                      
                      ISR(TIMER1_CAPT_vect){ // handler for Timer1 input capture interrupt
                      	period = ICR1; // period = value of Timer 1 stored in ICR1 --- 06 usec with 1 MHz	
                      	TCNT1 = 0; // reset Timer 1 --- 02 usec with 1 MHz
                      }
                      	
                      
                      
                      void main(void) {
                      	
                      	init_uart();
                      	DDRB = 0xFF; // set port B for output
                      	DDRA = 0xFF; // set port A for output
                      	TCCR1A = 0b00000000; // normal mode
                      	TCCR1B = 0b01000001; // no prescaler, rising edge,noise canceller dont used first 0 to 1 for noise canceler
                      	TIMSK = 0b00100000; // enable Timer 1 input capture interrupt
                      	sei(); // enable interrupt subsystem globally
                      	
                      while (1){
                      	printf("freq=%u\n",8000000/period);
                      	} // infinite loop
                        
                      }
                      «اگر واقعيات با نظريات هماهنگي ندارند، واقعيتآ‌ها را تغيير بده.»
                      آلبرت انشتين

                      دیدگاه


                        #12
                        پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                        منظور از تعریف بصورت volatile حذف uint16_t نبود. به هر حال مشکلی که به نظر می رسد در کد شما با افزایش فرکانس موجب ایجاد خطا شود این است که بعد از ایجاد لبه بالا رونده و انجام عملیات capture، مدت زمانی که طول می کشد تا برنامه به روتین وقفه پرش کند و مقدار تایمر بصورت نرم افزاری صفر شود، باعث ایجاد خطا خواهد شد که به افزایش فرکانس اندازه گیری شده منجر می شود. راه حل پیشنهادی این است که بجای صفر کردن مقدار تایمر در روتین وقفه، اجازه بدهید که تایمر شمارش عادی خود را انجام دهد و فقط اختلاف دو مقدار capture شده را اندازه گیری کنید. این روش البته در صورتی کارساز است که بین دو بار capture تایمر حداکثر یک بار overflow شده باشد و در غیر اینصورت می توانید وقفه overflow را هم فعال کنید و تعدا سرریز ها را هم از این طریق شمارش کنید و در محاسبات لحاظ کنید.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          #13
                          پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                          نوشته اصلی توسط علیرضا کیانی
                          سلام به همه دوستان
                          این یه فرکانس متره که از 4 میلی هرتز تا 500 کیلو هرتز را دقیق دقیق اندازه میگیره که در عمل پاسخ میده ولی تو پروتئوس درست نیست و من فایل پروتئوس را فقط واسه این میزارم که که سیم کشی ها معلوم باشه ورودی این مدار پایه capture تایمر 1 هست(PIND.6) و من واسه تست از خروجی تایمر صفر به ورودی این تایمر وصل مردم و فکر میکنم این مدار تا 2 مگا هرتز جواب بده با دقت فوق العاده بالا
                          اینم فایلها
                          http://www.4shared.com/file/108614239/c55f98c7/_3__1.html
                          http://www.4shared.com/file/108614339/c49df2f0/_2__1.html
                          دوستان بزگوار فقط لطف کنید نظرتون را در مورد برنامه بدید ودر صورتیکه اشکالی دیدید بیان کنید با تشکر
                          سلام
                          لینک ها منقضی شدند، اگر امکانش هست دوباره این پروژه رو پلود کنید
                          کسی پروژه ی دیگه ای (فرکانس متر) که با C نوسته شده باشه و از capture در timer1 استفاده کرده باشه، نداره؟؟؟
                          ممنون

                          دیدگاه


                            #14
                            پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                            فرکانس متر با c و کامپایلر avr-gcc به همراه یه نسخه اسمبلی .
                            تست عملیش به عهده خودتون .

                            http://s5.picofile.com/file/8108179326/freq_meter_lcd.7z.html
                            گذشت خصلت مردان است

                            دیدگاه


                              #15
                              پاسخ : پروژه کامل فرکانس متر دقیق با AVR

                              نوشته اصلی توسط tohid041
                              فرکانس متر با c و کامپایلر avr-gcc به همراه یه نسخه اسمبلی .
                              تست عملیش به عهده خودتون .

                              http://s5.picofile.com/file/8108179326/freq_meter_lcd.7z.html
                              سلام داخل فایل هیچی نیست لطفا دوباره پلود کنید
                              برای اینکه چیزی رو بدست بیاری که قبلا وجود نداشته باید کسی بشی که قبلا نبوده...

                              دیدگاه

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