به نام خدا!

سلام خدمت دوستان عزیز!

اینبار قصد دارم تا PWM رو توضیح بدم! انشالله که مفید باشه و به دردتون بخوره!!

امیدوارم بدونید PWM چیه! و اگر نمیدونید لینک زیر رو پیشنهاد میدم!

http://noise.blog.ir/post/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-PWM-27


خوب بریم سراغ بحثمون!

توی LPC1768 6 کانال PWM داریم. یعنی 6 تا پایه ی میکرو رو میتونیم جدا جدا PWM مربوط به خودش رو اعمال کنیم!

برای تنظیمات PWM باید کارهای زیر را دنبال کنیم!

  1. اولین کاری که میکنیم تعیین پین PWM هست که توسط رجیستر PINSEL انجام میشه!
  2. بعد تنظیم رجیستر TCR برای تنظیمات تایمر/کانتر از جمله ریست کردن و شروع شمارش!
  3. تنظیم رجیستر MCR برای زمانی که تایمر/کانتر (TC) با MR0 برابر شود! (که چه اتفاقی بیفته)
  4. تنظیم رجیستر PCR برای کنترل PWM که در کدام حالت (تک لبه یا دو لبه) کار کند و خروجی PWM را فعال کند!
  5. تنظیم رجیستر MR0 به عنوان دوره تناوب برای رجیستر های MR1-6 
  6. تنظیم رجیستر های MR1 تا MR6 برای دیوتی سایکل هر کانال
  7. تنظیم رجیستر LER برای ذخیره تنظیمات انجام شده روی MR0-6
  8. شروع شمارش تایمر کانتر!

معرفی رجیسترها!

رجیستر TCR (PWM Timer Control Register)
از این رجیستر برای تنظیمات تایمر/کانتر از جمله ریست کردن و شروع شمارش استفاده میشه!
بیت 0 : اگر یک شود رجیستر های TC و PC برای شمارش فعال میشوند!
بیت 1: نوشتن 1 در این بیت باعث ریست شدن TC  و PC میشوند

رجیستر MCR (PWM Match Control Register)
همونطور که از اسمش پیداست از این رجیستر برای انجام عملیات بعد از تساوی MR0 با TC استفاده میشود!
بیت 0: هنگامی که این دو رجیستر ( MR0 و TC) با یکدیگر برابر شوند. وقفه تولید میشود!
بیت 1: هنگامی که این دو رجیستر ( MR0 و TC) با یکدیگر برابر شوند. رجیستر TC ریست میشود!
بیت 2 : هنگامی که این دو رجیستر ( MR0 و TC) با یکدیگر برابر شوند. شمارش متوقف میشود!
بیت های بعدی به صورت مضاربی از 3 از رجیستر های MRX هستند! مثلا بیت های 3و4و5 برای برابری TC با MR1 هست و...

رجیستر PCR (PWM Control Register)
برای کنترل PWM استفاده میشود!
بیت 0و1 بدون استفاده هستند و اصلا کارشون نداریم و باید 0 بزاریم!
از بیت 2 تا 6 برای انتخاب حالت تک لبه و دو لبه استفاده میشه! یعنی اگر بیت 2 رو 1 کنیم PWM2 دو لبه میشه! و اگه 0 باشه تک لبه میشه! یه کثال دیگه! اگه بیت 6 رو یک کنیم دو لبه و اگه صفر باشه تک لبه میشه!
از بیت 9 تا 14 هم برای تعیین خروجی PWM استفاده میکنه!
بیت 9 برای فعال کردن خروجی PWM1 و بیت 14 برای فعال سازی PWM6 استفاده میشه (بین شون هم برای فعال سازی PWM2 تا PWM5 استفاده میشه)

رجیستر MR0
این رجیستر برای تعیین دوره تناوب MR1 تا MR6 استفاده میشه!

رجیستر LER (Latch Enable Register)
برای ذخیره تنظیمات انجام شده روی MR0-6 استفاده میشه! یعنی شما اگه MRx رو مقدار دهی کنید. تا این رجیستر مقدار دهی نشه هیچ تاثیری نمیزاره!
از بیت 0 تا 6 برای همین کاری که بالا گفتیم استفاده میشه!
بیت 0 برای MR0 و بیت 6 برای MR6 استفاده میشه!

اینم یه نمونه برنامه که port2.3 را PWM میکند!

#include "LPC17xx.h"

int main(){
SystemInit();

 /* Select PWM1 output on P2.3 */
 LPC_PINCON->PINSEL4 = 1<<4;      
   
                                       
	// ------------   PWM1 setting ---------------------
 LPC_PWM1->TCR = 0x01; /* reset PWM counter.The PWM Timer Control Register (PWMTCR)*/

 LPC_PWM1->MCR = 0x02;  /* setup match control to reset on MR0 */
 /* select single edge for PWM1.3 and enable PWM1.3 o/p */
 LPC_PWM1->PCR =  (1<<11) ; /* The PWM Control Registers  */
 LPC_PWM1->MR0 = 4095; // ال ای دی را کم نور میکند!
 LPC_PWM1->MR3 = 2048;/* setup PWM duty cycle  */
	
//LPC_PWM1->MR0 = 25000000;   // به صورت 1 هرتز کار میکند و در ثانیه یه بار خاموش و روشن میکند
 //LPC_PWM1->MR3 = 12500000; // 
	
 //--------------------------------------------------- 
 LPC_PWM1->LER = 0x04; /* enable LER */

 LPC_PWM1->TCR = 0x09;

}


توی کد بالا دو خط کامنت شده!
اون دو خط رو که از حالت کامنت بردارید و دو خط بالا رو روی کامنت بزارید! متوجه یه تغییر میشید! 
دیگه به جای اینکه نور LED کم باشه! کلا چشمک میزنه! زمانگیریش خیلی دقیقه و مثل تایمر عمل میکنه!

خوب شاید فک کنید دلیلش چیه که با کم کردن اون اعداد شیوه LED تغییر میکنه!
عکس زیر رو نگاه کنید...!
اگه درست به عکس زیر دقت کنید میبینید که PWM CLOCK کل سطح زیر رو گرفته! (مثلا توی مثال بالا کلاک PWM ما Cpuclk/4 است) بنابراین میشه 25 مگاهرتز یعنی که توی یک ثانیه 25 ملیون نوسان میکنه! حالا اگه ما MR0 رو هم 25 مگاهرتز بکنیم! دوره تناوب ما رو MR1 تعیین میکنه یعنی الان دوره تناوب ما 1 هست! و دیوتی سابکل هم برای MR1 پنجاه درصده!

اما شکل پائیین MR0 چند بار تکرار میشه مثلا اینجا هشت بار تکرار شده میتونیم بگیم تو این مثال چون PWM CLOCK ما 25 مگاهرتز هست پس تقریبا MR0 ما حدود 3 مگاهرتز هست) یعنی هر سه ملیون سیکل یک بار دوباره MR0 ریست میشه...!
توی MR1 هم دیوتی سایکل 50 درصده! و چون در ثانیه 8 بار تکرار میشه (یعنی توی هر ثانیه 8 بار برقش قطع و وصل میشه) ما کم نور میبینیم چون تا میاد روشن بشه خاموش میشه!
امیدوارم به دردتون خورده باشه!

فعلا...!
یا علی مدد...!