اطلاعیه

Collapse
No announcement yet.

حداکثر فرکانس

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

    #16
    پاسخ : پاسخ : حداکثر فرکانس

    نوشته اصلی توسط RubeuS
    خواهش میکنم. (من که تو پست دوم این تاپیک گفته بودم :smile: )

    ببینید تو مد fastpwm اگر تایمر از 0 تا TOP بشمرد ، دیدید که فرکانس ثابت می شود. و در صورتی که از مد غیر معکوس ( non-inverting ) استفاده کنیم ، در یک دوره تناوب از 0 تا مقدار رجیستر OCR موج در high است و از OCR تا TOP موج در low است. پس اگر کاری کنیم که تایمر از صفر نشمرد و بجاش از TOP-2 بشمرد و رجیستر OCR را نیز روی مقدار TOP-1 تنظیم کنیم، موج در یک کلاک تایمر high و در کلاک بعدی low و همینطور تا آخر . پس باید مقدار TCNT را اول کار TOP-2 بدیم و مقدار OCR را TOP-1 بدیم.
    سوال : خوب برای دفعه اول این درست کار میکند ولی برای دفعات بعدی با سرریز تایمر مقدار TCNT صفر میشود و کار خراب میگردد. باید چه کار کنیم؟
    جواب : می توانیم وقفه سرریز تایمر را فعال کنیم و در روتین سرریز تایمر مقدار TCNT را TOP-2 بدیم که اینجوری دوباره از TOP-2 میشمرد .

    برای مد phase correct به دلیل نوع افزایشی و کاهشی شمردن ، نمیشه اینجوری عمل کرد( حداقل من بلد نیستم، هر چی فکر میکنم هیچ جوره نمیشه با فرض ثابت بودن کلاک پردازنده و پری اسکیلر ،فرکانس متغییر ساخت)
    خب منظور از TOP-2 همان 253 (در تایمر کانتر 0)است؟
    و TOP-1 همان 254 است؟
    میشه نمونه کدی بذارین؟
    تکاور شدن جرات افزون کند.....هراس از دل مرد بیرون کند....


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

    دیدگاه


      #17
      پاسخ : حداکثر فرکانس

      مهندس میشه نمونه کد بذارین تا بهتر بشه موضوع رو درک کرد؟
      تکاور شدن جرات افزون کند.....هراس از دل مرد بیرون کند....


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

      دیدگاه


        #18
        پاسخ : حداکثر فرکانس

        بصورت زیر است، ولی یه مشکل داره که بتون میگم:

        کد:
        #include <avr/io.h>
        #include <avr/interrupt.h>
        ISR(TIMER0_OVF_vect)
        {
        	TCNT0=253;
        }
        int main()
        {
        	DDRB=(1<<DDB3);
        	TCNT0=253;
        	OCR0=254;
        	TIMSK = (1<<TOIE0);
        	asm("sei");
        	TCCR0 = (1<<WGM00) | (1<<COM01) | (1<<WGM01) | (1<<CS00);
        	while(1);
        }
        روش به همین صورت است ولی در این مثال خاص مشکلی وجود دارد:

        مشکلش: چون سرعت سرریز شدن تایمر خیلی زیاد است و در فاصله زمانی های خیلی کم سریز میشود، پردانزنده قادرنیست به موقع در روتین وقفه ، TCNT0 را مقدار دهی کند.
        راه حل: بایستی کدهای تولیدی برای اجرای روتین وقفه را کم کنیم(برای اجرای روتین وقفه کدهایی تولید میشود که ما نمیبینیم و به منظور ذخیره رجیسترها و ذخیره هرچیز که برای پرش به آدرس روتین وقفه نیاز است) . برای اینکار بهتر است در سطح اسمبلی (یا ماشین) برنامه نوشته شود و بدین وسیله کدها را کاهش میدهیم.
        (بایستی کمتر از 2 کلاک پردازنده بعد از وقفه خوردن از تایمر،مقدار TCNT0 مقداردهی شود)(که یعنی باید به محض وقفه خوردن و پرش ، TCNT0 را مقدار دهی کنیم. )(که البته با کامپایلرهای زبان های سطح بالا(حتی gcc و iar با اینکه میتوان در این کامپایلرها، کدهای مربوط وقفه ها را کاهش داد) نمیتوان اینکار را کرد و فقط با اسمبلی باید اینکار را کرد.(شدنی بودنش را الان نمیتونم بگم ،باید امتحان کنم)
        راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
        انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

        دیدگاه


          #19
          پاسخ : حداکثر فرکانس

          راستی اگر میخواید یک موج مربعی با فرکانس بالا(با دیوتی سایکل 50 درصد) داشته باشید ، نیاز نیست از روش بالا استفاده کنید(استفاده از مد fastpwm)
          چون انجام اینکار با مد CTC بسیار راحت تر است.
          راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
          کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
          نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
          http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
          انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

          دیدگاه

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