اطلاعیه

Collapse
No announcement yet.

تولید موج مربعی

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

    تولید موج مربعی

    سلام :sad:
    میشه راهنماییم کنید:
    تولید موج مربعی با فرکانس 1کیلوهرتز
    با (avr(atmega32df

    #2
    پاسخ : تولید موج مربعی با تایمر

    با تایمر :cry:

    دیدگاه


      #3
      پاسخ : تولید موج مربعی

      درود
      منظورت اینه که می خوای با 0 و 1 کردن پایه میکرو و با استفاده از تایمر موج مربعی بسازی
      در روزگاري كه لبخند آدم ها بخاطر شكست توست برخيز تا بگريزند. كورش كبير
      شاد بودن، تنها انتقامي است که ميتوان از زندگي گرفت. ارنستو چه گوارا

      دیدگاه


        #4
        پاسخ : تولید موج مربعی

        سلام.

        این یه نمونه.
        کد:
        #include <mega8.h>
        
        void delay();
        void main()
        {
        DDRB=0x01;
        PORTB=0x00;
        TCCR0=0x00;
        TCNT0=0x00;
        while(1)
        {
        PORTB.0=~PORTB.0;
        delay();
        }
        }
        void delay()
        {
        TCCR0=0x22;
        while(!(TIFR&0x02));
        TIFR|=0x02;
        }
        تشکر لازم نیست!

        دیدگاه


          #5
          پاسخ : تولید موج مربعی

          بله میخوام با 0و1 کردن پایه میکرو و همچنین تایمر موج مربعی ایجاد شه

          دیدگاه


            #6
            پاسخ : تولید موج مربعی

            سلام
            اول روش کار با تایمر :
            ما میخوایم یه برنامه بنویسیم که باهاش بشه یه موج مربعی با فرکانس 50 هرتز ساخت ( بقیه کار رو مرحله به مرحله اضافه میکنیم )
            خب موجمون فرکانسش 50 هرتز هست ، بنابراین زمان تنابش میشه 20 میلی ثانیه ، یعنی اگه ما یه پایه رو 10 میلی ثانیه 1 کنیم و 10 میلی ثانیه صفر واین کار رو مدام انجام بدیم ، یه شکل موج با فرکانس 50 هرتز ساختیم :
            ما باید تایمر رو یه جوری پیکربندی کنیم که تا 10 میلی ثانیه بشمره و بعد از سرریز شدن به زیر روال وقفه بره و و ضعیت یه پایه رو برعکس کنه :
            زمانی که تایمر میشمره از فرمول زیر بدست میاید :
            فرکانس کریستال /(بیت تایمر * مقدار پرسکلیر )=زمان
            از انجا که با تایمر 8 بیتی 0 و 2 بهتر میتوان زمان های کم را ساخت (دقیق تر ) ما از این دوتا استفاده میکنیم :
            16 /( * (دو به توان 8 یا 256)* 64 )=1میلی ثانیه
            خب با یه ضرب وتقسیم میشه فهمید که ما با استفاده از کریستال 16 مگاهرتز و پریسکلیر 64 و تایمر 16 بیتی میتونیم زمان 0.001024 ثانیه رو بدست بیاریم :
            خب بر نامه رو مینویسیم :
            $regfile = "M8DEF.dat" : $crystal = 16000000
            Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , E = Pind.1 , Rs = Pind.0
            Config Lcd = 16 * 2 : Cursor Off : Cls
            Config Pinb.0 = Output
            dim a as word
            Config Timer0 = Timer , Prescale = 64
            Enable Interrupts
            Enable Ovf0
            On Ovf0 Q
            Do
            Locate 1 , 1
            Lcd "t:"

            Loop
            End
            Q:
            if a>9 then
            Toggle Portb.0
            a=0
            endif
            Return
            در روزگاري كه لبخند آدم ها بخاطر شكست توست برخيز تا بگريزند. كورش كبير
            شاد بودن، تنها انتقامي است که ميتوان از زندگي گرفت. ارنستو چه گوارا

            دیدگاه


              #7
              پاسخ : تولید موج مربعی

              شرح برنامه بالا :
              $regfile = "M8DEF.dat" : $crystal = 16000000
              در این خط میکرو و فرکانس کاری اون مشخص شده ، میکررو مورد استفاده مگا 8 و مقدار کریستال 8 مگا هرتز است .
              Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , E = Pind.1 , Rs = Pind.0
              در این دوخط lcd راه اندازی شده است ، lcd به پایه های پورت d متصل است .
              Config Lcd = 16 * 2 : Cursor Off : Cls
              در این خط نوع lcd مشخص شده ، همچنین مکان نما خاموش شده و lcd پاک میشود.
              Config Pinb.0 = Output
              در این خط پورت b.0 به عنوان خروجی تعریف شده ، چون ما میخواییم از این پورت ولتاژ بگیریم.
              Config Timer0 = Timer , Prescale = 64
              در این خط تایمر 0 راه اندازی شده
              Enable Interrupts
              Enable Ovf0
              On Ovf0 Q
              در این سه خط ، ابتدا وقفه سراسری را اندازی شده است ، شما در هنگام استفاده از هر نوع وقفه ابتدا باید این وقفه را راه اندازی کنید ، در خط بعدی وقفه تایمر ودر خط سوم ، مکانی که تایمر پس از سرریز شدن به انجا پرش میکند معین شده است
              Do
              Locate 1 , 1
              Lcd "t:"
              Loop
              End
              در این قسمت یک حلقه do-loop موجود است که در ان عبارت t روی lcd نمایش داده میشود و فعلا به برنامه ما ربطی ندارد .
              Q:
              if a>9 then
              Toggle Portb.0
              a=0
              endif
              Return
              این قسمت از برنامه مکانی است که cpu بعد از سرریز شدن تایمر به ان پرش میکند ، در اینجا 1واحد به مقدار a اضافه میشود ، هنگامی که a برابر 10 شد ، وضعیت پورت b.0 برعکس میشود (اگر صفر است یک و اگر 1 است صفر میشود ) و cpu با دستور return به حلقه ی اصلی باز میگردد.
              در روزگاري كه لبخند آدم ها بخاطر شكست توست برخيز تا بگريزند. كورش كبير
              شاد بودن، تنها انتقامي است که ميتوان از زندگي گرفت. ارنستو چه گوارا

              دیدگاه


                #8
                پاسخ : تولید موج مربعی

                سوالاتی که ممکنه پیش بیاد ..
                چرا از وقفه استفاده میشه ؟
                شما توی حلقه ی do-loop تا دلت میخئاد از دستور wait استفاده کن ، اما تایمر با استفاده از وقفه کار خودش رو انجام میده ، به محض اینکه تایمر تا 256 شمرد cpu حلقه ی اصلی رو رها میکنه و به زیر روال وقفه میره ، کار های که در اونجا وجود داره رو انجام میده و دوباره به مکانی که اومده بود برمیگرده .

                با استفاده از مقدار پریسکلیر و فرکانس و... شما مشخص میکنی که تایمر شمرده از 0 تا 255 رو چقدر طول بده ، توی مثال بالا این زمان 10 میلی ثانیه طول میکشه ، اگه که موارد رو تغییر بدی ممکنه این زمان کمتر یا بیشتر بشه .

                همون طور که میدونی میکرو در حالت عادی با فرکانس 1 مگاهرتز کار میکنه ، شما برای اینکه نتیجه بگیرید ، باید میکرورو روی کریستال خارجی 16 مگ پروگرام کنید ، در صورتی که این کار رو انجام بدین با جدا کردن کریستال از میکرو ، میکرو خاموش میشه .
                در روزگاري كه لبخند آدم ها بخاطر شكست توست برخيز تا بگريزند. كورش كبير
                شاد بودن، تنها انتقامي است که ميتوان از زندگي گرفت. ارنستو چه گوارا

                دیدگاه

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