اطلاعیه

Collapse
No announcement yet.

تولید pwm بدون استفاده از وقفه

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

    تولید pwm بدون استفاده از وقفه

    یک برنامه pwm نیاز دارم که بدون استفاده از وقفه ها بتوانم تعداد معین پالس تولید کنم
    اگر کسی میدونه لطفا راهنماییم کنه
    برد هم Atxmega128َََA3U می باشد.
    با تشکر

    #2
    پاسخ : تولید pwm بدون استفاده از وقفه

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

    دیدگاه


      #3
      پاسخ : تولید pwm بدون استفاده از وقفه

      روند برنامه اینه که یک فرکانس1.5khz تولید کنه و بعد از 275 پالس وارد یک زیر برنامه یا وقفه بشه و کار خاصی را انجام بده و 200 بار این روند رو تکرار کنه.

      دیدگاه


        #4
        پاسخ : تولید pwm بدون استفاده از وقفه

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

        دیدگاه


          #5
          پاسخ : پاسخ : تولید pwm بدون استفاده از وقفه

          نوشته اصلی توسط طراح
          بنابراین به همان روالی که توضیح دادم، سرریز یا compare match یک تایمر(بسته به مد مورد استفاده) از طریقEvent System باید به عنوان کلاک تایمر دیگر انتخاب شود و بعد از رسیدن تایمر دیگر به مقدار مناسب، وقفه ای ایجاد و در آن عملیات مورد ننظر انجام شود. البته این شمارش پالس ها در وقفه تایمر اول هم می تواند بصورت نرم افزاری انجام شود و برای فرکانس 1.5KHz که فرکانس پائینی است، به روش شمارش نرم افزاری هم می توان به خوبی جواب گرفت.
          لطفا میتوانید برنامه را برایم قرار دهید؟

          دیدگاه


            #6
            پاسخ : تولید pwm بدون استفاده از وقفه

            برنامه ای رو که خودم نوشتم رو این زیر فرستادم و میدونم که مبتدیانه نوشته شده چون چند هفته است که کلا شروع به یاد گیری xmega نموده ام

            /*
            * scan
            *
            * Created: 5/26/2014 1229 AM
            * Author: sam
            */

            #include <avr/io.h>
            #include <avr/interrupt.h>

            volatile unsigned int flag=1;

            volatile unsigned int a=0;
            volatile unsigned int b=0;
            volatile unsigned int c=0;
            volatile unsigned int d=0;
            volatile unsigned int e=0;
            volatile unsigned int f=0;
            volatile unsigned int g=0;
            volatile unsigned int h=0;


            int main(void)
            {

            PORTC_DIRSET=PIN0_bm;
            PORTF_DIRSET=0xFF;
            //PORTF_OUTCLR=PIN1_bm;
            TCC0_PER=80; //0.32ms
            TCC0_INTCTRLA=TC_ERRINTLVL_OFF_gc|TC_OVFINTLVL_LO_ gc;
            TCC0_CTRLA=TC_CLKSEL_DIV8_gc;

            PMIC_CTRL=PMIC_LOLVLEN_bm;

            sei();

            while(flag);//count>0
            }


            ISR(TCC0_OVF_vect)

            {

            PORTC_OUTTGL=PIN0_bm; // 1.5625khz
            a=a+1;
            if (g==100)
            {
            flag=0;
            }
            if (b==100)
            {
            PORTF_OUT=PIN1_bm;
            e=0;
            a=0;
            c=c+1;
            g=g+1;
            h=h+1;
            if (h==2)
            {
            h=0;
            goto s1;
            }

            }
            if (d==547)
            {
            PORTF_OUT=PIN0_bm|PIN3_bm;
            c=0;
            e=e+1;
            d=0;
            }
            if (f==547)
            {
            b=b+1;
            //barnameye scan
            f=0;
            }
            if (e==1)
            {
            PORTF_OUT=PIN0_bm|PIN3_bm;
            f=f+1;

            }
            if (c==1)
            {

            PORTF_OUT=PIN1_bm;
            d=d+1;
            b=0;
            a=0;
            }
            s1:
            if (a==548)

            {

            //barnameye scan
            c=0;
            a=0;
            b=b+1;

            }
            else if (1<a)
            {
            PORTF_OUT=PIN0_bm;
            }




            }

            دیدگاه


              #7
              پاسخ : تولید pwm بدون استفاده از وقفه

              عملکرد نمونه کدی که قرار داده اید چندان مشخص نیست. اما اگر فرض کنیم بر خلاف فرض بخش های قبلی سوال تنها بر اساس وقفه سرریز عمل کنیم و عملیات تولید پالس و روتین مربوط به 275 پالس و 275*200 پالس بصورت نرم افزاری انجام شود و از واحد تولید شکل موج استفاده نشود، کدی شبیه به نمونه کد زیر را می توان برای وقفه سرریز در نظر گرفت:

              کد:
              ISR(TCC0_OVF_vect)
              {
               static unsigned char x200=200;
               static unsigned int x275=275;
               PORTC_OUTTGL=PIN0_bm;
               if((PORTC & PIN0_bm)==0)
               {
               if(--x275)return;
               x275=275;
               
               // Do 275 pulses routine
               
               if(--x200)return;
               x200=200;
               // Do 275*200 pulses routine 
               } 
              }


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

              دیدگاه


                #8
                پاسخ : پاسخ : تولید pwm بدون استفاده از وقفه

                نوشته اصلی توسط طراح
                عملکرد نمونه کدی که قرار داده اید چندان مشخص نیست. اما اگر فرض کنیم بر خلاف فرض بخش های قبلی سوال تنها بر اساس وقفه سرریز عمل کنیم و عملیات تولید پالس و روتین مربوط به 275 پالس و 275*200 پالس بصورت نرم افزاری انجام شود و از واحد تولید شکل موج استفاده نشود، کدی شبیه به نمونه کد زیر را می توان برای وقفه سرریز در نظر گرفت:

                کد:
                ISR(TCC0_OVF_vect)
                {
                 static unsigned char x200=200;
                 static unsigned int x275=275;
                 PORTC_OUTTGL=PIN0_bm;
                 if((PORTC & PIN0_bm)==0)
                 {
                 if(--x275)return;
                 x275=275;
                 
                 // Do 275 pulses routine
                 
                 if(--x200)return;
                 x200=200;
                 // Do 275*200 pulses routine 
                 } 
                }


                در این کد در دفعات زوج که پالس به صفر بر می گردد، متغیر X275 کاهش می یابد و بعد از 275 پالس وارد مرحله بعد می شود که کدهای مربوط به عملیات مورد نظر برای این مرحله را می توانید در این بخش بنویسید. در ادامه هم متغیر x200 کاهش می یابد و بعد از 200*275 پالس، برنامه وارد مرحله بعد می شود که عملیات دلخواه و از جمله غیر فعال کردن تایمر به منظور اتمام پالس ها را می توانید در این بخش بنویسید.
                با تشکر از برنامه نوشته شده و عذر خواهی بابت در دسترس نداشتن اینترنت برای پاسخ
                یه سوال دیگه هم داشتم: این که اگر بخواهیم آنطوری که شما گفتید یک تایمر set کنیم که فرکانس 1.5khzرا در پین خاصی به ما بدهد و به وسیله ی یک کانتر دیگر تعداد پالس ها را بشماریم و مثلا بعد از هر 200 پالس به یک وقفه برود.
                در این صورت برنامه چگونه است؟
                سپاس برای راهنمایی های مفیدتان.

                دیدگاه


                  #9
                  پاسخ : تولید pwm بدون استفاده از وقفه

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

                  دیدگاه


                    #10
                    پاسخ : تولید pwm بدون استفاده از وقفه

                    لطفا می توانید مثالی را در این تاپیک قرار دهید

                    دیدگاه


                      #11
                      پاسخ : تولید pwm بدون استفاده از وقفه

                      اگر فرض کنیم سرریز TCC0 به عنوان کلاک TCC1 تنظیم شود و لازم باشد بعد از 200 کلاک، TCC1 سرریز شود:

                      کد:
                      EVSYS_CH0MUX=EVSYS_CHMUX_TCC0_OVF_gc;
                      TCC1_PER=199;
                      TCC1_CTRLA=TC_CLKSEL_EVCH0_gc;
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


                        #12
                        پاسخ : پاسخ : تولید pwm بدون استفاده از وقفه

                        نوشته اصلی توسط طراح
                        اگر فرض کنیم سرریز TCC0 به عنوان کلاک TCC1 تنظیم شود و لازم باشد بعد از 200 کلاک، TCC1 سرریز شود:

                        کد:
                        EVSYS_CH0MUX=EVSYS_CHMUX_TCC0_OVF_gc;
                        TCC1_PER=199;
                        TCC1_CTRLA=TC_CLKSEL_EVCH0_gc;
                        ایا امکان ست کردن منبع کلاک 2 قسمت از یک ewent هست
                        مثلا سریز تایمر tcc1=>evnt1
                        خروجی اونت منبع دو یا چند بخش دیگر
                        [move][img width=133 height=100]http://bargiri.persiangig.com/aks/0.306310001356499787_taknaz_ir.gif[/img][/move]

                        دیدگاه


                          #13
                          پاسخ : تولید pwm بدون استفاده از وقفه

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

                          دیدگاه

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