تولید سیگنال PWM با استفاده از تایمرهای AVR:
در میکروکنترلرهای AVR، سیگنال های PWM توسط تایمرها تولید می شوند. دو روش برای تولید PWM از تایمرها وجود دارد:
در ادامه این موارد را شرح می دهیم.
تولید PWM سریع:
ما از ساده ترین تایمر، یعنی TIMER0 برای تولید PWM استفاده می کنیم. بنابراین یک شمارنده 8 بیتی داریم که از 0 تا 255 شمارش می کند و سپس روی 0 و غیره تنظیم می شود. این را می توان به صورت شکل زیر نشان داد.
دوره به تنظیمات مقسم بستگی دارد. در حال حاضر برای تولید PWM در کدویزن از این توالی شمارش از OCR0 (مقایسه خروجی رجیستر صفر) استفاده می شود (صفر به دلیل اینکه برای TIMER0 است و تعداد بیشتری از آن ها برای TIMER1 و TIMER2 وجود دارد).
می توانیم هر مقداری بین 0 تا 255 را در OCR0 ذخیره کنیم. به عنوان مثال، 64 را در OCR0 ذخیره می کنیم که به صورت شکل زیر نشان داده می شود (خط قرمز).
وقتی TIMER0 برای حالت PWM سریع پیکربندی می شود، در حالی که تایمر در حال شمارش است، هر زمان که مقدار شمارنده TIMER0 با مقدار موجود در رجیستر OCR0 مطابقت داشته باشد، پین خروجی Low یا 0 می شود و هنگام شمارش مجدد دوباره از 0 شروع می شود و پس از آن، پین دوباره SET خواهد شد (VCC).
این موضوع در شکل زیر نشان داده شده است. این پین OC0 نام دارد و می توانید آن را در نقشه پین ATmega32 پیدا کنید.
در شکل بالا می بینید که موجی از چرخه وظیفه 25٪ = 64/256 با تنظیم OCR0 روی 64 تولید می شود. می توانید OCR0 را روی هر مقداری تنظیم کرده و یک PWM چرخه وظیفه OCR0/256 را به دست آورید.
هنگامی که آن را روی 0 تنظیم کنید، 0٪ چرخه وظیفه را دریافت می کنید، در حالی که اگر آن را روی 255 قرار دهید، 100٪ خروجی چرخه وظیفه را خواهید داشت.
بنابراین با تغییر چرخه کاری می توانید خروجی ولتاژ آنالوگ را از پین OC0 دریافت کنید.
در حالت معکوس، مقدار پین OC0 معکوس مقدار فوق است. بنابراین هرگاه مقدار شمارنده TIMER0 کمتر از مقدار OCR0 باشد، پین OC0 روی LOW است، در غیر این صورت HIGH خواهد بود. می توانید حالت معکوس یا غیرمعکوس را در قسمت "Output" در CodeWizard AVR انتخاب کنید.
حالت های معکوس و غیرمعکوس دارای چرخه های کاری متفاوتی به صورت زیر است:
dinv + dnon-inv = 100%
و خواهیم داشت:
tout = ttimer = 256 × tclock
تولید PWM تصحیح فاز:
این حالت بسیار شبیه حالت سریع PWM است، با این تفاوت که هر زمان که مقدار تایمر به حداکثر مقدار خود رسید، به جای پاک کردن مقدار تایمر، به سادگی شروع به شمارش معکوس می کند.
مقدار پین فقط زمانی تغییر می کند که مقدار OCR0 با شمارنده TIMER0 مطابقت داشته باشد.
در اینجا، داریم:
tout = ttimer = 2 × tclock × OCR
و
fout = fclock / (2 × OCR)
در ادامه، روش تنظیم تایمر و PWM در کدویژن را شرح می دهیم.