You are on page 1of 37

YU CU:

Dng PIC 16F877A iu khin 1 ng c DC quay thun, quay nghch, dng nt nhn iu khin, c th thay i tc dng phng php iu khin rng xung, dng ngn ng C.

PP IU KHIN PWM:
iu khin tc ng c DC ngi ta c th dng nhiu phng php khc nhau trong c mt phng php ht sc quan trng v thng dng l phng php iu ch rng xung kch (PWM), c ngha l thay i rng xung kch iu khin linh kin ng ngt (SCR hay Transistor), t iu khin tc ng c. B PWM c th to ra t cc linh kin in t.

Vi yu cu dng PIC16F877A iu khin ng c quay thun-nghch v thay i tc , ta s dng b iu ch rng xung (PWM) tch hp sn bn trong PIC vi 2 ng ra xung ti hai chn CCP1(17) v CCP2 (16) . Ti cc chn ny khi hot ng s xut chui xung vung , rng iu chnh c d dng. Xung ra ny dng to tn hiu ng ngt Trasistor trong mch ng lc, vi rng xc nh s to ra mt in p trung bnh xc nh. Thay i rng xung s thay i in p trung bnh v do thay i c tc ng c.

c th s dng c b PWM trc ht n phi c khi to ch PWM bng lnh: setup_ccpx (CCP_PWM) vi x = 1,2 B PWM hot ng phi c s h tr ca Timer 2 , y l Timer 8-bit c b chia trc. Ng vo xung Clock (=fosc/4) c tu chn h s chia trc l: 1:1, 1:4, 1:16 c la chn bng cc bit iu khin T2CKPS1:T2CKPS2.

Lnh khi to Timer2 v cng l to chu k xung cho b PWM l: setup_timer_2(mode,period,postscale) vi: - Mode c th chn mt trong cc hnh thc sau: T2_DISABLED, T2_DIV_BY_1 T2_DIV_BY_4, T2_DIV_BY_16 - Period l mt s nguyn (0 255) xc nh khi no th xung clock reset. - Postscale l s (116) xc nh c bao nhiu ln reset trc mt ngt: 1 c ngha l 1 ln, 2 ngha l 2 ln Chc nng ca lnh ny l to ra chu k xung v c tnh nh sau: T = (1/fosc)*4*t2_div*(period+1)

Xt v d: Lnh: setup_timer_2(T2_div_by_4,0xc0,2) vi thch anh 10MHz , Timer2 s tng mi 1.6us ( 4*4*1/10e6), s b trn mi 307.2us (1.6*192), v s b ngt mi 714.4us ( 307.2*2). y chu k xung l T = (1/10e6)*4*4*(192+1) = 153.6us. C th trong bi, mun to chu k xung 1ms ta khi to Timer2 nh sau: setup_timer_2(T2_div_by_16,154,1) Khi y T= (1/10e6)*4*16*(154+1) = 0.992ms = 1ms.

Tip theo, to xung bng lnh: set_pwmx_duty(value) vi x = 1, 2 - value l bin hoc hng ,gi tr 8 hoc 16 bit. Lnh ny dng set duty trong ch PWM .N ghi 10 bit gi tr vo thanh ghi CCPx. Nu gi tr ch l 8 bit th n t dch ln vi 2 bit zero v tr LSB 10 bit np vo CCPx . Gi tr ny xc nh lng thi gian tn hiu PWM mc cao trong sut mi chu k xung. Thi gian duty c xc nh l: value*(1/clock)*t2_div vi t2_div l s chia t trc ca Timer2.

Xt v d trong bi: duty = 620; set_pwm1_duty(duty); vi thch anh 10MHz,gi s t2_div_16, ta c thi gian duty l: 620*16*(1/10e6) = 0.992ms. Gii thch thm: Thi gian duty l thi gian xung (mc cao) ca chu k xung, minh ho: Nh vy, trong bi ta c chu k xung l 0.992ms, ng c quay vi tc cc i th thi gian duty = chu k xung bi v khi y gn nh ng ra b PWM ch l mc 1.

Minh ho:
Thi gian duty

Chu k xung

PHN CNG:

VI IU KHIN PIC16F877A:
Cc nt nhn bao gm : - OFF : kt ni vi chn : 33 RBO/INT - FOR : kt ni vi chn : 34 RB1 - REV : kt ni vi chn : 35 RB2 - T1 : kt ni vi chn : 36 RB3/PG - T2 : kt ni vi chn : 37 RB4 - T3 : kt ni vi chn : 38 RB5 - T4 : kt ni vi chn : 39 RB6/PGC - T5 : kt ni vi chn : 40 RB7/PGD Ngun 5V, thch anh 20MHz.

MCH IU KHIN NG C DC:


