Khóa luận Điều khiển tốc độ và vị trí motor điện một chiều qua vi điều khiển và vi tính

docx 92 trang yendo 6680
Bạn đang xem 20 trang mẫu của tài liệu "Khóa luận Điều khiển tốc độ và vị trí motor điện một chiều qua vi điều khiển và vi tính", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • docxkhoa_luan_dieu_khien_toc_do_va_vi_tri_motor_dien_mot_chieu_q.docx

Nội dung text: Khóa luận Điều khiển tốc độ và vị trí motor điện một chiều qua vi điều khiển và vi tính

  1. ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Nguyễn Văn Long ĐIỀU KHIỂN TỐC ĐỘ VÀ VỊ TRÍ MOTOR ĐIỆN MỘT CHIỀU QUA VI ĐIỀU KHIỂN VÀ VI TÍNH KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ kỹ thuật Cơ điện tử HÀ NỘI - 2013
  2. ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Nguyễn Văn Long ĐIỀU KHIỂN TỐC ĐỘ VÀ VỊ TRÍ MOTOR ĐIỆN MỘT CHIỀU QUA VI ĐIỀU KHIỂN VÀ VI TÍNH KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ kỹ thuật cơ điện tử Cán bộ hướng dẫn: PGS.TS Trần Quang Vinh
  3. VIETNAM NATIONAL UNIVERSITY, HANOI UNIVERSITY OF ENGINEERING AND TECHNOLOGY Nguyen Van Long SPEED AND POSITION CONTROL DC MOTOR USING MICROCONTROLER AND COMPUTER Major: Mechatronics Engineering Supervisor: Assoc. Prof. Dr. Tran Quang Vinh HA NOI – 2013
  4. ĐIỀU KHIỂN TỐC ĐỘ VÀ VỊ TRÍ MOTOR ĐIỆN MỘT CHIỀU QUA VI ĐIỀU KHIỂN VÀ VI TÍNH Nguyễn Văn Long Khóa QH-2009-I/CQ , ngành Công nghệ Kỹ thuật cơ điện tử. Tóm tắt Khóa luận tốt nghiệp: Động cơ một chiều là một trong những thành phần rất quan trọng trong các hệ thống công nghiệp, các hệ thống cơ khí, các robot thông minh và các sản phẩm gia dụng Với sự phát triển của khoa học kỹ thuật nhất là ngành điện tử học điều khiển, công nghệ vi xử lý đã tạo điều kiện cho việc điều khiển động cơ trở nên thuận tiện hơn song cũng đặt ra vấn đề là đòi hỏi phải nghiên cứu hoàn thiện các hệ điều khiển, đáp ứng yêu cầu ngày càng cao của thực tế cuộc sống và phù hợp với xu thế phát triển khoa học công nghệ. Đã có nhiều công trình nghiên cứu về động cơ một chiều cũng như phương pháp, thuật toán điều khiển để làm sao cho quá trình điều khiển được đơn giản hơn cũng như tốc độ đáp ứng được nhanh hơn, tối ưu được độ chính xác của hệ thống và sự tiêu tốn năng lượng. Là một đề tài khá phổ biến và “điều khiển động cơ một chiều” cũng bao hàm rất nhiều xử lí chi tiết trong lĩnh vực tự động hóa như đo lường, điều khiển, truyền thông nên việc nghiên cứu về đề tài này sẽ giúp chúng ta cũng cố được kiến thức chuyên ngành của mình cũng như áp dụng những kiến thức đã học vào trong thực tế. Khóa luận “Điều khiển tốc độ và vị trí motor điện một chiều qua vi điều khiển và vi tính” là sự tổng hợp những kiến thức liên quan đến động cơ một chiều và các phương pháp điều khiển thích nghi. Thông qua việc mô phỏng trên matlab cũng như thiết kế lắp ráp mạch điện thực tế sẽ giúp hiểu rõ hơn về cấu tạo, nguyên lí hoạt động và phương pháp điều khiển động cơ một chiều qua đó cho phép có thể phát triển những ứng dụng phù hợp với các yêu cầu cụ thể trong thực tiễn. Từ khóa: động cơ một chiều, thuật toán PID
  5. LỜI CAM ĐOAN Tôi xin cam đoan bản khóa luận tốt nghiệp này là công trình nghiên cứu thực sự của cá nhân tôi, nội dung trong bài được thực hiện dựa trên cơ sở nghiên cứu lý thuyết, thực tiễn dưới sự hướng dẫn của PGS.TS Trần Quang Vinh. Các số liệu và kết quả trong đề tài là hoàn toàn trung thực. Hà nội, ngày 15 tháng 5 năm 2013 Sinh viên thực hiện Nguyễn Văn Long
  6. LỜI CẢM ƠN Lời đầu tiên cho phép em gửi lời cảm ơn tới nhà trường, khoa cơ học kĩ thuật và tự động hóa, các thầy cô đã dạy dỗ và dìu dắt em trong suôt những năm học vừa qua truyền thụ cho em những kiến thức về chuyên ngành cũng như các lĩnh vực liên quan để sau này khi ra đời em có thể làm việc, đóng góp cho xã hội. Trong thời gian qua em đã cố gắng rất nhiều để hoàn thành đề tài của minh, vì hạn chế về mặt kiến thức và nội dung nghiên cứu khá rộng nên chắc chắn sẽ có nhiều thiếu sót. Em xin chân thành cảm ơn PGS.TS Trần Quang Vinh đã giúp đở và tư vấn cho em rất nhiều trong quá trình thực hiện đề tài. Sự hướng dẫn của thầy là một yếu tố quan trọng để em có được khóa luận tốt nghiệp này. Cuối cùng em xin gửi lời cảm ơn tới gia đinh, bạn bè cũng như các thành viên trong lớp QH-2009-I/CQ-M đã luôn sát cánh và hỗ trợ em trong quá trình thực hiện đề tài. Em xin chân thành cảm ơn. Hà nội, ngày 15 tháng 5 năm 2013 Sinh viên thực hiện Nguyễn Văn Long
  7. MỤC LỤC MỞ ĐẦU 1 1. Lý do chọn đề tài 1 2. Mục tiêu của đề tài 1 3. Phương hướng thực hiện đề tài 1 4. Bố cục khóa luận 2 CHƯƠNG 1. MÔ HÌNH HỆ THỐNG ĐỘNG CƠ MỘT CHIỀU 3 1.1. Khái quát về động cơ điện một chiều 3 1.1.1. Nguyên lí, cấu tạo động cơ điện một chiều 3 1.1.2. Phân loại động cơ điện một chiều 4 1.1.3. Điều chỉnh tốc độ động cơ điện một chiều 5 1.2. Mô hình hệ thống động cơ điện một chiều 5 1.2.1. Thiết lập vật lý 5 1.2.2. Phương trình hệ thống 6 CHƯƠNG 2. PHƯƠNG PHÁP ĐIỀU KHIỂN ĐỘNG CƠ MỘT CHIỀU BẰNG THUẬT TOÁN PID VÀ KẾT QUẢ MÔ PHỎNG 8 2.1 Phương pháp điều khiển PID 8 2.2.1 Điều khiển vận tốc 10 2.2.2 Điều khiển vị trí 15 CHƯƠNG 3. THIẾT KẾ VÀ XÂY DỰNG HỆ GIÁM SÁT VÀ ĐIỀU KHIỂN ĐỘNG CƠ MỘT CHIỀU 25 3.1 Giới thiệu linh kiện 25 3.1.1 Vi điều khiển 16F877A 25 3.1.2 Mạch cầu H ( H-Bridge Circuit ) 30 3.1.3 Text LCD 33
  8. 3.1.4 Cổng com và IC max 232 36 3.1.5 IC cổng logic AND 74HC08 39 3.1.6 Bộ lập mã quang (Optical Encoder) 42 3.2 Thiết kế mạch 44 3.2.1 Mạch nguyên lí 44 3.2.1.2 Khối điều khiển 44 3.2.2 Sản phẩm thực tế 48 3.3 Sơ đồ thuật toán và lập trình 50 3.3.1 Sơ đồ thuật toán 50 3.2.3 Lập trình giao diện giám sát và điều khiển trên máy tính 54 3.4 Kết quả đo đạc trên mô hình thực tế 55 KẾT LUẬN 58 1. Kết quả đạt được và hạn chế của đề tài 58 2. Hướng phát triển 58 TÀI LIỆU THAM KHẢO 79
  9. MỤC LỤC HÌNH ẢNH Hình 1. 1 Mặt cắt ngang trục động cơ điện một chiều 3 Hình 1. 2 Các loại động cơ điện một chiều 4 Hình 1. 3 Sơ đồ mạch điện động cơ một chiều 5 Hình 2. 1 Hệ thống điều khiển phản hồi kiểu vòng kín 8 Hình 2. 2 Mô hình điều khiển có phản hồi 9 Hình 2. 4 Kết quả mô phỏng với Kp=100 12 Hình 2. 5 Kết quả mô phỏng với kp=75, Ki=1, Kd=1 13 Hình 2. 6 Kết quả mô phỏng với Kp=100, Ki=200, Kd=1 14 Hình 2. 7 Kết quả mô phỏng với Kp=100, Ki=200, Kd=10 15 Hình 2. 8 Mô hình điều khiển vị trí có phản hồi 16 Hình 2. 9 Kết quả mô phỏng với Kp trong khoảng 1 đến 21 18 Hình 2. 10 Kết quả mô phỏng với Kp trong khoảng 1 đến 21 có phản hồi 19 Hình 2. 11 Kết quả mô phỏng với Kp=21, Kp=100 20 Hình 2. 12 Kết quả mô phỏng với các giá trị Ki= 100, 300, 500 21 Hình 2. 13 Kết quả mô phỏng với các giá trị Kd= 0.05, 0.15, 0.25 22 Hình 2. 14 Kết quả mô phỏng vơi Kd=0.05, 0.15, 0.25 có phản hồi 23 Hình 3. 1 Sơ đồ khối mô hình điều khiển động cơ một chiều bằng máy tính và vi điều khiển 25 Hình 3. 2 Vi điều khiển 16F877A 26 Hình 3. 3 Sơ đồ chân vi điều khiển 16F877A 26 Hình 3. 4 Đồ thị dạng xung điều chế PWM 28 Hình 3. 5 Mô hình điều khiển sử dụng PWM và tín hiệu ra 28
  10. Hình 3. 6 Sơ đồ khối CCP (PWMmode)(trái) Các tham số của PWM (phải) 30 Hình 3. 7 Khảo sát hoạt động của mạch cầu H 31 Hình 3. 8 Nguyên lí hoạt động của mạch cầu H 31 Hình 3. 9 Sơ đồ chân của IC L298D (phải) IC L298D (trái) 32 Hình 3. 10 Sơ đồ nguyên lí của IC L298D 32 Hình 3. 11 Ảnh thực tế text LCD 16x2 33 Hình 3. 12 Sơ đồ kết nối LCD 34 Hình 3. 13 Cab kết nối cổng com 36 Hình 3. 14 Sơ đồ chân cổng com 25 chân và 9 chân 37 Hình 3. 15 Dạng tín hệu khi truyền kí tự A qua cổng Com 38 Hình 3. 16 IC Max 232 39 Hình 3. 17 Sơ đồ kết nối IC max 232 39 Hình 3. 18 Sơ đồ chân, sơ đồ nguyên lí IC max 232 40 Hình 3. 19 sơ đồ chân và nguyên lí 74ls14 41 Hình 3. 20 Optical Encoder 42 Hình 3. 21 Nguyên lí hoạt động và dạng tín hiệu ra của Encoder 43 Hình 3. 22 Sơ đồ mạch nguyên lí 44 Hình 3. 23 Khối điều khiển 45 Hình 3. 24 Khối hiển thị 45 Hình 3. 25 Khối nguồn 46
  11. Hình 3. 26 Khối công suất 46 Hình 3. 27 Khối giao tiếp với máy tính 47 Hình 3. 28 Sơ đồ mạch in 48 Hình 3. 29 sơ đồ các khối trong mạch điện 48 Hình 3. 30 Sản phẩm đầy đủ 49 Hình 3. 31 Giao diện điều khiển 55 Hình 3. 32 Kết quả thử nghiệm với Kp=3, Ki=0, Kd=0 56 Hình 3. 33 Kết quả thử nghiệm với Kp=4, Ki=2, Kd=0 56 Hình 3. 34 Kết quả thử nghiệm với Kp=6, Ki=0.9, Kd=0 57
  12. CÁC KÍ HIỆU SỬ DỤNG  góc quay của trục động cơ b hằng số ma sát nhớt của motor e suất điện động phản hồi J moment quán tính của rotor Kt hằng số moment xoắn của động cơ Ke hằng số suất điện động Kp hệ số tỉ lệ Ki hệ số tích phân Kd hệ số vi phân L điện cảm R điện trở s biến trong miền Laplace T moment xoắn của trục động cơ V điện áp vào
  13. CÁC KÝ HIỆU VIẾT TẮT DC Direct Current PID Poportional Integral Derivative PWM Pulse Width Modulation PIC Programmable Interface Controller ADC Analo-to digital Converter CCP Capture/Compare/PWM I/O Input/Output
  14. MỞ ĐẦU 1. Lý do chọn đề tài Trong giai đoạn hiện nay nền khoa học kĩ thuật đã có những bước phát triển đột phá nhất là trong lĩnh vực tự động hóa. Trước đòi hỏi ngày càng cao của nhu cầu cuộc sống hiện nay việc điều khiển không chỉ đơn thần chỉ là đáp ứng được những yêu cầu con người đặt ra mà còn đòi hỏi hệ thống phải có khả năng thích nghi và hiểu được con người. Là một sinh viên trong ngành đo lường điều khiển, việc nắm bắt được các kiến thức liên quan đến lĩnh vực điều khiển tự động là rất quan trọng, điều đó đòi hỏi sinh viên không những phải nắm chắc kiến thức chuyên ngành mà còn phải tiếp cận với thực tế, nghiên cứu áp dụng những kiến thức mình đã học được để trau dồi kĩ năng và kiến thức của mình. Chính vì thế em đã chọn cho mình đề tài điều khiển động cơ như là một cách để tìm hiểu và tiếp cận đến lĩnh vực đo lường điều khiển. Mặc dù đây không phải là một đề tài mới song lượng kiến thức bao hàm ở đây rất nhiều. việc nghiên cứu và tìm hiểu về động cơ DC và cách điều khiển nó không những giúp em củng cố được kiến thức mà qua đó có thể làm sáng tỏ hơn những vần đề liên quan đến việc điều khiển động cơ. Từ đó sẽ có những cải tiến giúp cho các cơ cấu sử dụng động cơ DC sẽ trở nên thông minh và linh hoạt hơn. Việc nghiên cứu đề tài này cũng góp phần đưa ra những hướng đi mới trong việc điều khiển động cơ, và tăng thêm khả năng ứng dụng của động cơ DC trong thực tế. Qua đề tài này em muốn hệ thống lại các kiến thức liên quan đến động cơ điện một chiều, đồng thời làm sáng tỏ vấn đề này qua việc mô phỏng trên matlab, để mọi người có thể dễ dàng hơn trong việc tìm hiểu và tiếp cận vấn đề này. 2. Mục tiêu của đề tài Nghiên cứu và xây dựng mô hình điều khiển động cơ một chiều dựa trên thuật toán PID qua máy tính và vi điều khiển. 3. Phương hướng thực hiện đề tài Đề tài được xây dựng dựa trên các kiến thức về động cơ điện một chiều và lí thuyết điều khiển kết hợp với mô phỏng và thực tế theo trình tự sau. 1
  15. - Tìm hiều và nghiên cứu về cấu tạo , nguyên lí hoạt động của động cơ điện một chiều, xây dựng các phương trình động học của động cơ điện một chiều. - Tìm hiểu về thuật toán PID, cách thức điều khiển động cơ điện một chiều bằng thuật toán PID. - Mô phỏng bằng matlab về phương pháp điều khiển động cơ điện một chiều bằng thuật toán PID từ đó lựa chọn các thông số phù hợp cho mô hình thực tế. - Triển khai xây dựng mô hình điều khiển động cơ bằng vi điều khiển PIC 16F877A. 4. Bố cục khóa luận Nội dung bản khóa luận được phân thành các chương sau: Chương 1. Mô hình hệ thống động cơ điện một chiều. Chương 2. Phương pháp điều khiển động cơ điện một chiều bằng thuật toán PID và kết quả mô phỏng. Chương 3. Thiết kế và xây dựng hệ giám sát và điều khiển động cơ điện một chiều. 2
  16. CHƯƠNG 1. MÔ HÌNH HỆ THỐNG ĐỘNG CƠ MỘT CHIỀU 1.1. Khái quát về động cơ điện một chiều Hiện nay động cơ điện một chiều được dùng rất phổ biến trong các hệ thống truyền động điện chất lượng cao, dải công suất động cơ một chiều từ vài watt đến hàng mê-ga watt. Đây là loại động cơ đa dạng và linh hoạt, có thể đáp ứng yêu cầu mômen, tăng tốc, và hãm với tải trọng nặng. Động cơ điện một chiều cũng dễ dàng đáp ứng với các truyền động trong khoảng điều khiển tốc độ rộng và đảo chiều nhanh với nhiều đặc tuyến quan hệ mômen – tốc độ. Trong động cơ điện một chiều, bộ biến đổi điện chính là các mạch chỉnh lưu điều khiển. Chỉnh lưu được dùng làm nguồn điều chỉnh điện áp phần ứng động cơ. Chỉnh lưu ở đây thường sử dụng chỉnh lưu cầu 3 pha. 1.1.1. Nguyên lí, cấu tạo động cơ điện một chiều Giống như các loại động cơ điện khác, động cơ điện một chiều cũng gồm có stator và rotor Động cơ điện một chiều gồm có stator, rotor, cổ góp và chổi điện như trình bày trên hình 1.1. sau Hình 1. 1 Mặt cắt ngang trục động cơ điện một chiều Stator: còn gọi là phần cảm, gồm dây quấn kích thích được quấn tập trung trên các cực từ stator. Các cực từ stator được ghép cách điện từ các lá thép kỹ thuật điện được dập định hình sẵn có bề dày 0,5-1mm, và được gắn trên gông từ bằng thép đúc, cũng chính là vỏ máy. Rotor: còn được gọi là phần ứng, gồm lõi thép phần ứng và dây quấn phần ứng. lõi thép phần ứng có hình trụ, được ghép từ các lá thép kỹ thuật điện ghép cách điện với nhau. Dây quấn phần ứng gồm nhiều phần tử, được đặt vào các 3
  17. rãnh trên lõi thép rotor. Các phần tử dây quấn rotor được nối tiếp nhau thông qua các lá góp trên cổ góp. Lõi thép phần ứng và cổ góp được cố định trên trục rotor. Cổ góp và chổi điện: làm nhiệm vụ đảo chiều dòng điện trong dây quấn phần ứng. 1.1.2. Phân loại động cơ điện một chiều Dựa vào hình thức kích từ, người ta chia động cơ điện một chiều thành các loại sau: Động cơ điện một chiều kích từ độc lập: Dòng điện kích từ được lấy từ nguồn riêng biệt so với phần ứng. Trường hợp đặc biệt, khi từ thông kích từ được tạo ra bằng nam châm vĩnh cữu, người ta gọi là động cơ điện một chiều kích thích vĩnh cửu. Động cơ điện một chiều kích từ song song: Dây quấn kích từ được nối song song với mạch phần ứng. Động cơ điện một chiều kích từ nối tiếp: Dây quấn kích từ được mắc nối tiếp với mạch phần ứng. Động cơ điện một chiều kích từ hỗn hợp: Dây quấn kích từ có hai cuộn, dây quấn kích từ song song và dây quấn kích từ nối tiếp. Trong đó, cuộn kích từ song song thường là cuộn chủ đạo. Hình 1.2 trình bày các loại động cơ điện một chiều. Hình 1. 2 Các loại động cơ điện một chiều a) Động cơ điện một chiều kích từ độc lập b) Động cơ điện một chiều kích từ song song c) Động cơ điện một chiều kích từ nối tiếp d) Động cơ điện một chiều kích từ hỗn hợp 4
  18. 1.1.3. Điều chỉnh tốc độ động cơ điện một chiều Ưu điểm cơ bản của động cơ điện một chiều so với các loại động cơ điện khác là khả năng điều chỉnh tốc độ dễ dàng, các bộ điều chỉnh tốc độ đơn giản, dễ chế tạo. Do đó, trong điều kiện bình thường, đối với các cơ cấu có yêu cầu chất lượng điều chỉnh tốc độ cao, phạm vi điều chỉnh tốc độ rộng, người ta thường sử dụng động cơ điện một chiều. Đối với các hệ thống truyền động điện một chiều có yêu cầu điều chỉnh tốc độ cao thường sử dụng động cơ điện một chiều kích từ độc lập. Trong phạm vi khóa luận này này, xét khả năng điều chỉnh tốc độ động cơ điện một chiều kích từ độc lập. 1.2. Mô hình hệ thống động cơ điện một chiều 1.2.1. Thiết lập vật lý Động cơ điện một chiều là một thành phần quan trọng trong các cơ cấu chấp hành. Nó có thể cung cấp trực tiếp chuyển động quay hoặc chuyển động tinh tiến thông qua cơ cấu truyền động. Mạch điện tương đương của phần ứng và phần thân tự do của rotor được thể hiện trong hình 1.2.1 dưới đây. Hình 1. 3 Sơ đồ mạch điện động cơ một chiều Trong ví dụ này, chúng ta giả sử đầu vào của hệ thống là nguồn điện áp (V) áp dụng cho phần ứng của động cơ, đầu ra là tốc độ quay của trục d ( theta ) / dt. Roto và trục coi như cố định với nhau. Giả thiết rằng đây là mô hình ma sát nhớt, mô-men xoắn của lực ma sát ma sát tỉ lệ với vận tốc góc của trục. 5
  19. Các thông số vật lý trong ví dụ này là: (J) moment quán tính của rotor 0,01 kg.m ^ 2 (b) hằng số ma sát nhớt của motor 0,1 NMS (Ke) hằng số suất điện động 0,01 V / rad / giây (Kt) hằng số mô-men xoắn của động cơ 0,01 Nm / Amp (R) điện trở 1 Ohm (L) điện cảm 0,5 H 1.2.2. Phương trình hệ thống Nhìn chung, mô-men xoắn được tạo ra bởi một động cơ một chiều tỷ lệ thuận với dòng điện phần ứng và độ lớn của từ trường. Trong ví dụ này, chúng ta sẽ giả định rằng từ trường là không đổi, do đó, mô-men xoắn động cơ chỉ tỷ lệ thuận với dòng điện phần ứng i bởi hằng số K t như trong phương trình dưới đây. Đây được coi là một cách điều khiển phần ứng động cơ điện một chiều. = 퐾푡푖 (1.1) Suất điện động phản hồi e tỷ lệ thuận với vận tốc góc của trục động cơ bởi hằng số Ke . 푒 = 퐾푒휃 (1.2) Trong đơn vị SI, mô-men xoắn động cơ và suất điện động phản hồi là như nhau, có nghĩa là, K t = Ke , do đó ta sẽ sử dụng K thay thế cho cả hai hằng số mô-men xoắn động cơ và hằng số suất điện động phản hồi. Từ hình trên, chúng ta có thể lấy đạo hàm các phương trình điều khiển sau đây dựa trên định luật 2 Newton và định luật Kirchhoff về điện thế. 퐽휃 + 휃 = 퐾푖 푖 (1.3) 퐿 + 푅 = ― 퐾휃 푡 푖 1.2.2.1. Hàm truyền Áp dụng các biến đổi Laplace, các phương trình mô hình trên có thể được thể hiện bằng biến Laplace s. 6
  20. 푠(퐽푠 + ) 휃(푠) = 퐾 (푠) (1.4) (퐿푠 + 푅) (푠) = (푠) ― 퐾푠휃(푠) (1.5) Bằng cách loại bỏ (푠) từ hai phương trình trên chúng ta có được hàm truyền vòng hở sau, trong đó tốc độ quay được coi là đầu ra và điện áp phần ứng được coi là đầu vào. 휃(푠) 퐾 /푠푒 푃(푠) = = ( ) (1.6) (푠) (퐽푠 + )(퐿푠 + 푅) + 퐾2 Trong trường hợp điều khiển vị trí thì vị trí trục động cơ được coi là đầu ra, chúng ta có thể có được ví trí bằng cách tích phân tốc độ, vì thế chúng ta chỉ cần chia hàm truyền trên cho s. 휃(푠) 퐾 푃(푠) = = ( ) (1.7) (푠) 푠(퐽푠 + )(퐿푠 + 푅) + 퐾2 1.2.2.2. Không gian trạng thái Ở dạng không gian trạng thái, các phương trình điều khiển trên có thể được thể hiện bằng cách chọn tốc độ quay và dòng điện như các biến trạng thái. Một lần nữa, điện áp phần ứng được coi là đầu vào và tốc độ quay được chọn là đầu ra. 퐾 0 휃 ― 휃 = 퐽 퐽 + 1 푡 푖 퐾 푅 푖 (1.8) ― ― 퐿 퐿 퐿 1 0 휃 = [ ] 푖 Tương tự với trường hợp điều khiển vị trí, chọn vị trí động cơ, tốc độ quay và dòng điện là các biến trạng thái ta có. 0 1 0 휃 퐾 휃 0 0 ― 0 휃 = 퐽 퐽 휃 + 1 푡 푖 퐾 푅 푖 0 ― ― 퐿 퐿 퐿 (1.9) 휃 = [1 0 0] 휃 푖 7
  21. CHƯƠNG 2. PHƯƠNG PHÁP ĐIỀU KHIỂN ĐỘNG CƠ MỘT CHIỀU BẰNG THUẬT TOÁN PID VÀ KẾT QUẢ MÔ PHỎNG Mô hình tổng quát của một hệ điều khiển vòng kín có phản hồi như hình 2.1. x e Bộ điều u Mô hình hệ y khiển thống + - Hình 2. 1 Hệ thống điều khiển phản hồi kiểu vòng kín Trong đó: - x là tín hiệu vào mong muốn (điểm đặt) -y là tín hiệu ra - u tín hiệu điều khiển - e là sai lệch giữa điểm đặt và tín hiệu ra Với động cơ một chiều, có 2 loại điều khiển cần quan tâm: - Điều khiển tốc độ trục quay motor tới một giá trị đặt trước (setting speed) - Điều khiển vị trí góc quay trục motor tới một giá trị đặt trước (setting position/rotation angle) Có nhiều phương pháp để điều khiển nhằm đảm bảo hệ thống đạt tới giá trị đặt trước (điểm đặt) một cách tối ưu, ổn định: nghĩa là có thời gian đáp ứng nhanh nhất và không quá lố Bản khóa luận này chỉ quan tâm tới phương pháp điều khiển PID là một phương pháp được sử dụng rất có hiệu quả hiện nay. Dưới đây mô tả phương pháp điều khiển PID và kết quả mô phỏng trên phần mềm matlab. 2.1 Phương pháp điều khiển PID Xét một hệ điều khiển phản hồi như hình sau 8
  22. Hình 2. 2 Mô hình điều khiển có phản hồi Trong mô hình này: r là giá trị tốc độ quay của motor cần đặt 휃 푣à 휃 là góc quay và vận tốc góc của motor u là năng lượng (điện thế, dòng điện, ) đặt vào motor Ở đây lối ra của bộ điều khiển C(s) là lối vào u của mô hình hệ thống P(s). trong miền thời gian nếu tín hiệu điều khiển u(t) phụ thuộc vào sai lệch e(t) theo luật sau thì bộ điều khiển được gọi là điều khiển PID: 푒 (푡) = 퐾 푒(푡) + 퐾 푒(푡) 푡 + 퐾 (2.1) 푖 푡 Ở đây Kp, Ki, Kd lần lượt là các hệ số tỉ lệ, tích phân và vi phân. Tín hiệu điều khiển u(t) được cấp tới mô hình hệ thống và một giá trị lối ra mới 휃 nhận được. tín hiệu này sau đó được phản hồi trở lại và so sánh với giá trị đặt r để có được một giá trị sai lệch mới. bộ điều khiển lại dung tín hiệu sai lệch mới này để tính giá trị u một lần nữa và cứ như vậy. Hàm truyền của bộ điều khiển PID được thiết lập bằng việc chuyển đổi Laplace phương trình kể trên: 2 퐾푖 퐾 푠 + 퐾 푠 + 퐾푖 퐾 + + 퐾 푠 = (2.2) 푠 푠 9
  23. Trong Matlab có một hàm thực hiện luật điều khiển PID là : pid(kp,ki,kd) Giải thuật điều khiển PID được dùng cho hầu hết các vòng điều khiển động cơ trong công nghiệp cũng như những ứng dụng khác. Để cho vòng điều khiển làm việc một cách tối ưu, các hệ số Kp,Ki, Kd phải được điều chỉnh một cách thích hợp. Có một vài cách chỉnh các hệ số này trong đó phương pháp Ziegler – Nichols là khá phổ biến [6]. Các bước điều chỉnh được thực hiện như sau: 1. Chọn điểm đặt mong muốn, đặt Ki, Kd bằng không; sau đó tăng Kp đến cực đại đến khi xảy ra dao động 2. Nếu hệ dao động, chia Kp cho 2 3. Tăng dần Kd và quan sát đáp ứng của hệ. Chọn Kd sao cho đáp ứng được làm nhụt nhanh. 1 1 4. Tăng từ từ Ki cho đến khi xảy ra dao động. Chọn giá trị bằng hoặc giá trị 2 3 này. 2.2 Mô phỏng 2.2.1 Điều khiển vận tốc Trong phần này chúng ta sẽ mô phỏng các nội dung sau: - Điều khiển tỉ lệ - Điều khiển PID - Điều chỉnh vọt lố Từ vấn đề chính ta có phương trình động lực học trong miền Laplace và hàm truyền vòng hở của động cơ một chiều như sau. 푠(퐽푠 + )휃(푠) = 퐾 (푠) 퐿푠 + 푅) (푠) = (푠) ― 퐾푠휃(푠) (2.3) 휃(푠) 퐾 /푠푒 푃(푠) = = (푠) (퐽푠 + )(퐿푠 + 푅) + 퐾2 Với một điểm đặt vận tốc 1 rad/sec, yêu cầu thiết kế đặt ra là: - Thời gian đáp ứng ít hơn 2 giây - Độ vọt lố ít hơn 5% 10
  24. - Sai lệch tĩnh e(t) nhỏ hơn 1% Chúng ta tạo m-file với các câu lệnh sau J = 0.01; b = 0.1; K = 0.01; R = 1; L = 0.5; s = tf('s'); P_motor = K/((J*s+b)*(L*s+R)+K^2); Nhắc lại hàm truyền của một bộ điều khiển PID là 2 퐾푖 퐾 푠 + 퐾 푠 + 퐾푖 (푠) = 퐾 + + 퐾 푠 = (2.4) 푠 푠 2.2.1.1 Điều khiển tỉ lệ Đầu tiên chúng ta thử với bộ điều khiển tỉ lệ với hệ số khuếch đại là 100, nghĩa là C(s)=100, để biết chức năng của hàm truyền vòng kín chúng ta sử dụng câu lệnh ‘feedback’, chúng ta thêm đoạn mã sau vào cuối m-file. Kp = 100; C = pid(Kp); sys_cl = feedback(C*P_motor,1); Để kiểm tra giá trị trả về của điều khiển vòng kín ta thêm đoạn mã lệnh dưới đây vào m-file và thực thi nó, ta sẽ có được đồ thị bên dưới, để xem một số đặc tính của hệ thống, click chuột phải vào đồ thị chọn đặc tính từ menu trả về. Hình dưới đã được thêm vào một số chú thích về thời gian đáp ứng, đỉnh đáp ứng và trạng thái xác lập. t = 0:0.01:5; step(sys_cl,t) grid title('Step Response with Proportional Control') 11
  25. Hình 2. 3 Kết quả mô phỏng với Kp=100 Từ đồ thị trên ta thấy sai lệch tĩnh và độ vọt lố quá lớn, chúng ta có thể giảm sai lệch này bằng cách tăng hệ số khuếch đại Kp, tuy nhiên việc tăng giá trị của Kp thường dẫn tới việc tăng độ vọt lố, vì thế có vẻ như không phải tất cả các yêu cầu thiết kế có thể đáp ứng được đáp ứng với một bộ điều khiển tỉ lệ đơn giản. Thực tế này có thể được xác nhận bằng cách thử nghiệm với các giả trị khác của Kp, tuy nhiên ta có thể sử dụng bộ công cụ thiết kế SISO bằng cách nhập lệnh ‘sisotool(P_motor)’ sau đó theo dõi từng bước giá trị trả về qua đồ thị từ tab ‘Analysis Plots’ của cửa sổ ‘Control and Estimation Tools Manager’. Kết hợp với việc kiểm tra hộp thoại ‘Real-Time Update’, ta có thể thay đổi được thông sô điều khiển trong tab ‘Compensator Editor’ và xem kết quả ảnh hưởng qua giá trị trả về của bộ điều khiển vòng kín. Qua đó thấy được điều khiển tỉ lệ không đủ để đáp ứng yêu cẩu điều khiển, cần phải thêm các thành phần tích phân và vi phân vào bộ điều khiển. 12
  26. 2.2.1.2 Điều khiển PID Với bộ điều khiển PID thành phần tích phân sẽ giúp loại bỏ sai lệch tĩnh, và thành phần vi phân sẽ làm giảm độ vọt lố. Chúng ta sẽ thử với bộ điều khiểm PID có hệ số Ki và Kd nhỏ, chỉnh sửa m-file với các giá trị như sau, sau đó chạy và đưa ra đồ thị bên dưới. Kp = 75; Ki = 1; Kd = 1; C = pid(Kp,Ki,Kd); sys_cl = feedback(C*P_motor,1); step(sys_cl,[0:1:200]) title('PID Control with Small Ki and Small Kd') Hình 2. 4 Kết quả mô phỏng với kp=75, Ki=1, Kd=1 Từ đồ thị trên cho thấy sai lệch tĩnh đã thực sự dần về 0, tuy nhiên thời gian để đạt được trạng thái ổn định là quá lớn so với yêu cẩu thiết kế là 2s. 2.2.1.3 Điều chỉnh độ vọt lố. Trong trường hợp này phần đuôi dài trên đồ thị bước đáp ứng là kết quả của việc chọn hệ số tích phân nhỏ dẫn tới việc tốn nhiều thời gian cho việc loại bỏ sai lệch tĩnh. Quá trình này có thể được tăng tốc bằng cách tăng hệ số Ki. Quay lại với m-file thay đổi giá trị Ki lên 200, chạy lại và ta có được đồ thị bên dưới. 13
  27. Kp = 100; Ki = 200; Kd = 1; C = pid(Kp,Ki,Kd); sys_cl = feedback(C*P_motor,1); step(sys_cl, 0:0.01:4) grid title('PID Control with Large Ki and Small Kd') Hình 2. 5 Kết quả mô phỏng với Kp=100, Ki=200, Kd=1 Như mong muốn, sai lệch tĩnh đã được loại bỏ một cách nhanh chóng, tuy nhiên Ki lớn đã làm cho độ vọt lố tăng lên rất nhiều. Hãy tăng Kd trong giới hạn có thể để giảm độ vọt lố. Quay lại m-file thay đổi Kd lên 10, chạy và ta có được đồ thị trả về như sau. Kp = 100; Ki = 200; Kd = 10; C = pid(Kp,Ki,Kd); 14
  28. sys_cl = feedback(C*P_motor,1); step(sys_cl, 0:0.01:4) grid title('PID Control with Large Ki and Large Kd') Hình 2. 6 Kết quả mô phỏng với Kp=100, Ki=200, Kd=10 Như đã hi vọng việc tăng Kd đã làm giảm độ vọt lố, bây giờ chúng ta biết nếu sử dụng bộ điều khiển PID với các thông số Kp=100, Ki=200, và Kd=10 tất cả các yêu cầu thiết kế sẽ được đáp ứng. 2.2.2 Điều khiển vị trí Các nội dung mô phỏng của phần này bao gồm: - Điều khiển tỉ lệ. - Điều khiển PI - Điều khiển PID Hàm truyền của hệ thống điều khiển vòng hở của động cơ một chiều trong trường hợp này là: 15
  29. 휃(푠) 퐾 푃(푠) = = ( ) (2.5) (푠) 푠(퐽푠 + )(퐿푠 + 푅) + 퐾2 Cấu trúc của hệ thống điều khiển vị trí được mô tả như hình dưới Hình 2. 7 Mô hình điều khiển vị trí có phản hồi Với điểm đặt góc quay là 1 radian, yêu cầu thiết kế của bộ điều khiển là: - Thời gian xác lập nhỏ hơn 0,040 giây - Độ vọt lố ít hơn 16% - Không có sai lệch tĩnh, ngay cả tín hiệu đầu vào bị nhiễu. Tạo bộ điều khiển PID thêm vào hệ thống, tạo m file với các câu lệnh bên dưới J = 3.2284E-6; b = 3.5077E-6; K = 0.0274; R = 4; L = 2.75E-6; s = tf('s'); P_motor = K/(s*((J*s+b)*(L*s+R)+K^2)); Nhắc lại rằng hàm truyền của bộ điều khiển PID có dạng 2 퐾푖 퐾 푠 + 퐾 푠 + 퐾푖 (2.6) (푠) = 퐾 + + 퐾 푠 = 푠 푠 2.2.2.1Điều khiển tỉ lệ Trước tiên ta thử với bộ điều khiển tỉ lệ có hệ số khuếch đại trong khoảng 1 đến 21. Một mảng của mô hình LTI, với mỗi tỉ lệ khuếch đại khác nhau có thể sử 16
  30. dụng cho một vòng lặp. Hàm truyền vòng kín có thể được tạo ra bằng cách sử dụng câu lệnh ‘feedback’. Thêm đoạn mã sau vào sau m-file và thực thi nó. Kp = 1; for i = 1:3 C(:,:,i) = pid(Kp); Kp = Kp + 10; end sys_cl = feedback(C*P_motor,1); Để có được các bước đáp ứng như bên dưới thêm các câu lệnh sau vào m- file và thực thi nó. t = 0:0.001:0.2; step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t) ylabel('Position, \theta (radians)') title('Response to a Step Reference with Different Values of K_p') legend('K_p = 1', 'K_p = 11', 'K_p = 21') 17
  31. Hình 2. 8 Kết quả mô phỏng với Kp trong khoảng 1 đến 21 Chúng ta sẽ xét đến đáp ứng của hệ thống cho mỗi bậc nhiễu, trong trường hợp này giả sử mức tham chiếu bằng không và xem đáp ứng của hệ thống như thế nào với nhiễu của chính nó. Hàm ‘feedback’ có thể vẫn được dùng để tạo ra hàm truyền vòng lặp kín ở những nơi có phản hồi tiêu cực, tuy nhiên bây giờ chỉ còn hàm truyền P(s) là có tín hiệu ra và bộ điều khiển C(s) được coi như là một thành phần phản hồi. Quay lại sơ đồ khối trên để xem lại sơ đồ hệ thống. Thêm các câu lệnh sau mào m-file và thực thi nó để có được kết quả bên dưới. dist_cl = feedback(P_motor,C); step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t) ylabel('Position, \theta (radians)') title('Response to a Step Disturbance with Different Values of K_p') legend('K_p = 1', 'K_p = 11','K_p = 21') 18
  32. Hình 2. 9 Kết quả mô phỏng với Kp trong khoảng 1 đến 21 có phản hồi Từ đồ thị cho thấy hệ thống không có sai lệch tĩnh đối với bậc tham chiếu của nó, với bất kì lựa chọn nào của giả trị Kp. Điều này là do hệ thống có thành phần tích phân, đó là hệ thống loại 1. Tuy nhiên hệ thống có sai lệch tĩnh đáng kể khi tăng thêm nhiễu. Cụ thể là đáp ứng của hệ thống do tham chiếu và nhiễu áp dụng đồng thời là tổng của hai đồ thị trên. 2.2.2.2 Điều khiển PI Lựa chọn bộ điều khiển PI để có thể loại bỏ sai lệch tĩnh. Ta đặt Kp = 21 và hệ số tích phân Ki trong khoảng 100 đến 500. Thay đổi m-file như sau và thực thi để có được kết quả bên dưới. Kp = 21; Ki = 100; for i = 1:5 C(:,:,i) = pid(Kp,Ki); Ki = Ki + 200; 19
  33. end sys_cl = feedback(C*P_motor,1); t = 0:0.001:0.4; step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t) ylabel('Position, \theta (radians)') title('Response to a Step Reference with K_p = 21 and Different Values of K_i') legend('K_i = 100', 'K_i = 300', 'K_i = 500') Hình 2. 10 Kết quả mô phỏng với Kp=21, Kp=100 Bây giờ hãy quan sát những gì xảy ra với các bước đáp ứng nhiễu. Thay đổi các câu lệnh dưới đây trong m-file và thực thi lại ta có thể có được đồ thị như bên dưới. dist_cl = feedback(P_motor,C); step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t) ylabel('Position, \theta (radians)') title('Response to a Step Disturbance with K_p = 21 and Different Values of K_i') legend('K_i = 100', 'K_i = 300', 'K_i = 500') 20
  34. Hình 2. 11 Kết quả mô phỏng với các giá trị Ki= 100, 300, 500 Điều khiển tích phân đã làm giảm sai lệch tĩnh về 0, ngay cả khi xảy ra bậc nhiễu, đó là mục tiêu của việc thêm thành phần tích phân. Đối với đáp ứng với các mức tham chiếu, số lượng các dao động tăng nhẹ khi Ki lớn hơn. Tuy nhiên đáp ứng do nhiễu thay đổi đáng kể khi Ki thay đổi. Cụ thể là với giá trị Ki lớn hơn sai lệch giảm về không nhanh hơn. Ta chọn Ki = 500 vì sai lệch bởi nhiễu về không nhanh mặc dù đáp ứng đến giá trị tham chiếu còn lâu hơn thời gian thiết đặt và vọt lố khá cao. Chúng ta sẽ cố gắng để giảm thời gian đáp ứng và độ vọt lố bằng cách thêm thành phần vi phân vào bộ điều khiển. 2.2.2.3 Điều khiển PID Thêm thành phần vi phân vào cho bộ điều khiển nghĩa là chúng ta có tất cả 3 thành phần của bộ điều khiên PID. Chúng ta sẽ khảo sát với giá trị Kd trong khoảng từ 0,05 đến 0,025. Quay lại với m-file và thêm vào các câu lệnh sau, sau đó thực thi ta sẽ có kết quả như hình dưới. Kp = 21; Ki = 500; 21
  35. Kd = 0.05; for i = 1:3 C(:,:,i) = pid(Kp,Ki,Kd); Kd = Kd + 0.1; end sys_cl = feedback(C*P_motor,1); t = 0:0.001:0.1; step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t) ylabel('Position, \theta (radians)') title('Response to a Step Reference with K_p = 21, K_i = 500 and Different Values of K_d') legend('K_d = 0.05', 'K_d = 0.15', 'K_d = 0.25') Hình 2. 12 Kết quả mô phỏng với các giá trị Kd= 0.05, 0.15, 0.25 Hãy quan sát những gì xảy ra ở các bước đáp ứng nhiễu, thay đổi dòng lệnh dưới đây ở m-file và chạy ở chế độ dòng lệnh. dist_cl = feedback(P_motor,C); 22
  36. t = 0:0.001:0.2; step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t) ylabel('Position, \theta (radians)') title('Response to a Step Disturbance with K_p = 21, K_i = 500 and Different values of K_d') legend('K_d = 0.05', 'K_d = 0.15', 'K_d = 0.25') Hình 2. 13 Kết quả mô phỏng vơi Kd=0.05, 0.15, 0.25 có phản hồi Có vẻ như với Kd =0.15, chúng có thể đáp ứng những yêu cầu thiết kế đã đặt ra. Để xác định chính xác đặc điểm của từng bước đáp ứng có thể sử dụng menu chuột phải của đồ thị bước đáp ứng, hoặc có thể sử dụng câu lệnh ‘stepinfo’ với cấu trúc như bên dưới. stepinfo(sys_cl(:,:,2)) ans = RiseTime: 0.0046 SettlingTime: 0.0338 23
  37. SettlingMin: 0.9183 SettlingMax: 1.1211 Overshoot: 12.1139 Undershoot: 0 Peak: 1.1211 PeakTime: 0.0121 Từ những điều trên, chúng ta thấy rằng đáp ứng của các mức tham chiếu có thời gian đáp ứng khoảng 34ms(<40ms), độ vọt lố 12% (<16%) và không có sai lệch tĩnh. Ngoài ra các đáp ứng khi có can nhiễu cũng không gây ra sai lệch tĩnh. Vì vậy nếu chúng ta sử dụng bộ điều khiển PID với các hệ số: Kp=21, Ki =500 và Kd =0,15. thì tất cả những yêu cầu thiết kế đặt ra sẽ được đáp ứng. 24
  38. CHƯƠNG 3. THIẾT KẾ VÀ XÂY DỰNG HỆ GIÁM SÁT VÀ ĐIỀU KHIỂN ĐỘNG CƠ MỘT CHIỀU Một sơ đồ khối điều khiển động cơ một chiều DC dựa trên vi xử lý và máy vi tính đã được thiết kế và xây dựng như trình bày trên hình 3.1. Đây là một nền tảng tốt để có thể nghiên cứu phát triển các giải thuật điều khiển tiên tiến như giải thuật PID. ĐẶT TỐC ĐỘ/ GÓC BÀN PHÍM ENCODER COM UART MÁY TÍNH VI ĐIỀU KHIỂN MOTOR MẠCH CÔNG SUẤT BỘ MOTOR BỘ ĐIỀU KHIỂN Hình 3. 1 Sơ đồ khối mô hình điều khiển động cơ một chiều bằng máy tính và vi điều khiển Căn cứ vào giá trị đặt (tốc độ/góc quay motor) được nhập vào từ bàn phím, vi điều khiển sẽ so sánh, tính toán với tốc độ/góc quay thực tế thu được qua encoder để xuất ra các lệnh điều khiển phù hợp (ví dụ theo luật PID) tới mạch công suất điều khiển motor. Đồng thời các giá trị tốc độ/góc quay thực tế cũng được truyền tới cổng COM của máy vi tính để dùng làm dữ liệu lối vào cho chương trình kiểm tra, hiển thị trên máy tính được viết trong môi trường Visual C++. 3.1 Giới thiệu linh kiện 3.1.1 Vi điều khiển 16F877A 3.1.1.1 Khái quát về vi điều khiển 16F877A 25
  39. Hình 3. 2 Vi điều khiển 16F877A Hình 3. 3 Sơ đồ chân vi điều khiển 16F877A - Đây là vi điều khiển thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ dài 14 bít.Mỗi lệnh đều được thực thi trong một chu kỳ xung clock.Tốc độ hoạt động tối đa cho phép là 20MHz với một chu kỳ lệnh là 200ns.Bộ nhớ chương trình 8Kx14 bít, bộ nhớ dữ liệu 368x8 byte RAM và bộ nhớ dữ liệu EEPROM với dung lượng 256x8 byte.Số PORT I/O là 5 với 33 pin I/O. - Các đặc tính ngoại vi bao gồm các khối chức năng sau: + Timer0: bộ đếm 8 bít với bộ chia tần số 8 bít. + Timer1: bộ đếm 16 bít với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep. + Timer2: bộ đếm 8 bít với bộ chia tần số, bộ postcaler. + Hai bộ Capture/ so sánh/ điều chế độ rộng xung. + Các chuẩn giao tiếp nối tiếp SSP, SPI và I2C. 26
  40. + Chuẩn giao tiếp nối tiếp USART với 9 bít địa chỉ. + Cổng giao tiếp song song PSP với các chân điều khiển RD, WR, CS ở bên ngoài. - Các kênh Analog: + 8 kênh chuyển đổi ADC 10 bít.Hai bộ so sánh. - Bên cạnh đó là một vài đặc tính khác của vi điều khiển như: + Bộ nhớ flash với khả năng ghi xóa được 100.000 lần. + Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần. + Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm. + Khả năng tự nạp chương trình với sự điều khiển của phần mềm. + Watchdog Timer với bộ dao động trong. + Chức năng bảo mật mã chương trình. + Chế độ Sleep. + Có thể hoạt động với nhiều dạng Oscillator khác nhau. 3.1.1.2 Phương pháp điều chế độ rộng xung PWM. Để điều khiển tốc độ động cơ DC người ta có thể dùng nhiều phương pháp khác nhau trong đó có một phương pháp hết sức quan trọng và thông dụng là phương pháp điều chế độ rộng xung kích (PWM). 3.1.1.2.1 Điều chế PWM là gì? Phương pháp điều chế độ rộng xung PWM (Pulse Width Modulation) là phương pháp điều chỉnh điện áp ra tải hay nói cách khác là phương pháp điều chế dựa trên sự thay đổi độ rộng của chuỗi xung kích để điều khiển linh kiện đóng ngắt (SCR hay Transistor) dẫn đến sự thay đổi điện áp ra tải. Đồ thị dạng xung điều chế PWM 27
  41. Hình 3. 4 Đồ thị dạng xung điều chế PWM 3.1.1.2.2 Nguyên lí của PWM Đây là phương pháp được thực hiện theo nguyên tắc dóng ngắt nguồn có tải một cách có chu kì theo luật điều chỉnh thời gian đóng ngắt.Phần tử thực hiện nhiệm vụ đóng cắt là các van bán dẫn.Sơ đồ nguyên lí điều khiển tải dùng PWM. Hình 3. 5 Mô hình điều khiển sử dụng PWM và tín hiệu ra Trong khoảng thời gian 0 – t0 ta cho van Q1 mở toàn bộ điện áp nguồn Ud được đưa ra tải. Cũng trong khoảng thời gian từ t 0 đến T cho van Q1 khóa, cắt nguồn cung cấp cho tải.Vì vậy với thời gian t 0 thay đổi từ 0 cho đến T ta sẽ cung cấp toàn bộ , một phần hay khóa hoàn toàn điện áp cung cấp cho tải. Công thức tính giá trị trung bình của điện áp ra tải là: 푈 = 푈 . (푡0/ ) ℎ 푈 = 푈 . (2.11) 28
  42. Trong đó Ud: là điện áp trung bình ra tải. Umax: là điện áp nguồn. t0: là thời gian xung ở sườn dương (van khóa mở) T: thời gian cả thời gian xung sươn dương và sườn âm. D = t0/T: hệ số điều chỉnh hay PWM được tính bằng % Ví dụ: điện áp nguồn là 12V. Nếu hệ số điều chỉnh là 20% => Ud = 12.20% = 2.4 V Nếu hệ số điều chỉnh là 50% => Ud = 12.50% = 6 V Vì vậy, trong đề tài này em sử dụng phương pháp điều chế độ rộng xung PWM để thay đổi điện áp DC cấp cho động cơ từ đó thay đổi tốc độ của động cơ DC. Đối với PIC16F877A để sử dụng phương pháp này ta có thể sử dụng bộ điều chế độ rộng xung (PWM) tích hợp sẵn bên trong PIC với 2 ngõ ra xung tại hai chân CCP1 (17) và CCP2 (16).Tại các chân này khi hoạt động sẽ xuất chuỗi xung vuông với độ 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. 3.1.1.2.3 Cách thiết lập chế độ PWM cho PIC16F877A - Khi hoạt động ở chế độ PWM (Pulse Width Modulation _ khối điều chế độ rộng xung), tính hiệu sau khi điều chế sẽ được đưa ra các pin của khối CCP (cần ấn định các pin này là output ). Để sử dụng chức năng điều chế này trước tiên ta cần tiến hành các bước cài đặt sau: + Thiết lập thời gian của 1 chu kì của xung điều chế cho PWM (period) bằng cách đưa giá trị thích hợp vào thanh ghi PR2. + Thiết lập độ rộng xung cần điều chế (duty cycle) bằng cách đưa giá trị vào thanh ghi CCPRxL và các bit CCP1CON . + Điều khiển các pin của CCP là output bằng cách clear các bit tương ứng trong thanh ghi TRISC. + Thiết lập giá trị bộ chia tần số prescaler của Timer2 và cho phép Timer2 hoạt động bằng cách đưa giá trị thích hợp vào thanh ghi T2CON. 29
  43. + Cho phép CCP hoạt động ở chế độ PWM. - Trong đó giá trị 1 chu kì (period) của xung điều chế được tính bằng công thức: 푃푊 푒 푖표 = [(푃푅2) + 1] ∗ 4 ∗ 표푠 ∗ ( 푖á 푡 ị ộ ℎ푖 푡ầ푛 푠ố ủ 푅2). - Độ rộng xung điều chế (duty cycle) được tính theo công thức. 푃푊 푡 푙푒 = ( 푃푅 퐿: 푃 ) ∗ 표푠 ∗ 푖á 푡 ị ộ ℎ푖 푡ầ푛 푠ố ủ 푅2) Hình 3. 6 Sơ đồ khối CCP (PWMmode)(trái) Các tham số của PWM (phải) - Khi giá trị thanh ghi PR2 bằng với giá trị thanh ghi TMR2 thì quá trình sau đây xảy ra: + Thanh ghi TMR2 tự động được xóa. + Pin của khối CCP được set. + Giá trị thanh ghi CCPR1L (chứa giá trị ấn định độ rộng xung điều chế duty cycle) được đưa vào thanh ghi CCPRxH. 3.1.2 Mạch cầu H ( H-Bridge Circuit ) 3.1.2.1 Công dụng và nguyên lí hoạt động Mạch cầu H là một mạch điện giúp đảo chiều dòng điện qua một đối tượng. Đối tượng là động cơ DC mà chúng ta cần điều khiển .Mục đích điều 30
  44. khiển là cho phép dòng điện qua đối tượng theo chiều A đến B hoặc B đến A .Từ đó giúp đổi chiều quay của động cơ. Hiện nay, ngoài loại mạch cầu H được thiết kế từ các linh kiện rời như: BJT công suất, Mosfet, Còn có các loại mạch cầu H được tích hợp thành các IC như: L293D và L298D. Do đối tượng điều khiển trong đề tài này là động cơ DC có điện áp 12V và công suât nhỏ nên em dùng mạch cầu H đảo chiều động cơ là IC L298. Hình 3. 7 Khảo sát hoạt động của mạch cầu H Hình 3. 8 Nguyên lí hoạt động của mạch cầu H 3.1.2.2 Mạch cầu H L298D L298D là một chip toch1 hợp 2 mạch trong gói 15 chân. L298D có điện áp danh nghĩa cao (lớn hơn 50V) và dòng điện danh nghĩa lớn hơn 2A nên rất thích hợp cho các ứng dụng công suất nhỏ như các động cơ DC loại vừa và nhỏ 31
  45. Hình 3. 9 Sơ đồ chân của IC L298D (phải) IC L298D (trái) Hình 3. 10 Sơ đồ nguyên lí của IC L298D Có 2 mạch cầu H trên mỗi chip L298D nên có thể điều khiển 2 đối tượng riêng với 1 chip này. Mỗi mạch cầu H bao gồm 1 đường nguồn Vs (thật ra là đường chung cho 2 mạch cầu), một chân current sensing (cảm biến dòng) ở phần cuối của mạch cầu H, chân này không được nối đất mà bỏ trống để cho người dùng nối 1 điện trở nhỏ gọi là sensing resistor.Bằng cacch1 đo điện áp rơi trên điện trở này chúng ta có thể tính được dòng qua điện trở, cũng là dòng qua động cơ, mục đích của việc này là để xác định dòng quá tải. Nếu việc đo lường là không cần thiết thì ta có thể nối chân này với GND. Động cơ sẽ được nối với 2 chân OUT1, OUT2 hoặc OUT3, OUT4.Chân EN (ENA và ENB) cho phép mạch cầu hoạt động, khi chân này được kéo lên mức cao. 32
  46. L298D không chỉ được dùng để đảo chiều động cơ mà còn điều khiển vận tốc động cơ bằng PWM.Trong thực tế, công suất thực ma L298D có thể tải nhỏ hơn giá trị danh nghĩa của nó (U =50V, I =2A). Để tăng dòng tải của chíp lên gấp đôi, chúng ta có thể nối hai mạch cầu H song song với nhau (các chân có chức năng như nhau của 2 mạch cầu được nối chung). 3.1.3 Text LCD 3.1.3.1 Chức năng và hình dạng LCD Text LCD là các loại màn hình tinh thể lỏng nhỏ dùng để hiển thị các dòng chữ hoặc số trong bảng mã ASCII. Không giống các loại LCD lớn, Text LCD được chia sẵn thành từng ô và ứng với mỗi ô chỉ có thể hiển thị một ký tự ASCII. Cũng vì lý do chỉ hiện thị được ký tự ASCII nên loại LCD này được gọi là Text LCD (để phân biệt với Graphic LCD có thể hiển thị hình ảnh). Mỗi ô của Text LCD bao gồm các “chấm” tinh thể lỏng, việc kết hợp “ẩn” và “hiện” các chấm này sẽ tạo thành một ký tự cần hiển thị. Trong các Text LCD, các mẫu ký tự được định nghĩa sẵn. Kích thước của Text LCD được định nghĩa bằng số ký tự có thể hiển thị trên 1 dòng và tổng số dòng mà LCD có. Ví dụ LCD 16x2 là loại có 2 dòng và mỗi dòng có thể hiển thị tối đa 16 ký tự. Một số kích thước Text LCD thông thường gồm 16x1, 16x2, 16x4, 20x2, 20x4 Hình dưới là một ví dụ Text LCD 16x2. Hình 3. 11 Ảnh thực tế text LCD 16x2 3.1.3.2 Sơ đồ chân Các Text LCD theo chuẩn HD44780U thường có 16 chân trong đó 14 chân kết nối với bộ điều khiển và 2 chân nguồn cho “đèn LED nền”. Thứ tự các chân thường được sắp xếp như sau: 33
  47. Bảng 1. Sơ đồ chân. Trong một số LCD 2 chân LED nền được đánh số 15 và 16 nhưng trong một số trường hợp 2 chân này được ghi là A (Anode) và K (Cathode). Hình 2 mô tả cách kết nối LCD với nguồn và mạch điều khiển. Hình 3. 12 Sơ đồ kết nối LCD Chân 1 và chân 2 là các chân nguồn, được nối với GND và nguồn 5V. Chân 3 là chân chỉnh độ tương phản (contrast), chân này cần được nối với 1 biến trở 34
  48. chia áp như trong hình 2.Trong khi hoạt động, chỉnh để thay đổi giá trị biến trở để đạt được độ tương phản cần thiết, sau đó giữ mức biến trở này. Các chân điều khiển RS, R/W, EN và các đường dữ liệu được nối trực tiếp với vi điều khiển. Tùy theo chế độ hoạt động 4 bit hay 8 bit mà các chân từ D0 đến D3 có thể bỏ qua hoặc nối với vi điều khiển. 3.1.3.3 Tập lệnh của LCD Các lệnh của LCD có thể chia thành 3 nhóm như sau: - Các lệnh về kiểu hiển thị.(VD: Kiểu hiển thị (1 hàng / 2 hàng), chiều dài dữ liệu (8 bit / 4 bit), ) - Chỉ định địa chỉ RAM nội. - Nhóm lệnh truyền dữ liệu trong RAM nội. Với mỗi lệnh, LCD cần một khoảng thời gian để hoàn tất, thời gian này có thể khá lâu đối với tốc độ của MPU, nên ta cần kiểm tra cờ BF hoặc đợi (delay) cho LCD thực thi xong lệnh hiện hành mới c thể ra lệnh tiếp theo. 35
  49. 3.1.4 Cổng com và IC max 232 3.1.4.1 Cổng COM Giao tiếp giữa PIC và PC thông qua cổng nối tiếp hay còn gọi là cổng COM theo chuẩn giao tiếp RS232 Hình 3. 13 Cab kết nối cổng com 36
  50. Cổng COM có 2 dạng: đầu nối DB25 ( 25 chân ) và DB9 ( 9 chân ) được môtả như bảng sau Hình 3. 14 Sơ đồ chân cổng com 25 chân và 9 chân - Cổng nối tiếp được sử dụng để truyền dữ liệu hai chiều giữa máy tính và ngoại vi, nó có các ưu điểm sau: + Khoảng cách truyền xa hơn so với truyền song song. + Số dây kết nối ít. + Có thể truyền không dây dùng hồng ngoại. + Có thể ghép nối với VĐK hay PLC. + Cho phép nối mạng. + Có thể tháo lắp thiết bị trong lúc máy tính đang làm việc. + Có thể cung cấp nguồn cho các mạch điện đơn giản. - Các thiết bị ghép nối chia làm 2 loại: + DCE: là các thiết bị trung gian như MODEM. + DTE: là các thiết bị tiếp nhận hay truyền dữ liệu như PC, PLC, VĐK. + Việc trao đổi tín hiệu thông thường qua 2 chân RDX (nhận) và RTX (gửi). 37
  51. - Tín hiệu truyền theo chuẩn RS232: + Chuẩn RS232 truyền tín hiệu với các tốc độ thông dụng là: 1200 bps, 4800 bps, 9600 bps, 19200 bps. + Định dạng khung truyền chuẩn RS232: + Khi không truyền dữ liệu, đường truyền sẽ ở trạng thái mark (điện áp - 10V). + Khi bắt đầu truyền, DTE sẽ đưa ra xung Start ( space :10V ) và sau đó truyền lần lượt từ D0 -> D7 và Parity, cuối cùng là xung Stop ( mark: - 10V ) để khôi phục lại trạng thái đường truyền.Ví dụ truyền ký tự A: Hình 3. 15 Dạng tín hệu khi truyền kí tự A qua cổng Com - Các đặc tính kỹ thuật của chuẩn RS232. Chiều dài Cab cực đại 15m Tốc độ dữ liệu cực đại 20 Kbps Điện áp ngõ ra cực đại ±25V Điện áp ngõ ra có tải ±5V đến ±15V Trở kháng tải 3K đến 7K Điện áp ngõ vào ±15V Độ nhạy ngõ vào ±3V Trở kháng ngõ vào 3K đến 7K 38
  52. 3.1.4.2 IC MAX 232 Hình 3. 16 IC Max 232 Hình 3. 17 Sơ đồ kết nối IC max 232 IC MAX 232 là IC chuyên dùng trong giao tiếp nối tiếp với PC.Nó có 2 bộ đệm và 2 bộ nhận.Đường dẫn điều khiển lối vào CTS, điều khiển việc xuất dữ liệu ở cổng nối tiếp khi cần thiết, được nối với chân 9.Chân RTS (chân 10) được nối với đường dẫn bắt tay để điều khiển với quá trình nhận.Thường thì các đường dẫn bắt tay được nối với cổng nối tiếp qua các cầu nối, để khi không dùng đến nữa có thể để hở mạch các cầu này.Cách truyền dữ liệu đơn giản nhất là chỉ dùng 3 chân RTX, RDX và GND 3.1.5 IC cổng logic AND 74HC08 IC 74HC08 là IC cổng AND 2 trạng thái , IC này gồm có 4 cổng AND , 1 chân nguồn, 1 chân nối mass , tổng cộng có 14 chân. 39
  53. Sơ đồ chân Sơ đồ nguyên lý 7: GND Hình 3. 18 Sơ đồ chân, sơ 14: VCC = 5V đồ nguyên lí IC max 232 Mô tả chân: Bảng trạng thái: 40
  54. Trong đó: - H: mức điện áp cao - L: mức điện áp thấp - Phép toán logic: Y = AB Đặc tính điện: 3.1.5.1 Ic cổng logic not 7404 IC 7404 là IC cổng NOT , bao gồm 6 cổng NOT, 1 chân nguồn, 1 chân nối mass, tổng cộng có 14 chân. Sơ đồ chân và nguyên lý: Hình 3. 19 sơ đồ chân và nguyên lí 7404 Bảng trạng thái: Input Output X Y L H H L 41
  55. Trong đó: H: mức điện áp cao L: mức điện áp thấp Phép toán logic: Y = NOT(X) Đặc tính điện: 3.1.6 Bộ lập mã quang (Optical Encoder) Optical Encoder là một trong những thiết bị dùng để xác định góc quay của motor. Hệ thống optical encoder bao gồm một nguồn phát quang (thường là hồng ngoại – infrared), một cảm biến quang và một đĩa có chia rãnh. Optical encoder lại được chia thành 2 loại: encoder tuyệt đối (absolute optical encoder) và encoder tương đối (incremental optical encoder). Trong đa số các DC Motor, incremental optical encoder được dùng đa số. Hình 3. 20 Optical Encoder Encoder thường có 3 kênh (3 ngõ ra) bao gồm kênh A, kênh B và kênh I (Index). Trong hình trên chú ý rằng có một lỗ nhỏ bên phía trong của đĩa quay và một cặp phat-thu dành riêng cho lỗ nhỏ này. Đó là kênh I của encoder. Cữ mỗi lần motor quay được một vòng, lỗ nhỏ xuất hiện tại vị trí của cặp phát-thu, hồng ngoại từ nguồn phát sẽ xuyên qua lỗ nhỏ đến cảm biến quang, một tín hiệu xuất hiện trên cảm biến. Như thế kênh I xuất hiện một “xung” mỗi vòng quay của motor. Bên ngoài đĩa quay được chia thành các rãnh nhỏ và một cặp thu-phát 42
  56. khác dành cho các rãnh này. Đây là kênh A của encoder, hoạt động của kênh A cũng tương tự kênh I, điểm khác nhau là trong 1 vòng quay của motor, có N “xung” xuất hiện trên kênh A. N là số rãnh trên đĩa và được gọi là độ phân giải (resolution) của encoder. Mỗi loại encoder có độ phân giải khác nhau, có khi trên mỗi đĩa chĩ có vài rãnh nhưng cũng có trường hợp đến hàng nghìn rãnh được chia. Để điều khiển động cơ, bạn phải biết độ phân giải của encoder đang dùng. Độ phân giải ảnh hưởng đến độ chính xác điều khiển và cả phương pháp điều khiển. Không được vẽ trong hình 2, tuy nhiên trên các encoder còn có một cặp thu phát khác được đặt trên cùng đường tròn với kênh A nhưng lệch một chút (lệch M+0,5 rãnh), đây là kênh B của encoder. Tín hiệu xung từ kênh B có cùng tần số với kênh A nhưng lệch pha 90o. Bằng cách phối hợp kênh A và B người đọc sẽ biết chiều quay của động cơ. Hãy quan sát hình 3. Hình 3. 21 Nguyên lí hoạt động và dạng tín hiệu ra của Encoder Hình 3.21. thể hiện sự bộ trí của 2 cảm biến kênh A và B lệch pha nhau. Khi cảm biến A bắt đầu bị che thì cảm biến B hoàn toàn nhận được hồng ngoại xuyên qua, và ngược lại. Hình thấp là dạng xung ngõ ra trên 2 kênh. Xét trường hợp motor quay cùng chiều kim đồng hồ, tín hiệu “đi” từ trái sang phải. Bạn hãy quan sát lúc tín hiệu A chuyển từ mức cao xuống thấp (cạnh xuống) thì kênh B đang ở mức thấp. Ngược lại, nếu động cơ quay ngược chiều kim đồng hồ, tín hiệu “đi” từ phải qua trái. Lúc này, tại cạnh xuống của kênh A thì kênh B đang ở mức cao. Như vậy, bằng cách phối hợp 2 kênh A và B chúng ta không những xác định được góc quay (thông qua số xung) mà còn biết được chiều quay của động cơ (thông qua mức của kênh B ở cạnh xuống của kênh A). 43
  57. 3.2 Thiết kế mạch 3.2.1 Mạch nguyên lí Hình 3. 22 Sơ đồ mạch nguyên lí 3.2.1.1 Khối xử lí - Khối xử lí sử dụng vi điều khiển PIC16F877A - Sử dụng thạch anh ngoài tần số 20Mh. - Kết nối với LCD qua portD, đọc encoder qua ngắt ngoài ở chân RB0. - Kết nối với bàn phím qua các chân RB4 -> RB7 và RA0 ->RA3. - Xuất tín hiệu ra khối công suất qua các chân C1, C2, C3. C1 là tín hiệu PWM, C2 là tín hiệu quy định chiều quay động cơ, C3 là tín hiệu đóng ngắt mạch cầu H. 3.2.1.2 Khối điều khiển 44
  58. Hình 3. 23 Khối điều khiển Việc điều khiển được thực hiện thông qua bàn phím 4x4, kết nối với các chân RB4 -> RB7 và RA0 ->RA3 của vi điều khiển. 4 chân RB4 -> RB7 được nối đất qua trở 10k. chức năng của các phím như sau. - Các phím 0-9 để nhập tốc độc cho động cơ. - Phím * xóa kí tự nếu nhập lỗi - Phím # xác nhận kết thúc quá trình nhập tốc độ, gửi giá trị về vi điều khiển. - Các phím A, B, C, D có chức năng lần lượt là chọn chiều quay trái, phải. tăng giảm tốc độ động cơ. 3.2.1.3 Khối hiển thị Hình 3. 24 Khối hiển thị - Khối hiển thị sử dụng LCD 16x2 - 4 chân dữ liệu D4->D7 được kết nối với chân D4->D7 của vi điều khiển - Các chân RS, EN kết nối lần lượt với các chân D2, D3 của vi điều khiển, chân RW nối đất 45
  59. 3.2.1.4 Khối nguồn. Hình 3. 25 Khối nguồn Khối nguồn sử dụng nguồn nuôi DC 12v, dùng IC LM2576 để tạo nguồn 5V cấp cho vi điều khiển 3.2.1.5Khối công suất Hình 3. 26 Khối công suất - Khối công suất sử dụng mạch cầu L298 để điều khiển động cơ, tín hiệu được xuất ra động cơ thông qua kênh A. - Dùng IC 7414 và 7408 để làm cơ cấu lái đổi chiều quay cho động cơ.Thông thường, khi thiết kế một mạch driver cho motor người ta thường dành 3 đường điều khiển đó là PWM dùng điều khiển vận tốc, DIR điều khiển hướng và En cho phép mạch hoạt động. Chip L298D đã có sẵn đường En nhưng 2 đường điều khiển In1 và In2 không thật sự chức năng như chúng ta mong muốn. Vì thế, 46
  60. chúng ta sẽ thiết kế một mạch logic phụ với 2 ngõ vào là PWM và DIR trong khi 2 ngõ ra là 2 đường điều khiển In1 và In2. Bảng chân trị của mạch logic cần thiết kế được trình bày trong bảng 1. Bảng 1. bảng chân trị của mạch logic cho driver L298D PWM DIR In1 In2 0 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 Từ bảng giá trị này, chúng ta có thể viết hàm bool cho 2 ngõ In1 và In2: In1=PWM.NOT(DIR) In2=PWM.DIR Mạch logic vì thế sẽ có dạng như trong hình 3.26 3.2.1.6 Khối giao tiếp với máy tính Hình 3. 27 Khối giao tiếp với máy tính Việc giao tiếp với máy tính được thực hiện thông qua giao tiếp UART, RS232, sử dụng IC MAX 232 để kết nối. 47
  61. 3.2.2 Sản phẩm thực tế 3.2.2.1 Mạch in Hình 3. 28 Sơ đồ mạch in 3.2.2.2 Sản phẩm thực tế Hình 3. 29 sơ đồ các khối trong mạch điện Các thành phần trong mạch điện bao gồm 1. khối hiển thị 2. khối công suất 3. khối giao tiếp máy tính 4. khối nguốn 5. khối xử lí 6. khối điều khiển (kết nối với bàn phím) 48
  62. Hình 3. 30 Sản phẩm đầy đủ 49
  63. 3.3 Sơ đồ thuật toán và lập trình 3.3.1 Sơ đồ thuật toán 1. Chương trình con ngắt ngoài 2. Chương trình con ngắt timer 3. Chương trình con ngắt RB 50
  64. 4. Chương trình con ngắt RDA 5. Chương trình con PID 6. Chương trình chính 51
  65. 3.3.2 Viết chương trình cho vi điều khiển Việc lập trình được thực hiện trên phần mềm CCS 3.3.2.1Tính toán các giá trị trong chương trình 3.3.2.1.1 Thiết lập ngắt timer Các lệnh: Code: setup_TIMER_2(mode, period, postscale); set_TIMER2(value); // xác định giá trị ban đầu (8bit) cho Timer2 get_TIMER2(); // trả về số nguyên 8bit Với mode gồm (có thể kết hợp bằng dấu "|"): T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period là số nguyên từ 0-255, xác định giá trị xung reset postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt. 3.3.2.1.2 Thiết lập ngắt ngoài Để nhận xung từ encoder, ta có thể sử dụng ngắt ngoài, ngắt timer hoặc đơn giản là tham dò mức logic của các chân vi điều khiển một cách liên tục. Phần sau đây giới thiệu cách nhận và đếm xung của PIC16F877A dùng ngắt ngoài B0 (nối với kênh A của encoder) và chân B1 (nối với kênh B của encoder). Ta có thể làm tương tự đối với các cách nhận xung khác. Khởi tạo ngắt ngoài theo cạnh lên tại chân B0: Code: ext_int_edge(0,L_TO_H); // Ngắt cạnh lên tại RB0 enable_interrupts(INT_EXT); // Cho phép ngắt ngoài enable_interrupts(GLOBAL); // Cho phép ngắt toàn cục Chương trình con phục vụ ngắt: Code: 52
  66. #int_EXT void EXT_isr(void) //Chương trình được gọi khi có tác động cạnh lên tại chân B0 { if (RB1==1) xung++; // Nếu kênh B mức cao thì tăng giá trị xung thêm 1 else xung ; // Nếu kênh B mức cao thì giảm giá trị xung xuống 1 } Từ giá trị xung tính được tại các thời điểm ta có thể tính ra các thông số mong muốn. 3.3.2.1.3 Thiết lập PWM Để giải quyết vấn đề việc điều xung PWM bằng phần mềm chiếm phần lớn thời gian hoạt động của vi điều khiển, PIC16F877A có hỗ trợ 2 kênh điều xung bằng phần cứng ở 2 chân C1 (CCP2) và C2(CCP1) sử dụng TIMER2. Nghĩa là, khi ta khai báo điều xung PWM ở một tần số và duty cycle nào đó thì vi điều khiển sẽ thực hiện công việc xuất xung một cách liên tục và tự động cho đến khi ta thay đổi các giá trị đã khai báo. Khi đó, ta có thể làm các công việc khác một cách dễ dàng mà không phải mất thời gian cho việc duy trì xung PWM. Các hàm hỗ trợ việc điều xung bằng phần cứng của CCS: Ghi chú: Chỉ đề cập đến các đối số của các hàm được phục vụ cho việc điều xung PWM. setup_timer_2 (mode, period, postscale) - mode: T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16 - period: 0-255 - postscale: 1 Tần số điều xung PWM: f = fosc / [ 4*mode*(period+1) ] setup_ccp1(mode) và setup_ccp2(mode) mode: - CCP_PWM: chọn chế độ PWM. 53
  67. - CCP_OFF: tắt chế độ PWM. set_pwm1_duty(value) và set_pwm2_duty(value) Nếu value là giá trị kiểu int 8bit: duty_cycle = value / ( period+1 ) Nếu value là giá trị long int 16bit: duty_cycle = value&1023 / [4*( period+1 )] Nếu không cần điều xung quá “mịn” thì nên điều xung ở giá trị value 8bit cho đơn giản. Ví dụ: Ta muốn điều xung PWM với tần số 10kHz với tần số thạch anh (fosc) sử dụng là 20MHz (value 8bit). f=fosc/[4*mode*(period+1)] 10000 =20000000/[ 4*mode*(period+1) ] mode(period+1) = 500 Với mode = [1,4,16] và period = 0-255 ta có thể chọn: - mode = 4; period = 124 - mode = 16; period = 32 Để cho việc điều xung được “mịn” (chọn được nhiều giá trị duty cycle) ta chọn mode = 4 và period = 124. Như vậy, để duty_cycle từ 0% đến 100% ta cho value từ 0 đến 125. value = 30 => duty_cycle = 30 / ( 124+1 ) = 0.32 = 32% value = 63 => duty_cycle = 63 / ( 124+1 ) = 0.504 = 50.4% value = 113 => duty_cycle = 113 / ( 124+1 ) = 0.904 = 90.4% Code: setup_timer_2(T2_DIV_BY_4,124,1); setup_ccp1(CCP_PWM); set_pwm1_duty(duty); 3.2.3 Lập trình giao diện giám sát và điều khiển trên máy tính 54
  68. Trong phần này em đã xây dựng được ứng dụng đọc dữ liệu từ vi điều khiển lên PC qua cổng com và vẽ ra đồ thị biểu diễn sự phụ thuộc của tốc độ quay của motor (vòng/phút - rpm) theo thời gian. Hình 3. 31 Giao diện giám sát 3.4 Kết quả đo đạc trên mô hình thực tế. Sau khi xây dựng xong mô hình đã tiến hành đo đạc và chạy thử nghiệm, việc khảo sát được tiến hành trên hệ thống có những đặc trưng sau: - Nguồn nuôi 12V, 1A - Vận tốc tối đa của động cơ: Vmax=2800(vòng/phút) - Vận tốc tối thiểu: Vmin=200(vòng/phút) Đồ thị đáp ứng vòng hở của động cơ có dạng như sau: Vận tốc 3000 2000 1000 Vận tốc Linear (Vận tốc) 0 0 20 40 60 80 100 120 Vận tốc(vòng/phút) -1000 Độ rộng xung(%) Trong thử nghiệm này yêu cầu đặt ra cho hệ thống là: - Thời gian đáp ứng ít hơn 2 giây - Độ vọt lố ít hơn 5% - Sai lệch tĩnh e(t) nhỏ hơn 1% 55
  69. Sau đây là các kết quả thu được qua quá trình thực nghiệm. Trong các đồ thị , đường màu xanh biểu diễn các giá trị đặt tốc độ (là các xung nhảy bậc), đường màu đỏ biểu diễn giá trị tốc độ thực tế của motor đo được qua bộ lập mã quang. Hình 3. 32 Kết quả thử nghiệm với Kp=3, Ki=0, Kd=0 Trong trường hợp này, tuy chưa xảy ra vọt lố nhưng thời gian đáp ứng của motor là còn chậm. Hình 3. 33 Kết quả thử nghiệm với Kp=4, Ki=2, Kd=0 Trong trường hợp này thời gian đáp ứng của motor đã nhanh hơn song độ vọt lố khá lớn. 56
  70. Hình 3. 34 Kết quả thử nghiệm với Kp=6, Ki=0.9, Kd=0 Trong trường hợp này, thời gian đáp ứng đủ nhanh, và không xảy ra vọt lố. Như vậy với các hệ số được chọn Kp=6, Ki=0.9 và Kd=0 là thỏa mãn với yêu cầu đặt ra cho điều khiển tốc độ của motor. 57
  71. KẾT LUẬN 1. Kết quả đạt được và hạn chế của đề tài Kết quả: Đã xây dựng thành công mô hình điều khiển động cơ DC bằng thuật toán PID sử dụng vi điều khiển PIC 16F877A với các chức năng điều khiển tốc độ bằng các giá trị vận tốc được nhập từ máy tính hoặc các phím tăng giảm vận tốc, chọn chiều quay, kết nối gửi số liệu lên máy tính để vẽ đồ thị thông qua giao diện trên máy tính. Hạn chế: chi phí cho hệ thống còn khá cao, tốc đọ đáp ứng chưa thực sự nhanh, giao diện điều khiển chư thực sự tối ưu, còn khó khăn trong việc thiết lập các thông số điều khiển. hệ thống sử dụng mạch cầu L298 chỉ điều khiển được các động cơ công suất nhỏ. 2. Hướng phát triển Tối ưu hệ thống điều khiển, tối giản các modul không thực sự cần thiết trong mạch, đồng thời tăng phạm vi điều khiển của mạch cho các động cơ công suất lớn. Tối ưu giao diện điều khiển trên máy tính và phát triên thêm cho các hệ điều hành của dị động, thêm các modul truyên thông không dây để có thể điều khiển từ xa qua wifi, mạng di động hoặc song radio. 58
  72. PHỤ LỤC Chương trình vi điều khiển 1. Điều khiển tốc độ #include #include #device *=16 ADC=8 #include #include #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8) #use fast_io (b) #use fast_io (c) #include // Thu vien ham cho LCD char key[8]; signed int16 xung=0, vset=0, Kp=6, Ki=0.9,Kd=0, output=0, vsum=0, vtb=0; signed int16 ppart=0, dpart=0, ipart=0, e1, e2; int8 j, l=0, duty=0, dem=0; void pid(); void quaytrai() { output_low(pin_c2); output_high(pin_c3); 59
  73. set_pwm2_duty(duty); } void quayphai() { output_high(pin_c2); output_high(pin_c3); set_pwm2_duty(duty); } void dung() { output_low(pin_c3); set_pwm2_duty(0); vset=0; } #int_ext void ngat_ngoai() { if(input(PIN_B1)) xung=xung+1; else xung=xung-1; } #int_timer1 void ngat_timer1() 60
  74. { set_timer1(3035); vsum=vsum+xung; dem++; set_pwm2_duty(duty); if(dem==5) { vtb=vsum*1.2; pid(); printf("Vset=%ld&Velocity=%ld&\n",vset,vtb); dem=0; vsum=0; } xung=0; } //#int_RDA //ngat khi có du lieu gui tu pc //void ngat_RDA() //{ // data=getc(); //} #int_RB void ngat_RB() { 61
  75. if((RBIF)&&(RBIE)) { if(RB4&&RA0) { key[l]='1'; key[l+1]='\0'; l++; } if(RB4&&RA1) { key[l]='4'; key[l+1]='\0'; l++; } if(RB4&&RA2) { key[l]='7'; key[l+1]='\0'; l++; } if(RB4&&RA3) { if(l>0) 62
  76. { l ; key[l]='\0'; } } / / if(RB5&&RA0) { key[l]='2'; key[l+1]='\0'; l++; } if(RB5&&RA1) { key[l]='5'; key[l+1]='\0'; l++; } if(RB5&&RA2) { key[l]='8'; key[l+1]='\0'; l++; 63
  77. } if(RB5&&RA3) { key[l]='0'; key[l+1]='\0'; l++; } / / if(RB6&&RA0) { key[l]='3'; key[l+1]='\0'; l++; } if(RB6&&RA1) { key[l]='6'; key[l+1]='\0'; l++; } if(RB6&&RA2) { key[l]='9'; 64
  78. key[l+1]='\0'; l++; } if(RB6&&RA3) { if(l>0) { vset = atof(key); key[0]='\0'; l=0; } } / / if(RB7&&RA0) { vset=-vset; } if(RB7&&RA1) { dung(); } if(RB7&&RA2) { 65
  79. vset=vset+5; } if(RB7&&RA3) { vset=vset-5; } / / RBIF=0; //Xoa co ngat RB } } void pid() { //Kp=15; //Ki=0; //Kd=0; e2=vset-vtb; ppart=Kp*e2; dpart=Kd*(e2-e1); ipart=ipart+ Ki*e2; output= output + (ppart + dpart+ ipart); e1=e2; //! if (ipart>4000) ipart=4000; //! if (ipart<-4000) ipart=-4000; 66
  80. //! if (ppart>4000) ppart=4000; //! if (ppart 4000) dpart=4000; //! if (dpart =30600) output=30600; if (output <=-30600) output=-30600; duty=(int8)abs(output/244); } void main() { set_tris_c(0xff); set_tris_b(0xff); set_tris_d(0x00); set_tris_a(0x00); lcd_init(); / / enable_interrupts(INT_EXT); ext_int_edge(H_to_L); enable_interrupts(global); / / enable_interrupts(int_RB); ext_int_edge(H_to_L); enable_interrupts(global); 67
  81. / / enable_interrupts(INT_RDA); enable_interrupts(global); / / enable_interrupts(int_timer1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); set_timer1(3035); //dinh thoi 100ms / / Printf(LCD_putchar,"Hello"); delay_ms(200); LCD_putcmd(0x01); / / setup_ccp2(ccp_pwm); setup_timer_2(t2_div_by_4,124,1); / / output_high(pin_c2); //output_high(pin_c3); output_a(0x00); while(TRUE) { for(j=0;j<=3;j++) { output_a(1<<j); 68
  82. delay_ms(20); } if(vset>0) quayphai(); else if(vset 0) { lcd_putcmd(0x01); printf(lcd_putchar, "vset: %s", key); delay_ms(50); } if(l==0) { LCD_putcmd(0x80); Printf(LCD_putchar,"vset= %ld "vset,); LCD_putcmd(0xC0); Printf(LCD_putchar,"vreal= %ld ",vtb); delay_ms(10); } } } 69
  83. 2. Điều khiển vị trí #include #include #device *=16 ADC=8 #include #include #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8) #use fast_io (b) #use fast_io (c) #include // Thu vien ham cho LCD char data, key[8]; signed int16 xung=0, vreal=0, vset=0, Kp=2, Ki=0.04,Kd=1, output=0; signed int16 ppart=0, dpart=0, ipart=0, e1, e2; int8 j, l=0, duty=0; void pid(); void quaythuan() { output_high(pin_c2); output_high(pin_c3); set_pwm2_duty(duty); } void quaynguoc() { output_low(pin_c2); output_high(pin_c3); set_pwm2_duty(duty); } 70
  84. void dung() { output_low(pin_c2); output_low(pin_c3); set_pwm2_duty(0); } #int_ext void ngat_ngoai() { if(input(PIN_B1)) xung=xung+1; else xung=xung-1; } #int_timer1 void ngat_timer1() { set_timer1(3035); vreal=xung*3.6; pid(); printf("Vset=%ld&Velocity=%ld&\n",vset,vreal); } #int_RDA //ngat khi có du lieu gui tu pc void ngat_RDA() { data=getc(); } #int_RB void ngat_RB() { if((RBIF)&&(RBIE)) 71
  85. { if(RB4&&RA0) { key[l]='1'; key[l+1]='\0'; l++; } if(RB4&&RA1) { key[l]='4'; key[l+1]='\0'; l++; } if(RB4&&RA2) { key[l]='7'; key[l+1]='\0'; l++; } if(RB4&&RA3) { if(l>0) { l ; key[l]='\0'; } } / / if(RB5&&RA0) { 72
  86. key[l]='2'; key[l+1]='\0'; l++; } if(RB5&&RA1) { key[l]='5'; key[l+1]='\0'; l++; } if(RB5&&RA2) { key[l]='8'; key[l+1]='\0'; l++; } if(RB5&&RA3) { key[l]='0'; key[l+1]='\0'; l++; } / / if(RB6&&RA0) { key[l]='3'; key[l+1]='\0'; l++; } if(RB6&&RA1) 73
  87. { key[l]='6'; key[l+1]='\0'; l++; } if(RB6&&RA2) { key[l]='9'; key[l+1]='\0'; l++; } if(RB6&&RA3) { if(l>0) { vset = atof(key); key[0]='\0'; l=0; } } / / if(RB7&&RA0) { output_high(pin_c2); } if(RB7&&RA1) { output_low(pin_c2); } if(RB7&&RA2) 74
  88. { vset=vset+5; } if(RB7&&RA3) { vset=vset-5; } / / RBIF=0; //Xoa co ngat RB } } void pid() { Kp=55; Ki=8; Kd=45; e2=vset/3.6-xung; if(e2>25) e2=25; if(e2 400) ipart=400; //! if (ipart 400) ppart=400; //! if (ppart 400) dpart=400; //! if (dpart<-400) dpart=-400; 75
  89. if (output >=30600) output=30600; if (output 0) quaythuan(); else if(e2<0) quaynguoc(); else dung(); } void main() { set_tris_c(0xff); set_tris_b(0xff); set_tris_d(0x00); set_tris_a(0x00); lcd_init(); / / enable_interrupts(INT_EXT); ext_int_edge(H_to_L); enable_interrupts(global); / / enable_interrupts(int_RB); ext_int_edge(H_to_L); enable_interrupts(global); / / enable_interrupts(INT_RDA); enable_interrupts(global); / / enable_interrupts(int_timer1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); 76
  90. set_timer1(3035); //dinh thoi 100ms / / Printf(LCD_putchar,"Hello"); delay_ms(500); LCD_putcmd(0x01); / / setup_ccp2(ccp_pwm); setup_timer_2(t2_div_by_4,124,1); / / output_high(pin_c2); output_high(pin_c3); output_a(0x00); while(true) { for(j=0;j 0) { lcd_putcmd(0x01); printf(lcd_putchar, "vset: %s", key); delay_ms(50); } if(l==0) { LCD_putcmd(0x80); Printf(LCD_putchar,"vreal: %ld ", vreal); 77
  91. LCD_putcmd(0xC0); Printf(LCD_putchar,"vset: %ld ", vset); } } } 78
  92. TÀI LIỆU THAM KHẢO Tài liệu trong nước [1]. Nguyễn Thị Mỹ Dung, Luận văn thạc sỹ “Thiết kế bộ điều khiển PID thích nghi điều khiển tốc độ động cơ một chiều có momen quán tính thay đổi”, Đại Học Đà Nẵng, Tr. 6-8. Tài liệu Website [2]. ntrolPID [3]. [4] max232-rs232.html [5]. [6]. %80%93Nichols 79