Đề tài: đo tốc độ động cơ.
SVTH:
GVHD:
Giới thiệu về đề tài
Đề tài bài tập lớn của nhóm là: Đo tốc độ động cơ hiển thị lên LCD. Với yêu cầu đề tai như trên, hướng thực hiện đề tài của nhóm được tóm tắt như sau:
- Sử dụng vi điều kiển PIC16F887A làm chip điều khiển trung tâm.
- 4 phím điều khiển chức năng:
- 1 phím reset vi điều khiển đồng thời ngưng mọi hoạt động của hệ thống (chế độ chờ).
- 1 phím hiển thị tốc độ vòng/phút.
- 1 phím hiển thị tóc độ vòng/giây.
- 1 phím hiển thị số vòng quay của động cơ.
- Chiều quay của động cơ được hiển thị trên cả 3 chế độ đo.
- Sử dụng LCD 2 dòng 16 cột để hiển thị kết quả, encoder 100xung/vòng.
Encoder được động cơ kéo thông qua bộ truyền đai răng và có bộ phận căng đai. 2 bánh đai bằng nhau, 1 gắn vào trục encoder, 1 gắn vào 1 thiết bị tương tự như mâm cặp của máy tiện có thể lắp vào nhiều cỡ trục động cơ (từ 1,5mm-13mm).
Sơ đồ nguyên lý mạch điều khiển:
Mạch điều khiển được cấp nguồn 1 chiều nhờ diode cầu, ic ổn áp LM7805 có nhiệm vụ ổn định điện áp ở mức 5V để vi điều khiển hoạt động. Các tụ lọc nguồn C1, C2 san phẳng các “gai” của dòng điện. Tụ C3 có tác dụng autoreset cho vi xử lí khi mới cấp nguồn, thạch anh Y1 20MHz tạo dao động cho PIC, tụ 104 lọc nhiễu. Biến trở 10k và 1k để điều chỉnh độ sáng và độ tương phản cho LCD. Timer1 làm counter đếm xung từ encoder đưa vào chân T1CKI (chân RC0), timer0 định thời.
Khái quát về vi điều khiển PIC16F877A
Sơ đồ chân
Sơ đồ nguyên lý
Nhận xét
Từ sơ đồ chân và sơ đồ nguyên lý ở trên, ta rút ra các nhận xét ban đầu như sau :
- PIC16F877A có tất cả 40 chân
- 40 chân trên được chia thành 5 PORT, 2 chân cấp nguồn, 2 chân GND, 2 chan thạch anh và một chân dùng để RESET vi điều khiển.
- 5 port của PIC16F877A bao gồm :
+ PORTB : 8 chân
+ PORTD : 8 chân
+ PORTC : 8 chân
+ PORTA : 6 chân
+ PORT E : 3 chân
Phương pháp đo: dùng encoder
Nguyên lý hoạt động của cảm biến encoder : có nhiều loại encoder khác nhau. Mỗi loại lại có một nguyên lý hoạt động khác nhau, trong khuôn khổ báo cáo bài tập lớn nhóm em xin trình bày phần nguyên lý loại encoder trong đề tài mà nhóm em sử dụng.
Mô hình thứ 1
Incremental encoder về cơ bản là một đĩa tròn quay quanh một trục được đục lỗ như hình trên.
Ở 2 bên mặt của cái đĩa tròn đó, sẽ có một bộ thu phát quang. Trong quá trình encoder quay quanh trục, nếu gặp lỗ rống thì ánh sáng chiếu qua được, nếu gặp mãnh chắn thì tia sáng không chiếu quá được. Do đó tín hiệu nhận được từ sensor quang là một chuổi xung. Mỗi encoder được chế tạo sẽ biết sẵn số xung trên một vòng. Do đó ta có thể dùng vi điều khiển đếm số xung đó trong một đơn vị thời gian và tính ra tốc độ động cơ.
Tuy nhiên, mô hình trên có nhược điểm lớn là : ta không thể xác định được động cơ quay trái hay quay phải, vì có quay theo chiều nào đi nữa thì chỉ có một dạng xung đưa ra. Do đó muốn xác định chiều quay của động cơ, nhóm phải chọn loại encoder có 2 cảm biến quang đặt lệch pha nhau 90o khi đó dạng xung ra của encoder như sau:
Nếu xung A nhanh pha hơn xung B thì chắc chắn động cơ quay từ trái sang phải và ngược lại.
Giải thích code:
#define a porta.f0
#define b porta.f1
#define c porta.f2
Khai báo 3 nút nhấn a,b,c kết nối vào 3 chân RC2, RC3, RC4.
sbit LCD_RS at RD0_bit;
sbit LCD_EN at RD2_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD2_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
LCD kết nối với PORTD.
void ngat() iv 0x04
{
if(TMR1IF_bit=1)
{
TMR1IF_bit=0;
TMR1H=56;
TMR1L=255;
dem=TMR0;
TMR0=0;
}
xung=xung+dem;
vong=xung/100;
}
Chương trình ngắt timer0. Sau 10ms thì lấy giá trị thanh ghi của timer0 lưu vào biến dem, gán lại i=0 và xóa thanh ghi.
Biến xung được cộng dồn với biến đếm, do encoder có 100 xung/vòng nên ta lấy số xung đếm được chia cho 100 sẽ được số vòng động cơ đã quay.
void xac_dinh_chieu_quay()
{
if(RA4_bit==0)
{
while(RA4_bit==0){}
if(RA5_bit==1)
{
LCD_Out(2,1,"CUNG CH KIM DH");
}
else
{
LCD_Out(2,1,"NGUOC CH KIM DH");
}
}
}
Chương trình con xác định chiều quay động cơ. Do 2 xung của encoder lệch pha nhau nên khi chân RA4 nhận xung cạnh lên mà chân RA5=1 thì động cơ quay theo chiều từ trái qua và ngược lại.
while(1)
{
if(a==0)
{
j=1;
}
if(b==0)
{
j=2;
}
if(c==0)
{
j=3;
}
Nếu nhấn nút a thì gán j=1, nhấn nút b gán j=2, nhấn nút c gán j=3, nhấn reset j=0.
if(j==1)
{
Lcd_Cmd(_LCD_CLEAR);
xung=0;
k=dem*60; // encoder 100xung/vong, lay mau 10ms
............................................
...............................................
Nếu j=2, tốc độ vòng/giây là k=dem, trong 1 giây có (1000/10)*dem =
100*dem xung, encoder 100xung/vòng =>1 giây có dem vòng.
if(j==3)
{
Lcd_Cmd(_LCD_CLEAR);
WordToStr(vong,txt);
LCD_Out(1,1,txt);
LCD_Out(1,8,"VONG");
xac_dinh_chieu_quay();
delay_ms(300);
}
Nếu j=3, xuất ra LCD số vòng đã quay được. Số vòng quay chỉ được đếm khi nhấn nút c, khi nhấn nút a hoặc b thì số vòng trở lại 0.
Trong 3 chế độ đo, chương trình con xác định chiều quay đều chạy.