Tải bản đầy đủ (.pdf) (18 trang)

Tltk pwm(sv)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.65 MB, 18 trang )

TIMER/COUNTER
1. Giới thiệu:

Picl6F877A có 03 Timer/Counter: Timer0, Timerl, Timer2. Đặc tính kỹ thuật của các
Timer như sau

> Timer 0:

- Timer/Counter 8 bit

- Bộ chia trước 8bit

- Giá trị tràn: từ FF về 00

-.. Dùng xung nội hoặc ngoại

> Timer 1:

- Timer/Counter 16 bit

- Bộ chia trước: 1, 2, 4, 8bit

- Giá trị tràn: từ FFFE về 0000

-.. Dùng xung nội hoặc ngoại

> Timer 2:

- Timer/Counter 8 bit

- Bộ chia trước và bộ chia sau: 1, 4, 16bit



- Gia tri tran: tir gia tri lưu trong thanh ghi PR2 về 0000

-.. Dùng xung nội hoặc ngoại

2. Các thanh ghi sử dụng trong Tỉmer/Counter
> Timer 0:

- Option_Reg:

Bit 7 Bit 6 Bit5 | Bit4 | Bit3 | Bit2 | Bitl | BitO
RBPU | INTEDG | TOCS | TOSE | PSA | PS2 | PS1 | PSO

Trong do: diéu khién dién trở treo của portB

RBPU: Bit lựa chọn nguồn xung cho TMR.
đếm xung ngoại đưa đến chân T0CKI.
INTEDG: đếm xung clock nội bên trong.
T0CS: Bit

I=:
0=:

T0SE: Bit lựa chọn cạnh tích cực T0SE-TMRO

1=: tích cực cạnh xuống u chan TOCKI.

0=: đếm xung clock nội bên trong.

PSA: Bit gán bộ chia trước


1=: gan bộ chia cho WDTT.
0=: gán bộ chia cho Timer0

PS2 —- PS0: các Bit lựa chọn tỉ lệ bộ chia trước

Bit lua chon Tỉ lệ TMRO Tỉ lên WDT

000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1: 64 1:32
110 1: 128 1: 64
111 1 : 256 1: 128

- TMRO: thanh ghi giá trị 8bit đếm lên: 00h-FFh

> Timer 1:

- TICON:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
TIGINV | TMRGE | TICKPSI | TICKPS0 | TIOSCEN | TISYNC | TMRICS | TMRION
Trong đó:
TIGINV: Bit đảo cổng của Timerl

1=: Cơng Timer] tích cực ở mức I.
0=: Công Timerl tích cực ở mức I.

TMRGE: Bit cho phép công của Timer1, chỉ có tac dụng khi bit TMRION = 1,

1=: Timerl mé néu cong Timer! khong tích cực.

O=: Timer 1 mo.

TICKPSI: TICKPSO: các Bit lựa chon tỉ lệ bộ chia trước

Bit lua chon Tỉ lệ chia

00 1:1
01 1:2
10 1:4
11 1:8

TIOSCEN: Bit điêù khiển cho phép bộ dao động Timer]
1=: Cho phép bộ dao động.
0=: Không cho phép bộ dao động.

TISYNC: Bit điều khiển đồng bộ ngõ vào xung Clk ngoài của Timer1, chỉ có tac dụng

khi bit TMRICS = 1

1=: Không đồng bộ ngõ vào xung CLK từ bên ngoài.
0=: Đồng bộ ngõ vào xung CLK từ bên ngoài.

2

TMRICS: lựa chọn nguồn xung CLK của Timer]


1=: nguồn xung từ bên ngoài
0=: Xung nội (Fxa1⁄4)

TMRION: điều khiển Timerl

1=: cho phép Timer1 đếm

0=: cho phép Timerl dừng

- TMRI1H, TMRIL: thanh ghi giá trị 16bit đếm lên: 0000h-FFFFh
> Timer 2:

3. Tính giá trị cho các Timer/Counter Fxtai(Mhz)

> Timer_0: v TIẾP

