در این بخش مطالبی راجع به نحوه تشکیل موج PWM در یک میکروکنترلر 8 بیتی PIC ارئه میکنیم.
میکروکنترلر انتخاب شده در این بحث تراشه معروف PIC16F877A میباشد.
در اینجا فرض بر این است که از ماژول CCP1 استفاده میکنیم.
هر دو ماژول CCP برای تولید موج PWM فقط از تایمر 8 بیتی 2 استفاده میکنند. بنابر این چنانچه از هردو ماژول CCP برای تولید PWM استفاده گردد دوره تناوب هردو موج باهم برابر خواهد بود. قابل توجه است که تقریباً تمامی میکروکنترلر های 8 بیتی PIC قادر به تولید PWM با حداکثر وضوح 10 بیت هستند. در حالت 10 بیتی رجیستر CCPR1H شامل 8 بیت بالایی از موج PWM میباشد.
برای تولید موج PWM ابتدا باید رجیستر کنترلی CCP1CON مقدار دهی شود.

دو بیت CCPxX و CCPxY مربوط به دوبیت کم ارزش حالت PWM ده بیتی هستند. در صورتی که PWM ده بیتی نیاز باشد باید دو بیت کم ارزش در این دو بیت نوشته شوند. بیت CCPxY کم ارزش ترین بیت میباشد.

برای انتخاب حالت تولید PWM باید به هر دو بیت CCPxM3 و CCPxM2 مقدار 1 دهید.
در مد PWM مقدار Duty Cycle در رجیستر CCPR1L نوشته میشود. همانطور که قبلًا گفته شد برای حالت 10 بیتی دو بیت کم ارزش دردو بیت CCPxX و CCPxY نوشته میشوند. در این حالت رجیستر CCPR1H به عنوان بافر رجیستر CCPR1L عمل میکند. به طوری که وقتی مقدار Duty Cycle جدید در CCPR1L نوشته شود بلافاصله این مقدار در CCPR1H نیز بار میشود. در واقع Duty Cycle پالس از مقایسه میان رجیستر CCPR1H و رجیستر محتوای تایمر 2 یعنی TMR2 به وجود می آید. زمانی که مقدار تایمر ( TMR2 ) با رجیستر CCPR1H برابر شود سطح ولتاژ پین RC2/CCP1 که خروجی موج PWM میباشد به پائین برده میشود.
همچنین دوره تناوب یا فرکانس موج خروجی وابسته یه مقدار رجیستر PR2 و میزان Prescale تایمر 2 میباشد نکته قابل توجه این است که تایمر 2 یک سیکل بعد از تشخیص برابری با PR2 ریست میشود. بنابر این رابطه موجود برای محاسبه دوره تناوب به صورت زیر خواهد بود:
![]()