MẠCH ĐIỀU CHỈNH :NÚT NHẨN ĐIỀU KHIỂN CHẾ ĐỘ HIỂN THỊ,MẠCH ĐỘNG LỰC... SƠ ĐỒ NGUYÊN LÝ:A.Tóm tắt : - Dùng LM35 đo nhiệt độ môi trường,dùng vdk Pic 16f877a,dùng PWM có sẵn của vdk Pic để
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM
KHOA ĐIỆN – ĐIỆN TỬ NGÀNH : ĐIỆN TỬ VIỄN THÔNG
BÁO CÁO VXL 2 – VDK PIC
QUẠT TỰ ĐỘNG
TP HỒ CHÍ MINH, THÁNG 11 NĂM 2010
Nhận xét của giáo viên :
Trang 2
SƠ ĐỒ KHỐI :
Trang 3 KHỐI CẢM BIẾN : LM35
KHỐI XỬ LÝ TRUNG TÂM :VDK PIC 16F877A
HIỂN THỊ: GỒM CÓ 4 LED 7 ĐOẠN
MẠCH ĐỘNG LỰC : CẦU H ĐIỀU KHIỂN ĐỘNG CƠ QUAY THUẬN QUAY NGHỊCH.
MẠCH ĐIỀU CHỈNH :NÚT NHẨN ĐIỀU KHIỂN CHẾ ĐỘ HIỂN THỊ,MẠCH ĐỘNG LỰC
Trang 5SƠ ĐỒ NGUYÊN LÝ:
A.Tóm tắt :
- Dùng LM35 đo nhiệt độ môi trường,dùng vdk Pic 16f877a,dùng PWM
có sẵn của vdk Pic để điều khiển tốc độ động cơ theo nhiệt độ
- Công việc thực hiện:
o Tìm hiểu VDK Pic và ADC trong VDK Pic 16f877A
o Tìm hiểu LM35
o Tìm hiểu PWM trong VDK Pic 16f877A
o Tìm hiểu ngôn ngữ lập trình CCS C cho VDK Pic
Trang 6o Thiết kế mạch bằng phần mềm Proteus
o Viết code và mô phỏng
B.Nội Dung:
1 Tìm hiểu VDK Pic và ADC Trong VDK Pic 16F877A
Hình dạng vdk Pic 16F877A
Pic 16F877A có 5 Port tất cả : PORT A ,PORT B ,PORT C ,PORT
D ,PORT E
THANH GHI ADCON0
Trang 7• Bit 5-3 :
CHS2 à CHS0: Các bit lựa chọn kênh tương tự Trong đề tài chọn kênh AN0 nên set CHS2:CHS0 = 000
• Bit 6,7 : Dùng lựa chọn tần số chuyển đổi
• Bit 2 GO/DONE:
Bit này bằng 1 khi chuyển đổi ADC đang diễn ra và về 0 khi quá trình chuyển đổi kết thúc
• Bit 0 :ADON
o Bit này bằng 1 thì khối ADC được mở nguồn
o Bit này bằng 0 thì khối ADC bị tắt nguồn để giảm bớt công suất tiêu thụ
Thanh ghi ADCON1:
Trang 8• Bit 7 : ADFM
Bit này lựa chọn định dạng cho kết quả ADC 1= Canh lề phải || 0= Canh lề trái
• Bit 6 : Bit ADCS2 cùng với ADCS1:0 (Trong ADCON0) cho phép lựa chọn xung clock cho chuyển đổi ADC
Trang 9• Bit 3:0 : PCFG3: PCFG0: Bit điều khiển ADC.
Trong đề tài sử dụng ADC 8 bit,tức có 256 mức x 10mv -
0.55V=2.01V=>vref- là 0.55V và vref+ là 2.01Vol
2 Tìm hiểu LM35:
+ LM35 là IC cảm biến nhiệt độ
+ Cảm biến nhiệt độ trong khoảng từ
-55 đến 150 oC
+ Ngõ ra tương thích TTL + Độ nhạy: 10mV/10C +Có ưu điểm là rẻ tiền
+Khuyết điểm là không chịu được nhiệt độ cao
KẾT NỐI LM35
Dạng 1:
Trang 10Cảm biến đáp ứng tại ngõ vào từ 2 C đến 150 C Ngõ ra thay đổi: 10mV/1oC
Dạng 2: (Trong đề tài sử dụng dạng này)
Cảm biến đáp ứng tại ngõ vào từ
-55oC đến 150 oC Điện trở R1 được
chọn: R1= -Vs/50 uA
Ngõ ra thay đổi: 10mV/oC
V OUT= -0.55 đến 1.5 Vol
Tính toán :1.5-(-0.55) x 1/10mV =205
Mức => chưa đủ toàn thang ADC 8 Bit
Max của ADC toàn thang là 255
Khai báo ADC :
setup_adc(adc_clock_internal);
//thiết lập adc dùng xung clok nội
setup_adc_ports(AN0_VREF_VREF);
//Khái báo adc channel 0,điện áp chuẩn Vref- và Vref+
3 Tìm hiểu PWM trong VDK Pic 16f877A
Với mục đích là điều khiền khiển quay thuận nghịch nên chọn hai chân CCP1(17) và CCP2 (16) là 2 chân điều xung Pwm có sẵn
Tại các chân này khi hoạt động sẽ xuất chuỗi xung vuông , độ rộng điều chỉnh được dễ dàng Xung ra này dùng để tạo tín hiệu đóng ngắt
Trasistor trong mạch động lực,với độ rộng xác định sẽ tạo ra một điện
áp trung bình xác định Thay đổi độ rộng xung sẽ thay đổi điện áp trung bình và do đó thay đổi được tốc độ động cơ
Để có thể sử dụng được bộ PWM trước hết nó phải được khởi tạo chế
độ PWM bằng lệnh:
Trang 11setup_ccp1(CCP_PWM); //khai báo dùng PWM1 và PWM2
setup_ccp2(CCP_PWM);
setup_timer_2(mode,period,postscale)
Bộ PWM hoạt động phải được sự hỗ trợ của Timer 2 , đây là Timer 8-bit
có bộ chia trước Ngõ vào xung Clock (=fosc/4) có tuỳ chọn hệ số chia trước là: “1:1”, “1:4”, “1:16” được lựa chọn bằng các bit điều
khiểnT2CKPS1:T2CKPS2
Lệnh để khởi tạo Timer2 và cũng là tạo chu kỳ
xung cho bộ PWM là: setup_timer_2(t2_div_by_16,154,1);
- Mode có thể chọn một trong các hình thức sau:
T2_DISABLED, T2_DIV_BY_1 T2_DIV_BY_4,
T2_DIV_BY_16 ( trong đề tài dùng bộ chia 16)
- Period là một số nguyên (0255) để xác định
khi nào thì xung clock reset
- Postscale là số (116) để xác định có bao
nhiêu lần reset trước một ngắt: 1 có nghĩa là 1
lần, 2 nghĩa là 2 lần…
Chức năng của lệnh này là tạo ra chu kỳ xung và
được tính như sau:
T = (1/fosc)*4*t2_div*(period+1)
setup_timer_2(t2_div_by_16,154,1);
//Tpwm =(1/10MHz)*4*16*(154+1) = 0.992 ms
Timer sẽ tăng mỗi 6.4us (4*16*(1/10Mhz=6,4us),Timer2 sẽ tràn mỗi 6.4us *154 = 985.6us,tràn 1 lần (postscale=1)thì sảy ra ngắt
Trang 12Value=duty = 620=4*(154+1); Tpwm=value*T2_div*(1/10MHz)
set_pwm1_duty(duty); //620 là giá Max duty Thời gian duty là thời gian xung (mức cao) của chu kỳ xung, minh hoạ như hình dưới:
Như vậy, trong bài ta có chu kỳ
xung là 0.992ms, để động cơ quay
với tốc độ cực đại thì thời gian duty
= chu kỳ xung bởi vì khi ấy gần như
ngõ ra bộ PWM chỉ là mức 1
4 Tìm hiểu ngôn ngữ lập trình CCS C cho VDK Pic
CCS C là một công cụ giúp lập trình c cho vdk khá mạnh,CCS C tích hợp trình biên dịch bên trong,rất tiện cho việc lập trình và dịch files hex cho vdk
Mô tả nội dung chương trình
#include 16f877a.h : Đi kèm chương trình dịch, chứa khai báo về các thanh ghi trong mỗi con PIC, dùng cho việc cấu hình cho PIC
#include <KhaiBao_16F877A.h>: Files do người lập trình tạo ra, chứa khai báo về các thanh ghitrong PIC giúp cho viêc lập trình được dễ dang hơn ví dụ ta co thể gán PORTB =0xAA (chi tiết files này sẽ trình bày trong phần dưới đây)
#device *=16 ADC = 8: Khai báo dùng con trỏ 8 hay 16 bit, bộ ADC là 8 hay 10 bit
#FUSES NOWDT, HS: Khai báo về cấu hình cho PIC
#use delay(clock=20000000): Tần số thạch anh sử dụng
#use rs232 (baud=9600,…): Khai báo cho giao tiếp nối tiếp RS232
Trang 13#use i2c(master, SDA=PIN_C4,…): Khai báo dùng I2C, chế độ hoạt động
#include <tên_file.c>:Khai báo các files thư viện được sử dụng ví dụ LCD_lib_4bit.c
#INT_xxx : Khai báo địa chỉ chương trình phục vụ ngắt
Void tên_chương_trình (tên_biến) {}: Chương trình chính hay chương trình con
5 Thiết kế mạch bằng phần mềm Proteus
Proteus là phần mềm mô phỏng trực quan ,giúp người học tiếp cận nhanh chóng khi chưa có điều kiện tiến hành trên linh kiện thật,là công
cụ tốt để kiểm tra ý tưởng của mình.Mạch mô phỏng vẽ bằng proteus như hình trên
6 Viết code và mô phỏng
//****************************************************
// Author : Nguyen Quoc Su
// Mssv:07117055
// Phone:0914.114.338
// Date : 25/11/2010
// Hardware: PIC16F877A
//****************************************************
#include <16F877a.h>
#include <KhaiBao_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#byte PORTA = 0x05
#byte PORTB = 0x06
#byte PORTC = 0x07
Trang 14#byte PORTD = 0x08
#byte PORTE = 0x09
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte TRISC = 0x87
#byte TRISD = 0x88
#byte TRISE = 0x89
#device 16F877*=16 ADC=8
#use delay(clock=10000000)
#use fast_io(b)
#use fast_io(d)
//#define daochieu=~(portc&0x08)
Int8 i,tram=0,chuc=0,dvi=0;
int trangthai=0,chieuquay=0;
int8 duty=0,adc;
signed int16 adctam,ndo;
const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf};
// 0xbf : ma 7 doan tuong ung dau tru
/*
#int_AD
void interrupt_AD()
{
portc=(portc&0xf0)|0x0f;
}
*/
void hex_bcd(signed int16 value)
{
value=value-55;
if(value<0) // khi nhiet do am
{
tram=10; // tram se tuong ung voi ma 7 doan la dau tru
abs(value); // lay tri tuyet doi
}else tram=value/100; // khi nhiet do duong
Trang 15value=value%100; // chuc + donvi
chuc=value/10; // gia tri nhiet do hang chuc
value=value%10; // gia tri nhiet do hang donvi
dvi=value;
}
void hienthi()
{
i=0;
while(i<10) // thuc hien vong lap 10 lan
{
portb=dig[dvi]; // lay gia tri ma 7 doan tuong ung cua dvi
portd=0x04; // chon led hang don vi
delay_ms(1);
portd=0x00; // chong lem
portb=dig[chuc]; // lay gia tri ma 7 doan tuong ung cua chuc
portd=0x02; // chon led hang chuc
delay_ms(1);
portd=0x00; // chong lem
portb=dig[tram]; // lay gia tri ma 7 doan tuong ung cua chuc
portd=0x01; // chon led hang tram
delay_ms(1);
portd=0x00; // chong lem
if(trangthai==0)
{
portb=0x0c; // r:0xaf p:0x0c
}else portb=0xc6;
portd=0x08; // chon led cuoi
delay_ms(1);
portd=0x00; // chong lem
i++;
}
}
Trang 16void chaythuan(int16 x)
{
set_pwm1_duty(0);
set_pwm2_duty((620/100)*x);
}
void chaynghich(int16 y)
{
set_pwm1_duty((620/100)*y);
set_pwm2_duty(0);
}
Void main()
{ int8 k;
duty=0;
trisa=0xff;
trisb=0x00;
trisd=0x00;
//trisc=0x09;
trise=0x00;
TRISC1=1;
TRISC3=1;
TRISC4=0;
setup_adc(adc_clock_internal);
setup_adc_ports(AN0_VREF_VREF);
// enable_interrupts(global);
// enable_interrupts(int_AD);
// -setup cho Timer2 ,de su dung
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_timer_2(t2_div_by_16,154,1); //Tpwm = 1ms
// set_pwm1_duty(duty);
// set_pwm2_duty(duty);
Trang 17
portb=0xff;
delay_ms(10);
set_adc_channel(0);
delay_us(50);
while(1)
{
adc=read_adc();
ndo=adctam=adc;
ndo-=55;
// portb=adc;
hex_bcd(adctam);
hienthi();
duty = (adc/2.05);
//chaythuan(duty);
if(ndo<0)porte=0x01;
else if (ndo<=45)porte=0x02;
else {porte=(~porte)&0x04;
////////////////////// xu ly hien thi nhiet do va Gia tri Bam xung///////////////// k=portc&0x01;
if (k==0) {
trangthai=0;
while(k==0)
{k=portc&0x01;
hex_bcd(duty+55);
hienthi();
}
}
else trangthai=1;
if(trangthai==1)
{
hex_bcd(adctam);
hienthi();
}
else {
Trang 18hex_bcd(duty);
hienthi();
}
////////////////////// xu ly chieu quay dong co/////////////////
if((~portc&0x08)==0x08)
{
chieuquay=!chieuquay;
while(((portc&0x08)==0x08))
{
if(chieuquay==1)
chaythuan(duty);
else
chaynghich(duty);
}
}
if(chieuquay==1)
chaythuan(duty);
else
chaynghich(duty);
}
}
}