Điều khiển pid động cơ không đồng bộ 3 pha với pic 18f4520

LỜI MỞ ĐẦU Hiện nay nước ta đang tiến hành quá trình công nghiệp hóa - hiện đại hóa với mục tiêu giúp cho đất nước thoát khỏi cảnh nghèo nàn, lạc hậu và phấn đấu cơ bản trở thành một nước công nghiệp vào năm 2020.Ứng dụng những thành tựu của khoa học kĩ thuật trong sản xuất, các ngành kĩ thuật nói chung và ngành điện tử - điều khiển tự động nói riêng đã đóng góp không nhỏ vào quá trình phát triển của đất nước. Lĩnh lực tự động hóa cần được quan tâm và phát triển để nâng cao hiệu quả sản xuất, đây cũng chính là cốt lõi của nền sản xuất hiện đại. Trong các dây chuyền công nghệ sản xuất trong công nghiệp thì hệ thống truyền động và băng tải là một bộ phận quan trọng và không thể thiếu. Để cung cấp sức kéo cho các hệ thống này thì so với các loại động cơ khác, động cơ điện không đồng bộ ba pha được sử dụng rộng rãi và phổ biến nhất, từ công suất nhỏ, trung bình đến công suất lớn do có rất nhiều tính năng ưu việt như: kết cấu đơn giản, độ bền cao, giá thành hạ, dễ lắp đặt và bảo trì. Nhờ sự phát triển của kĩ thuật đã chế tạo được các khóa bán dẫn có công suất lớn nên việc điều khiển các động cơ không đồng bộ ba pha trở nên dễ dàng hơn và các tính năng của động cơ cũng được khai thác tốt hơn. Thêm vào đó là sự phát triển của của kĩ thuật điện tử và lĩnh vực điều khiển tự động hóa, nhiều phương pháp điều khiển đã ra đời và ngày càng hoàn thiện hơn nên việc điều chỉnh moment cũng như ổn định tốc độ động cơ trở nên linh hoạt hơn, đáp ứng được các đòi hỏi của quy trình công nghệ và quá trình sản xuất công nghiệp. Trong các phương pháp điều khiển vòng kín thì thuật toán điều khiển PID là phương pháp tương đối đơn giản, dễ thiết kế, thực hiện, lại có chất lượng chấp nhận được nên được sử dụng rộng rãi trong điều khiển quá trình và nhiều đối tượng khác nhau. Xuất phát từ những điều kể trên, trong đồ án này tôi đã ứng dụng thuật toán điều khiển PID trong việc điều khiển và ổn định tốc độ động cơ không đồng bộ ba pha. Dù đã rất cố gắng trong khi thực hiện đề tài này, nhưng do kiến thức còn hạn chế, chưa có kinh nghiệm sản xuất thực tế nên không tránh khỏi sai sót, rất mong sự đóng góp và nhận xét từ phía thầy cô và các bạn, tôi xin chân thành cảm ơn. MỤC LỤC CHƯƠNG 1: LÝ THUYẾT LIÊN QUAN1 1.1 ĐỘNG CƠ KHÔNG ĐỒNG BỘ 3 PHA.1 1.1.1 Cấu tạo.1 1.1.2 Ứng dụng.2 1.1.3 Các phương pháp điều khiển.3 1.2 CHỈNH LƯU CẦU MỘT PHA.3 1.3 BIẾN TẦN VÀ CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN.5 1.3.1. Ứng dụng của biến tần 5 1.3.2 Biến tần trực tiếp . 6 1.3.3 Bộ biến tần có khâu trung gian một chiều (biến tần gián tiếp).6 1.3.4 Bộ nghịch lưu áp 3 pha.7 1.3.5 Các phương pháp điều khiển phổ biến.10 1.3.5.1 Phương pháp điều chế sin PWM 10 1.3.5.1.1 Giới thiệu . 10 1.3.5.1.2 Một số công thức tính toán 11 1.3.5.2 Phương pháp điều khiển V/f.12 1.3.5.3 Nghịch lưu 3 pha sixtep.14 1.3.5.3.1 Nghịch lưu sixtep dẫn 1.3.5.3.2 Nghịch lưu sixtep dẫn 1.4 ENCODER.18 1.4.1 Cấu tạo 18 1.4.2 Nguyên lý hoạt động 19 1.5 CẢM BIẾN NHIỆT LM335.19 1.6 THUẬT TOÁN ĐIỀU KHIỂN PID .20 1.6.1 Thuật toán PID số.20 1.6.2 Thuật toán PID rời rạc hóa.21 1.6.3 Hiệu chỉnh thông số của bộ điều khiển PID.25 1.6.3.1 Phương pháp thứ nhất.25 1.6.3.2 Phương pháp thứ hai 26 1.7 NGÔN NGỮ LẬP TRÌNH Visual Basic.26 1.7.1 Khái quát về Visual Basic.26 1.7. 2 Giới thiệu về công cụ ActiveX Teechart 28 1.8 VI ĐIỀU KHIỂN_PIC 18f4520.29 1.8.1 Giới thiệu về PIC . 29 1.8.2 Đặc điểm nổi bật ngoại vi 32 1.8.3 Chức năng từng chân.33 CHƯƠNG 2: THỰC HIỆN ĐỀ TÀI 35 2.1 NỘI DUNG.35 2.1.1 Yêu cầu đề ra.35 2.1.2 Giải quyết yêu cầu.35 2.2 THIẾT KẾ PHẦN CỨNG.36 2.2.1 Khối điều khiển và hiện thị.36 2.2.1.1 Khối nguồn .37 2.2.1.2 Nút nhấn và biến trở.38 2.2.1.3 Encoder . 38 2.2.1.4 Temp sensor.38 2.2.1.5 LCD hiển thị.38 2.2.1.6 Khối Max232 . 38 2.2.1.7 Vi điều khiển 39 2.2.2 Khối công suất.40 2.2.2.1 Bộ chỉnh lưu.41 2.2.2.2 Mạch cách li và mạch lái.41 2.2.2.2.1 Mạch cách li 41 2.2.2.2.2 Mạch lái.43 2.2.2.3 Mạch nghịch lưu 3 pha .44 2.3 SƠ ĐỒ NGUYÊN LÝ 46 2.4 GIẢI THUẬT CHƯƠNG TRÌNH.48 2.4.1 Chương trình trên PIC18F4520.49 2.4.1.1 Lưu đồ giải thuật chương trình chính . 49 2.4.1.2 Giải thuật chương trình PID.53 2.4.1.3 Lưu đồ giải thuật chương trình ngắt 54 2.4.1.3.1 Ngắt port nối tiếp.55 2.4.1.3.2 Ngắt Timer 2.55 2.4.1.3.3 Ngắt Timer1 và Timer 3 56 2.4.2 Chương trình và giải thuật trên máy tính . 57 2.4.2.1 Sự kiện nút nhấn CONNECT 58 2.4.2.2 Sự kiện Form_Load() 59 2.4.2.3 Sự kiện nút nhấn START.59 2.4.2.4 Sự kiện nút nhấn STOP.60 2.4.2.5 Sự kiện nút nhấn ABOUT.61 2.4.2.6 Sự kiện OnComn() . 61 2.4.2.7 Chương trình con tính thuật toán PID.62 CHƯƠNG 3: KẾT LUẬN 63 3.1 KẾT QUẢ ĐẠT ĐƯỢC.63 3.2 HẠN CHẾ.63 3.3 HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI 63 PHỤ LỤC65 TÀI LIỆU THAM KHẢO98

