Mạch đếm, phân loại sản phẩm trên băng truyền sử dụng ATMega16
HỌ C VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG - - BÀI TẬP LỚN HỌC PHẦN: XÂY DỰNG HỆ THỐNG SỐ Đề tài: Mạch đếm, phân loại sản phẩm băng truyền sử dụng ATMega16 GVHD: TS Nguyễn Quốc Uy ThS Lương Cơng Duẩn Nhóm sinh viên: Hà Nội, 11/2018 MỤC LỤC LỜI NÓI ĐẦU Ngày với phát triển mạnh mẽ giới mặt, khoa khoa học cơng nghệ nói chung ngành cơng nghệ kỹ thuật điện tử nói riêng có nhiều phát triển vượt bậc, góp phần làm cho giới ngày đại văn minh Sự phát triển kỹ thuật điện tử tạo hàng loạt thiết bị với đặc điểm xác cao, tốc độ nhanh, gọn nhẹ hoạt động ổn định Là yếu tố cần thiết làm cho hoạt động người đạt hiệu cao Từ lâu cảm biến sử dụng thiết bị để cảm nhận phát hiện, từ vài chục năm trở lại chúng thể vai trò quan trọng kỹ thuật công nghiệp đặc biệt lĩnh vực đo lường, kiểm tra điều khiển tự động Chính nhóm chúng em chọn đề tài “MẠCH ĐẾM VÀ PHÂN LOẠI SẢN PHẨM TRÊN BĂNG TRUYỀN DÙNG VI ĐIỀU KHIỂN ATMEGA16” Mặc dù cố gắng hồn thành báo cáo khơng tránh khỏi thiếu sót mong quý thầy giáo bạn đóng góp ý kiến để nhóm hồn thiện Chúng em xin chân thành cảm ơn! Nhóm sinh viên NHẬN XÉT CỦA GIẢNG VIÊN ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… ………………………………………………………… I, TỔNG QUAN VỀ ĐỀ TÀI Ngày với phát triển ngành khoa học kỹ thuật, kỹ thuật điện tử mà kỹ thuật số đóng vai trò quan trọng lĩnh vực khoa học kỹ thuật, quản lí, cơng nghiệp tự động hóa, cung cấp thơng tin Do phải nắm bắt vận dụng cách có hiệu nhằm góp phần vào phát triển khoa học kỹ thuật giới nói chung phát triển kỹ thuật điện tử nói riêng Trong q trình sản xuất nhiều khâu tự động hóa Một khâu đơn giản dây chuyền sản xuất tự động hóa số lượng sản phẩm làm đếm cách tự động Tuy nhiên doanh nghiệp vừa nhỏ việc tự động hóa hồn tồn chưa áp dụng khâu đếm sản phẩm, đóng bao bì mà sử dụng nhân công Từ điều thấy khả chúng em, chúng em muốn làm điều nhỏ để góp phần vào giúp người lao động bớt phần mệt nhọc chân tay mà cho phép tăng hiệu suất lao động lên gấp nhiều lần, đồng thời đảm bảo độ xác cao Nên chúng em định thiết kế mạch đếm sản phẩm gần gũi với thực tế thật có ý nghĩa chúng em làm phần nhỏ đóng góp cho xã hội II, CÁC LINH KIỆN SỬ DỤNG TRONG MẠCH Vi xử lý ATmega16 a, Tổng quan - Vi điều khiển AVR hãng Atmel sản xuất giới thiệulần năm 1996 AVR có nhiều dòng khác bao gồm dòng Tiny ( At tiny 13, At tiny 22…) có kích thước nhớ nhỏ, phận ngoại vi , đến dòng AVR ( chẳng hạn AT90S8535,AT90S8515…) có kích thước nhớ vào loại trung bình manh dòng Mega ( ATmega 16, Atmega 32, ATmega 128… ) với nhớ có kích thước vài Kbyte đến vài trăm Kb với ngoại vi đa dạng tích hợpcả LCD chip ( dòng LCD AVR) Tốc độ dòng Mega cao so với dòng khác Sự khác dòng cấu trúc ngoại vi, nhân - ATmega16 lọai Vi điều khiển có nhìều tính đặc biệt thíchhợp cho việc giải tóan điều khiển vi xử lý +Các lọai vi điều khiển AVR phổ biến thị trừơng Việt Nam nênkhơng khó khăn việc thay sửa chữa hệ thống lúc cần +Giá thành dòng Vi Điều Khiển phải +Các phần mềm lập trình mã nguồn mở tìm kiếm dễ dàngtrên mạng Các thiết kế demo nhiều nên có nhiều gợi ý tốt cho ngườithiết kế hệ thống.ATmega16 vi điều khiển 8bit dựa kiến trúc RISC Với khả thực lệnh vong chu kỳ xung clock, Atmega16có thể đạt tốc độ 1MIPS MHz( 1triệu lệnh/MHz),các lệnh xử lý nhanh hơn,tiêu thụ lượng thấp b, Sơ đồ chân Atmega 16 gồm 40 chân: Chân đến chân 8: Cổng nhập xuất liệu song song B (PortB) dược sử dụng chức đặc biệt thay nhập xuất liệu Chân 9:Reset để đưa chip trạng thái ban đầu Chân 10: VCC cấp nguồn nuôi cho vi điều khiển Chân 11, 31: GND chân nối với nối với đất Chân 12, 13: chân XTAL2 XTAL1 dùng để đưa xung nhịp từ bên vào chip Chân 14 đến 21: Cổng nhập xuất liệu song song D (PORTD) sử dụng chức đặc biệt thay nhập xuất liệu Chân 22 đến 29: Cổng nhập xuất liệu song song C (PORT C) sử dụng chức đặc biệt thay nhập xuất liệu Chân 30: AVCC cấp điện áp cho ADC Chân 32: AREF điện áp so sánh tín hiệu vào ADC Chân 33 đến 40: Cổng vào liệu song song A (PORTA) tích hợp chuyển đổi tín hiệu tương tự sang tín hiệu số ADC2 Vào vi điều khiển PORTA(PA7…PA0): chân số 33 đến 40 Là cổng vào song song bit không dùng chế độ ADC Bên có sẵn điện trở kéo, PORTA output điện trở kéo khơng hoạt động, PORTA input điện trở kéo kích hoạt PORTB (PB7…PB0): chân số đến số Nó tương tự PORTA sử dụng vào song song PORTC (PC7…PC0): chân 22 đến 30 Cũng giống PORTA PORTB cổng vào song song Nếu giao tiếp JTAG bật, trở treo chân PC5(TD1), PC3(TMS), PC2(TCK) hoạt động khhi kiện reset xảy PORTD(PD&…PD0): chân 13 đến 21 Cũng cổng vào song song giống PORT khác Cảm biến màu TCS3200 Ứng dụng: Áp dụng để phân loại màu sắc, cảm ứng hiệu chuẩn ánh sang mặt trời, kiểm tra dải đọc, kiểm tra màu sắc phù hợp Thông số kỹ thuật: + Điện áp cung cấp: (2.7V đến 5.5V) + Chuyển đổi từ cường độ ánh sáng sang tần số với độ phân giải cao + Lập trình lựa chọn lọc màu sắc khác dạng tần số xuất + Điện tiêu thụ thấp Giao tiếp trực tiếp với vi điều khiển Chức chân: + S0,S1 : Đầu vào chọn tỉ lệ tần số đầu + S2,S3 : Đầu vào chọn kiểu photodiode + OE : Đầu vào cho phép xuất tần số chân OUT + OUT : Đầu tần số thay đổi phụ thuộc cường độ màu sắc Linh kiện điện tử Module cảm biến màu TCS3200 với khả nhận biết mầu RGB đèn LED trắng TCS3200 phát đo lường gần tất màu sắc nhìn thấy Ứng dụng bao gồm kiểm tra đọc dải, phân loại theo màu sắc, cảm biến ánh sáng xung quanh hiệu chuẩn, kết hợp màu sắc, vài ứng dụng TCS3200 có tách sóng quang, có lọc màu sắc lọc màu đỏ, xanh dương, màu xanh lá, khơng có lọc ( rõ ràng) Các lọc màu phân bố khắp mảng để loại bỏ sai lệch vị trí điểm màu Bên dao động tạo đầu sóng vng có tần số tỷ lệ thuận với cường độ màu sắc lựa chọn Nguyên lý hoạt động cảm biến mầu linh kiện điện tử TCS3200 : + Cấu tạo cảm biến TCS3200 gồm khối hình vẽ phía dưới: + Khối mảng ma trận 8x8 gồm photodiode.Bao gồm 16 photodiode lọc màu sắc xanh dương (Blue),16 photodiode lọc màu đỏ (Red),16 photodiode lọc màu xanh lá(Green) 16 photodiode trắng không lọc (Clear).Tất photodiode màu kết nối song song với ,và đặt xen kẽ nhằm mục đích chống nhiễu + Bản chất loại photodiode lọc ánh sáng có mầu sắc khác Có nghĩa tiếp nhận ánh sáng có màu với loại photodiode tương ứng không tiếp nhận ánh sáng có màu sắc khác Việc lựa chọn loại photodiode thông qua chân đầu vào S2,S3 : Khối thứ chuyển đổi dòng điện từ đầu khối thứ thành tần số: Tần số đầu linh kiện điện tử TCS3200 khoảng 2HZ~500KHZ Tần số đầu có dạng xung vng với tần số khác mà màu sắc khác cường độ sáng khác Ta lựa chọn tỉ lệ tần số đầu mức khác bảng cho phù hợp với phần cứng đo tần số Ví dụ : Tần số S0 = H,S1=H - Fout = 500Khz thì: S0=H,S1=L -Fout=100Khz S0=L,S1=H -Fout=10Khz S0=L,S1=L -Fout=0 Nguyên lý hoạt động : Ánh sáng trắng hỗn hợp nhiều ánh sáng có bước sóng màu sắc khác Khi ta chiếu ánh sáng trắng vào vật thể Tại bề mặt vật thể xảy tượng hấp thụ phản xạ ánh sáng Ví dụ : Một vật thể có màu sắc đỏ chiếu ánh sáng trắng ánh sáng khơng nằm dải bước sóng màu đỏ bị vật thể hấp thụ Còn ánh sáng có bước sóng nằm dải màu đỏ bị phản xạ ngược trở lại Và khiến mắt ta nhận biết vật thể màu đỏ Màu sắc tổng hợp từ mầu Blue,Green,Red : Dựa nguyên lý phản xạ , hấp thụ ánh sáng trắng vật thể phối chộn màu sắc màu Blue,Green,Red TCS3200 có cấu tạo lọc photodiode Blue,Green,Red clear để nhận biết màu sắc vật thể Hình bên bảng test trình chuyển đổi từ ánh sáng mà loại photodiode nhận thành tần số: 10 Nguyên lý hoạt động mạch a Khối xử lý Đây khối xử lý mạch, sử dụng vi điều khiển ATMega16 Vi điều khiển ATMega16 có tác dụng điều khiển hoạt động mạch cho phép đóng ngắt relay, hiển thị liệu lên LCD… b Khối nguồn Tạo dòng điện ổn định cung cấp cho toàn mạch Trong mạch sử dụng nguồn 5V nên ta dùng IC ổn áp 7805 c Relay 20 Relay mạch có tác dụng đóng ngắt trạng thái băng truyền để khởi động reset liệu hình LCD d Khối hiển thị Chức khối hiển thị hiển thị liệu, cụ thể hiển thị số lượng sản phẩm đếm 21 Sơ đồ nguyên lý Nguyên lý hoạt động toàn mạch Khi mạch hoạt động, băng truyền quay, sản phẩm băng truyền quét cảm biến màu TCS3200, thông qua cảm biến màu sản phẩm phân loai theo màu sắc Vi điều khiển ATMega16 có nhiệm vụ đếm số lượng sản phẩm theo màu xuất liệu lên LCD Mạch điều khiển từ xa thơng qua module bluetooth HC 06 e, Code nạp cho mạch #include #include unsigned char has_product = 0, count_enable = 0, isFromButtonPressed = 0; unsigned char str[16]; unsigned int timer0_count = 0, color_count = 0, red_count = 0, blue_count = 0, green_count = 0, blind_count = 0; 22 unsigned char TCS3200_inProgress = 0; static unsigned int freq = 0; static unsigned int red_freq, blue_freq, green_freq; unsigned int red_product = 0, blue_product = 0, green_product = 0; #define TCS3200_OE PORTB.0 #define TCS3200_OUT PINB.1 #define TCS3200_S0 PORTB.2 #define TCS3200_S1 PORTB.3 #define TCS3200_S2 PORTB.5 #define TCS3200_S3 PORTB.4 #define START_PIN PIND.2 #define STOP_PIN PIND.3 #define RL1_PIN #define RL2_PIN PORTD.7 PORTC.0 #define RED_PIN PORTC.1 #define GREEN_PIN PORTC.2 #define BLUE_PIN PORTC.3 #define FILTER_RED #define FILTER_BLUE #define NO_FILTER #define FILTER_GREEN #define UNIDENTIFIED #define COLOR_RED #define COLOR_BLUE #define COLOR_GREEN #define POWER_DOWN #define FREQ_2_PERCENT #define FREQ_20_PERCENT #define FREQ_100_PERCENT #define OUTPUT_FREQ_ENABLE #define OUTPUT_FREQ_DISABLE #define COLOR_COUNT_MAX #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer 23 #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index++]; #if RX_BUFFER_SIZE != 256 if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #endif #asm("cli") rx_counter; #asm("sei") return data; } #pragma used#endif // Standard Input/Output functions #include // Timer overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { //Reset lai bien dem Timer0 TCNT0 = 0x06; // Place your code here timer0_count++; if (timer0_count >= 150) { //Dung Timer 0, Timer TCCR0 = 0b00000000; TCCR1B = 0b00000000; //Sau 50ms tinh toan tan so freq = TCNT1; timer0_count = 0; //Reset lai bien dem Timer TCNT1 = 0x00; TCS3200_inProgress = 0; } } void TCS3200_init(unsigned char output_freq, unsigned char freq_proportion) 24 { switch (output_freq) { case OUTPUT_FREQ_ENABLE: TCS3200_OE = 1; break; case OUTPUT_FREQ_DISABLE: TCS3200_OE = 0; break; } switch (freq_proportion) { case POWER_DOWN: TCS3200_S0 = 0; TCS3200_S1 = 0; break; case FREQ_2_PERCENT: TCS3200_S0 = 0; TCS3200_S1 = 1; break; case FREQ_20_PERCENT: TCS3200_S0 = 1; TCS3200_S1 = 0; break; case FREQ_100_PERCENT: TCS3200_S0 = 1; TCS3200_S1 = 1; break; } } unsigned int TCS3200_getFreq(unsigned char filter) { if (filter == FILTER_RED) { TCS3200_S2 = 0; TCS3200_S3 = 0; } else if (filter == FILTER_BLUE) { TCS3200_S2 = 0; TCS3200_S3 = 1; } 25 else if (filter == FILTER_GREEN) { TCS3200_S2 = 1; TCS3200_S3 = 1; } else if (filter == NO_FILTER) { TCS3200_S2 = 1; TCS3200_S3 = 0; } TCS3200_inProgress = 1; //Bat Timer 0, Timer TCCR0 = 0b00000010; TCCR1B = 0b00000110; while (TCS3200_inProgress) {} return freq; } unsigned char TCS3200_getColor() { red_freq = TCS3200_getFreq(FILTER_RED); blue_freq = TCS3200_getFreq(FILTER_BLUE) - 200; green_freq = TCS3200_getFreq(FILTER_GREEN) + 400; printf("%d %d %d\r\n", red_freq, blue_freq, green_freq); if (((red_freq < 1800) && (blue_freq < 1800)) || ((green_freq < 1800) && (blue_freq < 1800)) || ((red_freq < 1800) && (green_freq < 1800))) return UNIDENTIFIED; else { if ((red_freq > blue_freq) && (red_freq > green_freq)) return COLOR_RED; else if ((blue_freq > red_freq) && (blue_freq > green_freq)) return COLOR_BLUE; else if ((green_freq > red_freq) && (green_freq > blue_freq)) return COLOR_GREEN; } } // External Interrupt service routine 26 interrupt [EXT_INT0] void ext_int0_isr(void) { //Main isFromButtonPressed = 1; TCS3200_init(OUTPUT_FREQ_ENABLE, FREQ_100_PERCENT); RL1_PIN = 1; RL2_PIN = 1; count_enable = 1; } // External Interrupt service routine interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here isFromButtonPressed = 1; TCS3200_init(OUTPUT_FREQ_DISABLE, FREQ_100_PERCENT); RL1_PIN = 0; RL2_PIN = 0; count_enable = 0; timer0_count = color_count = red_count = blue_count = green_count = blind_count = 0; red_product = blue_product = green_product = 0; has_product = 0; } void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Function: Bit7=In Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out DDRA=(0