سلام
اگه از pwm برای راه اندازی موتور استفاده میکنید ، سرعت موتور ، رابطه ی متسقیم با ولتاژ اعمالی به موتور و rpm موتور داره و از روی pwm نمیشه به صورت مسقیم اون رو محاسبه کرد .
برای راه اندازی pwm در کامپایلر ccs باید مراحل زیر رو طی کنید :
در میکروکنترلر های pic برخلاف میکروکنترلر های avr واحد pwm از تایمر و کانتر ها مجزا هست و با نام CCP شناخته میشه . CCP میتونه در مد های capture, compare و PWM پیکربندی بشه .
در مد capture/compare فرکانس کاری CCP با مقدار دهی تایمر های 1 یا سه تعیین میشه .
در مد pwm فرکانس کاری ccp با مقدار دهی تایمر 2 یا 4 تعیین میشه .
بسته به نوع میکروکنترلر و تعداد ماژول های CCP ممکنه از تایمر های دیگه هم استفاده بشه .
تعیین فرکانس :
میکروکنترلر های pic معمولا دارای 2 تا 6 واحد CCP هستند ، CCP معمولا از تایمر 2 یا 4 برای عمل کرد در مد pwm استفاده میکنند ، با مراجعه به دیتاشیت میکروکنترلر مورد نظرتون میتونید شماره دقیق تایمر رو بدست بیارید . برای مثال میکروکنترلر pic18f8720 دارای Five Capture/Compare/PWM (CCP) modules هست و کاربر میتونه از تایمر 2 یا 4 برای تعیین فرکانس ccp استفاده کنه ( اطلاعات بیشتر در بخش 13 و 15 دیتاشیت میکروکنترلر ) .
قبل از هر کاری باید ccp رو در مد pwm راه اندازی کنید :
و بعد تایمر 2 رو مقدار دهی کنید تا فرکانس pwm مشخص بشه :
setup_timer_2 (mode, period, postscale)
فرکانس pwm از رابطه محاسبه میشه ، و شما میتونید با جستوجوی دستورات بالا در راهنمای ccs اطلاعات بیشتری رو در موردشون بدست بیارید :
کد:
(1/clock)*4*t2div*(period+1)
مثال :
کد:
#use delay(clock=10000000)
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_1, 127, 1); // (1/10000000)*4*1*128 = 51.2 us or 19.5 khz
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_4, 127, 1);//(1/10000000)*4*4*128 = 204.8 us or 4.9 khz
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 127, 1); // (1/10000000)*4*16*128= 819.2 us or 1.2 khz
در بالا سه تا مثال برای پیکربندی pwm وجود داره که توضیحات مربوط بهش در کامنت های مقابلش اورده شده .
تعیین دیوتی سایکل :
برای تعیین مقدار دیوتی سایکل از دستور زیر استفاده میشه :
کد:
set_pwm1_duty (value)
که مقدار value از فرمول زیر بدست میاد :
کد:
duty cycle = value / [ 4 * (PR2 +1 ) ]
در این رابطه PR2 حداکثر مقداری هست که تایمر 2 میشمره ( مقدار period در دستور پیکربندی تایمر ) .
مثال :
کد:
// For a 20 mhz clock, 1.2 khz frequency,
// t2DIV set to 16, PR2 set to 200
// the following sets the duty to 50% (or 416 us).
long duty;
duty = 408; // [408/(4*(200+1))]=0.5=50%
set_pwm1_duty(duty);