اطلاعیه

Collapse
No announcement yet.

تولید موج سینوسی با AVR

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

    پاسخ : تولید موج سینوسی با AVR

    سلام جناب کی نژاد خسته نباشید
    در مورد جدول موج سینوسی مطلبی رو می خواستم عرض کنم
    ظاهرآ هدف این جدول ایجاد یک موج سینوسی با استفاده از یک انتگرال گیر در خروجی میکرو بوده است
    خروجی این جدول بیشتر به موج ذوزنقه ای شباهت دارد تا یک موج سینوسی که با انتکرال گیری به سینوسی تبدیل
    میشود و در موارد دیگه مثل کنترل دور موتور و .....مانند یک موج ذوزنقه ای عمل میکند تکرار زیاد 0xff و 0x00
    در پیکها به شکل موج آسیب میزنه انتگرال گیری خروجی میکرو این مشکل رو نشون نمیده فکر میکنم یک جدول ایده آل
    نباید دو مقدار مشابه داشته باشه.

    اگر شاد بودی آرام بخند تا غم بیدار نشود

    دیدگاه


      پاسخ : تولید موج سینوسی با AVR

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

      دیدگاه


        پاسخ : تولید موج سینوسی با AVR

        نوشته اصلی توسط طراح
        برنامه زیر دو موج PWM روی خروجی های OC1A و OC1B در mega8 تولید می کند که با فیلتر کردن آن می توان موج های سینوسی با اختلاف فاز 180 درجه را مشاهده کرد. فرکانس سینوسی در محدوده 488.2-1.9 هرتز تغییر می کند که برای تغییر آن باید یک ولتاژ متغیر در محدوده 0 تا AVcc را به ورودی ADC0 اعمال کرد. این کار می تواند از طریق یک پتاسیومتر انجام شود که دو سر کناری آن به زمین و AVcc و سر وسط آن به ADC0 متصل می شود و با تغییر وضعیت پتانسیومتر، فرکانس خروجی تغییر خواهد کرد. فرکانس کلاک mega8 باید در 8MHz تنظیم شود که این کار از طریق تنظیم مناسب فیوزبیت ها انجام می گیرد.همچنین فرکانس حامل PWM برابر 15.6 کیلوهرتز می باشد.
        با سلام خدمت جناب کی نژاد
        بنده میخوام یک پروژه ی SPWM با PIC انجام بدم.(البته فقط تغییر سرعت و بدون V/f و باقی امکانات)
        در قدم اول نمونه کدی که در صفحه یک قرار دادید رو در پروتیوس شبیه سازی کردم و فرکانس حامل رو بصورت 15686 هرتز مشاهده کردم که با محاسبه کاملاً مطابقت داره اما فرکانس سینوسی رو به ازای Delay=1 برابر 163 هرتز نمایش میداد که با محاسبات من جور در نمیاد. آیا محاسبات زیر درسته؟
        کد:
        8000000 / 2*255 = 15686.27 Hz
        15686.27 / 256 = 61.27 Hz (for Delay=1)


        میشه فرمول محاسبه فرکانس سینوسی بر حسب Delay رو توضیح بدید؟
        ممنون

        دیدگاه


          پاسخ : تولید موج سینوسی با AVR

          در این برنامه یک وقفه به ازای هر 64 کلاک cpu ایجاد می شود که 256 نقطه از یک جدول خوانده می شود. بنابراین به ازای Delay=1

          8000000/(256*64)=488.28125


          نکته دیگر اینکه فرکانس سینوسی ارتباطی با فرکانس حامل ندارد. بلکه به سرعت خواندن جدول سینوسی بستگی دارد. در همین رابطه، پست زیر را مطالعه کنید:

          http://www.eca.ir/forum2/index.php?t...1606#msg401606
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            پاسخ : تولید موج سینوسی با AVR

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

            ممنون

            دیدگاه


              پاسخ : تولید موج سینوسی با AVR

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

              دیدگاه


                پاسخ : تولید موج سینوسی با AVR

                Delay را در داخل برنامه بصورت ثابت برابر 1 قرار دادم.

                دیدگاه


                  پاسخ : تولید موج سینوسی با AVR

                  نوشته اصلی توسط B2
                  Delay را در داخل برنامه بصورت ثابت برابر 1 قرار دادم.
                  به تفاوت این خط با برنامه اصلی دقت نکردم. در هر صورت در این شرایط باید حتما همان فرکانس 488.2 به ازای کلاک 8 مگاهرتز تولید شود. بنابراین یا شبیه ساز درست عمل نمی کند و یا پارامترهای آن به درستی تنظیم نیست (بطور کلی به نتایج شبیه سازی اعتماد نکنید و خروجی را در عمل آزمایش کنید).
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    پاسخ : تولید موج سینوسی با AVR

                    سلام
                    مجددا با چند تا سوال مزاحمتون میشم. البته شرمنده سوالامو دیر به دیر میپرسم. خودمم کمتر وقت میکنم رو پروژه کار کنم.
                    بنده بعد از نمونه کد قبلی، پروژه spwm سه فاز که شما به اشتراک گذاشتید رو دانلود کردم و هر چهار نسخه رو خوندم.سوالهام ایناست:
                    1- وقتی freq_Boost را 10هرتز در نظر گرفته اید مگر A_Boost نباید بصورت 10Hz / 50Hz = 0.2 باشد؟ اما ظاهراً شما مقدار A_Boost را 25 در نظر گرفته اید که درصورت تقسیم بر 255 برابر حدوداً 0.1 میشود.
                    2- چرا از نسخه سوم برنامه به بعد، عبارت speed>194 (و امثال آن) را به speed>195 تغییر داده اید؟
                    3- اگر ممکنه در مورد دستور A=((N*(unsigned long)(speed-f_Boost))/M)+A_Boost کمی توضیح دهید.
                    4- یک سوال هم در مورد سخت افزار. اگر فرمان بازوهاآ‌ی پایین را با not کردن بدهیم، هنگام استپ بودن درایو چه مشکلاتی ممکن است پیش بیاید؟

                    متاسفانه مشکلی که من دارم اینه که زیاد به PIC مسلط نیستم و ظاهراً تایمرهای PIC در امکاناتی مثل autoreload ، جهت شمارش به پایین، دوبل بافر و غیره کمبودهایی دارند. تا اونجایی هم که من تاپیکها رو دنبال میکردم ظاهراً شما هم در این زمینه به مشکل خوردید.
                    البته چون به این تاپیک مربوط نمیشه زیاد اینجا بحثش رو نمیکنم اما اگر در این مورد نظری داشتید ممنون میشم بگید.

                    دیدگاه


                      پاسخ : تولید موج سینوسی با AVR

                      با سلام
                      1- به دلیل صفر نبودن مقاومت سیم پیچ های موتور، یکی از روش ها برای جبران سازی این اثر مقاومتی (که مقدار آن ثابت است) این است که به منحنی V/f یک عرض از مبدا داده شود که در درایورها معمولا مقدار آن قابل تنظیم است.
                      2- تغیر مقدار 194 به 195 به دلیل تغییر در ساختار برنامه انجام گرفته است.
                      3- عبارت مورد نظر یک معادله خط به شکل y=((y2-y1)/(x2-x1))(x-x1)+y1 است.
                      4- عدم اعمال Dead time و not بودن کامل شکل موج می تواند باعث هدایت توام سوئیچ ها و آسیب دیدن آنها شود.
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


                        پاسخ : تولید موج سینوسی با AVR

                        در مورد سوال 1 مشکلم این بود که در یکی از application note های میکروچیپ نمودار V/f را بصورتی نمایش داده که شیب آن برابر 1 است اما طبق فرمایش شما لزومی ندارد شیب 1 باشد. آیا برداشت من درست است؟



                        در مورد سوال 4 منظورم این است که وقتی مدار در حالت STOP قرار دارد و سه تا از سویچ ها بصورت دائم روشن هستند چه مشکلاتی ممکن است پیش بیاید؟

                        در باره تایمرها نظری ندادید؟ آیا می توانیم برای اجتناب از بروز مشکلاتی که در مقداردهی تایمرسرعت(تایمر3) پیش می آید بجای آنکه مقدار جدید تایمر را در روتین ADC یا روتین تایمر Accel,Decel اعمال کنیم آنرا در یک متغیر بریزیم و در روتین وقفه خود تایمر آنرا مقدار دهی کنیم؟

                        دیدگاه


                          پاسخ : تولید موج سینوسی با AVR

                          شیب منحنی برابر 1 نیست. بلکه حتی با فرض عبور از مبدا Vmax/fbase است. برای غلبه بر خاصیت مقاومتی در فرکانس های پائین، یا همین منحنی در نظر گرفته می شود و از یک فرکانس پائین تر، معادله خط تغییر می کند. به نحوی که دارای عرض از مبدا باشد و از مبدا عبور نکند. یک روش دیگر هم این است که بجای دو تکه کردن خط، از همان نقطه عرض از مبدا، یک خط بصورت مستقیم به نقطه انتهایی متناظر fbase رسم شود(منبع عکس ها: درایور LS)



                          بطور کلی در یک اینورتر انعطاف پذیر، نقاط مختلف این منحنی باید قابل تغییر و تعریف باشد.



                          حتی برای برخی بارها مثل فن، بجای خط بهتر است منحنی سهمی در نظر گرفته شود.



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

                          دیدگاه


                            پاسخ : تولید موج سینوسی با AVR

                            نوشته اصلی توسط طراح
                            برنامه زیر دو موج PWM روی خروجی های OC1A و OC1B در mega8 تولید می کند که با فیلتر کردن آن می توان موج های سینوسی با اختلاف فاز 180 درجه را مشاهده کرد. فرکانس سینوسی در محدوده 488.2-1.9 هرتز تغییر می کند که برای تغییر آن باید یک ولتاژ متغیر در محدوده 0 تا AVcc را به ورودی ADC0 اعمال کرد. این کار می تواند از طریق یک پتاسیومتر انجام شود که دو سر کناری آن به زمین و AVcc و سر وسط آن به ADC0 متصل می شود و با تغییر وضعیت پتانسیومتر، فرکانس خروجی تغییر خواهد کرد. فرکانس کلاک mega8 باید در 8MHz تنظیم شود که این کار از طریق تنظیم مناسب فیوزبیت ها انجام می گیرد.همچنین فرکانس حامل PWM برابر 15.6 کیلوهرتز می باشد.

                            کد:
                            #include <mega8.h>
                            volatile unsigned char Delay;
                            flash unsigned char sine[256]={
                            0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
                            0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
                            0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
                            0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
                            0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
                            0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
                            0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
                            0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
                            0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
                            0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
                            0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
                            0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
                            0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
                            0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
                            0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
                            0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c};
                            interrupt [TIM2_COMP] void timer2_comp_isr(void)
                            {
                             static unsigned char index=0;
                             if(!--Delay)
                             {
                             Delay=(ADCH?ADCH:1); 
                             OCR1A=sine[++index]; 
                             OCR1B=sine[index];
                             } 
                            }
                            
                            void main(void)
                            {
                             DDRB=0x06; 
                             ADMUX=0x60;
                             ADCSRA=0xE6;
                             while(!ADCSRA.4); 
                             Delay=(ADCH?ADCH:1);
                             OCR1A=sine[0];
                             OCR1B=sine[0];
                             TCCR1A=0xB1;
                             TCCR1B=0x01;
                             TCCR2=0x09;
                             OCR2=63;
                             TIMSK=0x80;
                             #asm("sei")
                             while (1);   
                            }
                            سلام
                            من میکروم رو پروگرام کردم و اینجوری بستم:




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



                            یه سوال جدای از این مسائل هم دارم. چرا اسیلاتور داخلی 8 مگا درون میکرو رو غیر واقعی میگیم. توی تنظیم فیوز بیت ها نوشته!؟

                            دیدگاه


                              پاسخ : تولید موج سینوسی با AVR

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

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

                              دیدگاه


                                پاسخ : پاسخ : تولید موج سینوسی با AVR

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

                                متوجه منظور شما از عبارت "غیر واقعی" نشدم .

                                به کد های این صفحه دقت کنید:


                                http://www.eca.ir/forum2/index.php?topic=73578.0

                                تو این صفحه من کدی قرار دادم که ظاهرا یک موج سینوسی بر روی پایه PB3(OC0) تولید می کند که این موج در هر بازه زمانی فرکانس خاصی دارد و تولید صدا میکند. من فکر کردم که اگه با این پروژه شما دو بلندگو به پایه ها متصل کنم می تونم صدای خاصی بشنوم ولی ظاهرا نمیشه. حالا واقعا چرا نمیشه؟
                                این کدی که من قرار دادم خیلی جالبه، چون فقط از یه تایمر استفاده کرده. هر چند که متاسفانه من هنوز هم نفهمیدم که چطور کار میکنه. آخه کسی نتونست کدهاشو تحلیل کنه. کدهاش هم خیلی کمه. اگه خواستین فیلم عملکرد این کد رو ببینید این ویدئو رو دانلود کنید و ببینید:

                                http://uploadtak.com/images/d1759_pwmsound.zip

                                واسه سوال دومم هم اگه به این تصویر زیر نگاه کنید متوجه میشید(به سطر 3 و 5 و 13 دقت کنید نوشته):




                                دیدگاه

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