Mch gm cc Transistor, in tr v Diode. Nguyn l nh sau : - Khi A, B cng mc 1 : Q1, Q2 dn lm cho Q5, Q6 dn, Q3, Q4 khng dn, in p 2 cc ng c bng nhau nn ng c ng yn. - khi A, B cng mc thp : Q1, Q2 khng dn lm cho Q3, Q4 dn, Q5, Q6 khng dn, ng c ng yn. - Khi A mc cao, B mc thp : Q4, Q5 dn, ng c quay. - Khi B mc cao, A mc thp : Q3, Q6 dn, ng c quay theo chiu ngc li.

LU :
Begin
Khi to cu hnh 2 b PWM

Nhn nt chy thun S Nhn nt chy nghch

X l bin chy thun

X l bin chy nghch

Nhn nt tc 1
S Nhn nt tc 2 S Nhn nt tc 3 S Nhn nt tc 4 S

X l bin tc

Nhn nt tc 5 S Nhn nt OFF S iu khin ng c quay

Ngng ng c

End

Chng trnh:
#include <16F877A.h> #include <def_16f877a.h> #fuses NOWDT,PUT,HS,NOPROTECT,NOLVP #use delay(clock=10000000) #use fast_io(b)

#define #define #define #define #define #define #define

tocdo0 0 //toc do bang 0 td_macdinh 80 //toc do mac dinh tocdo1 124 //1/5 toc do cuc dai tocdo2 248 //2/5 toc do cuc dai tocdo3 372 //3/5 toc do cuc dai tocdo4 496 //4/5 toc do cuc dai tocdo5 620 //toc do cuc dai

int16 duty1=0; int16 duty2=0; int8 bientocdo=0; int1 bienthuan=0; int1 biennghich=0;

void main()

//bo PMW1 dk dco quay thuan { //bo PMW2 dk dco quay nghich set_tris_b(0x0ff); //khoi tao port B la port nhap setup_ccp1(CCP_PWM); //khoi tao bo PWM1 setup_ccp2(CCP_PWM); //khoi tao bo PWM2

setup_timer_2(T2_div_by_16,154,1); //tao chu ky xung 1ms //(1/clock)*4*t2div*(period+1) //(1/10e6)*4*16*(154+1)=1e-3=1ms

set_pwm1_duty(duty1); set_pwm2_duty(duty2); //gia tri duty cua PWM duoc tinh theo cong thuc duty1*t2div/clock //khoi tao duty=0 -> tat dong co

while(true) { if (!bit_test(portb,1)) { duty1=tocdo0; duty2=tocdo0; //neu nhan phim FO : chay thuan

set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de set_pwm2_duty(duty2); //tat dong co delay_ms(1000); //delay 1s de giam quan tinh dong co bienthuan=1; biennghich=0; goto next; }

if (!bit_test(portb,2))

//neu nhan phim RE : chay nghich

{
duty1=tocdo0; duty2=tocdo0;

set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de set_pwm2_duty(duty2); //tat dong co delay_ms(1000); //delay 1s de giam quan tinh dco bienthuan=0; biennghich=1; goto next; }

if (!bit_test(portb,3)) //nhan phim toc do 1 { bientocdo=1; goto next; }

if (!bit_test(portb,4)) //nhan phim toc do 2 { bientocdo=2; goto next; }

if (!bit_test(portb,5)) //nhan phim toc do 3 { bientocdo=3; goto next; }

if (!bit_test(portb,6)) //nhan phim toc do 4 { bientocdo=4; goto next; }

if (!bit_test(portb,7)) //nhan phim toc do 5


bientocdo=5; next: if (!bit_test(portb,0)) { duty1=tocdo0; duty2=tocdo0;

//neu nhan phim OFF

set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de set_pwm2_duty(duty2); //tat dong co bienthuan=0; biennghich=0; bientocdo=0; //xoa bien toc do }

if (bienthuan) { duty2 = tocdo0; switch (bientocdo) { case 1: duty1= tocdo1; break; case 2: duty1= tocdo2; break;

case 3: duty1= tocdo3; break; case 4: duty1= tocdo4; break; case 5: duty1= tocdo5; break; default : duty1 = td_macdinh; break;

set_pwm1_duty(duty1); //cho dco chay thuan set_pwm2_duty(duty2); } if (biennghich) { duty1 = tocdo0; switch (bientocdo)

{ case 1: duty2= tocdo1; break; case 2: duty2= tocdo2; break; case 3: duty2= tocdo3; break; case 4: duty2= tocdo4; break;

case 5: duty2= tocdo5; break; default : duty2 = td_macdinh; break;


} set_pwm1_duty(duty1); //cho dco chay nghich set_pwm2_duty(duty2); }

}
}

M phng:

You might also like