doc100 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3735 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Điều khiển pid động cơ không đồng bộ 3 pha với pic 18f4520, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
cho việc đổi tương tự sang số ( A/D ). + Chân RA4 là ngõ vào xung clock cho Timer0. RA5 dùng phát hiện mức điện áp cao / thấp ở đầu vào. - Port B: + Là port xuất nhập hai chiều, port B có thể được lập trình bằng phần mềm để làm chức năng kéo lên cho tất cả đầu vào. + RB0, RB1, RB2 lần lượt có thể làm chân ngắt ngoài 0, 1, 2. + RB4, RB5, RB6 có thể tạo ngắt với sự thay đổi trên chân đó. - Port C: + Port xuất nhập hai chiều. + RC0 làm ngõ ra bộ dao động Timer1 hoặc ngõ vào xung clock cho Timer1 / Timer3. + RC1 làm ngõ vào bộ dao động cho Timer1, ngoài ra nó còn lấy mẫu 2 ngõ vào / so sánh 2 ngõ ra / PWM 2 ngõ ra. + RC2 lấy mẫu 1 ngõ vào / so sánh 1 ngõ ra / PWM 1 ngõ ra, nó còn được tăng cường thêm CCP1 ở đầu ra. - Port D: + Là port xuất nhập 2 chiều, có thể làm port slave song song ( PSP ) khi giao tiếp với 1 port vi xử lí. Những chân của port có đệm đầu vào TTL ( Transisitor – transistor logic ) khi module PSP được cho phép. - Port E: + Là port xuất nhập 2 chiều, có thể dùng để điều khiển chọn / đọc / ghi cho PSP. - Các chân khác: + VSS: Chân nối đất . + VDD: Chân cấp nguồn dương . + OSC1/CLKI/RA7: Ngõ vào bộ dao động thạch anh hay xung clock. + OSC2/CLKO/RA6: Ngõ ra bộ dao động thạch anh hay xung clock. CHƯƠNG 2: THỰC HIỆN ĐỀ TÀI 2.1 Nội dung. 2.1.1 Yêu cầu đề ra. Tạo ra được điện áp 3 pha ở ngõ ra cấp cho motor hoạt động, tần số điện áp 3 pha ngõ ra có thể thay đổi trong khoảng 10 -70 Hz. Điều khiển vòng kín động cơ không đồng bộ 3 pha bằng thuật toán PID. Theo dõi và giám sát nhiệt độ của các khóa công suất. Giao tiếp máy tính, viết giao diện điều khiển và giám sát trên máy tính. 2.1.2 Giải quyết yêu cầu. Từ yêu cầu đặt ra, sơ đồ khối của hệ thống được thiết kế như sau: Vac Cầu Chỉnh Lưu Nghịch Lưu 3 pha Động Cơ Không Đồng Bộ 3 Pha Mach lái Mạch cách li Hồi tiếp Encoder Nhiệt độ Bộ Điều Khiển PIC PC Rs232 Biến trở Nút nhấn Led LCD Tín hiệu xung kích Hình 2.1 - Sơ đồ thiết kế. Điện áp từ nguồn điện AC qua mạch chỉnh lưu toàn kỳ, tạo ra điện áp một chiều DC cung cấp cho bộ nghịch lưu và bộ điều khiển ( lưu ý rằng áp DC cung cấp cho bộ điều khiển là 5 V, còn cho bộ nghịch lưu cao hơn rất nhiều, gần 300 Vdc). Bộ điều khiển được lập trình để gởi tín hiệu điều khiển đến các van điện tử của bộ nghịch lưu 3 pha, sử dụng phương pháp kích dẫn các khóa theo kiểu six_step dẫn 180 độ. Với tín hiệu điều khiển nhận được các van của bộ nghịch lưu sẽ được kích dẫn theo ý muốn tạo ra điện áp lệch 3 pha từ nguồn DC ban đầu, cung cấp cho động cơ. Tốc độ quay của động cơ được đo thông qua số xung hồi tiếp về từ Encoder. Bộ điều khiển giao tiếp với máy tính qua cổng Com, chuẩn RS232, chương trình trên máy tính sẽ tính toán PID dựa vào tốc độ của động cơ đo được bằng Encoder và gửi tín hiệu điều khiển xuống vi xử lý. Vi xử lý sẽ tính toán và đưa ra giá trị xung kích phù hợp. 2.2 Thiết kế phần cứng. Từ sơ đồ khối của hệ thống như trên, hệ thống được thiết kế với hai khối chủ yếu: khối điều khiển và hiển thị cùng với khối công suất . 2.2.1 Khối điều khiển và hiển thị. Sơ đồ khối của khối điều khiển: Biến trở PC LCD DISPLAY LED PIC 18f4520 CONTROLLER Encoder Temp sensor Power Nút nhấn MAX 232 PWM signal Fan Hình 2.2 - Sơ đồ khối mạch điều khiển, hiển thị. 2.2.1.1 Khối nguồn . Điện áp ac 15V được chỉnh lưu theo phương pháp chỉnh lưu toàn kì không điều khiển dùng cầu diode, điện áp DC sau đó được lọc phẳng bằng tụ và đưa vào vi mạch ổn áp 7805 để tạo ra điện áp 5V ổn định cấp cho mạch điều khiển. Do yêu cầu về an toàn và chống nhiễu, điện áp DC cung cấp cho mạch điều khiển, mạch công suất, mạch lái đều được dùng các nguồn khác nhau. 2.2.1.2 Nút nhấn và biến trở. Mạch điều khiển được thiết kế với 4 nút nhấn và 4 biến trở. Nút nhấn dùng để chọn chế độ điều khiển, chọn chiều quay động cơ được dùng chủ yếu trong mode dùng PID trên PIC. Tất cả các nút nhấn đều được thiết kế tích cực mức thấp. Biến trở dùng để cài đặt tốc độ cũng như cài đặt các giá trị của các thông số PID. 2.2.1.3 Encoder. Sử dụng Encoder quang có độ phân giải 100 xung/vòng, dùng để đo và hồi tiếp tốc độ quay của động cơ. Các xung được vi xử lý đếm vào khi có tác động cạnh xuống trên chân vi điều khiển. 2.2.1.4 Temp sensor. Cảm biến dùng để đo nhiệt độ, giúp lấy mẫu nhiệt độ của các khóa công suất. Cảm biến nhiệt có rất nhiều loại, ở đây sử dụng IC cảm biến nhiệt LM335 với tầm đo trong khoảng . 2.2.1.5 LCD hiển thị. Sử dụng màn hình tinh thể lỏng LCD 20x4, gồm có 4 hàng và mỗi hàng đều hiển thị được 20 kí tự. LCD được giao tiếp với vi xử lý ở chế độ 4 bit giúp tiết kiệm chân port cho vi xử lý. Việc dùng LCD để hiển thị có nhiều ưu điểm là: Dễ lập trình . Giao diện bắt mắt, trực quan, thông tin hiển thị rõ ràng. LCD 20x4 có số lượng kí tự đủ lớn để hiển thị các thông tin cần thiết. 2.2.1.6 Khối Max232. Khi ghép nối cổng Com của máy tính với vi điều khiển hay mạch TTL cần phải có mạch chuyển mức và ngược lại.Quy định về mức tín hiệu của hai chuẩn này không giống nhau do đó cần có mạch chuyển đổi để hai thiết bị làm việc theo hai chuẩn trên có thể giao tiếp với nhau. Vi mạch chuyển đổi thường được sử dụng là MAX232(maxim) hoặc DS275(dallas). MAX232 thông dụng hơn cả vì chỉ cần nguồn 5V, mạch 10V do mạch dao động 16KHz bên trong cung cấp. 2.2.1.7 Vi điều khiển. Chúng ta đã quá quen thuộc với các vi điều khiển của hãng Atmel ( AT89C51, AT89C2051, AT89C1051, AT89C52 ) hay Philip( P89V51RB2, P89V51RD2). Đặc biệt với vi điều khiển của Atmel, đây là loại vi điều khiển được dùng khá phổ biến trong chương trình giảng dạy ở các trường đại học và cao đẳng hiện nay, loại vi điều khiển này chỉ là cơ sở, chưa tích hợp được nhiều tính năng chuyên dụng khác. Nhằm mục đích mở rộng kiến thức của mình, tôi đã tìm hiểu về vi điều khiển PIC và sử dụng nó ( PIC18F4520 ) làm IC điều khiển chính trong đề tài này. Họ vi điều khiển PIC và dsPIC do hãng Microchip chế tạo và sản xuất với công nghệ hiện đại, phù hợp với các ứng dụng từ đơn giản đến phức tạp. Ngoài việc tích hợp đến 13 ngõ vào chuyển đổi ADC độ phân giải lên đến 10 bit với tốc độ lấy mẫu nhanh, PIC18F4520 còn có đến 4 Timer dùng cho việc định thì hoặc dùng làm bộ đếm, thích hợp cho các ứng dụng cần nhiều ngắt timer. Đặc biệt ngoài ngôn ngữ lập trình Assembler như các vi điều khiển khác, người dùng có thể lập trình PIC bằng ngôn ngữ C thông qua các phần mềm hỗ trợ như: PIC18C, CCS C, MPLAP… 2.2.2 Khối công suất. Sơ đồ khối của khối công suất. Bộ nghịch lưu Bộ chỉnh lưu 3 Pha AC AC source Mạch lái Mạch cách li Tín hiệu xung kích Hình 2.3 - Sơ đồ khối của khối công suất. 2.2.2.1 Bộ chỉnh lưu. Điện áp AC 220V được đưa trực tiếp qua cầu chỉnh lưu không điều khiển dùng 4 Diode công suất. Điện áp DC sau khi chỉnh lưu được lọc phẳng bằng tụ có điện dung lớn, và được cấp cho bộ nghịch lưu hoạt động . Với điện áp cấp vào là AC220V, ta sẽ có điện áp DC ở ngõ ra sau khi qua tụ lọc là: . 2.2.2.2 Mạch cách li và mạch lái. 2.2.2.2.1 Mạch cách li. Vì có sự chênh lệch về áp nguồn cung cấp giữa khối điều khiển và khối công suất nên cần phải cách li 2 khối này với nhau để đảm bảo an toàn cho mạch và chống nhiễu. Có 2 phương pháp cách li: biến áp xung và opto. - Cách li bằng biến áp xung. Gồm một cuộn dây sơ cấp và có thể có nhiều cuộn thứ cấp. Với nhiều cuộn dây phía thứ cấp ta có thể đóng ngắt nhiều transistor nối tiếp hoặc song song. Biến áp xung có cảm kháng tản nhỏ và đáp ứng nhanh. Tuy nhiên trường hợp xung điều khiển có cạnh tác động kéo dài hoặc tần số thấp thì biến áp xung nhanh đạt đến trạng thái bão hòa và ngõ ra của nó không phù hợp với yêu cầu điều khiển. - Cách li bằng opto. Gồm nguồn phát tia hồng ngoại ( IR –led ) và nguồn thu là phototransistor. Để tạo cách li về điện giữa mạch điều khiển và mạch công suất, tôi dùng OPTO PC817, vì: - Đảm bảo cách li về điện. - Đáp ứng opto tốt hơn biến áp xung. - Dễ dàng mua được tại các cửa hàng linh kiện điện tử với giá tương đối rẻ. Hình 2.4 - Sơ đồ nguyên lí mạch cách li. Mạch cách li: Là 6 opto ( PC817 ) có tác dụng cách li vi điều khiển và mạch công suất để tránh nhiễu và bảo vệ mạch điều khiển. Đây là sự cách li bằng quang. Khi vi điều khiển phát xung qua điện trở 330 tác động vào opto ( anode của led ) tùy theo xung ở mức cao hay thấp mà transitor quang dẫn hay không dẫn. Khi transitor quang dẫn ( xung từ vi điều khiển mức cao ) thì đầu ra opto là mức cao và ngược lại. 2.2.2.2.2 Mạch lái. Cũng như thyristor và transistor, IGBT, MOSFET cần có mạch lái, là phần tử trung gian giữa mạch điều khiển và các khóa điện tử có nhiệm vụ: + Đảm bảo dạng và trị số dòng cực B cho BJT ( hay áp cổng đối với MOSFET hay IGBT ) để các linh kiện này dẫn bão hòa. + Cách li mạch điều khiển – công suất theo yêu cầu của sơ đồ động lực, tăng khả năng an toàn cho người vận hành và tránh nhiễu cho mạch điều khiển. Có 2 phương pháp chính để lái các khóa ( MOSFETs hay IGBTs ): - Biến áp xung . - IC điều khiển. Họ IC IR2136 ( IR21362 / IR21363 / IR21365 / IR21367 / IR21368) là những IC chuyên dụng để điều khiển MOSFETs và IGBTs có áp và công suất lớn dành cho các ứng dụng 3 pha với đầu ra 3 kênh độc lập mà được tham chiếu đến cạnh lên và xuống từ đầu vào. Nhưng ở đây lại phát sinh vấn đề đó là IR2136 rất khó mua được ngoài thị trường Việt Nam, vì đều là IC chuyên dụng cho các bộ biến tần. Ở đây tôi dùng biến áp xung, tạo ra các điện áp cách li dùng cho việc kích các khóa công suất. Biến áp xung được sử dụng gồm có 5 cuộn dây, một cuộn sơ cấp và 4 cuộn thứ cấp. Tỉ lệ số vòng dây thứ cấp so với số vòng dây của sơ cấp là 4/3. Dùng IC định thời LM555 tạo tín hiệu xung kích để cấp cho biến áp xung, tạo ra 4 điện áp độc lập và cách li, dùng tạo áp kích cực G của các MOSFET. Hình 2.5 - Sơ đồ nguyên lí mạch lái. Tần số xung của ngõ ra LM555 có thể điều chỉnh nhờ vào việc thay đổi giá trị của biến trở R35. Điện áp nhận được tại ngõ ra của biến áp xung là điện áp xoay chiều có giá trị khoảng 10V, sau đó được chuyển thành điện một chiều dùng phương pháp chỉnh lưu hình tia, rồi dùng tụ nguồn để lọc phẳng lại. Diode zenner được sử dụng để ổn định điện áp ra ở mức 12V, đủ áp để kích các khóa công suất. 2.2.2.3 Mạch nghịch lưu 3 pha . Phần chính của bộ nghịch lưu 3 pha là cầu 6 khóa . Khi cấp điện áp DC cho bộ nghịch lưu, bằng việc kích dẫn các khóa theo trình tự và chu kì nhất định, sẽ tạo ra được điện áp 3 pha ở ngõ ra cung cấp cho động cơ. Hình 2.6 - Cầu nghịch lưu 3 pha dùng 6 MOSFETs. Đối với yêu cầu công suất đầu ra, tôi xem xét 2 loại khóa điện tử: transistor lưỡng cực có cực cổng cách li (IGBTs) hoặc MOSFETs. Cả IGBTs và MOSFETs đều là linh kiện điều khiển bằng điện áp, nghĩa là việc dẫn hay ngưng dẫn của linh kiện được điều khiển bằng một nguồn điện áp nối với cực Gate của linh kiện này thay vì là dòng điện trong các trong các bộ nghịch lưu sử dụng transistor như trước đây. Vì vậy việc sử dụng linh kiện này làm cho việc điều khiển trở nên dễ dàng hơn. Hình 2.7 - Ký hiệu IGBT và MOSFET. - Các yêu cầu chính đặt ra cho linh kiện sử dụng làm bộ nghịch lưu: + Điện áp (MOSFET) hay (IGBT) >. + Chịu được tần số đóng ngắt cao. + Dòng điện qua linh kiện lớn hơn dòng định mức trên động cơ. + Công suất tiêu hao thấp. ….. Trong đề tài này tôi chọn MOSFET ( mà cụ thể là IRFP460P ) làm cầu 6 khóa cho nghịch lưu 3 pha với các lí do sau: + Điện áp ngược có khả năng chịu được lớn. + Đóng ngắt nhanh. + Yêu cầu điều khiển đơn giản. + Khả năng chịu dòng lớn ( dùng cho công suất trung bình và nhỏ). + Công suất tiêu hao thấp và nội trở lúc hoạt động bé. Hơn nữa công nghệ chế tạo ra MOSFET không cho phép tạo ra các linh kiện có định mức dòng lớn, IGBT có thể xem là sự kết hợp giữa MOSFET ở ngõ vào và BJT ở ngõ ra để có được linh kiện đóng ngắt dòng DC lên đến hàng nghìn Ampe điều khiển bằng áp cực G. Hình 2.8 - Ký hiệu, thông số và dạng đóng gói của IRFP460P. 2.3 Sơ đồ nguyên lý. 2.4 Giải thuật chương trình. Khái quát hoạt động của toàn bộ hệ thống: Điều khiển ổn định tốc độ động cơ không đồng bộ 3 pha với thuật toán PID. Hệ thống được thiết kế với hai chế độ hoạt động, PID_PC và PID_CHIP. Việc lựa chọn giữa hai chế độ được thực hiện bằng phím nhấn tích hợp sẵn trên board khi mới khởi động chương trình và động cơ đang ở trạng thái Stop. Ở chế độ hoạt động PID_PC, việc tính toán thuật toán PID được thực hiện bằng phần mềm chạy trên máy tính.Việc cài đặt tốc độ và chiều quay của động cơ cũng như việc cài đặt các thông số cho bộ hiệu chỉnh PID đều được thực hiện trên giao diện điều khiển. Trạng thái kết nối, trạng thái hoạt động của động cơ, tốc độ quay hiện tại của động cơ, tần số điện áp 3 pha ngõ ra đều được hiển thị trên giao diện này. Ngoài ra phần mềm điều khiển trên máy tính còn tiến hành vẽ đồ thị đáp ứng vận tốc của động cơ, giúp cho việc điều khiển và giám sát trở nên dễ dàng hơn. Khi hoạt động ở chế độ này phím nhấn và biến trở trên board đều bị khóa nếu động cơ đang chạy. Để hoạt động ở chế độ này, mạch điều khiển phải được kết nối với máy vi tính qua cổng giao tiếp nối tiếp RS232. Chế độ thứ 2, chế độ PID_CHIP mạch điều khiển không cần kết nối với máy vi tính nữa.Toàn bộ việc tính toán PID và đưa ra tín hiệu điều khiển đều được nhúng trên vi điều khiển trung tâm PIC18F4520. Các thông tin như vận tốc đặt, vận tốc đo, trạng thái hoạt động của động cơ, nhiệt độ khóa công suất, và các thông số cài đặt cho bộ hiệu chỉnh PID đều được đưa ra hiện thị trên LCD 20x4. Thông qua 4 biến trở được thiết kế sẵn, các thông số Kp, Ki, Kd và vận tốc mong muốn của động cơ được cài đặt nhanh chóng và dễ dàng. Nhiệt độ của các khóa công suất luôn được giám sát trong suốt quá trình hoạt động của hệ thống đưa tín hiệu thu được về vi xử lý để đưa ra các quyết định như tắt mở quạt giải nhiệt, tránh cho nhiệt độ khóa công suất lên quá cao. 2.4.1 Chương trình trên PIC18F4520. 2.4.1.1 Lưu đồ giải thuật chương trình chính. Thiết lập cấu hình Port, I/O. Đặt cấu hình truyền thông Khởi tạo timer,counter. Khởi động LCD,ADC. Xử lý phím nhấn:chọn chế độ hoạt động. Begin OPTION=0 PID_PC PID_CHIP S Đ Giải thích giải thuật: Khi mới khởi động, chương trình sẽ thiết lập các thông số như cấu hình Port, LCD, Timer, Counter, ADC, thiết lập cổng giao tiếp hoạt động ở tốc độ baud 9600b/s. Việc lựa chọn chế độ hoạt động được thực hiện thông qua nút nhấn UP và DOWN trên board để chọn qua lại giữa hai chế độ PID_PC và PID_CHIP. Chế độ đang chọn sẽ được chấp nhận khi phím START được nhấn và chương trình sẽ nhảy đến thực hiện chương trình con tương ứng. Giải thuật chương trình chế độ PID_CHIP: Đ S S Đ S Đ S Đ Đ Up =0 Down =0&on=0 Tần số <40Hz Mở Timer 3 Tắt Timer0,Timer1,Timer2,Timer3 Nhận các thôngsố:KP,KI,KD, vận tốc đặt ,thông tin nhiệt độ từ ADC . Đảo chiều động cơ Rev=1||on=1 Mở Timer0,Timer1,Timer2 Start =0 Từ tần số tính bởi hàm PID,tính toán giá tri nạp cho Timer1 tạo xung cơ bản. Hiện thị thông tin lên LCD Begin Tắt Timer 3 End S Chế độ PID_CHIP : Khi ở mode này chương trình sẽ đọc giá trị từ ADC0, ADC1, ADC2, ADC3 để xác định các thông số cài đặt Kp, Ki, Kd cho bộ hiệu chỉnh PID và tốc độ cần đặt của động cơ. Chiều quay của động cơ được chọn bằng phím nhấn REV trước khi động cơ hoạt động. Nhấn phím DOWN để dừng động cơ và phím UP để quay lại màn hình chọn chế độ. Các thông tin về thông số cài đặt, tốc độ động cơ, nhiệt độ khóa công suất, trạng thái hoạt động của động cơ đều được đưa ra LCD hiển thị. Khi phím START được nhấn, chương trình sẽ cho phép Timer1, Timer2 và Counter0 hoạt động, khi đó động cơ sẽ chạy và được điều khiển bởi chương trình PID trên PIC. Nhiệm vụ của Counter0 là liên tục đọc số xung phát ra từ Encoder. Timer2 dùng để tạo ngắt lấy mẫu vận tốc hiện tại của động cơ dùng cho việc tính toán PID với chu kì là 60ms. Timer1 dùng để tạo ngắt thay đổi chu kì đóng ngắt của các khóa công suất tạo ra điện áp 3 pha. Tần số của điện áp 3 pha ngõ ra được điều chỉnh phụ thuộc vào giá trị nạp cho Timer1. Timer3 dùng để tạo ra xung băm trên nền xung cơ bản khi tần số điện áp dưới 40Hz, nhằm tăng trở kháng cho động cơ để hạn dòng tránh làm hỏng động cơ. Đ Đ Đ Đ Đ Đ S S S S Cập nhật trạng thái kết nối ,tốc độ ,chiều quay của động cơ, tần số điện áp ,nhiệt độ khóa công suất lên LCD. BEGIN Tần số <40Hz Tắt Timer3 Mở Timer 3 Down =0&on=0 Nhận tín hiệu điều khiển từ thuật toán PID trên máy tính. Tính giá trị nạp cho Timer1 tạo tần số 3 pha cơ bản. On=1 Mở Timer0,Timer1,Timer2. command = 0XFF way=1 – chiều quay phải On=0 ,Reset counter Tắt: Timer0,Timer1, Timer2,Timet3. command = 0XFF. way=0 – chiều quay trái Gửi mã kiểm tra kết nối qua Port nối tiếp command = 0XFF. command = 0XFD command = 0XFC command = 0XFB command = 0XFA command = 0XFE END Đ S Giải thuật chương trình chế độ PID_PC: Chế độ PID_PC: Khi ở mode này chương trình sẽ cho phép Port nối tiếp hoạt động, các phím nhấn trên board đều bị cấm trừ phím DOWN dùng để trở về màn hình lựa chọn lại chế độ. Phím nhấn này chỉ có tác động khi động cơ đang ở trạng thái ngừng. Chương trình sẽ đáp ứng với các mã lệnh được phần mềm trên máy tính gửi xuống. Lúc này INVERTER sẽ hoạt động dưới sự điều khiển và giám sát của giao diện người dùng trên máy vi tính. Trạng thái kết nối, tốc độ động cơ, tần số hiện tại của điện áp, nhiệt độ khóa công suất đều được hiển thị trên cả LDC và giao diện điều khiển trên máy vi tính. Thuật toán PID được tính toán trên máy tính sẽ đưa tín hiệu điều khiển xuống vi điều khiển, từ đó đưa ra giá trị xung kích phù hợp. Ngoài ra ở mỗi chế độ, nhiệt độ khóa công suất luôn được giám sát, chương trình sẽ đưa ra các quyết định tắt mở quạt giải nhiệt . 2.4.1.2 Giải thuật chương trình PID. Ngõ vào của bộ điều khiển là sai số giữa vận tốc đặt và vận tốc đo được hiện tại của động cơ. Sau khi qua tính toán PID, tín hiệu ngõ ra của bộ điều khiển là tần số, dùng để Update tần số của điện áp 3 pha ngõ ra. Tần số ngõ ra được giới hạn trong khoảng 9 -70 Hz, tránh việc tần số quá thấp sẽ làm giảm trở kháng động cơ, dòng tăng cao và làm hỏng động cơ hay tần số lên quá cao sẽ làm suy giảm từ thông và làm giảm moment động cơ. Đ S PID RET e0=vtdat-vtecd; tanso = tanso + kp *( e0 –e1) + ki * (e0 + e1 ) / 2 + kd * (e0 - (2 * e1) + e2); Tần số>70 Tần số =70 Tần số =0 Tần số<0 0<Tần số<9 Tần số =9 Đ Đ S S 2.4.1.3 Lưu đồ giải thuật chương trình ngắt. Khi có sự kiện ngắt xảy ra, chương trình chính sẽ bị tạm ngưng và chương trình ngắt được thực thi tùy theo loại ngắt nào được phát hiện. Chương trình sử dụng 3 ngắt Timer dùng cho việc lấy mẫu tốc độ động cơ, tạo tần số cơ bản và xung băm cho điện áp 3 pha ngõ ra, một ngắt do port nối tiếp phục vụ cho việc truyền thông giữa hệ thống và máy vi tính. 2.4.1.3.1 Ngắt port nối tiếp. Thực hiện việc nhận các mã lệnh cũng như các tín hiệu điều khiển từ máy vi tính gửi xuống. Đọc bộ đệm thu. command=RCREG RETI Ngắt nối tiếp Cờ thu RCIF=1 Đ S 2.4.1.3.2 Ngắt Timer 2. Lấy mẫu Counter 0 với chu kì 60 ms, và tùy thuộc vào chế độ hoạt động mà gọi Ngắt Timer2 RETI -Xóa cờ ngắt ,tắt Timer 2 -Tắt counter0,đọc kết quả counter 0 OPTION=1 -Gửi kết quả đọc từ counter0 lên máy tính -Tính vận tốc hiện tại của động cơ. -Gọi chương trình PID Reset bộ đếm Cho bộ đếm và Timer2 chạy lại. Đ S chương trình PID trên PIC hay không. 2.4.1.3.3 Ngắt Timer1 và Timer 3 . Dùng để định thời xuất tín hiệu ngõ ra điều khiển phần công suất. - Ngắt Timer1: Chương trình sẽ cài đặt giá trị thích hợp cho Timer1 khi nhận được tần số, để định thời cho từng chu kì thay đổi trạng thái theo sơ đồ kích của các khóa công suất. Ngắt Timer1 RETI -Xóa cờ ngắt ,tắt Timer 1 -Nạp lại Timer1 Thay đổi ngõ ra theo chu kì đóng ngắt,tạo tần số 3 pha cơ bản. Cho Timer1 chạy lại Ngắt Timer3 RETI -Xóa cờ ngắt ,tắt Timer 3 -Nạp lại Timer3 Đảo trạng thái ngõ ra tạo xung băm. Cho Timer3 chạy lại - Ngắt Timer3: Khi tần số nhận được nhỏ hơn 40Hz, Timer3 được phép hoạt động và được cài giá trị cố định để băm điện áp ngõ ra. 2.4.2 Chương trình và giải thuật trên máy tính. Giao diện điều khiển trên máy tính. Nhập các thông số PID Lựa chọn thông số cổng Com Chọn chiều quay động cơ Trạng thái kết nối Đồ thị đáp ứng vận tốc động cơ. Tốc độ đặt,tần số và tốc độ hiện tại Các Button điều khiển Hình 2.9 - Giao diện điều khiển trên máy tính. Form hiển thị thông tin: 2.4.2.1 Sự kiện nút nhấn CONNECT. END CONNECT -Kết nối thành công Cổng chưa mở Mở cổng com. Gửi mã kiểm tra kết nối (0xFA) Thông báo lỗi Kết nối =0 Đ Đ S S Khi nút CONNECT được nhấn, chương trình kiểm tra nếu cổng Com chưa được mở thì sẽ mở cổng Com.Trường hợp cổng đã mở hoặc đang được sử dụng bởi một chương trình ứng dụng khác, chương trình sẽ ra thông báo lỗi. Khi cổng đã được mở, chương trình sẽ gửi mã FAH xuống vi xử lý để kiểm tra tình trạng kết nối. Nếu lúc này chương trình cũng nhận lại được mã FA từ vi xử lý gửi lên thì kết nối coi như thành công. 2.4.2.2 Sự kiện Form_Load(). Là sự kiện xảy ra đầu tiên khi giao diện điều khiển được mở lên. Khi đó chương trình sẽ tiến hành đặt cấu hình cổng, tốc độ baub, khung truyền, kiểm tra chẵn, lẽ … Form_Load RETI -Đặt cấu hình cổng com -Đặt số byte nhận tối thiểu để báo sự kiện là 1 -ketnoi=0 2.4.2.3 Sự kiện nút nhấn START. END START -Xóa bộ đệm truyền -Gửi mã Start(0xFE) -Timer=0,dùng cho vẽ đồ thị Gửi mã quay phải (0xFC) Option1.value=1 Gửi mã quay trái (0xFB) Cho phép Timer1 chạy Tích cực nút nhấn STOP S Đ Khi nút START được nhấn, chương trình sẽ gửi mã Start FEH qua cổng Com, và tùy thuộc vào chiều quay động cơ được chọn mà tương ứng sẽ gửi mã quay trái hay quay phải xuống cho vi xử lý. Lúc này Timer1 được cho phép hoạt động để tính thời gian vẽ đồ thị đáp ứng vận tốc động cơ. 2.4.2.4 Sự kiện nút nhấn STOP. END STOP -Xóa bộ đệm truyền -Gửi mã Stop(0xFD) -Xóa đồ thị -Xóa danh sách list -Reset các biến về giá tri ban đầu. -Tắt Timer1 Khi nhấn STOP mã Stop FDH sẽ được gửi xuống vi xử lý để dừng động cơ. Các biến và đồ thị đều được xóa về giá trị ban đầu và tắt Timer1. 2.4.2.4 Sự kiện nút nhấn EXIT. Kiểm tra nếu cổng đang mở thì đóng cổng và kết thúc chương trình ứng dụng. END EXIT - Đóng cổng com Cổng đang mở Tắt giao diện điều khiển S Đ 2.4.2.5 Sự kiện nút nhấn ABOUT. Hiện thị Form2, là form hiển thị thông tin về chương trình. END ABOUT Cho hiện thị Form Cấm tác động lên form1 2.4.2.6 Sự kiện OnComn(). Đây là sự kiện ngắt cổng Com. Ta chỉ sử dụng điều kiện ngắt cổng Com khi trong bộ đệm nhận được 1 byte. Mỗi khi bộ đệm nhận được một byte thì chương trình OnComn () sẽ được thực hiện. S Đ END OnComn Command=bộ đệm thu Command=FAH Ketnoi=1 Hiện thông báo kết nối thành công -Tính vận tốc động cơ -Gọi chương trình con PID -Gửi tần số xuống vi điều khiển -Cập nhật vận tốc đo,tần sô lên giao diện -Vẽ đồ thị đáp ứng vận tốc Khi mã nhận được là FAH thì chương trình sẽ xác nhận kết nối thành công bằng cách cho ketnoi=1. Vận tốc tức thời được tính nhờ vào số xung đếm được của Encoder gửi lên từ vi xử lý theo công thức : Chương trình sẽ gọi thuật toán PID, cập nhật lại tần số điện áp và gửi xuống vi điều khiển, đồng thời vẽ đồ thị đáp ứng vận tốc của động cơ. 2.4.2.7 Chương trình con tính thuật toán PID. PID END e0=vtdat-vtecd; FRE = FRE + kp *( e0 –e1) + ki * (e0 + e1 ) / 2 + kd * (e0 - (2 * e1) + e2); FRE >70 FRE =70 FRE =0 FRE <0 0< FRE <9 FRE =9 CHƯƠNG 3: KẾT LUẬN Sau thời gian thực hiện đề tài, với sự hướng dẫn của các thầy cô thì tôi đã đạt được một số kết quả như yêu cầu đặt ra, tuy nhiên bên cạnh đó vẫn còn nhiều mặt hạn chế: 3.1 Kết quả đạt được. - Tìm hiểu về động cơ không đồng bộ 3 pha và các phương pháp điều khiển. - Tìm hiểu về INVERTER. - Tìm hiểu và lập trình cho PIC18 với ngôn ngữ cấp cao C. - Ứng dụng thuật toán PID trong điều khiển tốc độ động cơ. - Xây dựng được bộ điều khiển động cơ 3 pha với 2 mode hoạt động dùng phương pháp điều khiển PID. - Đáp ứng vận tốc của hệ kín của hệ khá tốt ở chế độ PID_PC, vận tốc giới hạn của động cơ trong khoảng 300 đến 1700 vòng/phút. - Xây dựng và so sánh được đáp ứng hệ thống khi việc tính toán PID được đặt trên máy tính so với đặt trên vi điều khiển. 3.2 Hạn chế. - Chưa tìm được phương trình toán của động cơ, do dó việc tìm các thông số Kp, Ki, Kd còn gặp nhiều khó khăn và chưa tìm được các thông số tốt nhất. - Ở chế độ PID_CHIP, đáp ứng của hệ còn chưa tốt, sai số lớn, việc nhập Kp, Ki, Kd bằng biến trở có nhiều khó khăn đo độ phân giải của biến trở và dao động của nguồn. - Đáp ứng vận tốc của động cơ chưa tốt khi tốc độ đặt thấp, sai số lớn, chưa ổn định. - Phần nghịch lưu 3 pha tạo ra được áp 3 pha chỉ thay đổi được tần số chưa thay đổi được điện áp, do đó chưa điều khiển được moment của động cơ. 3.3 Hướng phát triển của đề tài. - Hoàn thiện để hệ thống đáp ứng tốt hơn khi tốc độ đặt thấp. - Sử dụng các phương pháp nghịch lưu hiện đại như các phương pháp vector không gian, điều chế xung sin… để điện áp ngõ ra có chất lượng tốt hơn. - Xây dựng phương trình toán của động cơ để có thể tìm các thông số của động cơ dễ dàng hơn và tìm được các thông sô tối ưu hơn. - Phát triển thêm khâu hồi tiếp dòng, hồi tiếp điện áp, hồi tiếp nhiệt độ động cơ, tránh quá tải động cơ. - Sử dụng phương pháp điều khiển V/f để điều khiển động cơ ở chế độ tải không đổi, để đảm bảo moment động cơ không thay đổi theo tần số. PHỤ LỤC Một số hình ảnh của đề tài: Hình 2.10 - Đáp ứng vận tốc động cơ khi đặt ở tốc độ 1060 vòng/phút. Hình 2.11 - Đáp ứng vận tốc động cơ khi đặt ở tốc độ 300 vòng/phút. Hướng dẫn sử dụng mô hình: Mô hình được lập trình để hoạt động ở hai chế độ: PID_PC và PID_CHIP. Khi mới cấp nguồn, màn hình LCD trên Board sẽ hiển thị giao diện cho phép người dùng lựa chọn chế độ hoạt động. Nhấn qua lại giữa hai nút UP và DOWN trên board để lựa chọn chế độ. Nhấn START để chấp nhận lựa chọn. - Khi làm việc ở chế độ PID_PC: Board phải được kết nối với máy tính qua cổng RS232, thiết lập kết nối bằng cách lựa chọn cổng Com và tốc độ Baud phù hợp và nhấn nút CONNECT trên giao diện điều khiển. Trạng thái kết nối được hiển thị trên cả Board và giao diện điều khiển, khi kết nối giữa Board và máy tính thành công, nút START trên giao diện được Active. Nhập các thông số Kp, Ki, Kd cho bộ hiệu chỉnh PID trên giao diện điều khiển , chiều quay của động cơ và tốc độ mong muốn của động cơ cũng được cài đặt trên giao diện này. Nhấn nút START trên giao diện để cho phép động cơ hoạt động. Khi START được nhấn, chương trình sẽ vẽ đồ thị đáp ứng vận tốc của động cơ, các thông số như tần số hiện tại của điện áp ra, vận tốc hiện tại của động cơ cũng được cập nhật lên giao diện. Động cơ ngừng hoạt động khi nút STOP trên giao diện được nhấn. Việc lựa chọn chiều quay phải được thực hiện trước khi động cơ hoạt động bằng cách chọn vào OPTION tương ứng trên giao diện. Khi động cơ ở trạng thái ngừng hoạt động, nhấn nút DOWN trên Board để quay lại giao diện chọn chế độ hoạt động.Việc này không thể thực hiện khi động cơ đang chạy. - Khi làm việc ở chế độ PID_CHIP: Board không cần thiết phải kết nối với máy tính, việc hiển thị thông tin hoàn toàn ở trên LCD 20x4 tích hợp sẵn trên Board . Các thông số PID được cài đặt thông qua ba biến trở độc lập có sẵn trên Board, một biến trở dùng để chỉnh cho một thông số. Tốc độ đặt của động cơ cũng được cài đặt thông qua một biến trở còn lại. Nút REV trên Board dùng để chọn chiều quay động cơ trước khi động cơ được phép hoạt động. Nhấn nút START trên Board để cho phép động cơ bắt đầu hoạt động. Khi động cơ hoạt động các thông tin như tốc độ hiện tại động cơ, nhiệt độ khóa công suất sẽ được cập nhật và hiển thị lên LCD. Động cơ dừng khi nút UP trên Board được nhấn. Khi động cơ đã dừng hoạt động, nhấn nút DOWN sẽ cho phép quay lại màn hình chọn chế độ . Code lập trình cho PIC: //dieu khien pid dong co 3 pha voi pic18f4520 //khai bao thu vien #include #include #include #include #include #include #include #include //khai bao lcd 4bit #define rs PORTEbits.RE0 #define en PORTCbits.RC1 #define databus PORTB //(RB2-RB5) // button active low level #define start PORTBbits.RB0 #define up PORTBbits.RB1 #define down PORTCbits.RC4 #define rev PORTCbits.RC3 //device all active high level #define speaker PORTDbits.RD6 #define fan PORTBbits.RB6 #define ledsta PORTDbits.RD7 #define ledinfo PORTCbits.RC5 //khai bao chuong trinh con void ghilcd(char x); void guilenh(char x); void guidata(char x); void khoidong(void); void hienthi(char x[]); //hien thi mot chuoi len LCD void delay(void); void beep(void); void low_isr(void); //chuong trinh ngat void high_isr(void); void EnableHighInterrupts (void); //cho phep ngat toan cuc void PID(); //khai bao bien int t=0;//nhiet do int option=0; //che do auto||manual char command=0xff; //ma nhan tu pc short vtdat=0,vtecd=0; int e0=0,e1=0,e2=0,e3=0,e4=0,e5=0; float kp=0,ki=0,kd=0; float ketqua,ketqua1,ketqua2; short vantocdo=0; int j=0; int i,state=0; int on=0; char string[]; char string1[]; char string2[]; char string3[]; char string4[]; char string5[]; char string6[]; int ketqua3; int ketqua4; int result=0; //ket qua doc tu timer 0 int run=1; int tanso=0; int k=0; int way=1; //chon chieu unsigned short napt1=0; unsigned short firt=0; int const t1=0x19,t2=0x29,t3=0x25,t4=0x26,t5=0x16,t6=0x1a; char mess1[]="*MOTOR PID CONTROL*"; char mess2[]="PID_CHIP <"; char mess3[]="PID_PC >"; char mess4[]="KP:"; char mess5[]="KI:"; char mess6[]="KD:"; char mess7[]="Dir:"; char mess9[]="MODE:"; char mess10[]="press start!"; char mess11[]="Status:"; char mess12[]="Temp:"; char mess13[]="Stop "; char mess14[]="Running "; char mess15[]="Connect "; char mess16[]="Not Connect"; char mess17[]="Pre:"; char mess18[]="VPre:"; void main(void) { char mess20[]="***PID_PC***"; char mess21[]="***PID_CHIP***"; char mess22[]="Hz"; char mess23[]="Left "; char mess24[]="Right"; char mess25[]="VSet:"; TRISA=0xff; // all input TRISB=0x03; TRISC=0xd9; TRISD=0x00; //all output TRISE=0x06; ADCON1=0x09; PORTD=0X00; //=0 speaker=0; fan=0; ledsta=0; ledinfo=0; //dem encoder //khai bao timer0 :cam ngat,counter 8 bit,dem canh xuong,prescale 1-1 OpenTimer0( TIMER_INT_ON &T0_8BIT& T0_SOURCE_EXT &T0_EDGE_FALL& T0_PS_1_1); INTCONbits.TMR0IF=0; INTCON2bits.TMR0IP=0; INTCONbits.TMR0IE=0; WriteTimer0(0); T0CONbits.TMR0ON=0; //CloseTimer0(); //------------------------------------------------------------- //KHAI BAO NGAT TIMER1 tao xung co ban T1CON=0X01; //chon 2 thanh ghi 8 bit,cho phep timer chay PIR1bits.TMR1IF=0; PIE1bits.TMR1IE=1; IPR1bits.TMR1IP=1; WriteTimer1(napt1); T1CONbits.TMR1ON=0; //CloseTimer1(); //-------------------------------------------------------------- //khai bao Timer 3 ,tao xung bam OpenTimer3( TIMER_INT_ON &T3_8BIT_RW &T3_SOURCE_INT &T3_PS_1_1 &T3_OSC1EN_OFF &T3_SYNC_EXT_OFF ); PIR2bits.TMR3IF=0; PIE2bits.TMR3IE=1; IPR2bits.TMR3IP=0; WriteTimer3(62535); T3CONbits.TMR3ON=0; //-------------------------------------------------------------- //khai bao timer2:tao ngat doc counter0 //cho phep ngat moi 20ms,timer 8 bit//cong thuc trong giao trinh OpenTimer2(TIMER_INT_ON & T2_PS_1_16 & T2_POST_1_15 );//ngat chu ki 20ms PIE1bits.TMR2IE=1; IPR1bits.TMR2IP=1; T2CONbits.TMR2ON=0; PR2=249; TMR2=0; PIR1bits.TMR2IF=0; //CloseTimer2(); //--------------------------------------------------------------- //khai bao ngat port noi tiep //TRUYEN TXSTAbits.SYNC=0;//CHE DO KHONG DONG BO BAUDCONbits.BRG16=0; TXSTAbits.BRGH=1; SPBRGH=0X00; SPBRG=0X4D; //DAT TOC DO BAUD 9600 RCSTAbits.SPEN=1; //CHO PHEP PORT NOI TIEP PIE1bits.TXIE=0; //CHO PHEP NGAT PHAT TXSTAbits.TX9=0; //TRUYEN 8 BIT TXSTAbits.SENDB=0; TXSTAbits.TXEN=1; //CHO PHEP TRUYEN IPR1bits.TXIP=0; // UU TIEN THAP PIE1bits.RCIE=1; //CHO PHEP NGAT NHAN 1 RCSTAbits.RX9=0; //TRUYEN 8 HAY 9 BIT RCSTAbits.CREN=1; // CHO PHEP NHAN IPR1bits.RCIP=0; EnableHighInterrupts(); //------------------------------------------------------------------ khoidong(); Delay10KTCYx(100); nhan: guilenh(0x01); guilenh(0x81); hienthi(mess1); guilenh(0xc1); hienthi(mess9); guilenh(0xCA); hienthi(mess2); guilenh(0xd9); hienthi(mess10); //chon che do while(start==1) { if(up==0) { while(up==0); if(option==0) { guilenh(0xca); hienthi(mess3); option=option+1; beep(); } } if(down==0) { while(down==0); if(option==1) { guilenh(0xca); hienthi(mess2); option=option-1; beep(); } } } beep(); if(option==0) //PID on chip { guilenh(0x01); guilenh(0x83); hienthi(mess21); guilenh(0xd4); hienthi(mess12);//Temp guilenh(0xde); //VPre hienthi(mess18); while(1) { if(j==2) //nhiet do { OpenADC(ADC_RIGHT_JUST,0,0); //nhiet do ADCON1=0x09; SetChanADC(ADC_CH4); ConvertADC(); while(BusyADC()); ketqua4=ReadADC(); CloseADC(); if(t<100) { guilenh(0xdb); guidata(' '); } if(t<10) { guilenh(0xda); guidata(' '); } guilenh(0xd9); t=ketqua4/2; t=t-273; itoa(t,string4); hienthi(string4); j=0; if(t>=50) { fan=1; } else if(t<47) { fan=0; } } j=j+1; guilenh(0xc0); //kp hienthi(mess4); OpenADC(ADC_RIGHT_JUST,0,0); ADCON1=0x09; SetChanADC(ADC_CH0); ConvertADC(); while(BusyADC()); ketqua=ReadADC(); CloseADC(); ketqua=ketqua/10000; kp=ketqua; ketqua=(ketqua+1)*10000; //dung hien thi lcd guilenh(0xc3); guidata('0'); guidata('.'); guilenh(0xc5); itoa(ketqua,string);//gui ket qua la so tu 0-1023 for(i=1;i<5;i++) { guidata(string[i]); } guilenh(0xca);//ki hienthi(mess5); OpenADC(ADC_RIGHT_JUST,0,0); ADCON1=0x09; SetChanADC(ADC_CH1); ConvertADC(); while(BusyADC()); ketqua1=ReadADC(); CloseADC(); ketqua1=ketqua1/100000; ki=ketqua1; ketqua1=(ketqua1+1)*100000; //dung hien thi lcd guilenh(0xcd); guidata('0'); guidata('.'); guilenh(0xcf); ltoa(ketqua1,string1);//gui ket qua la so tu 0-1023 for(i=1;i<6;i++) { guidata(string1[i]); } guilenh(0x94);//kd hienthi(mess6); OpenADC(ADC_RIGHT_JUST,0,0); ADCON1=0x09; SetChanADC(ADC_CH2); ConvertADC(); while(BusyADC()); ketqua2=ReadADC(); CloseADC(); ketqua2=ketqua2/10000; kd=ketqua2; ketqua2=(ketqua2+1)*10000; //dung hien thi lcd guilenh(0x97); guidata('0'); guidata('.'); guilenh(0x99); itoa(ketqua2,string2); for(i=1;i<5;i++) { guidata(string2[i]); } guilenh(0x9e); //vantoc hienthi(mess25); OpenADC(ADC_RIGHT_JUST,0,0); ADCON1=0x09; SetChanADC(ADC_CH3); ConvertADC(); while(BusyADC()); ketqua3=ReadADC(); CloseADC(); ketqua3=ketqua3*2; vtdat=ketqua3; if(ketqua3<1000) { guilenh(0xa6); guidata(' '); } if(ketqua3<100) { guilenh(0xa5); guidata(' '); } if(ketqua3<10) { guilenh(0xa4); guidata(' '); } guilenh(0xa3); itoa(ketqua3,string3); hienthi(string3); firt=500000/tanso; //tu tan so tinh gia tri nap timer 1 napt1=65535-firt; if(0<tanso && tanso<40) { T3CONbits.TMR3ON=1; //run timer3 } else { T3CONbits.TMR3ON=0; //stop timer3 } vantocdo=result*10; //hien thi van toc if(vantocdo<1000) { guilenh(0xe6); guidata(' '); } if(vantocdo<100) { guilenh(0xe5); guidata(' '); } if(vantocdo<10) { guilenh(0xe4); guidata(' '); } guilenh(0xe3); //hien thi van toc len lcd itoa(vantocdo,string6); hienthi(string6); if(start==0) { while(start==0); beep(); on=1; //bao trang thai dong co T0CONbits.TMR0ON=1; T1CONbits.TMR1ON=1; T2CONbits.TMR2ON=1; // T3CONbits.TMR3ON=0; } if(up==0) { while(up==0); if(on==1) { T0CONbits.TMR0ON=0; T1CONbits.TMR1ON=0; T2CONbits.TMR2ON=0; T3CONbits.TMR3ON=0; PORTD=0x00; result=0; tanso=0; beep(); on=0; ledinfo=0; } } if(down==0) { while(down==0); if(on==0) { beep(); goto nhan; } } if(rev==0) { while(rev==0); if(on==0) //dong co da dung { beep(); way=!way; guilenh(0xa7); if(way==1) { guidata('<'); } else { guidata('>'); } } } } }//option 0 if(option==1) //pid_pc { guilenh(0x01); guilenh(0x84); hienthi(mess20); guilenh(0xc0); //Dir hienthi(mess7); guilenh(0xca); hienthi(mess18); guilenh(0xcf); guidata('0'); //van toc do guilenh(0x94); hienthi(mess12);//Temp guilenh(0xd4); hienthi(mess11); guilenh(0xdb); //Not Connect hienthi(mess16); guilenh(0x9e); hienthi(mess17); //pre guilenh(0xa6); hienthi(mess22); guilenh(0xa2); guidata('0'); //tan so on=0; while(1) { if(down==0) { if(on==0) { while(down==0); beep(); option=0; PORTD=0X00; goto nhan; } } if(j==2) { OpenADC(ADC_RIGHT_JUST,0,0); //nhiet do ADCON1=0x09; SetChanADC(ADC_CH4); ConvertADC(); while(BusyADC()); ketqua4=ReadADC(); CloseADC(); if(t<100) { guilenh(0x9b); guidata(' '); } if(t<10) { guilenh(0x9a); guidata(' '); } guilenh(0x99); t=ketqua4/2; t=t-273; itoa(t,string4); hienthi(string4); j=0; if(t>=50) { fan=1; } else if(t<45) { fan=0; } } j=j+1; if(command==0XFF) //RESET { ledinfo=!ledinfo; Delay10KTCYx(150); } else if(command==0XFE) //START { beep(); guilenh(0xdb); //running hienthi(mess14); T0CONbits.TMR0ON=1; T1CONbits.TMR1ON=1; T2CONbits.TMR2ON=1; on=1; //dong co dang chay } else if(command==0XFD) //STOP { T0CONbits.TMR0ON=0; T1CONbits.TMR1ON=0; T2CONbits.TMR2ON=0; T3CONbits.TMR3ON=0; PORTD=0X00; result=0; beep(); guilenh(0xdb); //stop hienthi(mess13); on=0; command=0xff; } else if(command==0XFC) //phai { way=1; guilenh(0xc4); //Right hienthi(mess24); } else if(command==0XFB) //trai { way=0; guilenh(0xc4); //Left hienthi(mess23); } else if(command==0XFA) //KIEM TRA KET NOI { guilenh(0xdb); //Not Connect hienthi(mess15); TXREG=0XFA; //GUI MA KET NOI command=0xff; beep(); } else { tanso=command; firt=500000/tanso; napt1=65535-firt; if(0<tanso && tanso<40) { T3CONbits.TMR3ON=1; //run timer3 } else { T3CONbits.TMR3ON=0; //stop timer3 } guilenh(0xa2); //hien thi tan so itoa(tanso,string5); hienthi(string5); if(tanso<10) { guilenh(0xa3); guidata(' '); } vantocdo=result*10; //hien thi van toc if(vantocdo<1000) { guilenh(0xd2); guidata(' '); } if(vantocdo<100) { guilenh(0xd1); guidata(' '); } if(vantocdo<10) { guilenh(0xd0); guidata(' '); } guilenh(0xcf); //hien thi van toc len lcd itoa(vantocdo,string6); hienthi(string6); } } } }//main //-----------------ROUTINE PROGRAM-------------------------------- void ghilcd(char x) //lcd 4 bit ,data noi vao 4 bit giua cua port { char tam; tam=x>>2;// gui 4 bit cao tam=tam&0x3c; databus=databus&0xc3; databus=databus|tam; en=1; delay(); en=0; tam=x<<2; //gui 4 bit thap tam=tam&0x3c; databus=databus&0xc3; databus=databus|tam; en=1; delay(); en=0; } void guilenh(char x) { rs=0; ghilcd(x); } void guidata(char x) { rs=1; ghilcd(x); } void khoidong(void) { Delay10KTCYx(20); // rs=0; // rw=0; guilenh(0x28); //nap 2 bit 4,5 cua lcd gia tri 10,noi data vao 4 bit giua en=1; //khai bao dung 4 bit delay(); en=0; guilenh(0x28); guilenh(0x0c); guilenh(0x06); guilenh(0x01); guilenh(0x02); } void hienthi(char x[]) { int i; for(i=0;x[i]!=0;i++) { guidata(x[i]); } } void delay(void) { int i; for(i=0;i<500;i++); } void beep (void) { PORTDbits.RD6=1; Delay10KTCYx(100); PORTDbits.RD6=0; Delay10KTCYx(100); } void EnableHighInterrupts (void) { RCONbits.IPEN = 1; INTCONbits.GIEH = 1; INTCONbits.GIEL = 1; } void PID() { e0=vtdat-vtecd; tanso = tanso + kp * (e0-e1) + ki * (e0 + e1 ) / 2 + kd * (e0 - (2 * e1) + e2); if (tanso>= 70) { tanso = 70; } else if (0 <tanso && tanso <= 9) { tanso = 9; } else if (tanso < 0) { tanso= 0; } e2=e1; e1=e0; } //-----------------INTERRUP PROGRAM---------------------------------- //-----------------vector ngat uu tien thap-------------------------- #pragma code LOW_INTERRUPT_VECTOR =0x18 void low_ISR(void) { _asm goto low_isr _endasm } #pragma code //-----------------VECTOR NGAT CO MUC UU TIEN CAO------------------- #pragma code HIGH_INTERRUPT_VECTOR=0x08 void high_ISR(void) { _asm goto high_isr _endasm } #pragma code //----------------------------------------------- #pragma interruptlow low_isr save = PROD void low_isr(void) //NGAT THAP { //ngat port noi tiep if(PIR1bits.RCIF==1) //xoa bang phan cung khi doc xong { ledinfo=!ledinfo; command=RCREG; //doc ma tu may tinh gui xuong }// rs232 interrup if( PIR2bits.TMR3IF==1) // TIMER3 INTERRUP { PIR2bits.TMR3IF=0; //xoa co ngat T3CONbits.TMR3ON=0; //tat timer3 if(run==0xff) { WriteTimer3(64035); run=0x00; } else { WriteTimer3(62535); run=0xff; } if(way==0)//chieu thuan { switch(state) { case 1: PORTD=t1&run; break; case 2: PORTD=t2&run; break; case 3: PORTD=t3&run; break; case 4: PORTD=t4&run; break; case 5: PORTD=t5&run; break; case 6: PORTD=t6&run; break; } } else if(way==1) { switch(state) { case 1: PORTD=t5&run; break; case 2: PORTD=t4&run; break; case 3: PORTD=t3&run; break; case 4: PORTD=t2&run; break; case 5: PORTD=t1&run; break; case 6: PORTD=t6&run; break; } } T3CONbits.TMR3ON=1; } //TIMER3 INTERRUP } //LOW INTERUP //------------------------------------------ #pragma interrupt high_isr void high_isr(void) { if(PIR1bits.TMR2IF==1) //timer2 interrup { PIR1bits.TMR2IF=0; //xoa co ngat timer2 T2CONbits.TMR2ON=0; //tat timer 2 WriteTimer2(0x00); // nap lai gia tri dau k=k+1; if(k==3) { T0CONbits.TMR0ON=0; //tat timer0 result=ReadTimer0(); //doc timer0 if(option==1) { TXREG=result; //TRUYEN LEN PORT NOI TIEP } else if(option==0) { TXREG=result; vtecd=result*10; PID(); } WriteTimer0(0); //nap lai bo dem T0CONbits.TMR0ON=1; //cho timer0 chay lai k=0; } T2CONbits.TMR2ON=1; //cho timer2chay lai } if( PIR1bits.TMR1IF==1) //TIMER1 INTERRUP { PIR1bits.TMR1IF=0; //xoa co ngat T1CONbits.TMR1ON=0; //tat timer1 WriteTimer1(napt1); if(state==6) { state=0; } state=state+1; if(way==0) { if(tanso>39) { switch(state) //lua chon 1 trong 6 trang thai { case 1: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t1; break; case 2: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t2; break; case 3: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t3; break; case 4: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t4; break; case 5: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t5; break; case 6: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t6; break; } } else { PORTD=0x00; } } else if(way==1) //way==1 { if(tanso>39) { switch(state) //lua chon 1 trong 6 trang thai { case 1: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t5; break; case 2: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t4; break; case 3: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t3; break; case 4: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t2; break; case 5: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t1; break; case 6: PORTD=0x00; Delay10TCYx(100); //dead time PORTD=t6; break; } } else { PORTD=0x00; } } T1CONbits.TMR1ON=1; //cho timer1 chay lai } //TIMER1 INTERRUP }/* HIGH INTERUP */ Code xây dựng giao diện điều khiển: Option Explicit Dim ketnoi As Integer Dim command As Variant Dim vantoc As Variant Dim TempTime As Date Dim kp, kd, ki As Single Dim e0, e1, e2esum, edel As Single Dim vtecd, vtdat As Integer Dim FRE As Integer Dim timer As Long Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ------------------------------------------------------------------------------------------------- Private Sub BAUD_Click() If (MSComm1.PortOpen = True) Then MSComm1.PortOpen = False End If MSComm1.Settings = BAUD.Text + "N,8,1" Command5.Enabled = True TBAO.Caption = " KIEM TRA LAI KET NOI." TBAO.ForeColor = vbRed Command1.Enabled = False End Sub ------------------------------------------------------------------------------------------------- Private Sub COM_Click() On Error GoTo TBAO If (MSComm1.PortOpen = True) Then MSComm1.PortOpen = False End If MSComm1.CommPort = Switch(COM.Text = "COM1", 1, COM.Text = "COM2", 2, COM.Text = "COM3", 3, COM.Text = "COM4", 4) Command5.Enabled = True TBAO.Caption = " KIEM TRA LAI KET NOI." TBAO.ForeColor = vbRed Command1.Enabled = False Exit Sub TBAO: MsgBox "CONG COM DA MO!", vbDefaultButton1, "LOI!" End Sub ------------------------------------------------------------------------------------------------- Private Sub Command1_Click() 'start On Error GoTo sendfalse timer = 0 e0 = 0 e1 = 0 e2 = 0 FRE = 0 MSComm1.OutBufferCount = 0 'xoa bo dem truyen MSComm1.Output = Chr$(254) Call Sleep(500) 'delay 500ms If (Option1.Value = True) Then MSComm1.Output = Chr$(252) ElseIf (Option2.Value = True) Then MSComm1.Output = Chr$(251) End If Call Sleep(500) 'delay 500ms ' MSComm1.Output = Chr$(249) Timer1.Enabled = True Command2.Enabled = True Command1.Enabled = False Exit Sub sendfalse: MsgBox "Cong COM chua duoc mo, nhan CONNECT" End Sub ------------------------------------------------------------------------------------------------- Private Sub Command2_Click() 'stop MSComm1.OutBufferCount = 0 'xoa bo dem truyen MSComm1.Output = Chr$(253) Call Sleep(600) With TChart1 .Series(0).Clear .Series(1).Clear End With Text2.Text = "" vtecd = 0 timer = 0 e0 = 0 e1 = 0 e2 = 0 FRE = 0 List1.Clear ' xoa list Timer1.Enabled = False Command1.Enabled = True Command2.Enabled = False Call Sleep(100) End Sub ---------------------------------------------------------------------------------------------- Private Sub Command3_Click() 'EXIT If MSComm1.PortOpen = True Then 'kiem tra neu cong dang mo thi dong MSComm1.PortOpen = False End If End End Sub ------------------------------------------------------------------------------------------------- Private Sub Command4_Click() 'ABOUT Form2.Show Form1.Enabled = False End Sub ------------------------------------------------------------------------------------------------- Private Sub Command5_Click() 'KET NOI On Error GoTo OpenFalse 'neu co loi thi nhay If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If MSComm1.Output = Chr$(250) 'gui ma kiem tra ket noi If (ketnoi = 0) Then TBAO.Caption = " KIEM TRA LAI KET NOI." TBAO.ForeColor = vbRed Command1.Enabled = False End If Exit Sub OpenFalse: MsgBox " KHONG THE MO CONG.KIEM TRA LAI KET NOI!", vbDefaultButton1, "LOI!" TBAO.Caption = " KIEM TRA LAI KET NOI." ' truong hop cong com da mo,hay chon sai cong End Sub ------------------------------------------------------------------------------------------------- Private Sub Form_Load() With MSComm1 .Settings = " 9600,N,8,1" 'mac dinh .RThreshold = 1 'SO BYTE TOI THIEU CUA BO THU DE BAO SU KIEN>ONCOMM .SThreshold = 0 'so byte co trong bo dem truyen de bao su kien .InBufferSize = 1024 .OutBufferSize = 1024 .InputMode = comInputModeText .ParityReplace = "" .CommPort = 1 End With ketnoi = 0 HScroll1.Value = Text1.Text / 10 End Sub Private Sub HScroll1_Change() Text1.Text = HScroll1.Value * 10 End Sub ------------------------------------------------------------------------------------------------- Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent ' Case comEvSend Case comEvReceive command = Asc(MSComm1.Input) If (command = 250) Then ketnoi = 1 TBAO.Caption = " KET NOI THANH CONG!" TBAO.ForeColor = vbBlue Command1.Enabled = True Command5.Enabled = False Else vtecd = command * 10 PID Val(kp1.Text), Val(ki1.Text), Val(kd1.Text) MSComm1.Output = Chr$(FRE) Text2.Text = (vtecd) & " v/p" List1.AddItem vtecd & " v/p" 'dua ra list List1.ListIndex = List1.ListIndex + 1 With TChart1.Series(0) .AddXY timer * 10, vtecd, "", vbRed End With With TChart1.Series(1) .AddXY timer * 10, vtdat, "", vbBlue End With Text3.Text = FRE & " Hz" End If End Select End Sub ------------------------------------------------------------------------------------------------- Sub PID(kp As Single, ki As Single, kd As Single) Dim T As Single T = 0.06 vtdat = Val(Text1.Text) e0 = vtdat - vtecd FRE = FRE + kp *(e0-e1) + ki * (e0 + e1 )/ 2 + kd * (e0 - 2 * e1 + e2) If FRE >= 70 Then FRE = 70 ElseIf (0 < FRE And FRE <= 9) Then FRE = 9 ElseIf FRE < 0 Then FRE = 0 End If e2 = e1 e1 = e0 End Sub ------------------------------------------------------------------------------------- Private Sub Text1_Change() HScroll1.Value = Val(Text1.Text) / 10 End Sub Private Sub Timer1_Timer() timer = timer + 1 If (timer = 3000) Then timer = 0 With TChart1 .Series(0).Clear .Series(1).Clear End With End If Timer1.Enabled = False Timer1.Enabled = True End Sub TÀI LIỆU THAM KHẢO 1. Các trang wed và tài liệu trên mạng. 2. Điện tử công suất - Nguyễn Bính - Nhà xuất bản Khoa học và Kĩ thuật. 3. Đo lường và điều khiển bằng máy tính - Nguyễn Đức Thành - Nhà xuất bản Đại học quốc gia Tp.Hồ Chí Minh. 4. Lý thuyết điều khiển tự động - Nguyễn Thị Phương Hà - Nhà xuất bản Đại học quốc gia TP Hồ Chí Minh. 5. PIC18f2420/2520/4420/4520 Data Sheet-Microchip. MỤC LỤC

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

  • docNOIDUNG.doc
  • docBIA.doc
  • rarDieu khien PID dong co khong dong bo 3 pha voi PIC 18F4520.rar