کتاب زبان اصلی راهنمای شیرها Skousen Valve Handbook
20 آذر, 1389
مبدل usb به سریال با قابلیت اتصال به میکرو کنترلر ft232RL
9 بهمن, 1389
کتاب زبان اصلی راهنمای شیرها Skousen Valve Handbook
20 آذر, 1389
مبدل usb به سریال با قابلیت اتصال به میکرو کنترلر ft232RL
9 بهمن, 1389

بازدیدها: 2

PWM مخفف (Pulse Width Modulation) یعنی مدولاسیون پهنای باند می باشد که در بعضی مواقع به آن (Pulse Duration Mode) نیز می گویند. در این مدولاسیون پهنای پالس تولیدی را می توان تحت کنترل داشت. از کاربردهای PWM می توان به کنترل دور موتورهای AC و DC و منابع تغذیه سوئیچینگ و … اشاره کرد.

برای استفاده و راه اندازی PWM باید بیت های WGM01 , WGM00 را از رجیستر TCCR0 که 4 حالت ایجاد می کنند را مطابق جدول زیر تنظیم کرد.

SET شدن TOV0 دربروزرسانی OCR0 درحد بالا مد عملکردWGM00WGM01حالت
ماکزیممآنی و فوری0xFFعادی000
حد پایینحد بالا0xFFPWM تصحیح فاز101
ماکزیممآنی و فوریOCR0مقایسه012
ماکزیممحد بالا0xFFPWM سریع113

در حالت 3 PWM سریع انتخاب شده و همانطور که در قسمت CTC توضیح دادیم رجیستر OCR0 به طور دائم با رجیستر TCNT0 مقایسه می شود و پس از برابر شدن بیت سریز مقایسه خروجی (OCF0) فعال شده و پایه OC0 مطابق با تنظیمات مربوطه تغییر وضعیت می دهد. همانطور که در جدول بالا مشاهده می کنید در حالت 3 شماره تا 0xFF ادامه می یابد و بعد از سریز تایمر TCNT0=0 خواهد شد و دوباره شماره ادامه داده می شود.

در حالت PWM سریع پایه OC0 در تایمر صفر دارای حالت های زیر می باشد که ما در برنامه می توانیم آنها را با توجه به نیازمان انتخاب کنیم:

  1. OC0 قطع باشد
  2. OC0 معکوس نشود.
  3. OC0 معکوس شود

نکته: توجه داشته باشید که در تایمر/کانتر 1و2 حالت های متفاوت دیگری وجود دارد.

فرکانس خروجی PWM را می توان از طریق رابطه زیر بدست آورد:

FPWM=(fclk_IO)/(N*256)

N ضریب تقسیم کلاک سیستم است و برابر با یکی از اعداد 1و8و32و64و128و256و1024 می باشد و fclk_IO هم همان فرکانس کریستال میکرو می باشد.

 @مثال1  برنامه ای بنویسید که یک موج PWM با عرض پالس 30% روی پایه OC0 ایجاد شود.

منظور از عرض 30% یعنی اینکه از 100% یک پالس کامل، مقدار 30% آن در وضعیت 1 باشد و 70% دیگر آن در وضعیت صفر باشد. که با یک تناسب ساده می توان عددی بدست آوردن و با گذاشت این عدد در OCR0 می توانیم به عرض 30% دست یابیم.

  void main(void){
     PORTB.3=0;
     DDRB.3=1;//OC0 OUT PUT
     TCNT0=0;
     OCR0=76;
     TCCR0=0x6D;// Clock value: 7.813 kHz & NON INVERT
     while (1);
    }

تنظیمات در Codewizard:

Clock Source: System Clock
Clock Salue: 7.813kHZ Mode:
Fast PWM top=ffh
Output: Non inverted PWM 0 Overflow Intrrupt 0 Compare Match Interrupt
Timer Value: 0h Compare: 0h
 

چون عدد OCR0 اعشاری شد پس پالس ما دقیقا 30% نخواهد بود که اگر این پالس را با دقت بالاتری نیاز داشته باشیم باید با استفاده از وقفه تایمر صفر اینکار را انجام داد.