Nghiên cứu thiết kế máy Computer Numerical Control loại nhỏ

MỤC LỤC LỜI NÓI ĐẦU 3 CHƯƠNG 1: TÌM HIỂU VỀ MÁY GIA CÔNG TỰ ĐỘNG 4 1.1. Khái quát về điều khiển số và lịch sử phát triển của máy CNC 4 1.2. Cấu tạo của các máy NC, CNC 6 1.2.1. Phân biệt máy CNC và máy NC 6 1.2.2. Các kết cấu cơ bản về cơ khí. 6 1.3. Các động cơ sử dụng trên máy CNC 15 1.3.1. Động cơ 1 chiều 15 1.3.2. Động cơ xoay chiều 15 1.3.4. Động cơ bước 16 1.3.5. Động cơ servo 18 1.4. Cảm biến sử dụng trong máy CNC 18 1.4.1.Khái niệm chung 18 1.4.2.Phân loại 19 1.5. Lập trình 19 1.5.1. Lập trình bằng máy 20 1.5.2. Ngôn ngữ lập trình 20 1.5.3. Ngôn ngữ lập trình tự động 20 1.6. Kết luận chương 1 21 CHƯƠNG 2 : THIẾT KẾ CẢI TIẾN MÁY GIA CÔNG ĐA NĂNG MICRO LATHER 21 2.1. Cơ bản về thiết bị cần cải tiến. 22 2.2. Phân tích và cải tiến chiếc máy MICRO LATHE thành máy gia công bán tự động. 23 2.2.1. Thiết kế mạch điện phần cứng thay đổi cấp tốc độ cho trục chính bằng vi xử lý 24 2.2.2. Thiết kế mạch điều khiển vị trí ăn dao vào chi tiết 27 2.2.3. Phần thiết kế mạch cho vi xử lý 29 2.2.4. Modul giao tiếp máy tính để lập trình 31 2.2.5. phần hiển thị cho biết trạng thái đang làm việc của hệ thống. 32 2.2.6. Phần mềm lập trình trên máy tính 33 2.3. Kết luận chương 2 34 CHƯƠNG 3: THIẾT KẾ MÔ HÌNH MÁY CNC LOẠI NHỎ. 35 3.1. Tổng quan, phạm vi và chức năng của máy 35 Sơ đồ khối 35 3.2. Phân tích và đưa ra giải pháp gia công phần cơ khí cho mô hình. 38 3.2.1. Kết cấu cơ khí trục Z. 38 3.2.2. Kết cấu cơ khí trục X. 40 3.2.3. Kết cấu cơ khí trục Y. 42 3.2.4. Công tắc hành trình 43 3.2.5. Gá mạch và tản nhiệt cho IC công suất 43 3.2.6. Lắp ghép mô hình. 44 3.3. Phân tích và thiết kế mạch điện điều khiển. 45 3.3.1.Phân tích lựa chọn vi điều khiển sử dụng điều khiển mô hình 45 3.3.2. Thiết kế khối giao tiếp với máy tính thông qua cổng truyền thông đa năng USART. 53 3.3.3. Sơ đồ mạch điện cho bộ nhớ ngoài. 54 3.3.4. Sơ đồ mạch điện phần công suất điều khiển động cơ. 56 3.3.4. Sơ đồ mạch nguồn. 59 3.4. Thiết kế phần mềm 60 3.4.1. Thiết kế phần mềm cho vi điều khiển. 60 3.4.2. Thiết kế giao diện trên máy tính. 70 3.5. Chạy thử mô hình và đánh giá kết quả. 76 3.6. Kết luận chương 3 76 KẾT LUẬN 77 TÀI LIỆU THAM KHẢO 78

