اطلاعیه

Collapse
No announcement yet.

مولد موج سینوسی

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

    #16
    پاسخ : مولد موج سینوسی

    برای تنظیم دقیق فرکانس باید از تایمر دیگر میکرو استفاده کنید و آنرا روی فرکانس 256*f تنظیم کنید تا اینتراپت تولید کند. هر بار که اینتراپت این تایمر اومد باید عدد بعدی جدول را در OCR لود کنید. مثلا اگر سینوسی 50 هرتز می خوای این تایمر باید روی 50*256 ست کنی.
    بله مد fast PWM را باید استفاده کنی. مقدار OCR را هر جا که بخوای می تونی تغییر بدی. طبق جمله ی بالا مقدار OCR تایمر مربوط به PWMآ‌ در روتین اینتراپت تایمر دیگر تغییر می کند.

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

    دیدگاه


      #17
      پاسخ : مولد موج سینوسی

      اونطوری که شما گفتین ،مقدار تایمر رو باید بگذارم 50*256=12.8k ....من فرکانس تایمر صفر و دو (تو mega16) رو گذاشتم،تامر 2 رو واسه OVF int گذاشتم که وقتی int زد،مقدار OCR0 تغییر کنه(non-inverter واسه OC0)
      کد:
      flash char sinewave[]={
      128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,
      	218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,
      	255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,
      	218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,
      	128,124,121,118,115,112,109,106,103,99, 96, 93, 90, 87, 84, 81, 79, 76, 73, 70, 67, 64, 62, 59, 56, 54, 51, 49, 46, 44, 42, 39, 
      	37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 18, 16, 15, 13, 12, 10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0, 
      	0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 18, 19, 21, 23, 25, 27, 29, 31, 33, 35, 
      	37, 39, 42, 44, 46, 49, 51, 54, 56, 59, 62, 64, 67, 70, 73, 76, 79, 81, 84, 87, 90, 93, 96, 99, 103,106,109,112,115,118,121,124
      };
      char i=0;
      // Timer 2 overflow interrupt service routine
      interrupt [TIM2_OVF] void timer2_ovf_isr(void)
      {
      // Place your code here
        OCR0=sinewave[i];
        i++;
        if(i==255)
        i=0;
      }
      اما فرکانس خروجی 50 نشد!! :angry:....تازه با این فرض که فرکانس میکرو رو همون 12.8k گذاشتم(بدون prescalar)،خروجی 15 هرتز شد..شگه فرکانس میکرو رو تغییر بدم(فرکانس تایمر همون) ،جوابهای عجیب بدست میاد!!

      به نظرتون چرا دامنه 2 ولته؟
      ممنون میشم کمک کنین یا حداقل کدی(همراه فرکانس میکرو و تایمر) رو بگذارین که 50 هرتز تو خروجی بده
      ممنون...

      دیدگاه


        #18
        پاسخ : مولد موج سینوسی

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

        http://www.4shared.com/file/128471058/50f5785d/convertor.html

        دیدگاه


          #19
          پاسخ : مولد موج سینوسی

          علت کم بودن دامنه مقدار زیاد RC است.
          جدول 255 تایی کاملا درسته.
          fast PWM رو هم باید تا 255 تعریف کنی.
          با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

          دیدگاه


            #20
            پاسخ : مولد موج سینوسی

            fast PWM رو هم باید تا 255 تعریف کنی.
            اگه منظور استفاده از تایمر 8 بیتیه که گفتم از تایمر صفر و 2، mega16 استفاده کردم(کلا با فرکانس به مشکل خوردم...اگه میشه یه نمونه از تنظیمات فرکانس میکرو و تایمر واسه خروجی 50 هرتز بگذارین)
            ممنون...

            دیدگاه


              #21
              پاسخ : مولد موج سینوسی

              تایمر صفر را بهتر است روی ماکزیمم فرکانس تنظیم کنی.
              فرض کلاک میکرو 8 مگاهرتز باشد:

              کد:
              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: 8000.000 kHz
              // Mode: Fast PWM top=FFh
              // OC0 output: Non-Inverted PWM
              TCCR0=0x69;
              TCNT0=0x00;
              OCR0=0x00;

              با کد بالا تایمر صفر یک PWM با فرکانس 31250 هرتز تولید می کند. بنابراین مقدار RC را باید طوری انتخاب کنی که این فرکانس را فیلتر کند. می تونیم فرکانس قطع فیلتر را 100 برابر کمتر 31250 هرتز یعنی 312.5 هرتز انتخاب کنیم:
              (f=1/(2*pi*R*C
              RC=5*10^-4
              اگر مقاومت 5 کیلو بگذاریم خازن باید 100 نانو باشد.

              واسه تولید سینوسی 50 هرتز باید تایمر 2 را روی 50*256 هرتز یعنی 12.8 کیلو هرتز تنظیم کنی. اما نمی توان دقیقا روی این فرکانس تنظیم کرد. تازه چرا روی overflow گذاشتی؟
              تایمر 2 را باید بصورت زیر تنظیم کنی:

              کد:
              // Timer/Counter 2 initialization
              // Clock source: System Clock
              // Clock value: 1000.000 kHz
              // Mode: CTC top=OCR2
              // OC2 output: Disconnected
              ASSR=0x00;
              TCCR2=0x0A;
              TCNT2=0x00;
              OCR2=0x00;

              مقدار OCR2 را 78 گذاشتم تا با فرکانس 12.82 کیلو هرتز اینتراپت دهد. برنامه را باید داخل اینتراپت روتین زیر بگذاری:

              کد:
              // Timer2 output compare interrupt service routine
              interrupt [TIM2_COMP] void timer2_comp_isr(void)
              {
              // Place your code here
              
              }
              با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

              دیدگاه


                #22
                پاسخ : مولد موج سینوسی

                با سلام دوباره...
                من این کارایی که فرمودید رو انجام دادم اما فرکانس خروجی 4 هرتز شد(حدودا) :angry:
                شما فرمودین که OCR2 میشه 78 ...اما با این کلاکی که گذاشتین ،حدود 32(یا 20 هگز) نمیشه؟
                با گذاشتن 78 ،فرکانس حدود 4 هست و با گذاشتن 20(هگز) حدود 14 هرتز میشه!!!!!
                با جابجا کردن عددها دیدم عدد 9 ،برای compare مقدار فرکانس خروجی رو 50 هرتز میده
                اگه میشه دلیلشو بگین...من که دیگه واقعا :angry:
                اطلاعات برنامه:mega16 با فرکانس 8 مگ،تایمر صفر 8 مگ fastPWM و none-inverted ،تایمر2 باملاک 1مگ و مد CTC و با اینتراپت compare و مقدار compare=9(؟؟)

                دیدگاه


                  #23
                  پاسخ : مولد موج سینوسی

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

                  دیدگاه


                    #24
                    پاسخ : مولد موج سینوسی

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

                    دیدگاه


                      #25
                      پاسخ : مولد موج سینوسی

                      یعنی که چه دایی جان؟!
                      با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                      دیدگاه


                        #26
                        پاسخ : مولد موج سینوسی

                        یعنی توپروتئوس جوابم درست نبود...اگه شما دقیقا جواب گرفتین برم codevision رو عوض کنم!!

                        دیدگاه


                          #27
                          پاسخ : مولد موج سینوسی

                          به گمانم این شبیه سازی باعث شده شما دیگه فکر نکنید. توصیه می کنم چند سال شبیه سازی رو کنار بگذارید و عملی کار کنید. این توصیه جدیست. هر وقت استاد شدید برای تفریح از شبیه سازی استفاده کنید!!! oo:
                          با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                          دیدگاه


                            #28
                            پاسخ : مولد موج سینوسی

                            نوشته اصلی توسط ahmadmn
                            مثال از یک جدول سینوسی البته مقادیر باید محاسبه شده در جدول قرار بگیره:

                            flash unsigned char lookup[256]={128, 128+127*SIN(1*360/255), 128+127*SIN(2*360/255), 128+127*SIN(3*360/255), ..., 128+127*SIN(255*360/255) };example
                            چرا ضریبی که ضرب می کنیم 127است؟

                            دیدگاه


                              #29
                              پاسخ : مولد موج سینوسی

                              سلام دایی جان
                              اگه بخواهیم دامنه یه موج سینوسی رو در بازه 0 تا 255 قرار بدیم مجبوریم دامنه رو 127 بگیریم.
                              با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                              دیدگاه


                                #30
                                پاسخ : مولد موج سینوسی

                                نوشته اصلی توسط ahmadmn
                                سلام دایی جان
                                اگه بخواهیم دامنه یه موج سینوسی رو در بازه 0 تا 255 قرار بدیم مجبوریم دامنه رو 127 بگیریم.
                                من در نت سرچ کردم جای دیگر ضریب دیگه مثل 128 رو گرفته من بازم متوجه نشدم!!مثل زیر:
                                l
                                For(i=0;i<=255;i++)
                                Source[]=(int)((sin(i*2*pi/255)+1)*128);

                                دیدگاه

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