اطلاعیه

Collapse
No announcement yet.

مشکل با PWM در CCS

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

    مشکل با PWM در CCS

    سلام

    من این برنامه رو نوشتم تا وقتی پریود و دیوتی رو تغییر بدم تو خروجی واسم اون فرکانس ودیوتی مورد نظر واسه PWM رو تولید کنه اما تو پروتوس ازش جواب نمی گیرم
    مگه برای تنظیم دیوتی و فرکانس فرمولهای ما اینا نیستن
    Period = (PR2 + 1) * 4 * ( 1/xtal ) * prescaler
    duty cycle = value / [ 4 * (PR2 +1 ) ]
    خوب اینم برنامه می شه راهنمائی کنید

    include <16F877A.h>
    #FUSES HS,NOWDT,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT
    #use delay(clock=20000000)
    #include <math.h>
    void main(){
    long PR,period=0.0001,value,duty=0.5,k;
    //Period = (PR2 + 1) * 4 * ( 1/xtal ) * prescaler
    //duty cycle = value / [ 4 * (PR2 +1 ) ]
    PR=period / 4*((1/20000000)*16);

    PR= floor(PR);//round to low number
    value=duty*(4*(PR+1));
    value=ceil(value); //round to hight number
    while(true){
    setup_ccp1(CCP_PWM);
    set_pwm1_duty(value);
    setup_timer_2(T2_DIV_BY_16,PR,1);

    }
    }

    دوستان گفتن می شه از طریق ویزارد این کار ها رو کرد اما چه جوری؟ آیا می شه مدام توی برنامه افرکانس و دیوتی رو از طریق ویزارد تغییر داد؟

    با تشکر

    #2
    پاسخ : مشکل با PWM در CCS

    با سلام
    دوست عزیز همون طوری که خودتون گفتین واسه بدست آوردن زمان وظیفه باید از فرمول duty=value/[4*(PR2+1 استفاده کنیم ولی برای بدست آوردن پریود نیازی به محاسبه نیست! شما وقتی دستور setup_timer_2(T2_DIV_BY_16,X, 1) را تایپ میکنید با استفاده از x میتوانید پریود یا همان دوره تناوب خودتون رو تعیین کنید که مقدار x میتواند بین 0 تا 255 تغییر کند. درضمن یه نگاهی به جدول زیر بنداز, چون من خودم با این جدول معنی واقعی PWM رو فهمیدم.

    موفق باشید

    دیدگاه


      #3
      پاسخ : مشکل با PWM در CCS

      سلام

      من می خواهم مدام از طریق یه گیرنده که با پرتکل SPI میکرو ارتباط داره یه سری عدد رو بدم به میکرو که میکرو با اون پالس های PWM با فرکانس ودیوتی مختلف بسازه. اما مسئله اینه که این کار یه کم با توجه به جدولی که در پاسخ آقای SA3ID هست یه کم مشکله آخه باید Prescale رو تغییر داد که این کار بعد از اولین باری که ست کردی دیگه ممکن نیست. این جوری بگم که ایدم اینه که یه برنامه بنویسم که با چنتا عدد که بهش میدی خودش بفهمه که مثلا فرکانس 2KHz با دیوتی 20 در صد رو تولید کنه که گیر کردم. نظری پیشنهادی کمکی .... ندارین؟

      دیدگاه


        #4
        پاسخ : مشکل با PWM در CCS

        راستی فرق این دستورات واسه راه اندازی PWM با اون دستورات چیه؟
        این دستورات
        setup_ccp1(CCP_PWM);
        set_pwm1_duty(value);
        setup_timer_2(T2_DIV_BY_16,PR,1
        ///////////////////////////////////////
        اون دستورات
        setup_power_pwm(modes, postscale, time_base, period, compare, compare_postscale, dead_time
        set_power_pwm_override(pwm, override, value)
        setup_power_pwm_pins(module0,module1,module2,modul e3)

        دیدگاه


          #5
          پاسخ : مشکل با PWM در CCS

          دوست عزیز تا اونجایی که من دونستم مشکل شما در دستور set_timer_2 هست و شما میخواین هم پریود و هم پرسکل رو تغییر بدین, البته تغییر مقدار پریود کاره سختی نیست ولی مشکل اصلی به Prescale برمیگرده. حالا چاره کار چیه؟ شما باید دست به دامن دیتاشیت میکروتون بشین!! :surprised: من در اینجا میکروی PIC16F877A رو در نظر میگیرم. جهت شناختن مکان ریجسترهای PR2=Period Register و T2CON=Time2 Control Register در CCS باید با دستور #byte آنها را فراخوانی کنیم, حال این سوال پیش میاید که ما چگونه محل دقیق ریجسترها را در حافظه پیدا کنیم؟ برای اینکار باید در دیتاشیت میکرو سراغ SFR=SPECIAL FUNCTION REGISTER بگردیم و در این قسمت است که ما آدرس دقیق ریجستر رو میتونیم پیدا کنیم. لطفا به شکلهای زیر توجه کنید:



          تا اینجا شما فقط مکان ریجسترها رو معرفی کردین. بعده این نوبت به مقدار دهی این ریجسترها میرسد. برای ریجستر پریود میتوانیم عددی بین 0 تا 255 رو به صورت باینری یا دسیمال و یا هگزدسیمال بدهیم ولی برای مقدار دهی ریجستر T2CON باید این مطالب رو بدونید:


          حال با توجه به شکل بالا به توضیح بیتها میپردازیم. البته این مطالب رو من از دیتاشیت میگم و اگه نکته گنگی بود به بزرگیه خودتون ببخشید :smile:
          Bit7: این بیت بی اثر بوده همیشه مقدار صفر را برمیگرداند
          Bit6-Bit3: با این بیتها شما میتوانید مقدار Postscale را از 1 تا 16 تنظیم کنید.
          Bit2: با این بیت شما تایمر2 را فعال میکنید.
          Bit1-Bit0: با این دو بیت شما مقدار Prescale را تعیین میکنید. Prescale میتواند اعداد 1 4 و 16 را شامل شود.
          1X= پریسکل 16
          01= پریسکل 4
          00= پریسکل 1
          حال شما با دانستن این موارد به سادگی میتوانید از شر دستور set_timer_2 خلاص شوید. درضمن من برنامه ای PWM را به شکل زیر تغییر دادم


          موفق باشید

          دیدگاه


            #6
            پاسخ : مشکل با PWM در CCS

            نوشته اصلی توسط masiha308
            راستی فرق این دستورات واسه راه اندازی PWM با اون دستورات چیه؟
            این دستورات
            setup_ccp1(CCP_PWM);
            set_pwm1_duty(value);
            setup_timer_2(T2_DIV_BY_16,PR,1
            ///////////////////////////////////////
            اون دستورات
            setup_power_pwm(modes, postscale, time_base, period, compare, compare_postscale, dead_time
            set_power_pwm_override(pwm, override, value)
            setup_power_pwm_pins(module0,module1,module2,modul e3)
            با سلام. من توی فرومی دیدم که نوشته بود:
            دستورات قسمت اول همان کارهای عادی مربوط به ماژول CCP را انجام میدهند ولی دستورات قسمت دوم دارای امکانات بیشتری میباشد و مخصوص طراحی موتور کنترلر هست. به احتمال زیاد این دستورات مربوط به میکروهایی است که دارای سخت افزار ویژه ی هستن مثل dsPIC33F4012

            موفق باشید

            دیدگاه


              #7
              پاسخ : مشکل با PWM در CCS

              نوشته اصلی توسط masiha308
              راستی فرق این دستورات واسه راه اندازی PWM با اون دستورات چیه؟
              این دستورات
              setup_ccp1(CCP_PWM);
              set_pwm1_duty(value);
              setup_timer_2(T2_DIV_BY_16,PR,1
              ///////////////////////////////////////
              اون دستورات
              setup_power_pwm(modes, postscale, time_base, period, compare, compare_postscale, dead_time
              set_power_pwm_override(pwm, override, value)
              setup_power_pwm_pins(module0,module1,module2,modul e3)
              دستورات اول مربوط به ماژول إ¾إ¾CCP هست و دستورات دوم مربوط ECCP به ماژول هستش که مخفف Enhanced Capture Compare PWM می باشد .

              دیدگاه


                #8
                پاسخ : مشکل با PWM در CCS

                سلام
                خوب آقای ایجی این ECCP بدر چی می خوره؟
                راستی کسی فرفف SSP وMSSP رو می دونه ؟SSP=serial synchronos port و MSSP=master serial ...

                دیدگاه


                  #9
                  پاسخ : مشکل با PWM در CCS

                  ماژول ECCP اگر در دو مد capture و compare پیکربندی بشه تقریبا شبیه ماژول CCP عمل میکنه . عمده ترین تفاوتش در مد PWM ظاهر میشه . توسط ECCP در بعضی از مدل های سری 18 میشه پین خروجی pwm رو خود کاربر تعیین کنه . قابلیت تعیین پلاریته خروجی ، auto shutdown و auto restart هم به آن اضافه شده . چهار مد کاری داره به نام های تک خروجی ، نیم پل ، تمام پل Forward و تمام پل Reverse .
                  من خودم تاحالا با این ماژول کار نکردم به همین خاطر در موردش اطلاعات زیادی ندارم . همین چند خط رو هم از دیتاشیت فهمیدم . توصیه میکنم شما هم به دیتاشیت مراجعه کنید که کاملترین مرجع هستش .
                  موفق باشید .

                  دیدگاه

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