doc73 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2442 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Nghiên cứu thiết kế máy Computer Numerical Control loại nhỏ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
đã được đưa vào nội dụng EEPROM thì quá trình giải mã bắt đầu được tiến hành, dữ liệu sẽ được giải mã và biến thành các hành động của các trục để thực hiện quá trình gia công. Các hành động của mô hình bao gồm dịch chuyển trục X theo hai hướng, dịch chuyển trục Y theo hai hướng, dịch chuyển trục Z theo hai hướng (nâng hạ mũi khoan), điều khiển cấp tốc độ cho động cơ khoan và đảo chiều quay cho động cơ khoan. Khi gia công hết chương trình, vi điều khiển kiểm tra mã lệnh xem có cần lặp lại quá trình gia công hay không, nếu có thì lặp lại còn nếu không thì kết thúc và chuyển qua chế độ chờ. 3.2. Phân tích và đưa ra giải pháp gia công phần cơ khí cho mô hình. 3.2.1. Kết cấu cơ khí trục Z. Như phân tích phần cơ khí ở trên, mô hình sẽ bao gồm 3 trục đó là trục X, Y và trục Z. Khi hoạt động các trục được tịnh tiến qua lại bằng các động cơ điều khiển nhờ các cơ cấu trục vít bánh vít. Cũng có thể nhìn thấy luôn, khi hoạt động mũi khoan tiến theo trục Z và chỉ được phép di chuyển lên xuống (nâng, hạ). Do khi khoan, tốc độ tiến mũi khoan chậm và yêu cầu cần di chuyển các khoảng nhỏ cho nên ở đây tôi đưa ra phương án chọn động cơ bước. Động cơ bước tôi sử dụng là loại động cơ 2 cuộn dây và có góc bước là 1.8 độ. Có nghĩa là nếu bước đủ vòng thì cần phải đi 200 bước. Bên cạnh đó, cơ cấu trục vít bánh vít có tác dụng hạn chế chuyển động tối đa vòng quay của động cơ và đồng thời tạo lực ép mũi khoan lớn. Cơ cấu trục vít bánh vít sử dụng loại bulong đai ốc có bước ren là 1mm. Với kết cấu như vậy thì động cơ bước khi bước 200 bước sẽ chỉ làm cho mũi khoan tiến dọc trục được một khoảng là 1mm. Như vậy khoảng dịch chuyển nhỏ nhất của mũi khoan là 1mm/200=0.005mm. Với khoảng cách này đảm bảo cho tốc độ tiến mũi khoan. Để có thể thực hiện ghép trục bulong vào với trục động cơ, tôi khoan một lỗ nhỏ ở đầu trục có đường kính vừa khít với đường kính của trục động cơ và thực hiện đóng cốt để ghép chặt hai chi tiết này với nhau. Bằng cách này trục động cơ và bulong được ghép chết với nhau. Hình vẽ 3.3 bên dưới là hình chụp của động cơ và trục sau khi đã tiến hành đóng cốt với nhau. Hình 3.3: Động cơ và trục bulong sau khi đã ghép với nhau. 2: Đầu bulong sau khi đã ghép với động cơ 1: Động cơ bước gắn với bulong. Yêu cầu đặt ra ở đây là làm sao khi động cơ bước quay thì mũi khoan của ta cần phải di chuyển lên xuống dọc trục tùy theo chiều quay của động cơ. Để thực hiện được điều này một cách êm ái và trơn tru thì tôi sử dụng một loại đệm trượt dùng bi để gắn giữa hai thanh nhôm. Thanh nhôm làm khung và thanh nhôm chứa động cơ khoan. Khi gắn xong, hai thanh có thể trượt nhẹ nhàng trên nhau. Phần đai ốc của bulong sẽ phải được gắn cố định lên một thanh nhôm có chứa động cơ khoan để sao cho khi động cơ quay làm cho bulong quay, đai ốc sẽ tiến dọc trục động cơ khoan kéo theo sự chuyển động lên xuống của động cơ khoan. Tiến hành gia công và lắp ghép ý tưởng tôi được một kết cấu di chuyển như hình vẽ 3.4 dưới đây. Hình 3.3: hệ thống trượt được nối với trục động cơ. Như chỉ số ở trên hình, bulong số 3 được ghép chặt với thanh trượt số 4 là thanh trượt có mang động cơ khoan trên đầu. Bulong được sẻ rãnh và ép chặt bằng hai bulong nhỏ ở hai đầu, nhìn trên mô hình chúng ta có thể thấy được điều này. Đệm trượt dùng bi số 2 đệm giữa thanh trượt 4 và khung 5 làm cho quá trình dịch chuyển lên xuống được nhẹ nhàng. Ở đầu thanh trượt 4, ta cần lắp ghép động cơ khoan với thanh trượt đảm bảo chắc chắn, khi khoan không bị rung hay bị tuột ra khỏi thanh trượt. Tôi sử dụng đai để cố định hai chi tiết này với nhau. Hình vẽ 3.4 thể hiện điều này. Động cơ khoan yêu cầu phải là loại động cơ có mômen đủ để thực hiện gia công trên một vài phôi nào đó. Ngoài ra nó phải thay đổi được tốc độ khoan, đảo chiều khi cần thiết. Tôi chọn loại động cơ 1 chiều công suất nhỏ có gắn mũi khoan ở đầu. Ở hình vẽ bên dưới, động cơ khoan 1 được ghép vào với thanh trượt 2 thông qua đai số 3. Hình 3.3: Ghép động cơ khoan vào với thanh trượt. Đối với hai trục còn lại, trục X và trục Y có nhiệm vụ dịch chuyển bàn khoan theo hai phương vuông góc với nhau. Cũng giống như trục Z, yêu cầu đặt ra là các di chuyển bàn khoan theo các phương phải nhỏ và khi di chuyển lực di chuyển phải lớn. Do đó tôi vẫn chọn phương án trục vít bánh vít. Ở đây tôi vẫn sử dụng bulong đai ốc có sẵn với bước ren 1mm. Bàn khoan được thiết kế sử dụng nhựa cứng phíp chuyển dùng để gia công với nhôm và nhôm thanh. Bàn khoan sau khi thiết kế cần phải trượt nhẹ nhàng dọc theo trục X hoặc trục Y. Sau đây tôi đưa ra phương án thiết kế kết cấu cho hai trục 3.2.2. Kết cấu cơ khí trục X. Nói ra thì khó tưởng tượng, sau quá trình phân tích tôi quyết định đưa ra kết cấu như hình vẽ 3.4 dưới đây có thể giúp cho bàn khoan có thể trượt một cách tự do nhẹ nhàng theo yêu cầu. Tấm nhựa bàn khoan 1 được gá lên thanh nhôm hình chữ L như hình vẽ. Trên thanh nhôm hình chữ L có khoan các lỗ để có thể đưa qua đó hai thanh trượt cũng được làm bằng nhôm và được gá cố định ở hai đầu. Như vậy khi đó thì bàn khoan bây giờ đã có thể trượt tự do trên hai thanh nhôm tròn. Cũng giống như trục Z, thanh dài bulong được khoan một lỗ nhỏ ở đầu có đường kính đúng bằng đường kính đúng bằng đường kính của của trục động cơ, sau đó tiến hành đóng cốt để ghép chặt trục bulong và động cơ. Bây giờ khi động cơ quay sẽ làm cho thanh bulong quay theo. Để cho quá trình hoạt động được trơn chu hơn, trục bulong của động cơ trục X được đỡ bằng hai gối đỡ có vòng bi 3. Khi động cơ và trục bulong quay sẽ làm cho vòng bi quay và trượt nhẹ nhàng theo cơ cấu của vòng bi. Cuối cùng là việc gá đai ốc vào với bàn trượt. Đai ốc được sẻ một rãnh nhỏ để bàn khoan có thể gá lên trên đó mà không bị trượt ra ngoài. Việc ghép bàn khoan và đai ốc là một mối ghép động nhưng vẫn đảm bảo hoạt động tốt khi khoan. Do sử dụng mỗi ghép động cho nên khi hoạt động kết cấu hệ thống sẽ không bị bó cứng. Động cơ được lựa chọn là loại động cơ 1 chiều công suất nhỏ nhưng vẫn đảm bảo đủ moment trong quá trình hoạt động. Sở dĩ tôi chọn loại động cơ một chiều để đảm bảo tính linh hoạt cho sự di chuyển của bàn khoan. Nếu sử dụng động cơ bước cho mô hình sẽ kéo theo sự phức tạp của mạch điều khiển. Kế theo đó sẽ làm sự di chuyển của bàn khoan sẽ trở nên chậm chạp đi rất nhiều. Còn một vấn đề nữa, nếu lựa chọn động cơ bước, khi đó ta sẽ thực hiện điều khiển động cơ bước và đếm bước của động cơ để xác định ra khoảng cách di chuyển. Nhưng nếu một trường hợp không mong muốn nào đó, bước đưa ra không được thực hiện bởi phần cơ khí (trường hợp mất bước) thì lúc đó vi điều khiển không thể nào phát hiện ra được và dẫn đến gia công sẽ bị sai. Còn về phần tốc độ, thử làm một phép tính đơn giản sẽ thấy được ngay. Giả sử tôi tính cho trục X chẳng hạn, Chiều dài của trục X là 10cm. Cơ cấu trục vít bánh vít sử dụng loại bulong có bước ren là 1mm, do đó khi hoạt động, muốn di chuyển một đoạn là 1mm thì động cơ phải quay một vòng. Còn di chuyển hết trục X (100mm) thì động cơ quay 100 vòng. Nếu sử dụng động cơ bước để xoay trục, tốc độ tối đa của động cơ bước sẽ khoảng 200 vòng / phút. Khi đó để di chuyển được hết trục X ở trên thì phải mất khoảng thời gian là 30s. Còn nếu đối với động cơ 1 chiều với tốc độ khi quay khoảng 2500 vòng / phút. Khi đó khoảng thời gian để chạy hết trục X là 100/2500 phút và tính vào khoảng 2.4 giây, rõ ràng là nhanh hơn đáng kể. Động cơ sau khi ghép với trục bulong được ghép vào phần đế bằng một tấm nhựa nhỏ và hai chiếc bulong dài. Điều này có thể nhìn thấy rất rõ ở hình 3.3 bên dưới. Ở đầu động cơ có gắn encoder, đây là bộ phận quan trọng và không thể thiếu vì nó cho phép ta xác định được vị trí của bàn khoan. Encoder này cũng là một thiết bị được gia công thủ công và chỉ có 4 xung cho một vòng quay của động cơ. Đế và khung 7 được thiết kế chủ yếu bằng nhựa phíp và nhôm. Các mối ghép chủ yếu sử dụng là các đinh rút và các bulong cỡ nhỏ, có các mối ghép sử dụng mối ghép vĩnh cửu như mối ghép giữa thanh gối vòng bi và đế chẳng hạn, một số chi tiết được lắp ghép bằng mối ghép tháo được như mối ghép ở động cơ. Hình vẽ bên dưới thể hiện toàn bộ kết cấu cơ khí của phần dịch chuyển trục X. Hình 3.3: Cơ cấu dịch chuyển bàn khoan theo trục X 3.2.3. Kết cấu cơ khí trục Y. Cũng hoàn toàn giống với kết cấu cơ khí ở trục X, ở đây tôi sẽ đưa hình ảnh lên trước sau đó sẽ giải thích các bộ phận cũng như hoạt động của nó sau. Hình ảnh 3.4 ở dưới đây là hình ảnh thực tế tôi chụp từ mô hình của mình. Hình 3.4: Cơ cấu dịch chuyển bàn khoan theo trục X Nhiệm vụ của kết cấu trục Y lúc này không phải chỉ đẩy một bàn khoan duy nhất như trục X nữa. Lúc này toàn bộ cơ cấu bao gồm bàn khoan, động cơ trục X, thanh trượt, đế và các chi tiết liên quan sẽ đượt đưa lên thanh trượt của trục Y. Ở trên hình, số 1 là đế của cơ cấu trục X , trên đó chứa toàn bộ cơ cấu trục X được trình bày ở trên. Còn lại toàn bộ cơ cấu tịnh tiến và lắp ghép cũng giống hoàn toàn với cơ cấu của trục X. Động cơ số 5, ở đầu có lắp encoder, đầu còn lại được đóng cốt với một bulong cùng loại. Thanh trượt được cố định ở hai đầu, đai ốc được xẻ rãnh để ghép động với đế số 1. Về cơ bản, ở phần trên tôi đã trình bày các kết cấu cơ khí chính của mô hình máy CNC loại nhỏ, ngoài ra để mô hình có thể hoạt động được thì cần phải có các yêu tố khác. Nó đóng góp phần không thể thiếu trong quá trình hoạt động của mô hình. Ở phần tiếp theo đây tôi xin trình bày về các chi tiết đó. 3.2.4. Công tắc hành trình Công tắc hành trình có tác dụng khi bắt đầu khởi động mô hình lên. Toàn bộ các trục sẽ hoạt động theo chiều âm của các trục để đưa mũi khoan về tọa độ điểm 0 của chi tiết. Công tắc hành trình giúp cho vi điều khiển phát hiện ra khi nào mũi khoan đã thực sự về đến điểm 0 của chi tiết. Do đó khi tiến hành lắp công tắc hành trình chúng ta phải chú ý sao cho khi công tắc hành trình bắt đầu kích hoạt thì lúc đó vị trí mũi khoan đang ở điểm gốc. Do mô hình máy có 3 trục X, Y và Z nên ta cần sử dụng 3 công tắc hành trình cho 3 trục này. Hình vẽ dưới đây là hình ảnh về công tắc hành trình sau khi đã tiến hành đo và lắp đặt trên mô hình máy. Hình 3.5: Công tắc hành trình sau khi đã lắp trên mô hình 3.2.5. Gá mạch và tản nhiệt cho IC công suất Đặt mạch lên mô hình sao cho trong quá trình hoạt động các kết cấu cơ khí không ảnh hưởng đến linh kiện cũng như các dây nối từ các cảm biến trả về. Tôi đặt mạch ở vị trí cuối của mô hình, nơi này không bị ảnh hưởng bởi các dịch chuyển khi mô hình hoạt đông. Các dây điện dẫn tín hiệu cảm biến cũng như các dây cấp nguồn cho các động cơ được gá cố định và gọn gàng trên khung. Mạch phải được đặt sao cho không sảy ra hiện tượng chập chân do khung mô hình được chế tạo bằng nhôm. Trong quá trình hoạt động, các IC công suất tản ra một nhiệt lượng nào đó tùy theo chế độ hoạt động cũng như thời gian hoạt động của mô hình. Lượng nhiệt này nếu không được tản ra xung quanh thì sẽ có thể gây cháy nổ IC và làm hỏng mạch điều khiển. Lợi dụng khung của mô hình được làm bằng nhôm tôi quyết định tản nhiệt ra khung nhôm. Toàn bộ các IC công suất bao gồm các IC điều khiển động cơ, IC chỉnh lưu, IC ổn áp được ép toàn bộ phần tản nhiệt vào khung nhôm. Hình chụp bên dưới chụp từ mô hình thể hiện những gì tôi trình bày ở trên. Hình 3.6:Tản nhiệt cho IC công suất 3.2.6. Lắp ghép mô hình. Sau khi thiết kế xong các phần cơ khí tiến hành lắp ráp các bộ phận và cho ra sản phẩm cuối cùng như hình chụp bên dưới. Hình 3.7: Mô hình cơ khí sau khi hoàn thành. Khi đã có kết cấu cơ khí cho mô hình máy, chúng ta tiến hành đi thiết kế mạch điện điều khiển mô hình sao cho phù hợp với các động cơ và cảm biến đã lắp đặt. Ở phần tiếp theo đây tôi trình bày quá trình thiết kế mạch điều khiển và lập trình cho mô hình máy. 3.3. Phân tích và thiết kế mạch điện điều khiển. Yêu cầu mạch điều khiển phải đảm bảo thực hiên được các yêu cầu sơ đồ khối của mạch điện đã được đưa ra và trình bày cơ bản chức năng ở phần trên. Ở phần này tôi chỉ trình bày cách thiết kế các khối có trong mạch điều khiển chính. 3.3.1.Phân tích lựa chọn vi điều khiển sử dụng điều khiển mô hình a. phân tích và lựa chọn. Sau khi đã phân tích thiết kế phần cơ khí và các động cơ điều khiển mô hình chúng ta cần tiến hành chọn loại vi điều khiển nào cho phù hợp. Yêu cầu phải đảm bảo đủ các cấu trúc phần cứng cũng như đảm bảo về tốc độ, bộ nhớ. Có thể thấy mạch dùng điều khiển 4 động cơ bao gồm 3 động cơ 1 chiều và 1 động cơ bước. Do đó số chân cổng tối thiếu để điều khiển động cơ phải là 10. Tiếp theo công tắc hành trình trả về tín hiệu ở tại 3 chân cổng hướng dữ liệu vào. Các tín hiệu xung encoder trả về từ 2 trục gồm hai chân của bộ đếm counter. 2 chân của I2C dùng giao tiếp với EEPROM ngoài. Các chân cổng nạp, các chân giao tiếp với led hiển thị. Như vậy tính sơ qua vi điều khiển cần tới gần 20 chân cổng vào ra. Cần 2 bộ đếm xung ngoài, cần 1 phần cứng giao tiếp RS232, cần một phần cứng giao tiếp I2C. Để thỏa mãn các yêu cầu trên ở đây tôi đưa ra phương án chọn vi điều khiển thuộc dòng vi điều khiển AVR của Atmel là Atmega16. Phần tiếp theo đây tôi trình bày về các đặc tính của vi điều khiển tôi chọn làm bộ xử lý. Ở phần này tôi chỉ trình bày cơ bản và sơ qua về dòng vi điều khiển tôi sử dụng. Thanh ghi dữ liệu (Data register). Các thanh ghi dữ liệu gồm có cổng A, cổng B, cổng C, cổng D có chức năng đọc ghi dữ liệu. Giá trị khởi tạo sau khi Reset là 0x00. Ban đầu nếu được khởi tạo là cổng ra thì khi ghi dữ liệu vào sẽ làm thay đổi giá trị logic của các chân hay làm thay đổi chức năng của cổng. Hình 3.8: Các thanh ghi dữ liệu của các cổng của Atmega16. Các thanh ghi dữ liệu cổng A, cổng B, cổng C và cổng D đều gồm có 8 bit từ PA0 ÷ PA7, PB0 ÷ PB7, PC0 ÷ PC7và PD0 ÷ PD7. Thanh ghi hướng dữ liệu (Data direction). Gồm có các thanh ghi: DDRA, DDRB, DDRC, DDRD. Có chức năng xác định hướng dữ liệu truyền cho các thanh ghi cổng A, cổng B, cổng C và cổng D. Ví dụ như thanh ghi DDRB được sử dụng để xác định hướng truyền dữ liệu cho từng chân của cổng B. Khi ghi một giá trị “0” (cũng là giá trị khôi phục) vào bit bất kỳ của thanh ghi sẽ làm cho bit đó trở thành đầu vào (ghi dữ liệu vào) và khi ghi giá trị “1” sẽ làm cho nó trở thành đầu ra (đọc dữ liệu ra). Hình 3.9: Các thanh ghi hướng dữ liệu của các cổng của Atmega16. Thanh ghi UDR (USART I/O data register). Thanh ghi đệm truyền nhận dữ liệu có phần giống địa chỉ I/O được xem như thanh ghi dữ liệu USART hay UDR. Khi thực hiện quá trình đọc ( nhận) dữ liệu vào thì thanh ghi truyền dữ liệu đệm (TXB) sẽ đến ghi dữ liệu vào thanh ghi UDR. Còn khi truyền, thanh ghi UDR sẽ quay trở lại chứa giá trị của thanh ghi nhận dữ liệu đệm (RXB). Hình 3.11: Thanh ghi UDR ( bộ đệm truyền thong) Sự truyền bộ đệm chỉ được ghi khi cờ UDRE trong thanh ghi UCSRA được set. Dữ liệu ghi đến UDR khi cờ UDRE không được kích sẽ đồng ý truyền bởi USART. Khi dữ liệu được ghi vào đệm phát và thông tin được kích hoạt, thông tin sẽ tải dữ liệu vào thanh ghi truyền vị trí khi thanh ghi vị trí rỗng. Sau đó dữ liệu sẽ truyền ra từng chu kỳ trên chân TXD. Thanh ghi UCSRA (USART Control and Status Register A). Hình 3.12: Thanh ghi UCSRA. Bit 7-RXC USART nhận thành công. Bit cờ sẽ được thiết lập khi có dữ liệu chưa đọc trong vùng nhận đệm và bị xoá khi vùng nhận đệm rỗng. Nếu vùng nhận không được kích hoạt vùng đệm nhận sẽ bị kích hoạt vì vậy bit RXC sẽ có giá trị 0. Bit 6-TXD: USART truyền thành công. Bit cờ sẽ được thiết lập khi toàn bộ khung trong thanh ghi vị trí truyền toàn bộ ra ngoài và không có dữ liệu mới trong khi bộ đệm truyền (UDR). Cờ TXC có thể phát truyền ngắt thành công. Bit 5-UDRE: USART thanh ghi dữ liệu rỗng. UDR đã sẵn sàng để nhận một byte mới. Bit 4- FE: Frame Error: Bit sẽ thiết lập nếu một ký tự tiếp theo trong vùng đệm nhận có một khung lỗi khi nhận. Luôn để bit này ở mức 0 khi ghi vào thanh ghi UCSRA Bit 3- DOR: Data Over Rung Bit này sẽ được thiết lập khi phát hiện dữ liệu tràn. Dữ liệu tràn được tìm thấy khi vùng nhận đệm đầy. Luôn để bit này ở mức 0 khi ghi vào thanh ghi UCSRA. Bit 2-PE: Party Error Bit này sẽ được thiết lập nếu ký tự tiếp theo trong vùng đệm có lỗi chẵn lẻ Luôn để mức 0 khi ghi vào thanh ghi UCSRA Bit 1-U2X: Tốc độ truyền USART gấp đôi Để mức 0 khi có sự hoạt động của xung đồng bộ. Bit 0-MPCM: Kiểu xử lý truyền thông. Thanh ghi UCSRB (USART Control and Status Register B). Hình 3.13: Thanh ghi UCSRB. Bit 7-RXCIE: RX cho phép ngắt thành công. Bit 6-TXCIE: TX cho phép ngắt thành công. Bit 5-UDRIE: Cho phép thanh ghi dữ liệu USART ngắt rỗng. Bit 4-RXEN: Cho phép nhận. Bit 3-TXEN: Cho phép gửi. Bit 2-UCSZ2: Cỡ ký tự. Bit 1-RXB8: Nhận bít 8 dữ liệu. Bit 0-TXB8: Truyền bit 8 dữ liệu. Thanh ghi UCSRC (USART Control and Status Register C). Hình 3.14: Thanh ghi UCSRB. Bit7-URSEL: Lựa chọn thanh ghi. Bit7-URSEL: Lựa chọn kiểu USART. Bit 5:4-UMP1:0: Kiểu chẵn lẻ. Bit 3 – USBS: Lựa chọn dừng bit. Bit 2:1 UCSZ1:0: Cỡ ký tự. Bit 0 : UCPOL: Thời gian phân cực. Thanh ghi UBRRH, UBRRL (USART Baud Rate Register). Hình 3.15: Thanh ghi UBRR Bit 15-URSEL: Lựa chọn thanh ghi. Bit 14-12: Nhận bits. Bit 11-0 – UBRR11:0: USART tốc độ truyền thanh ghi. Trên đây là các thanh ghi điển hình trong Atmega16, dưới đây là một số khối hay sử dụng: Khối số học ALU. Khối số học (ALU) thực hiện các thao tác như thao tác bit phép tính số học và logic trên nội dung của các thanh ghi và ghi ngược kết quả vào tệp thanh ghi trên thanh ghi đã được chỉ định. Các thao tác này được thực hiện trong một chu kỳ đồng hồ đơn lẻ. Mỗi một thao tác ALU đều làm ảnh hưởng đến các cờ trong thanh ghi trạng thái tuỳ thuộc vào lệnh. Bộ nhớ EEPROM. Tất cả các bộ vi điều khiển AVR đều có một bộ nhớ EEPROM trên chip. Dung lượng bộ nhớ EEPROM thay đổi từ 64 byte đến 4KB. Bộ nhớ EEPROM được truy nhập thông qua thanh ghi truy nhập EEPROM. Thanh ghi EEAR là thanh ghi đọc/ghi, được sử dụng để đặt địa chỉ của bộ nhớ EEPROM mà dữ liệu cần ghi vào đó hoặc đọc ra từ đó. Các cổng vào/ra. Tất cả các cổng lối ra của các bộ vi điều khiển AVR có thể chịu đựng dòng điện đến 20 mA nên rất thích hợp với việc điều khiển trực tiếp các đèn LED vì không cần các mạch đệm bổ sung. Các cổng vào ra đều có ba địa chỉ vào ra đi kèm với nó. Ba địa chỉ vào ra được cần đến để đặt cấu hình cho các bit riêng biệt thành lối vào hoặc thành lối ra. Các cổng đó được đánh số là DDRx, cổngx, PINx. Để đọc dữ liệu ở chân lối vào của một cổng ta sử dụng thanh ghi PINx. Thanh ghi PINx được nối trực tiếp với chân của cổng, chúng có thể được cấp tín hiệu để duy trì trạng thái theo cách tạo mức điện áp cao bên trong bằng cách ghi giá trị 1 vào bit cổng ở các địa chỉ cổngx và ngược lại Hình 3.16: Các thanh ghi PINx. Bộ nhớ SRAM. Có trong hầu hết các bộ vi xử lý có giá thành cao trong họ AVR. Dung lượng thay đổi từ 128 byte đến 4K byte. Được truy nhập bằng nhiều lệnh truy nhập trực tiếp hoặc gián tiếp, thời gian truy nhập bộ nhớ Ram bằng 2 lần chu kỳ đồng hồ. Bộ định thời. Có chức năng giống như một bộ định thời hoặc một bộ đếm. Giống bộ định thời tín hiệu giữ nhịp bên trong hoặc một dẫn xuất của tín hiệu giữ nhịp đó được sử dụng để giữ nhịp bộ định thời, trong khi giống như bộ đếm một tín hiệu từ bên ngoài ở chân của một cổng được sử dụng để giữ nhịp bộ định thời/ bộ đếm. Bộ truyền nhận UART. Việc truyền dữ liệu được khởi tạo bằng cách ghi dữ liệu vào thanh ghi dữ liệu UDR. Dữ liệu truyền từ thanh ghi dữ liệu UDR đến thanh ghi dịch khi: Một ký tự mới đã được ghi vào UDR sau khi bit stop từ ký tự trước đó đã được dịch chuyển ra. Thanh ghi dịch chuyển ra được nạp ngay lập tức. Một ký tự mới đã được ghi vào UDR trước khi bit stop từ ký tự trước đã được dịch đi. Thanh ghi dịch được nạp khi bit stop của ký tự đang được truyền đã được dịch chuyển ra. Cấu trúc ngắt. Thiết bị ngoại vi sẽ ngắt việc thực thi của chương trình chính và bộ xử lý tạm thời ngừng làm việc thực thi chương trình bình thường để thẩm tra nguồn ngắt và để thực hiện những thao tác đáp ứng cần thiết, sau khi xong việc thực thi chương trình đã bị ngắt lại tiếp tục. Bộ so sánh ANALOG. Bộ so sánh Analog so sánh các giá trị điện áp ở lối vào, cụ thể là ở lối vào AIN0 (AC+) và AIN1(AC-) với nhau. Nếu điện áp ở lối vào AIN0 lớn hơn ở lối ra AIN1 thì lối ra của bộ so sánh Analog ACO được đặt lên mức Lối ra này có thể được sử dụng cho bộ Timer/Counter1 để kích hoạt hoặc xoá ngắt bộ so sánh Analog. Bộ biến đổi A/D bên trong. Bộ biến đổi tương tự số có độ phân giải là 10 bit, bộ dồn kênh 8 lối vào. Bộ biến đổi ADC được điều khiển qua 4 thanh ghi ADMUX, ADCSR, ADCH và ADCL trong vùng địa chỉ vào ra. Kết quả của quá trình biến đổi A/D được đặt ở thanh ghi ADCH (bit 8 và 9) và ADCL (bit 0-7). Bộ định thời Watchdog bên trong. Là một bộ định thời điều khiển được và được sử dụng làm thiết bị đánh thức trong trường hợp phần mềm bị rơi vào một hoặc một số vòng lặp vô tận hoặc trong trường hợp việc thực thi chương trình bị mắc lỗi. Có một lối ra có khả năng đặt lại bộ điều khiển. Khi phần mềm bị treo, bộ định thời có khả năng reset lại toàn bộ hệ thống và thực hiện chạy lại từ đầu chương trình. b. Thiết kế môdul mạch vi xử lý với atmega16 Cũng như bất kì dòng vi điều khiển nào khác, để có thể hoạt động bình thường ta cần cấp cho vi điều khiển nguồn áp 5v và nguồn xung thạch anh. Hình vẽ 3.17 dưới đây là sơ đồ mạch sau khi đã thiết kế trên phần mềm Orcad. Hình 3.17: Sơ đồ phần vi điều khiển Như ở hình vẽ bên trên đây, thạch anh Y1 được nối với vi điều khiển để cấp nguồn dao động cho chip thông qua hai chân X1 và X2 của chip, ngoài ra hai chân thạch anh còn được nối xuống đất thông qua hai tụ C1 và C2 có nhiệm vụ dập tắt dao động tần số cao ảnh hưởng đến dao động cho mạch vi điều khiển. Điện trở R1 có giá trị 10k dùng để treo chân reset của mạch lên mức cao. Cụ thể là, khi hoạt động bình thường, nếu chân reset của vi điều khiển bị kéo xuống mức thấp sẽ làm cho vi điều khiển thực hiện quá trình reset. Điện trở ở bên trên có nhiệm vụ chống reset trong những trường hợp không mong muốn. Các chân cổng nạp được đưa ra ngoài qua Jum J1, bao gồm các chân dữ liệu và chân nguồn có tác dụng trong việc nâng cấp hoặc update phần mềm mới cho hệ thống. Các chân tín hiệu còn lại được nối ra bên ngoài với các nhiệm vụ riêng biệt của từng khối. Ở dưới đây là bảng thể hiện chức năng các chân cổng sử dụng cho việc điều khiển các modul bên ngoài. Bảng 3.1: Bảng chức năng của các chân sử dụng trong vi điều khiển. Số chân Tên Chức năng 1 T0 Tín hiệu vào của encoder trục X 2 T1 Tín hiệu vào của encoder trục Y 3 SDA Chân dữ liệu kết nối với EEPROM thông qua chuẩn I2C 4 SCL Chân clock kết nối với EEPROM thông qua chuẩn I2C 7 LED2 Nối với led 7 thanh bên ngoài thông qua SPI 8 LED1 Nối với led 7 thanh bên ngoài thông qua SPI 9 Reset Nối qua Jum làm nhiệm vụ kết nối mạch nạp 10 5V Cấp nguồn 5v 11 0v Nối đất cho mạch 14 RXD Nhận dữ liệu qua cổng UART 15 TXD Phát dữ liệu qua cổng UART 20 Role Thông qua l298 điều khiển động cơ khoan 21 Pwm Thông qua l298 điều khiển động cơ khoan 40 40 Thông qua l298 điều khiển động cơ bước 39 39 Thông qua l298 điều khiển động cơ bước 38 38 Thông qua l298 điều khiển động cơ bước 37 37 Thông qua l298 điều khiển động cơ bước 36 36 Thông qua l298 điều khiển động cơ trục X 35 35 Thông qua l298 điều khiển động cơ trục X 34 34 Thông qua l298 điều khiển động cơ trục Y 33 33 Thông qua l298 điều khiển động cơ trục Y 3.3.2. Thiết kế khối giao tiếp với máy tính thông qua cổng truyền thông đa năng USART. Do sự khác biệt về mức tín hiệu 0 và 1 ở hai điểm: máy tính và vi điều khiển cho nên muốn ghép nối giữa hai điểm này ta cần phải sử dụng một mạch chuyển đổi tín hiệu để cho hai bên có thể “hiểu” được nhau. Có thể nói một cách rõ ràng hơn, trên cổng COM của máy tính sử dụng hai mức điện áp 0 ứng với +12v, mức điện áp 1 ứng với -12v trong khi đó tại cổng nối tiếp của vi điều khiển thì lại khác biệt hoàn toàn. Ứng với mức điện áp 0v sẽ qui định đó là mức 0, còn ở mức điện áp 5v sẽ coi là mức 1. Hình vẽ 3.18 bên dưới là Hình 3.18: Sơ đồ mạch chuyển đổi tín hiệu truyền thông. Để thực hiện yêu cầu này, tôi chọn IC max232 là một IC chuyên dụng cho việc chuyển đổi mức tín hiệu cho hai điểm này. MAX232 có chức năng là một bộ điều khiển đường truyền (bộ chuyển đổi điện áp) để chuyển các tín hiệu RS232 (-12V ÷ +12V) về các mức điện áp TTL (0V ÷ +5V) được các chân RxD và TxD của ATmega16 chấp nhận và ngược lại chuyển tín từ Atmega16 về RS232. Để có thể hoạt động bình thường và ít sai số thì MAX232 cần phải được mắc 5 tụ (C122, C133, C144,C155 và tụ C166 ở các chân 1,2,4,5,6,15,16) có giá trị từ 1µF đến 22µF.Ở mạch trên dùng tụ với giá trị 10µF. MAX232 có 2 đôi chân truyền và 2 đôi chân nhận, ở mạch này Khi đã có phần chuyển đổi, ta có thể thực hiện truyền dữ liệu qua lại mà không cần quan tâm tới modul chuyển đổi mức tín hiệu nữa. Phần tiếp theo đây tôi sẽ giới thiệu modul bộ nhớ ngoài, EEPROM 24c64. 3.3.3. Sơ đồ mạch điện cho bộ nhớ ngoài. Tôi sử dụng một IC nhớ bên ngoài thuộc loại bộ nhớ EEPROM có đăc tính không bị mất dữ liệu khi bị mất điện hoặc vi điều khiển bị reset. Sở dĩ phải chọn như vậy vì hai lý do, thứ nhất bộ nhớ EEPROM tích hợp sẵn trong vi điều khiển nhỏ không đủ chứa được một chương trình gia công. Lý do thứ hai để tôi quyết định chọn EEPROM là yêu cầu đảm bảo dữ liệu trong quá trình gia công. Khi đang gia công, sảy ra sự cố như mất điện hoặc treo hoàn toàn là hiện tượng không thể tránh khỏi. Khi sảy ra sự cố đó vi điều khiển thực hiện reset lại toàn bộ hệ thống và điều này không làm mất nội dung chương trình bên trong EEPROM. EEPROM được chọn là EEPROM 24c64, như cái tên của nó đã thể hiện, độ rộng vùng nhớ ở bên trong là 64Kbyte. Với con số này thì giới hạn người lập trình chỉ được viết các chương trình sao cho có độ lớn nhỏ hơn 64kbyte. Tuy nhiên, con số trên có thể chứa đươc 65.535 ký tự mã lệnh. Nó cũng không phải là một con số nhỏ. EEPROM chỉ có 8 chân trong đó có 2 chân nguồn nuôi, 2 chân giao tiếp dữ liệu qua lại, một chân cấm ghi vào trong nội dung khi cần. 3 chân còn lại có nhiệm vụ tạo thành địa chỉ của nó trên mạng giao tiếp. EEPROM giao tiếp với thế giới bên ngoài thông qua chuẩn giao tiếp I2C. Hình vẽ 3.19 bên dưới của EEPROM tôi đang nói đến. Hình 3.19: EEPROM 24c64 Ở trên hình 3.13, hình b là hình ảnh thật về EEPROM. Nó chỉ có 8 chân như đã nói và được đóng vỏ 2 hàng chân hai bên. Ở hình c là sơ đồ chân chức năng cho EEPROM. Cũng như bất kì thiết bị giao tiếp I2C nào khác, nó cũng có địa chỉ của mình ở trên hệ thống bus chung. Hình a cho ta biết địa chỉ của EEPROM sẽ như thế nào ở trên mạng I2C. Byte địa chỉ lựa chọn (device select code) bao gồm 3 phần, phần đầu được nhà sản xuất đánh cố định là 1010 bao gồm các bit ở phần cao của byte. Các bit E0, E1, E2 được qui định từ các chân 1, 2, 3 của EEPROM. Như vậy là do cách kết nôi 3 chân này lên mức cao hay mức thấp mà EEPROM sẽ có một địa chỉ khác nhau trên mạng I2C. Do chỉ có 3 bit nên có thể khẳng định luôn là địa chỉ của loại EEPROM này chỉ có thể tạo được 23 =8 địa chỉ khác nhau. Và tất nhiên trên một mạng I2C không thể tồn tại quá 8 EEPROM 24c64 được. Bít cuối cùng qui định hướng giao tiếp dữ liệu với EEPROM. Nếu bít này là 1 thì hành động đọc nội dung sẽ được thực hiện. Còn nếu bít này bằng 0 thì hành động ghi vào nội dung sẽ được thực hiện. Việc kết nối với vi điều khiển rất đơn giản chỉ cần cấp nguồn cho EEPROM và kết nối với vi điều khiển thông qua hai dây dữ liệu và xung nhịp như ở hình 3.20 dưới đây. Để đảm bảo cho chuẩn I2C hoạt động bình thường thì cần phải có hai điện trở kéo lên mức cao có giá trị 10k. Hình 3.20: Sơ đồ kết nối EEPROM với vi điều khiển. Ở trên tôi kéo hết toàn bộ các chân địa chỉ của xuống đất, khi đó các bít tương ứng sẽ bằng 0. Bằng cách này địa chỉ của EEPROM lúc ghi sẽ là 0xA0 còn địa chỉ lúc đọc sẽ là 0xA1. Có một chân số 7 cũng bị kéo xuống mức thấp, chân này có tác dụng như sau, nếu ở mức cao thì quá trình ghi vào EEPROM bị cấm. Như vậy để ghi vào nội dung ta cần kéo xuống mức thấp. Tiếp theo đây tôi sẽ giới thiệu về khối công suất điều khiển động cơ các trục cũng như động cơ khoan thông qua chip L298. 3.3.4. Sơ đồ mạch điện phần công suất điều khiển động cơ. Về nguyên lý thì vi điều khiển chỉ có thể đưa ra chân cổng của mình mức điện áp 5v với dòng rất nhỏ cỡ vài trăm mili ampe. Do đó không thể dùng mức dòng điện và điện áp này để điều khiển động cơ các trục được. Do đó mạch công suất có nhiệm chuyển tín hiệu điều khiển thành dòng và áp đủ để điều khiển được động cơ. Đối với động cơ 1 chiều có rất nhiều cách, rất nhiều phương pháp để điều khiển, trước hết tôi sẽ nói tới động cơ 1 chiều ở hai trục X và trục Y. Đây là hai động cơ không cần điều khiển tốc độ, có nghĩa là chỉ cấp nguồn cho quay thuận, quay ngược hoặc là dừng lại. Để thực hiện điều này thì mạch công suất cần phải có dạng cầu H. Đây là sơ đồ mạch có hình giống chữ H giúp cho việc đảo chiều và dừng động cơ. Có lẽ là chúng ta không ai không biết về mạch cầu H nữa cho nên tôi sẽ không giới thiệu về nó ở đây nữa. Về mạch cầu H ở đây lại có thể sử dụng nhiều cách, có thể tự lắp ghép lấy từ các linh kiện rời rạc, hoặc cũng có thể sử dụng các loại chip có tích hợp sẵn các cầu H rất đa dạng. Ở đây tôi chọn cách thứ hai sử dụng chip chuyên dụng có tích hợp sẵn cầu H. Chip tôi chọn có tên là L298 là loại chip rất thông dụng và dễ kiếm ở ngoài chợ, hoạt động cũng tương đối ổn định với dòng cho phép khoảng 2A chạy qua, phù hợp để điều khiển các loại động cơ 1 chiều cỡ nhỏ như các động cơ được tôi sử dụng cho mô hình của mình. Do có chứa 2 cầu H cho nên đối với động cơ các trục X và Y chỉ cần 1 chip L298 là đủ. Đối với động cơ trục Z là động cơ bước, thực chất động cơ bước cũng chứa các cuộn dây ở bên trong và cũng yêu cầu phải đảo chiều các cuộn dây này, do đó chip L298 vẫn được dùng cho động cơ trục Z. Tuy nhiên động cơ bước tôi sử dụng có chứa bên trong hai cuộn dây nên để điều khiển được động cơ này cần sử dụng hết toàn bộ hai cầu H ở bên trong Chip L298. Hình vẽ 3.21 bên dưới đây tôi sẽ giới thiệu sơ qua về L298 để chúng ta có thể hiểu rõ hơn và sử dụng linh hoạt nó trong việc điều khiển động cơ. Hình 3.21: Hình ảnh thực tế của L298 L298 được đóng vỏ như hình vẽ bên trên, trong đó kiểu multiwatt15 dùng phổ biến hơn với lý do chịu dòng đi qua lớn hơn do có nơi để tản nhiệt trong quá trình hoạt động. Hình 3.22 bên dưới đây là sơ đồ cấu trúc của các khối bên trong. Hình 3.22: sơ đồ cấu trúc của L298 L298 có 15 chân và có chứa bên trong 2 bộ cầu H. Nhìn trên sơ đồ bên trên tôi tạm giải thích về nguyên lý hoạt động của nó như sau. Trước hết nguồn cấp cho L298 cũng như nguồn cấp cho động cơ cho phép lên đến 45v VDC. Nguồn cấp cho L298 thông qua các cặp chân 4-1 (cho cầu A) và 4-15 (cho cầu B). Nguồn Vss cấp cho L298 thông qua chân số 9 có chức năng cấp điện áp cho các modul logic bên trong hoạt động (bao gồm các cổng AND, cổng OR…). Điện áp ở chân này chỉ được phép cấp nhỏ hơn 5v do các IC logic hoạt động ở mức điện áp thấp. Các chân EnA và EnB ở các chân số 6 và chân số 11 có chức năng cấm hay cho phép các cầu tương ứng. Nếu EnA, và EnB ở mức cao sẽ cho phép cầu A và cầu B hoạt động bình thường. Nhưng nếu một trong hai ở mức thấp sẽ cấm sự hoạt động của cầu tương ứng. Các chân điều khiển cầu bao gồm In1, In2, In3, In4 là các chân điều khiển dòng chạy qua động cơ theo một chiều nào đó. Nhìn vào sơ đồ cấu trúc, nếu chân số 5 và chân số 7 có cùng mức logic thì động cơ nối với cầu A sẽ không hoạt động. Nếu chúng khác mức logic thì động cơ cầu A sẽ quay theo một chiều nào đó. Đối với các chân 10 và 12 của cầu B cũng hoàn toàn tương tự. Các đầu ra 2,3,13,14 sẽ được nối với động cơ một chiều hoặc cuộn dây của động cơ bước. Sau khi phân tích chi tiết về chip L298 tôi đưa ra sơ đồ mạch ở hình 3.23 là sơ đồ mạch hoàn chỉnh của tôi. Hình 3.23: sơ đồ cấu trúc của L298 Ở trên mạch các chân điều khiển của các cầu được nối trực tiếp với vi điều khiển. Các đầu ra được nối với động cơ thông qua các Jum j3và j4 để nối tới các động cơ điều khiển trục. Trong quá trình hoạt đông khi động cơ đang từ trạng thái hoạt động mà dừng lại sẽ gây ra dòng điện cảm ứng ngược. Dòng điện này thường có điện áp rất cao nếu ta không dập tắt đi sẽ có thể gây hỏng IC hoặc hỏng mạch . Ở đây tôi chọn diode dùng để dập tắt dòng cảm ứng khi sinh ra. Nó được mắc ngược với nguồn của động cơ, khi động cơ hoạt động thì nó không có ý nghĩa gì. Nhưng khi dừng, dòng điện cảm ứng sinh ra sẽ bị dập tắt bởi nhưng con diode này. Sơ đồ mạch bên dưới là sơ đồ nối của các diode này. Hình 3.24: Sơ đồ mạch diode dập tắt dòng ngược. 3.3.4. Sơ đồ mạch nguồn. Cũng như bất kì một thiết bị điện tử nào, mô hình máy cũng cần được cấp 1 nguồn nuôi để hoạt động. Do đặc thù của linh kiện ở trên mạch điện tử, cho nên nguồn cấp cho các linh kiện phần công suất và linh kiện phần điều khiển cũng khác nhau. Ở phần mạch điều khiển bao gồm vi điều khiển, EEPROM, modul truyền thông và các đèn báo, led hiển thị sử dụng nguồn áp 1 chiều có độ ổn định cao 5v. Phần mạch công suất sử dụng điện áp cao hơn do phải nuôi các động cơ hoạt động. Điện áp này vào khoảng 15v. Do nguyên lý và sự hoạt động của mạch nguồn khá đơn giản nên tôi sẽ đưa luôn sơ đồ mạch tôi đã thiết kế vào đây và giải thích nguyên lý hoạt động của nó. Hình 3.25 là sơ đồ mạch nguồn cấp cho mạch điện. Hình 3.25: Sơ đồ mạch cấp nguồn cho mạch Mạch nguồn hoạt động như sau: Điện áp 220VAC sau khi qua biến áp cho điện áp xoay chiều ở đầu ra khoảng 12v. Sau khi đi qua cầu Diode điện áp phía sau sẽ là điện áp 1 chiều nhưng chưa ổn định. Các tụ lọc nguồn C13,C15 và C21 có nhiệm vụ lọc nguồn và đưa nguồn về gần dạng với nguồn điện 1 chiều. Nguồn tại đây được mang đi nuôi động cơ và nguồn công suất cho L298. Để vi điều khiển có thể lấy nguồn tốt hơn với mức điện áp thấp hơn, ở đây tôi sử dụng hai IC ổn áp 7805 mắc song song với mục đích cấp điện áp 5v cho các khối còn lại. Sở dĩ tôi chọn mắc song song hai IC trên với mục đích tăng khả năng cấp dòng lên cao cho mạch nguồn. Mạch phần hiển thị Mạch phần hiển thị được kết nối với cổng SPI, đây là mạch được tận dụng từ một thiết bị khác, có thể nó chỉ sử dụng trong quá trình lập trình thử nghiêm và sẽ không được sử dụng cho mô hình máy cho nên tôi sẽ không thuyết minh gì ở đây. 3.4. Thiết kế phần mềm 3.4.1. Thiết kế phần mềm cho vi điều khiển. Phần mềm viết cho vi điều khiển phải thực hiện được các yêu cầu đặt ra của bài toán. Có nghĩa là phải có khả năng nhận đầy đủ dữ liệu từ máy tính gửi xuống, và lưu vào EEPROM. Có khả năng đọc và giải mã toàn bộ mã lệnh nằm trong EEPROM ra để điều khiển các động cơ các trục. Đối với dòng vi điều khiển AVR, có rất nhiều công cụ hỗ trợ được cài vào máy tính và hỗ trợ trong quá trình lập trình rất tốt. Một trong những công cụ đó tôi chọn phần mềm codevision AVR. Đây là một công cụ hỗ trợ rất mạnh cho phép người sử dụng lập trình vi điều khiển trên nền ngôn ngữ lập trình C. Ngoài ra hệ thống thư viện phần mềm cũng cấp cho người dùng rất phong phú và rất dễ sử dụng. Ở đây tôi sẽ giới thiệu một cách rất tổng quan về cách sử dụng phần mềm, để biết thêm chi tiết có thể tìm ở những tài liệu có rất nhiều ở trên mạng. Sau khi cài đặt và đăng kí bản quyền phần mềm, lần đầu tiên khởi động lên cửa sổ màn hình được nhìn thấy như hình 3.26 bên dưới. Hình 3.26: Cửa sổ giao diện lập trinh vi điều khiển. Lần đầu tiên ta phải tiến hành vào settings >programmer để tiến hành chỉnh thông số của phần mềm cho phù hợp với mạch nạp sử dụng. Đối với mạch nạp tôi sử dụng thông qua cổng LPT sử dụng giao thức nạp STK200+/300 (giao thức nạp nối tiếp). Sau khi tiến hành chỉnh thông số ta bắt đầu làm việc với phần mềm. Để bắt đầu một dự án mới ta sử dụng một công cụ hỗ trợ mã lập trình của codevision AVR. Để khởi động nó lên ta vào tools chọn codewizard AVR của sổ mới hiện ra như hình 3.27 bên dưới. Ở đây sau khi đã chọn chip và thạch anh phù hợp với phần cứng, ta sẽ bắt đầu tiến hành chọn các khối cần thiết cho phần mềm của mình . Ở trên codewizard sẽ hiển thị toàn bộ các khối phần cứng được tích hợp bên trong vi điều khiển. Cuối cùng ta vào thực đơn file và chọn save lại lựa chọn của mình, sau đó trên cửa sổ lập trình sẽ hiển thị code sau khi đã chọn các modul phần cứng. Hình 3.27: Cửa sổ giao diện codewizard. Để có thể lập trình hiệu quả và tránh bị nhầm lẫn thì ta nên đưa ra giải thuật giải quyết bài toán trước. Sau đó tiến hành triển khai giải thuật trên mã lệnh. Ở dưới đây là lưu đồ thuật toán của giải thuật. (hình vẽ 3.28) Hình 3.28: Lưu đồ thuật toán. Toàn bộ nội dung mã lệnh sau khi đã triển khai được xây dựng trên hai file bao gồm file V2.C và file lib.h. Khi lập trình ta tiến hành dịch hai file này thành file hex và nạp vào bộ nhớ flash của chip. Dưới đây là nội dung của hai file này.ư File V2.C #include #include #include char str[]="Y+230X+200M+1Z+7000Z-1100Z+1100M+1M-1Z-1100Y+20X+20M+1Z+7000Z-1100Z+1100M+1M-1Z-1100S"; interrupt [USART_RXC] void usart_rx_isr(void) { unsigned char content; content=UDR; if (content=='O') { ew(0xfffe,count_eep); //cat giu dia chi ew(count_eep,prepare); //chuyen du lieu lan truoc vao eeprom count_eep++; content=0; prepare=0; } if (content=="R") while (1); prepare=content; putchar(content); #asm("wdr"); } void main(void) { unsigned long i; ACSR=0x80; SFIOR=0x00; init_spi(); i2c_init(); init_uart(); IO_init(); wde(); TCNT0=0; TCNT1=0; TCCR0=0x06; TCCR1B=0x06; dcz(-1,30000); dcx(-1); dcy(-1); while (PIND.5==1 || PIND.3==1) { if (PIND.5==0) dcx(0); if (PIND.3==0) dcy(0); if ((PORTA & 0xf0)==0) {dcx(0); dcy(0);break;} #asm("wdr"); } for (i=0;i<=strlen(str);i++) ew(i,str[i]); n=0; test(); i=n; active(); str[0]=0; while (1) { #asm(“wdr”) } } File lib.h #include #include #include #include #include // I2C Bus functions #asm .equ __i2c_port=0x18 ;PORTB .equ __sda_bit=2 .equ __scl_bit=3 #endasm #include #define i2c_addr 0xA0 unsigned int n=0,f=0;; void test () { unsigned int *ptr; ptr=&n; (*ptr)=123456; } unsigned int mu(unsigned int n, unsigned char i) { unsigned char j,a; a=n; n=1; for (j=0;j<i;j++) n=n*a; return n; } unsigned char led[11]={0x7d,0x05,0x5b,0x1f,0x27,0x3e,0x7e,0x15,0x7f,0x3f,0}; hienthi(unsigned long n) { char str[8]={58,58,58,58,58,58,58,58}; if (n>999999) { spi(0x02);spi(0x02);spi(0x02);spi(0x02);spi(0x02);spi(0x02);} else { ltoa(n,str); spi(led[str[0]-48]); spi(led[str[1]-48]); spi(led[str[2]-48]); spi(led[str[3]-48]); spi(led[str[4]-48]); spi(led[str[5]-48]); } PORTD.2=0; PORTD.2=1; } void delay(unsigned long i) { i=i*250; while (i!=0) { #asm("wdr"); i--; } } void ew(unsigned int dchi, unsigned char dlieu) { i2c_start(); i2c_write(i2c_addr); i2c_write(dchi/256); //byte cao i2c_write(dchi%256); //byte thap i2c_write(dlieu); i2c_stop(); delay_ms(5); //10ms de viet xong } unsigned char er(unsigned int dchi) { unsigned char dlieu; unsigned char dchi_cao; unsigned char dchi_thap; dchi_cao = dchi / 256; dchi_thap = dchi % 256; i2c_start(); i2c_write(i2c_addr); i2c_write(dchi_cao); i2c_write(dchi_thap); i2c_start(); //start repeat i2c_write(i2c_addr | 1); dlieu = i2c_read(0); //read end i2c_stop(); return dlieu; } void init_uart() { UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x01; UBRRL=0xA0; // Global enable interrupts #asm("sei") } void IO_init() { DDRC=0xff;//khoi tao cong C PORTC=0x00;//CAM CAC DONG CO DDRD=0;//HUONG DU LIEU DAU VAO PORTD=0XFF;//TREO LEN DUONG NGUON DDRD.6=0;//CHAN DAO CHIEU CONG DCK PHAI DAT DAU RA PORTD.6=0;//XOA VE 0 PORTD.7=0; } void dcx(int n) { if (n==0) {PORTA.7=0;PORTA.6=0;} if (n==1) {PORTA.7=1;PORTA.6=0;} if (n==-1) {PORTA.7=0;PORTA.6=1;} } void dcy(int n) { if (n==0) {PORTA.4=0;PORTA.5=0;} if (n==1) {PORTA.4=1;PORTA.5=0;} if (n==-1) {PORTA.4=0;PORTA.5=1;} } void dck(int n, unsigned char i) { if (n==0) {PORTD.6=0;PORTD.7=0;} if (n==1) {PORTD.6=1;PORTD.7=0;} if (n==-1) {PORTD.6=0;PORTD.7=1;} i=0; } void L1(int n) { if (n==0) {PORTA.0=0;PORTA.1=0;} if (n==1) {PORTA.0=1;PORTA.1=0;} if (n==-1) {PORTA.0=0;PORTA.1=1;} } void L2(int n) { if (n==0) {PORTA.2=0;PORTA.3=0;} if (n==1) {PORTA.2=1;PORTA.3=0;} if (n==-1) {PORTA.2=0;PORTA.3=1;} } void L(unsigned i) { if (i==1) {L1(1);delay_us(1500); } if (i==2) {L2(1);delay_us(1500);} if (i==3) {L1(-1);delay_us(1500);} if (i==4) {L2(-1);delay_us(1500);} } void dcz(int i,unsigned int n) { unsigned int t=0,k=1; if (i==-1)while ((t!=n) && (PIND.4==1)) { #asm("wdr"); L(k); k++; if (k==5) k=1; t++; hienthi(t); } if (i==1)while (t!=n) { #asm("wdr"); L(k); k--; if (k==0) k=4; t++; hienthi(k); } if (i==0) {L1(0);L2(0);} L1(0); L2(0); } void active() { unsigned int d=0; unsigned char i=0,delta=0; unsigned int far=0; //thuc hien di chuyen while (1) { delta=0; far=0; //doc string while ((er(d+2+delta) =48)){ #asm("wdr"); delta++;} /// if (er(d)==88/*x*/) { for (i=0;i<delta;i++) far=far+(er(d+2+i)-48)*mu(10,delta-1-i); if (er(d+1)==43/*+*/) dcx(1); if (er(d+1)==45/*-*/) dcx(-1); TCNT1=0; TCCR1B=0x07; while (TCNT1 <= far) {#asm("wdr");hienthi(TCNT1);} dcx(0); TCCR1B=0x00; d=d+delta+2; continue; } if (er(d)==89/*y*/) { for (i=0;i<delta;i++) far=far+(er(d+2+i)-48)*mu(10,delta-1-i); if (er(d+1)==43/*+*/) dcy(1); if (er(d+1)==45/*-*/) dcy(-1); TCNT0=0; TCCR0=0x07; while (TCNT0 <= far) {#asm("wdr");hienthi(TCNT0);} dcy(0); d=d+delta+2; TCCR0=0x00; continue; } if (er(d)==90/*z*/) { for (i=0;i<delta;i++) far=far+(er(d+2+i)-48)*mu(10,delta-1-i); if (er(d+1)==43/*+*/) dcz(1,far); if (er(d+1)==45/*-*/) dcz(-1,far); dcz(0,0); d=d+delta+2; continue; } if (er(d)==77/*m*/) { if (er(d+1)==43/*+*/) dck(1,0); if (er(d+1)==45/*-*/) dck(-1,0); d=d+delta+2; delay(2000); continue; dck(0,0); } if (er(d)==83/*s*/) break; } ////////////////////////////// } void init_spi() { DDRB=0xb0; DDRB.0=0; DDRB.1=0; DDRD.2=1; SPCR=0x50; SPSR=0x00; } void wde() { #pragma optsize- WDTCR=0x1E; WDTCR=0x0E; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif } 3.4.2. Thiết kế giao diện trên máy tính. Giao diện trên máy tính có nhiệm vụ dịch và gửi toàn bộ nội dung chương trình được viết trong file code và gửi xuống vi điều khiển thông qua cổng COM. Giao diện được thiết kế trên phần mềm visual basic của Microsoft. Do chức năng của phần mềm trên máy tính không nhiều cho nên về cơ bản phần mềm khá đơn giản nhưng vẫn đảm bảo đủ các tính năng cần thiết. Dưới đây là giao diện của phần mềm. Hình 3.29: Giao diện lập trình Để làm việc với mô hình máy, lúc đầu người lập trình cần phải soạn thảo một file mã nguồn trên một phần mềm soạn thảo bất kì nào đó với một qui định có sẵn. Sau khi soạn thảo xong, dùng phần mềm ở trên link để file vừa rồi và tiến hành kiểm tra lỗi . Nếu không có lỗi sảy ra ta tiến hành gửi chương trình xuống vi điều khiển bằng cach click vào nút send. Dưới đây là mã lệnh của toàn bộ chương trình Dim b As Integer Private Sub COMmand1_Click() Dim s As String ' kÕt qu¶ cña chuçi ®äc ®­îc tõ file text Dim buf As Variant ' m¶ng t¸ch c¸c phÇn tö trong dÊu ; Dim buf1 As String 'chuçi ®Öm 1 Dim i As Integer ' biÕn lÆp Dim j As Integer ' ®Õm dßng Dim t As Integer ' ®Õm sè m¶ng trong buf Dim a As String 'chuçi ®Öm Dim k As Integer Dim dx As Integer Dim dy As Integer Dim dz As Integer Dim key_test As String Dim key_buf As String str = "" f = FreeFile Open "E:\Bui Duc Tho1\do an tot nghiep\VB\txt\1.txt" For Input As #f j = 0 Do While Not EOF(f) j = j + 1 Line Input #f, s 'doc file s = Trim(s) 'cat khoang trong dau va cuoi 'kiem tra ki tu cuoi cung If Right(s, 1) ";" Then MsgBox "KÝ tù kÕt thóc kh«ng ph¶i lµ kÝ tù '" & Right(s, 1) & "' t¹i dßng sè : " & j, vbOKOnly, "KiÓm tra lçi" Exit Sub End If 'kiem tra ki tu cã thuéc tËplÖnh kh«ng For i = 1 To Len(s) a = UCase(Mid$(s, i, 1)) If (Asc(a) 58) And a "X" And a "Y" And a "Z" And a "M" And a "F" And a ";" And a "-" And a "+" Then MsgBox "KÝ tù '" + Mid$(s, i, 1) + "' kh«ng ph¶i tõ kho¸ cña lÖnh t¹i dßng sè " & j Exit Sub End If Next ' kiem tra cac ki tu ";" trung lap i = 0 i = InStr(s, ";;") If i 0 Then MsgBox "Trïng lÆp kÝ tù t¹i dßng sè " & j Exit Sub End If 't¸ch kho¶ng t = vCount(s, ";") buf = Split(s, ";") For i = 0 To t - 1 buf1 = buf(i) a = UCase(Mid$(buf1, 1, 1)) k = Val(Mid$(buf1, 2, Len(buf1) - 1)) If a = "M" And k 1 And k 2 Then MsgBox "PhÝa sau M ph¶i lµ 1 hoÆc 2, ch­¬ng tr×nh lµ: " & k & ", Lçi t¹i dßng sè " & j Exit Sub End If a = UCase(Mid$(buf1, 2, 1)) If (Asc(a) > 58 Or Asc(a) "-" And a "+" Then MsgBox "Sau ch÷ c¸i ph¶i lµ sè hoÆc dÊu, lçi t¹i dßng sè: " & j Exit Sub End If a = Mid$(buf1, 2, Len(buf1) - 1) If Not IsNumeric(a) Then MsgBox "Lçi t¹i dßng sè " & j Exit Sub End If a = UCase(Mid$(buf1, 1, 1)) If a = "X" Then dx = dx + Val(Mid$(buf1, 2, Len(buf1) - 1)) If a = "Y" Then dy = dy + Val(Mid$(buf1, 2, Len(buf1) - 1)) If a = "Z" Then dz = dz + Val(Mid$(buf1, 2, Len(buf1) - 1)) If Val(Mid$(buf1, 2, Len(buf1) - 1)) > 0 Then str = str + a + "+" + Mid$(buf1, 2, Len(buf1) - 1) Else: str = str + buf(i) End If Next Loop If dz > 100 Or dx > 100 Or dy > 100 Then MsgBox "DÞch chuyÓn v­ît qu¸ giíi h¹n cho phÐp", , "Th«ng b¸o lçi" Exit Sub End If Close #f MsgBox "DÞch thµnh c«ng", , "Th«ng b¸o" Text2.Text = UCase(str) End Sub Private Sub COMmand2_Click() Unload Me End Sub Private Sub COMmand3_Click() send (UCase("t")) End Sub 'Private Sub COMmand2_Click()' 'Text1.Text = "" 'f = FreeFile 'Open "E:\Bui Duc Tho1\do an tot nghiep\VB\txt\1.txt" For Output As #f 'Print #f, "Bui Duc Tho" 'Print #f, "Ngo Thi Nghia" 'Close #f ' 'End Sub Public Sub send(str As String) Dim i As Integer For i = 1 To Len(str) MSCOMm1.Output = Mid(str, i, 1) Sleep (2) Next i End Sub Private Sub COMmand4_Click() str = "M+01F+20X+09" key_test = "O" For i = 1 To Len(str) 'doi ki tu tra loi ok Do While key_test "O" j = j Loop 'gui ky tu moi For j = 1 To 1000 If (key_buf UCase(Mid$(str, i, 1))) Then MSCOMm1.Output = UCase(Mid$(str, i, 1)) Next If j < 1000 Then MSCOMm1.Output = "O" Else MsgBox "MÊt kÕt nèi", , "Th«ng b¸o" Exit Sub End If key_test = 0 Sleep (2) Next End Sub Private Sub COMmand6_Click() MSCOMm1.Output = "R" End Sub Private Sub Form_Load() Text1(0).Text = "" With MSCOMm1 .Settings = "2400,N,8,1" .COMmPort = 1 .RThreshold = 1 .SThreshold = 0 .InputMode = COMInputModeText .InputLen = 0 .Handshaking = COMNone .InBufferSize = 1024 .OutBufferSize = 1024 If .PortOpen = False Then .PortOpen = True End If End With COMbo1.Text = "" End Sub Private Sub MSCOMm1_OnCOMm() Dim v As Variant v = MSCOMm1.Input key_buf = v 'If (Mid$(v, 1, 1) = "T") Then MsgBox "KÕt nèi thµnh c«ng", , "Th«ng b¸o" Text2.Text = Asc(v) End Sub Private Sub Timer1_Timer() MSCOMm1.Output = Chr(b) b = b + 1 If (b = 255) Then b = 0 End Sub Một số qui chuẩn khi lập trình với mô hình máy Mỗi một câu lệnh lập trình thể hiện một hành động nào đó trên mô hình máy. Hành động đó có thể là dịch chuyển trục X theo chiều dương, hoặc cũng có thể là bật động cơ khoan theo một chiều nào đó và theo một tốc độ nào đó…do đó ngôn ngữ lập trình có cấu trúc như sau: {ký tự chức năng} [chiều của dịch chuyển] [lượng dịch chuyển (mm)] Bảng dưới đây thể hiện chức năng của các kí tự chức năng. Bảng 3.2: Bảng chức năng của các ký tự chức năng trong lập trình mô hình Kí tự Chức năng Ví dụ minh họa X Dịch chuyển dọc trục X X-20: dịch chuyển theo chiều âm 20mm X30: dịch chuyển theo chiều dương 30mm Y Dịch chuyển dọc trục Y Y-20: dịch chuyển theo chiều âm 20mm Y30: dịch chuyển theo chiều dương 30mm Z Dịch chuyển dọc trục Z Z-20: dịch chuyển theo chiều âm 20mm Z30: dịch chuyển theo chiều dương 30mm M Thay đổi chiều khoan của động cơ khoan M01: Quay thuận M02: Quay ngược F Thay đổi cấp tốc độ trục chính F0: Dừng động cơ F1: chạy với tốc độ 1 F2: chạy với tốc độ 2 F3: chạy với tốc độ 3 3.5. Chạy thử mô hình và đánh giá kết quả. Sau khi hoàn tất các phần cơ khí và mạch điện tử, phần mềm trên máy tính cũng như phần mềm viết cho vi điều khiển thì thấy kết quả tưởng đối tốt. Do có sự giám sát của watdog timer nên khi sảy ra sự cố mất điện hay treo vi điều khiển cũng không làm ảnh hưởng đến kết quả gia công của mô hình. Tuy nhiên do điều kiện không cho phép nên phần cơ khí thiết kế không được linh hoạt nhẹ nhàng cho nên sảy ra ít nhiều sai số do phần cơ khí tạo nên. Nó cỡ khoảng dưới 1mm. Lỗi này có thể khắc phục được nếu như có các thiết bị cơ khí gia công tốt và chính xác hơn. 3.6. Kết luận chương 3 Chương 3 đã tiến hành thiết kế chế tạo thành công một mô hình máy khoan CNC loại nhỏ có thể gia công một vài phôi mềm. Mô hình có thể được sử dụng trong quá trình học tập. Qua mô hình chúng ta có thể hiểu thêm về cách thiết kế mạch điện tử thực tế. Hiểu thêm về sự hoạt động của một máy CNC như thế nào, cũng như học được cách lập trình visual basic, lập trình C cũng như lập trình CNC. Với sự hỗ trợ của thiết bị có độ chính xác cao tôi có thể thiết kế ra một mô hình hoạt động tốt hơn và chức năng nhiều hơn. KẾT LUẬN Đề tài đã thực hiện được 3 nhiệm vụ: Nghiên cứu thành công về cấu trúc và hoạt động của mộ hệ thống CNC và NC Đưa ra thiết kế chi tiết để cải tiến máy Micro Lathe thành một chiếc máy gia công bán tự động Chế tạo thành công mô hình máy CNC loại nhỏ và đã chạy thử nghiệm thành công. Ngoài ra khi thực hiện đề tài này, tôi học thêm được nhiều kiến thức về mặt lập trình CNC, lập trình C cũng như lập trình Visual basic. TÀI LIỆU THAM KHẢO [1] Michael sava- joseph pusztai, Computer Numerical control programming, 2000 [2] Ngô Diên Tập, Kĩ thuật điều khiển AVR, NXB KHKT, 2003 [3] Ngô Diên Tập, Kĩ thuật ghép nối máy tính, NXB KHKT, 2001 [4]Nguyễn Anh Tuấn, Cơ sở kĩ thuật CNC, NXB TPHCM, 2003

Các file đính kèm theo tài liệu này:

  • doc11.Do-an-Tot-Nghiep-tho-final.doc