Điều khiển đèn giao thông bằng vi điều khiển
MỤC LỤC
Lời mở đầu. 1
Chương 1: GIỚI THIỆU TỔNG QUAN 2
1. Nguyên lý đèn giao thông 2
2. Giới thiệu IC điều khiển3
3. Quét led 7 đoạn 6
4. Lý thuyết ngắt trong 7
Chương 2: THIẾT KẾ TỔNG QUAN 8
2.1. Giải thuật điều khiển 8
2.2. Bản vẽ solidwork 9
2.3. Mạch điều khiển 9
Chương 3: THIẾT KẾ CHƯƠNG TRÌNH 11
Tài liệu tham khảo 17
17 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3089 | Lượt tải: 2
Bạn đang xem nội dung tài liệu Điều khiển đèn giao thông bằng vi điều khiển, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 1. GIỚI THIỆU TỔNG QUAN
Nguyên lý đèn giao thông.
Đèn tín hiệu thường hoạt động cả ngày, đến 0 giờ (12 giờ đêm) thì chuyển sang trạng thái nháy vàng hoặc ngừng hoạt động. Khi nháy vàng, xe cộ được đi và phải chú ý, người đi bộ được phép sang đường. Đến 6 giờ sáng ngày hôm sau đèn lại hoạt động bình thường trở lại. Đôi khi ở một vài ngã tư đông đúc, đèn tín hiệu có thể hoạt động 24/24 mà không nháy vàng. Khi hoạt động, đèn thường sáng màu xanh, sau đó đến vàng và đỏ. Sau một thời gian hoạt động, đèn lại chuyển xuống màu xanh.
Các loại đèn giao thông.
1. Loại 3 màu (dành cho các loại xe).
Loại 3 màu : xanh, vàng, đỏ. Tác dụng như sau:
· Đỏ: Khi gặp đèn đỏ, tất cả các phương tiện đang lưu thông phải dừng lại ở phía trước vạch dừng (trừ trường hợp những xe rẽ phải), người đi bộ được sang đường.
· Xanh: Khi gặp đèn xanh, tất cả các phương tiện được phép đi và phải chú ý. Người đi bộ không được sang đường.
· Vàng: Đèn vàng là dấu hiệu của sự chuyển đổi tín hiệu. Khi đèn vàng bật sau đèn xanh nghĩa là chuẩn bị dừng, khi đó các phương tiện phải dừng lại trước vạch dừng vì tiếp đó đèn đỏ sẽ sáng, trường hợp đã vượt quá vạch dừng thì phải nhanh chóng cho xe rời khỏi giao lộ.
2. Loại 2 màu (dành cho người đị bộ).
Loại 2 màu : xanh, đỏ. Tác dụng như sau:
· Đỏ: Đèn đỏ có nghĩa là "không được sang đường". Nó có hình ảnh người màu đỏ đang đứng yên hoặc chữ "dừng lại". Khi gặp đèn đỏ, người đi bộ phải đứng yên trên vỉa hè.
· Xanh: Đèn xanh có nghĩa là "được phép sang đường". Nó có hình ảnh người màu xanh đang bước đi hoặc chữ "sang đường". Khi gặp đèn xanh, người đi bộ được phép sang đường. Khi đèn xanh nhấp nháy, người đi bộ phải khẩn trương sang nốt quãng đường còn lại.
3. Quy định điều khiển đèn tín hiệu.
Đèn tín hiệu phải bật từng màu riêng biệt, đèn này tắt mới được bật đèn kia lên, không được bật nhiều màu cùng một lúc. Giữa 2 chiều đường, khi chiều A bật đèn đỏ thì lập tức chiều B phải bật ngay đèn xanh và ngược lại. Khi chuyển từ xanh-đỏ và đỏ-xanh bắt buộc phải bật qua màu vàng, vì màu vàng đệm giữa 2 màu xanh đỏ.
II. Giới thiệu IC điều khiển.
1. ATmega32.
Nguồn nuôi của vi điều khiển là nguồn DC 5V, sau khi qua biến áp 24V, điện áp xoay chiều 220V sẽ còn 12V và được đưa qua chỉnh lưu thành dòng 1 chiều, sau khi qua IC ổn áp 7805, điện áp ra còn 5V và được đưa vào vi điều khiển. Để cho điện áp sau chỉnh lưu trở nên tương đối ổn định, ta dùng các tụ lọc.
Mạch nguyên lý của Atmelga32:
Atmega32 là vi điều khiển họ AVR, có 40 chân, trong đó có 4 PORT:A, B, C, D. Mỗi PORT có 8 chân, có thể khai báo là đầu vào hoặc đầu ra tùy người sử dụng. Các chân còn lại là chân nguồn, đất, reset, và có chân gắn thạch anh để tạo tần số dao động cho nó.
+ PORTC chỉ là các chân vào ra bình thường ( kích led 7 đoạn ).
+ PORTA là kênh vào ADC ( Kích đèn xanh, đỏ vàng hoạt động ).
+ PORTB chân vào ra ( Kích led người đi bộ ).
+ PORTD xuất dữ liệu (data ) ra led 7 đoạn.
2. IC giải mã 7447.
Đây là IC khá đơn giản dùng để chuyển tín hiệu dạng số nhị phân ở ngõ vào sang mã 7 đoạn.dễ thấy IC này hoạt động ở tích cực mức thấp. Do đó ta có bảng chân thực sau :
Để IC hoạt động ta kết nối chân 16 (Vcc) với nguồn 5V, chân số 8 với đất. Ngõ vào có 4 chân là 7,1,2,6 tương ứng với A,B,C,D trong đó mức ý nghĩa giảm dần từ A đến D. Kết nối các ngõ ra A,B,C,D của IC với các công tắc mà mỗi công tắc đơn giản là nằm giữa 2 mức cao hoặc thấp. Các chân LT, BI/RBO, RBI không cần kết nối. Nếu ta dùng Led 7 đoạn kiểu cathode chung: thì mỗi ngõ ra của IC 7447 cần kết nối với các cổng đảo trước khi đến các chân của Led. Dễ thấy IC này được tích hợp 6 cổng đảo. Do đó ngõ ra tích cực thấp của IC 7447 sẽ chuyển thành mức cao khi qua IC 7404 do đó làm cho led 7 đoạn kiểu cathode chung hoạt động. Nếu sử dụng Led 7 đoạn kiểu anode chung không cần dùng IC đảo 7404 mà chỉ cần 1 IC giải mã 7447.
III. Quét led 7 đoạn.
Phần cứng :8 chân data (A, B, C, D, E, F, G, dot) của các LED7 đấu vào các chân của IC 7447. Mức logic 0 để điều khiển từng đoạn sáng. Tại một thời điểm chỉ có 1 trong các LED7 này được cấp nguồn, các LED7 còn lại tắt. Nguyên lý:Lần lượt cấp nguồn cho từng LED7, đối với LED7 thứ n, xuất dữ liệu của LED7 thứ n (lưu trong buffer). Tại một thời điểm chỉ có 1 LED7 sáng với dữ liệu của nó. Delay một khoảng thời gian, sau đó chuyển sang LED7 khác.Theo nguyên lý lưu ảnh 24h/s (đối với IC thì nên nhanh hơn khoảng 50h/s) ta sẽ thấy giá trị của từng LED7.
IV. Lý thuyết ngắt trong.
Timer/counter là một modul độc lập với CPU với chức năng chính là bộ định thời ( tạo ra một khoảng thời gian, đếm thời gian. ), và đếm sự kiện. Trên Atmega 32 có 3 bộ timer/counter trong đó có 2 bộ timer/counter 8 bit và một bộ timer/counter 16 bit.
Hoạt động:
T/C0 hoạt động rất đơn giản, giá trị của thanh ghi TCNTO đếm tăng cho đến khi đạt mức max là 255, khi đạt đến giá trị “tràn” sẽ làm thanh ghi TCNTO trở về 0, lúc này bit cờ tràn TOVO sẽ được set lên 1. Dựa vào tần số ta khai báo ta sẽ tính được số lần ngắt trong 1s và từ đó sẽ tạo được thời gian chuẩn 1s.
CHƯƠNG 2. THIẾT KẾ TỔNG QUÁT
I . Giải thuật điều khiển.
II. Bản vẽ solidwork.
III. Mạch điều khiển.
CHƯƠNG 3. THIẾT KẾ CHƯƠNG TRÌNH
Chương trình chính
#include
#include
#define den_xanh1 PORTA.3 // tru phai tren
#define den_do1 PORTA.2
#define den_vang1 PORTA.1
#define den_xanh2 PORTA.7 // tru phai duoi
#define den_do2 PORTA.6
#define den_vang2 PORTA.5
#define led_ch1 PORTC.2 // tru phai tren
#define led_dv1 PORTC.3
#define led_ch2 PORTC.0 // tru phai duoi
#define led_dv2 PORTC.1
#define led_do_duoi PORTB.4 // Led di bo
#define led_tr_duoi PORTB.5
#define led_do_phai PORTB.6
#define led_tr_phai PORTB.7
int i,d2,v2,x2,d1,v1,x1,s=45;
char a=0,b=0;
char data[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//PORTD
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
i++;
}
//*********************************************************
void giay(void) // 31250/255=1S (KHAI BAO TIMER)
{
if(i==122) // i = so lan ngat trong 1s(1s ngat 31250/255=122 lan)
{
i=0;
x2--;
d2--;
v2--;
x1--;
d1--;
v1--;
s--;
if(s<0)
s=45;
}
}
//***********************************************************
void control(void)
{
if( (a==0)&&(x1==0) )
{
x1=19;
d2=22;
den_xanh1=0;
den_do1=1;
den_vang1=1;
led_do_duoi=1;
led_tr_duoi=0;
led_do_phai=0;
led_tr_phai=1;
den_xanh2=1;
den_do2=0;
den_vang2=1;
a=1;
}
if( (x1<0)&&(a==1) )
{
v1=2;
d2=2;
den_xanh1=1;
den_vang1=0;
den_do1=1;
led_do_duoi=1;
led_tr_duoi=0;
led_do_phai=0;
led_tr_phai=1;
den_xanh2=1;
den_vang2=1;
den_do2=0;
a=2;
}
if( (d2<0)&&(a==2)&&(v1<0) )
{
x2=19;
d1=22;
den_xanh1=1;
den_vang1=1;
den_do1=0;
led_do_duoi=0;
led_tr_duoi=1;
led_do_phai=1;
led_tr_phai=0;
den_xanh2=0;
led_do_duoi=0;
den_vang2=1;
den_do2=1;
a=3;
}
if((x2<0)&&(a==3))
{
v2=2;
d1=2;
den_xanh1=1;
den_vang1=1;
den_do1=0;
led_do_duoi=0;
led_tr_duoi=1;
led_do_phai=1;
led_tr_phai=0;
den_xanh2=1;
den_vang2=0;
den_do2=1;
a=4;
}
if((v2<0)&&(a==4)&&(d1<0))
{
a=x1=x2=d1=d2=v1=v2=0;
}
}
//*****************************************************
void quet_led1(void)
{
control();
if((s<=45)&&(25<s))
{ // x hthi 20 so (19->0)
PORTD=data[x1/10];
led_ch1=0;
delay_ms(1);
led_ch1=1 ;
PORTD=data[x1%10];
led_dv1=0;
delay_ms(1);
led_dv1=1;
}
if((s0)
{
PORTD=data[v1/10];
led_ch1=0;
delay_ms(1);
led_ch1=1 ;
PORTD=data[v1%10];
led_dv1=0;
delay_ms(1);
led_dv1=1;
}
if((s<=22)&&(0<=s))
{ // d hthi 23 so (22->0)
PORTD=data[d1/10];
led_ch1=0;
delay_ms(1);
led_ch1=1 ;
PORTD=data[d1%10];
led_dv1=0;
delay_ms(1);
led_dv1=1;
}
if(s<0)
{
a=x1=x2=d1=d2=v1=v2=0;
}
}
void quet_led2(void)
{ control();
if((s<=45)&&(22<s))
{
PORTD=data[d2/10];
led_ch2=0;
delay_ms(1);
led_ch2=1 ;
PORTD=data[d2%10];
led_dv2=0;
delay_ms(1);
led_dv2=1;
}
if((s<=22)&&(2<s))
{
PORTD=data[x2/10];
led_ch2=0;
delay_ms(1);
led_ch2=1 ;
PORTD=data[x2%10];
led_dv2=0;
delay_ms(1);
led_dv2=1;
}
if((s<=2)&&(0<=s))
{
PORTD=data[v2/10];
led_ch2=0;
delay_ms(1);
led_ch2=1 ;
PORTD=data[v2%10];
led_dv2=0;
delay_ms(1);
led_dv2=1;
}
if(s<0)
{
a=x1=x2=d1=d2=v1=v2=0;
}
}
//*****************************************************
void main(void)
{
PORTA=0xFF;
DDRA=0xEE;
PORTB=0xFF;
DDRB=0xFF;
PORTC=0xFF;
DDRC=0xFF;
PORTD=0xFF;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 31.250 kHz
// Mode: Fast PWM top=FFh
// OC0 output: Inverted PWM
TCCR0=0x7C;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
giay();
quet_led1();
delay_us(20);
quet_led2();
delay_us(20);
};
}
Tài liệu tham khảo :
+ Kỹ thuật vi điều khiển AVR
+ Tài liệu AVR
Các trang web tài liệu khác:
google.com.vn.
cdtvn.net.
alldatasheet.com.
diendandientu.com.vn.
wikipedia.com.