اطلاعیه

Collapse
No announcement yet.

PWM در CCS+ درخواست کمک

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    PWM در CCS+ درخواست کمک

    سلام
    من می خوام یک موج PWM تولید کنم و مطالب زیر رو هم بلدم اما ....
    در تولید موج PWM دو فاکتور اساسی نقش دارند
    1) دوره تناوب (پریود)
    2) زمان وظیفه(دیوتی سایکل)
    برای ساخت این موج با کامپایلر CCS دستورات زیر به کار برده می شود .
    1.setup_ccpX()
    2.set_pwmX_duty()
    3.set_power_pwm_override()
    4.set_power_pwmx_duty()
    5.setup_power_pwm()
    6.setup_power_pwm_pins()
    اما وقتی help نرم افزار رو خوندم گیج شدم چون نفهمیدم برای اینکه مثلا بخوام یک موج با دیوتی 50% یا 40 یا هر چی داشته با شم و با فرکانس تکرار 20 هرتز باید چه کار کنم میشه کمک کنین؟
    تو یکی از تاپیک ها آقای عبدی این فایل رو قرار داده بودن ولی بازم از برنامش هیچی نفهمیدم :

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

    #2
    پاسخ : PWM در CCS+ درخواست کمک

    در CCS اصول تولید PWM به این صورته :
    اول توسط دستور SETUP_CCPx ، مازول CCP رو در مد PWM پیکربندی میکنید.
    دوم توسط دستور SETUP_TIMER_‎2 تایمر 2 رو پیکربندی میکنید. قابل ذکر میباشد که فرکانس موج خروجی توسط پارامتر های مربوط به تایمر2 تعیین میشه.
    سوم توسط دستور SET_PWMx_DUTY نیز دیوتی سایکل موج خروجی رو تعیی میکنیم.
    دوست عزیز به شما توصیه میکنم برای تنظیمات کاملا دقیق و بی دردسر، از WIZARD نرم افزار CCS استفاده کنید.

    دیدگاه


      #3
      پاسخ : PWM در CCS+ درخواست کمک

      در CCS اصول تولید PWM به این صورته :
      اول توسط دستور SETUP_CCPx ، مازول CCP رو در مد PWM پیکربندی میکنید.
      دوم توسط دستور SETUP_TIMER_‎2 تایمر 2 رو پیکربندی میکنید. قابل ذکر میباشد که فرکانس موج خروجی توسط پارامتر های مربوط به تایمر2 تعیین میشه.
      سوم توسط دستور SET_PWMx_DUTY نیز دیوتی سایکل موج خروجی رو تعیی میکنیم.
      دوست عزیز به شما توصیه میکنم برای تنظیمات کاملا دقیق و بی دردسر، از WIZARD نرم افزار CCS استفاده کنید.

      دیدگاه


        #4
        پاسخ : PWM در CCS+ درخواست کمک

        در CCS اصول تولید PWM به این صورته :
        اول توسط دستور SETUP_CCPx ، مازول CCP رو در مد PWM پیکربندی میکنید.
        دوم توسط دستور SETUP_TIMER_‎2 تایمر 2 رو پیکربندی میکنید. قابل ذکر میباشد که فرکانس موج خروجی توسط پارامتر های مربوط به تایمر2 تعیین میشه.
        سوم توسط دستور SET_PWMx_DUTY نیز دیوتی سایکل موج خروجی رو تعیی میکنیم.
        دوست عزیز به شما توصیه میکنم برای تنظیمات کاملا دقیق و بی دردسر، از WIZARD نرم افزار CCS استفاده کنید.

        دیدگاه


          #5
          پاسخ : PWM در CCS+ درخواست کمک

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

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

          include <16F877A.h>#
          #FUSES HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT
          #use delay(clock=20000000)
          void main(){
          setup_timer_2(T2_DIV_BY_1,255,1);
          setup_ccp1(CCP_PWM);
          set_pwm1_duty(512);
          }
          اما مسئله ای که هست اینه که وقتی از دستور setup_timer_2( ) استفاده میشه .این گزینه ها را خواهیم داشت :
          setup_timer_2 (mode, period, postscale)
          mode may be one of:
          • T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
          period is a int 0-255 that determines when the clock value is reset,
          postscale is a number 1-16 that determines how many timer overflows before an interrupt: (1 means once, 2 means twice, and so on).

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

          مشکل دیگه اینه که من میخواهم از این PWM واسه شبیه سازی DAC استفاده کنم واسه همین نیاز دارم که فرکانس و پریود رو مدام تغییر بدم. واسه همین نمیتونم از PIC WIZARD استفاده کنم.وقتی برنامه بالا رو تو یه حلقه FOR قرار دادم وعدد مربوط به DUTY رو در دستور set_pwm1_duty(512 تغییر دادم اتفاقی تو پروتوس نیفتاد و همون مقدار قبلی رو نشون داد . به نظر شما مشکل از کجاست؟

          با تشکر

          دیدگاه


            #6
            پاسخ : PWM در CCS+ درخواست کمک

            در مورد فرکانس خروجی این فرمولشه :
            period=(Tosc*4)*(tmr2 prescale value)*(pr2+1)

            دیدگاه


              #7
              پاسخ : PWM در CCS+ درخواست کمک

              salam migam in kode ro mishe ye negah ****d bebinid moshkelesh kojast?

              akhe too protos dorost kar nemikone vali benazaram ke moshkeli nadashte bashe
              too in kode faghat duty cycle ro taghir midim ke vaghti sabet bashe protus bash moshkeli nadare vali vaghti too halghe miyad dorost kar nemikone
              mibakhshin ke fingilish neveshtam computeram ye dafe ghati kard.

              #include <16F877A.h>
              #FUSES HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT
              #use delay(clock=20000000)
              #include <math.h>
              void main(){
              int i=0;
              do {
              setup_timer_2(T2_DIV_BY_1,255,1);
              setup_ccp1(CCP_PWM);
              set_pwm1_duty(i);
              i=i+15;
              }while(i==255);

              دیدگاه


                #8
                پاسخ : PWM در CCS+ درخواست کمک

                سلام دوست عزیز. چند وقت پیش منم مجبور شدم در مورد PWM کار کنم که آخر سر به این مطالب و نتایج رسیدم. امیدوارم که به دردت بخوره :biggrin:

                اول از همه باید مراحل تولید پالس رو بدونی:
                1. تنظیم زمان تناوب توست ریجستری PR2
                2. تنظیم زمان وظیفه توسط ریجستری CCPR1L و CCP1CON.4 و CCP1CON.5
                3. پیکر بندی پایه CCP1 به صورت خروجی با استفاده از ریجستری TRISx
                4. تنظیم پرسکالر تایمر 2 توسط ریجستری T2CON
                5. پیکر بندی ماژول CCP در حالت PWM توسط ریجستری CCP1CON

                کل PWM در شکل زیر خلاصه شده :


                در این شکل Period همان ریجستر PR2 میباشد که به صورت 8 بیتی است که مقدار آن از صفر تا 255 قابل تغییر است. Duty Cycle همان زمانی است که پالس ما در حالت یک قرار میگیرد و مقدار آن با درصد بیان میشود و در کامپایلر ccs با دستور (مقدار)set_pwm1_duty تعریف میشود. فرمول بدست آوردن مقدار بر حسب درصد به شکل زیر است:


                از لینک زیر میتونی پروژه ی رو که خودم روش کار کردم رو امتحان کنی مطمئنم که بهت کمک میکنه:

                http://www.4shared.com/file/opgvDsTJ/PWM.html


                نوشته اصلی توسط masiha308
                mibakhshin ke fingilish neveshtam computeram ye dafe ghati kard.

                #include <16F877A.h>
                #FUSES HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT
                #use delay(clock=20000000)
                #include <math.h>
                void main(){
                int i=0;
                do {
                setup_timer_2(T2_DIV_BY_1,255,1);
                setup_ccp1(CCP_PWM);
                set_pwm1_duty(i);
                i=i+15;
                }while(i==255);
                اولا احتیاجی به فراخوانی هدر math نداری.
                دوما برنامه ی که شما نوشتین به قدری سریع انجام میشه که شما نمیتونید ببینید!!
                سوما شما Period رو چند گرفتین؟ تو برنامه ای که من نوشتم پریود رو PR2=255 گرفتم

                نکته: برای درک بهتر PWM در فایل ضمیمه شده بهتون پیشنهاد میکنم که این مقادیر رو تغییر بدین و تغییرات رو روی اسیلوسکوپ مشاده کنید.
                1. مقدار PR2
                2. مقدار متغییر duty
                3. مقدار T2_DIV_BY_x از 16 به 4 و 1

                موفق باشید

                دیدگاه


                  #9
                  پاسخ : PWM در CCS+ درخواست کمک

                  سلام

                  با تشکر از راهنمایی هاتون میشه یه چیزی به این برنامه اضافه کنید تا من تغییرات رو آهسته ببینم.

                  دیدگاه


                    #10
                    پاسخ : PWM در CCS+ درخواست کمک

                    یه delay ‎ قرار بده تو حلقه. درضمن فکر کنم شرط حلقه اشتباه باشه!!

                    دیدگاه


                      #11
                      پاسخ : PWM در CCS+ درخواست کمک

                      سلام
                      این برنامه منه به Delay ای که قرار دادم توجه کنید هر چند که دارم جواب رو کند میبینم ولی بازم خیلی سریعه
                      نمیشه کندترش کرد.
                      #include <16F877A.h>
                      #FUSES HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT
                      #use delay(clock=20000000)
                      #include <math.h>
                      long i=0;
                      void main(){
                      while(true){
                      setup_ccp1(CCP_PWM);

                      set_pwm1_duty(i);
                      setup_timer_2(T2_DIV_BY_16,255,1);
                      i=i+15;
                      delay_ms(200000000000000000000);
                      }
                      }

                      نکته بعد این که من اگه خروجی این پایه رو به یه RC filter بدم میشه مبدل دیجیتال به آنالوگ رو باهاش شبیه سازی کرد حالا مثلا اگه بخوام سینوسی تولید کنم کسی کار کرده بدونه من تو چه زمان هایی باید دامنه های سینوسی رو بجای duty بزارم
                      اگه منبع هم خواستین
                      http://www.abov.co.kr/data/appnote/AN110.pdf

                      دیدگاه

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