Cac gia tri sr dung trong Timer0: Fpi.(Mhz)
- _ Tần số dao động của thạch anh: Fxtal (MHz)
= 3
-_ Tần số dao dong cua Pic: Fpic (MHz)

- Tan s6 dao d6ng ctia Timer: Frimer (MHz)
Fumer[Mh2)
- Thor gian cua 1 chu ky Timer: Ttimer
t
- Thời gian trễ: Taeay

Tính tốn giá trị nạp cho thanh ghi TMRO:

GTN= 256-(Tdelay/Ttimer Trimer( US)


( ov

> Timer_1: Ftai(Mhz)
Cac gia tri sr dung trong Timer1 v +4
- Tan s6 dao déng cita thach anh: Fxtai (MHz)
- Tần số dao động của Pic: Fpic (MHz)="F al Fp¡.(Mhz)

-_ Tần số dao động của Timer: FTimer (MHz)=—F pic v" X(2; 4; 6; 8)

- Thoi gian cua | chu ky Timer: Ttimer Fcimer(Mhz)

- The 01 i Ø1gian {TÊé:: ÍT qeellaay ÿ 1E
Tính toán giá trị nạp cho thanh ghi TMRO0:
Ttimer(H1S)
GTN=65.536 - (Tactay/T timer )

Vi du: tim gia tri nap cho Timer 1 dé tạo tré 100ms, biét Fxiat =20(MNz) và sử dụng bộ chia
8:

Timer0

Fp=.*EFxtal=.*20Mhz=5Mhz

Eane=-*Fpe=S 5Mhz=0,625MHz

TT tỉ 1 om =1,6(us)

—____
mer Ftim


1 xung nhịp (1 chu kỳ kéo đài trong khoảng tg là 1,6us

k 100us
So xung=Tactay/Ttimer= | 6 =63xung nhip

GTN=256-63=193

Vi du: tìm gia tri nap cho Timer 1 dé tao tré 500ms, biét Fxiat =4(MHz) và sử dụng bộ chia 8:

Fue= pr*eE’ xtal=ˆ*4 4Mhz=IMhz

Fyimer=g"F PM pic=-g 1Mhz=0,125MHz

T timer 1 =8(um)
Fier

50ms

S0 xung=T detay/Trimer= 9G 930-250

GTN=65.536-6.250=59.286

e‹Ồ e se s se ` + Các lệnh sử dụng trong Timer/Counter
SETUP_TIMER_X ()
SET_TIMER_X ()
SETUP_COUNTERS ()
SETUP_WDT Q
RESTART_WDT ()
GET_TIMERX_Q)

Lệnh Timer 0
Setup_timer_0(mode) Timer 1 Timer 2
Mode : Setup_timer_2(mode)
RTCC_INTERNAL, Setup_timer_1(mode) Mode :
Setup_timer_x(mode) RTCC EXT L H, Mode :
Định cầu hình cho RTCC EXT H L, Tl DISABLED, T2 DISABLED,
Timer RTCC DIV 2
T1 INTERNAL, TI DIV BY 1
Tl EXTERNAL, (4,16)
Tl EXTERNAL SYN
(4,6,8,16,32,64,128,256) | C,
TC_CLK_OUT,
Tl DIV BY 1
(2,4,6,8)

Set_TimerX(Value) Set_Timer0(int8 hoac Set_Timer1(int8 hoac Set_Timer2(int8
Thiet lap gia tri bat int16) int16) hoac int16)
dau cho Timer Value=Get_Timer0() Value=Get_Timer1() Value=Get_Timer2
Get_TimerX ()
0
Doc gia tri cua
Timer/Counter

5. Lập trình cho Timer1

- Khoi tao cho Timer1l: SETUP_ TIMER_I(TI INTERNADLIVIBTY I8);

- _ Thiết lập giá trị bắt đầu đếm cho Timer_1

- _ Kiểm tra cờ TRÀN cho Timer_1: bit TMRIIF, 6 dia chi 0x0C.0. Néu co TRAN=1,


dat co TRAN=0 va thiét lap lai GTN cho Timer

6. Vidu
> Kết nối Led đến chân C0, viết chương trình sử dụng Timer1 để tạo trễ để led

Sáng/Tắt sau mỗi 200ms, biết Fxtal=20M:

e Tinh GTN cho Timer: Led sáng 100ms, tat 100ms >GTN=3036

e Code:

#include <Leddon_100ms.h>
#use delay(clock=20m)
#bit bit_tran=0x0C.0
#define led pin_c0
void main()

{ set_tris C(0x00);

setup_timer_1(T1_internal/T1_div_by_ 8);

set_timer1(3036);
while(TRUE)

{ if(bit_tran==1)

} } bit_tran=0;

Cach 2: set_timer1(3036);


output_toggle(led);

}

#include <Leddon_100ms.h>
#use delay(clock=20m)
#bit bit_tran=0x0C.0
#define led pin_c0

void main() div_by 8);

{ set_tris C(0x00);

setup timer 1(T1_internal|T1
set_timer1(3036);
while(TRUE)

{ if(bit_tran==1)
{ bit_tran=0;

set_timer1(3036);
output _high(led);

bit_tran=0;

set_timer1(3036);

output _low/(led);


> Bài tập: Kết nối 8led don dén PortB, viét chuong trinh dé led sang dan sau mdi 50ms

> Két ndi Led dén chan CO, viét chuong trinh str dung Timer! dé tao tré dé led

Sáng/Tắt sau mỗi 2s, biết Fxtal=20M:

Mỗi lần Tắt/Sáng hết 1s, cần đếm 10 lần 100ms
#include <Leddon_100ms.h>
#use delay(clock=20m)
#bit bit_tran=0x0C.0
#define led pin_c0
unsigned int8 dem;
void main()

{

set_tris C(0x00);
setup_timer_1(T1_internal|T1_div_by_8);
set_timer1(3036);
while(TRUE)

{

if(bit_tran==1)

{

bit_tran=0;

set_timer1(3036);


dem++;

if(dem==10) lên sau mỗi 200ms giây. Biết Fxtal=4Mhz, tần

{ Code:

output_toggle(led); #include <2_Led7doan 00_99.h>
dem=0; #use delay(clock=20M)
#bit bit_tran=0x0C.0
} const unsigned int8 maled[10]={0xC0,
}
} OXA4, OXBO, 0X99, 0X92, 0X82,
} 0X80, 0X90};
unsigned int8 x;
> 2 led 7 đoạn kết nối đến PortB và C, đếm VOID GIAIMA()
số chia 4
{ OUTPUT B(MALED[x/10]);
Tính tốn giá trị nạp
OUTPUT C(MALED[x%10]);
Fpic= Fxtal = : * 4Mhz=1Mhz
}
Ftimer== Fpic= 1Mhz = 0,25Mhz OXF9,
void main() OXF8,
Ttimer= =-—=4uS
Ftimer _ 0,25 { set_tris B(0x00);
Số xung đếm= Ttrễ _ 200mS Ttimer 4uSx103 = 50.000
GTN=65.536- 62.500=15.536 set_tris C(0x00);

x=0;


giaima(); setup timer 1(T1_Internal|
T1_div_by_8);

set_timer1(15536);

while(true)

{ if(bit_tran==1)
{ bit_tran=0;

set_timer1(15536);
giaima();

xt++; >

if(x==99) x=0;

> Bai tap: 2 led 7 đoạn kết nối đến PortB và C, đếm lên sau mỗi 2s giây. Biết Fxtal=4Mhz,
tần số chia 4
#include <2_Led7doan 00_99.h>
#use delay(clock=20M)

#bit bit_tran=0x0C.0 OXF9, OXA4, OXBO, 0X99, 0X92, 0X82,
const unsigned int8 maled[10]={0xC0,
OXF8, 0X80, 0X90};

unsigned int8 x, dem;

VOID GIAIMA()


{ OUTPUT_ B(MALED[x/10]);
OUTPUT_C(MALED[x%10]);

j

void main()

{ set_tris B(0x00);

set_tris C(0x00);

x=0;

giaima();

setup_ timer I(TI Internal|TI div by 8);

set_tImer1(15536);

while(true)

{ if(bit_tran==1)
{ bit_tran=0;

set_timer1(15536);

dem++;

giaima();

if(dem==10)

{
{

Xo;

if(x==99) x=0;
dem=0;

}
}


TAO XUNG PWM

> Vi điều khiển PICI6F877A có hỗ trợ kênh điều xung bằng phần cứng ở 2 chân

C1 (CCP2) và C2(CCP1) sử dụng TIMER2. Khi khai báo điều chế xung PWM

ở một tần số và độ rộng xung cụ thể nào đó thì vi điều khiến sẽ thực hiện công

việc xuất xung một cách liên tục và tự động cho đến khi có sự thay đơi các giá

trị độ rộng xung mới.

> Các hàm hỗ trợ tạo xung PWM trong CCS:

e setup_timer_2 (mode, period, postscale) // hàm thiết lap timer 2
-mode: T2 DIV BY 1,T2 DIV BY 4,T2 DIV BY l6

- period: 0 + 255
- postscale: 1

_ fectat
lou — :
4.rnode. (period + 1)

e setup_ccp1(mode) va setup_ccp2(mode) // ham thiết lập chế độ PWM mode:

- CCP PWM: chọn chế độ PWM.

- CCP_OFF: tắt chế độ PWM

e set pwm1_duty(value) và set pwm2_duty(value) // hàm thiết lập giá trị

PWM
- Nếu value là gia tri kiéu int 8 bit:
value
dut =————
WYeycle pariod +1

- Nếu value là giá trị long int 16 bit:

value&1023

duty -yc1e =—__—_~

WYeyele ~ 4 (pariod + 1)

Vi du:


> Ta muốn điều xung PWM với tần số 20kHz với tần sé thach anh (fatal) str dung

là 20MHz (8 bit).

f — fetal 4.mode. (period + 1)
20.000
© 20.000 =
4. mode((period + 1))

© mode. (period + 1) = 250

V6i Mode=[1,4,16] va Period=[0,255] ta có thể chọn

- mode = 1 ; period = 249

10

- mode = 4; period = 62

- mode = 16; period = 30

Để cho việc điều xung được “mịn” (chọn được nhiều giá trị độ rộng xung) ta
chọn:

- mode = 1 va period = 249.

Nhu vay, dé duty _cycle tir 0% dén 100% ta cho value tir 0 dén 250.

dut value I duty 106

=——-- =—
=e period + 1 pc 350

Ta viet mã nguôn như sau:

setup fimer 2(12 DIV BY 1,219,1);

setup_ccp1(CCP_PWM);

set pwml duty(value);

> Bai tapl :Viết chương trình sử dụng 03 nút nhấn để chọn 03 tốc độ: Chậm- Trung

Bình- Nhanh cho động cơ sử dụng phương pháp điều chế xung PWM
#include <16f877a.h>
#use delay(clock=20M)
#define LCD_RS_PIN PIN_BO
#defineLCD RW_ PIN PIN BI

#define LCD _ ENABLEP_IN PIN B2
#define LCD DATA4 PIN B4
#define LCD DATAS PIN BS5
#define LCD _DATA6 PIN B6
#define LCD _DATA7 PIN _B7

#include<lcd.c>
void main()

{ set_tris D(OxFF);


set_tris C(0x00); BY_1,249,1);
setup timer 2(T2 DIV
setup ccpl(CCP_ PWM);
set pwml_ duty(0);
Icd_init();

Icd_gotoxy(3,1); toc do");
printf(Icd_putc,"Chon TB. Nhanh");
Icd_gotoxy(1,2);
prmtf(lcd_putc,"Cham
while(TRUE)

II

{

if(!input(pin_D0O))

{

while(!input(pin_D0O));
set pwml_ duty(S50);
Icd_gotoxy(1,1);
printf(Icd_putc,"\fToc do 1 - Cham");

}

else if(!input(pin_D1))

{


while(!input(pin_D1));
set pwml_ duty(125);
Icd_gotoxy(1,1);
printf(Icd_putc,"\fToc do 2 - TB");

}

else if(!input(pin_D2))

{

while(!input(pin_D2));
set pwml_ duty(250);
Icd_gotoxy(1,1);
printf(Icd_putc,"\fToc do 3 - Nhanh");

}

12

DIEU KHIEN DONG CO DC, DONG CO BUGC
1. Điều khiển động cơ DC

1.1 Tổng quan về động cơ DC

a) Cau tao động cơ điện | chiều:

a a


_ ee) H nn Ï

Hình 1 Cấu tạo động cơ điện DC

- _ Stator: thường là I hay nhiều cặp nam châm vĩnh cửu hoặc nam châm điện

- Rotor: la phan lõi có quấn các cuộn dây đỀ tạo thành nam châm điện

- _ Chỗi than (brushes): nhiệm vụ tiếp xúc và tiếp điện cho cơ góp
- Co gdp (commutator): nhiệm vụ tiêp xúc và chia điện cho các cuộn dây trên rotor. Sô

lượng các diém tiêp xúc tương ứng với sô cuộn trén rotor.

b) Phân loại động cơ điện 1 chiều:

- _ Động cơ điện 1 chiều kích từ bằng nam châm vĩnh cửu.

- _ Động cơ điện I chiều kích từ độc lập.

- Động cơ điện | chiều kích từ nối tiếp.

- _ Động cơ điện I chiều kích từ song song.
- _ Động cơ điện 1 chiêu kích từ hỗn hợp gồm 2 cuộn dây kích từ 1 cuộn mắc nỗi tiếp với

phân ứng, I cuộn mắc song song với phân ứng.

c) Thiết lập chế độ PWM cho PIC 16F8§77A:

- Vi điều khiển PIC16F877A có 2 chân RC1 và RC2 có thể cầu hình điều khiển đầu ra


PWM. Để cấu hình 2 chân này hoạt động ở chế độ PWM trong CCS thực hiện lệnh:
e sefup ccpI(CCP PWMI;
e setup _ccp2(CCP_ PWM);

- _ Khi đó bộ Timer 2 khi đó sẽ được sử dụng để cài đặt tan s6 PWM.

- _ Sử dụng biểu thức sau để tính tần số PWM:
PWM peroid=[(PR2)+1]*4*Tosc*(TMR2 Prescale Value)

13

Tan s6 PWM sé la 1/[PWM period]

PR2 la gia tri đặt trước của Timer2

Tosc=1/(MCU_ frequency)

TMR2 Prescale Value có thể là 1,4 hoặc 16
Ví dụ cho PR2=255, tần số của vi điều khiển là 20MHz và Prescale là 4 thì:

PWM peroid={(255)+1 |*4*1/2000000*4=0,0002048

Tan so PWM = 1/PWM period = 4882Hz

Đề thiết lập Timer2 trong CCS ta dùng lệnh:
setup timer 2(mode, period, postscale);

Trong do:
e Mode la TMR2 Prescale Value
e Period la PR2


e Postscale khong khai bao ở chế độ này (để giá trị là 1)

Với ví dụ trên ta thiết lập Timer2 như sau:

setup2(_ T2tDIiV_mBYer 4,255,1);
Lệnh cuối cùng trong CCS để xuất giá trị PWM là:

e set pwml duty(value);
e Do rong xung duty = value/[4*(PR2+1)]
1.2 Bài thực tập điều khiến động cơ DC quay thuận, nghịch
Bai thực tập 1: Viết chương trình điều khiển động cơ đảo chiều gián tiếp.

a) Sơ đồ kết nối:

14

10k 10k 10k

DaynoiBo|} Z2 Day noi B1 z0 Day noi B2|| Z9
B0 B1 B2

| =Ì ¬) rT

i Forward Tai Reverse T me

Š bò RL4

22pF I 031 ] B0 ^ 6


22pF OSC1/CLKIN RBOINT BT

AC OSC2/CLKOUT RB1 B2
RB2 5 BS
A RA0AN0 RB3PGM 7Ì 9 +k 7] a

R2R RA1/AN1 RB4 = aBS? 20
RA2/AN2/VREF-/CVREF RBS Feo Day ket noi dong co
Ki RA3AN3VREF+ RB6PGC mee

^ RA4/T0CKIC 1OUT RB7/PGD ~ cr
RASAN4/SS/C2OUT
_—_ RC0T1OSO/T1CKI
RE0WANSRD. RC1/T1OSIICCP2
RE1/ANØWR RC2ICCP1
RE2IAN7ICS RC3/SCKSCL
RC4/SDI/SDA.
MCLR/VpTHV RC5SDO
RC6/TXICK
RC7RXIDT
u(t)
RD0/PSP0
RD1/PSP1 mw\—
RD2IPSP2
RD3/PSP3
RD4IPSP4
RD5/PSPS5
RD6/PSP6
RD7IPSP7


Hình 2 Sơ đồ kết nối nút nhắn, động cơ với PIC16F877A
b) Chương trình điều khiển:

#include<16#877A.h> //Khai bao thu vien xu ly

ruse dđelay (crystal=20M)

//Dinh nghia cac nut nhan

#define R EORWARD input (pin b0)

#define R REVERSE input(pin b1)

#define stop input (pin b2)

//Ham chay dong co

void run(intl6 duty)

4 //Vong lap den toc do 100%
while (duty<=1000)

{ //Nhan phim stop
if (STOP==0)

{ //Chong rung phim
while (STOP==0);
//Pha vo vong lap toc do
break;
15


}

//Dong co chay voi toc do duty

set pwml duty(duty);

duty+=100; //Tang toc do len 10%

delay ms(380); //tre 380 ms

}

void main()

{ //Khai bao bien
1nt16 duty=0;

int left, right; //Khai bao bien

//Thiet lap chan cap xung la ccpl

setup _ccpl (ccp_pwm);

//Thiet lap time2 voi bo div_16 va tan so f=1250Hz

setup timer 2(t2 div by 16, 249, 1);

set tris b(0xff); //Port B la dau vao


set tris _c(0x00); //Port C la dau ra

set pwml duty(duty); //Tat dong co

while (true)

{

//Nhan phim R_ FORWARD

if ((left==0) && (R_FORWARD==0) && (right==0) )

{

while (r_forward==0) ; //Chong rung phim

right=1; //Khoa phim r forward

output_low(pci0n); //Chon chieu quay thuan

16

dut y=200; //Thiet lap toc do 20%

run (duty) ; //Goi ham run()

} R_ REVERSE

//Nhan phim


else if ((ri && g (R_Rh EVERt SE== =0) = && (0 lef) t==0) )

{ //Chong rung phim
wh(R_i REVl ERSe E==0);

left=1; //Khoa phim r reverse

output_high(pci0)n; //Chon chieu quay nguoc

duty=200; //Thiet lap toc do 20%

run (duty) ; //Goi ham run()

} if (STOP==0) //Nhan nut stop

else

{ //Chong rung phim

while (STOP==0) ;

left=0; //Mo khoa phim r_reverse

right=0; //Mo khoa phim r_forward

output low(pin _c0); //Tat chieu quay nguoc

duty=0; //Thiet lap toc do 0

set pwml duty(duty); //Dung dong co


17

Bai tap sinh vién tu lam

> Bai tapl: Viét chuong trinh dé tao xung vuéng co tan so 10Mhz trén chan C1
và tan s6 SMhz cé dé rong xung 14 75% trén C2. Dung Ossilloscope dé quan
sat

> Bài tập 2: Kết nối I động cơ và I Matrix, viết chương trình để:
o_ Động cơ quay cham, matrix hién thị ký tự S
o_ Động cơ quay vừa, matrix hiển thị ký tự V
o_ Động cơ quay nhanh, matrix hiển thị ký tự F

> Bài tập 3: Kết nối I cảm biến nhiệt độ LM35, 1 động cơ và 1 LCD. Hãy viết

chương trình đề:

o_ Cảm biến nhiệt độ tang 10°C thi tốc độ động cơ tăng lên I toc dé;

o Hién thi ra LCD nhiét độ hiện thời và tốc độ động cơ
Giới hạn nhiệt độ từ 0-100°C và động cơ có từ tốc độ 1+ tốc độ 10

18


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×