Tltk pwm(sv)

18 0 0
Tài liệu đã được kiểm tra trùng lặp
Tltk pwm(sv)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TÀI LIỆU THỰC HÀNH NHÚNG F L K K

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 toá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 #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 #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 #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 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 toá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 #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 #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 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 //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 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

Ngày đăng: 04/05/2024, 16:03

Tài liệu cùng người dùng

Tài liệu liên quan