PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : [سوال] ساخت pwmدقیق



Raha323
15-01-2014, 10:52
با سلام
دوستان من چطور میتونم یک PWM دقیق داشته باشم طریقه محاسبه کردن اش هم بلد نیستم ممنون میشم کمکم کنید
من آی سی18F8720 رو دارم و کریستال ام هم 14745600 میباشد و مثلا میخوام 1درجه بر ثانیه سرعت خروجیم ست بشه چه راه حلی وجو داره
محاسبه خود duty به چه صورت است
من PWM رو راه اندازی کردم ولی کنترل دست من نیست حتی اعداد زیر صفر هم ست میکنم تو duty یه سرعتی میگیره
; ( set_pwm2_duty(0.06
; ( set_pwm2_duty(26
; ( set_pwm2_duty(20
; ( set_pwm2_duty(300
همه اینا یه سرعتی میشه ولی من میخوام محاسبه کنم
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DIV_BY_16, 243 , 1);




setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
دوستان خواهشا کمک کنید
از اینم چیزی سر در نیاوردم در helpخود PCW


Examples:
// For a 20 mhz clock, 1.2 khz frequency,
// t2DIV set to 16
// the following sets the duty to 50% (or 416 us).

long duty;

duty = 512; // .000416/(16*(1/20000000))
set_pwm1_duty(duty);
:(

1nafar
16-01-2014, 14:28
سلام
اگه از 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 راه اندازی کنید :

setup_ccp1 (mode)
و بعد تایمر 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);