Đồ án Điều khiển giám sát động cơ ac với avr và wincc

LỜI NÓI ĐẦU ---oOo--- So với tất cả động cơ điện sử dụng trong công nghiệp, động cơ không đồng bộ 1, 3 pha được sử dụng rộng rãi nhất, từ công suất nhỏ, trung đến công suất lớn và chúng đang dần thay thế các động cơ một chiều do có nhiều tính năng ưu việt như: kết cấu đơn giản, độ bền cao, dễ bảo trì, chi phí thấp, sử dụng trực tiếp lưới điện. Nhưng quan trọng hơn cả do kỹ thuật điều khiển động cơ phát triển làm cho việc điều khiển động cơ không đồng bộ trở nên dễ dàng nên khắc phục được những nhược điểm của động cơ như: đặc tính đóng, mở máy, điều khiển moment Trong các loại động cơ không đồng bộ, thì động cơ không đồng bộ có roto lồng sóc là được sử dụng nhiều hơn cả. Chúng được sử dụng trong các máy nghiền, máy khuấy, ba lăng vận tải, máy bơm, quạt thông gió, quạt giải nhiệt Trong thời gian gần đây do sự phát triển của nền công nghiệp chế tạo các khóa bán dẩn có công suất lớn, kỹ thuật điện tử, tin học nên các tính năng của động cơ không đồng bộ được khai thác triệt để. Nó đuợc điều khiển bởi các bộ biến tần bán dẫn và ngày càng được hoàn thiện hơn nên có thể so sánh với hệ truyền động một chiều nhất là ở vùng công suất lớn. Trong công nghiệp thường sử dụng 4 bộ truyền động để điều khiển tốc độ động cơ không đồng bộ đó là: - Điều chỉnh điện áp cấp cho động cơ dùng bộ biến đổi thyristor. - Điều chỉnh điện trở roto. - Điều chỉnh công suất trượt. - Điều chỉnh tần số nguồn cung cấp cho động cơ bằng bộ biến đổi tần số. Trong đồ án chuyên ngành này chúng em sẽ thiết kết 2 bộ điều khiển tốc độ động cơ không đồng bộ bằng 2 phương pháp: thay đổi điện áp cho động cơ không đồng bộ 1 pha bằng cách thay đổi góc kính cho triac và thay đổi tốc độ động cơ không đồng bộ 3 pha dùng bộ biến đổi tần số. MỤC LỤC Phần I: LÝ THUYẾT CƠ SỞ Trang 1 CÁC BỘ BIẾN ĐỔI XUNG ÁP 1 Các sơ đồ van 1Hoạt động với tải thuần trở . 2Hoạt động với tải trở cảm 3BIẾN TẦN & CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN 5 Giới thiệu chung 5Phân loại các bộ biến tần . 6 Biến tần trực tiếp 6Biến tần gián tiếp 6 Biến tần sử dụng nghịch lưu áp 6Biến tần nghịch lưu dòng . 6Bộ nghịch lưu áp 3 pha . 7Biến tần nguồn áp điều khiển theo phương pháp V/f 8 Phương pháp E/f . 8Phương pháp V/f 9Các phương pháp thông dụng trong đk động cơ KĐB qua biên tần 11 Phương pháp điều rộng xung SINPWM . 11Phương pháp vectơ không gian 12CHUẨN RS-485 . 15 Mạch chuyển đổi RS-232 sang RS-485 16Mạch Chuyển đổi RS-485 sang TTL và ngược lại 17MODBUS 18 Cơ chế giao tiếp . 18Mạng Modbus chuẩn . 19Modbus trên các mạng khác 19Chế độ truyền 19 Chế độ ASCII . 20Chế độ RTU . 20Khung ASCII . 20Khung RTU . 20Bảo toàn dữ liệu 21 Kiểm soát LRC . 21Kiểm soát CRC . 21LẬP TRÌNH GIAO DIỆN HMI TRONG WINCC . 21 Giới thiệu về HMI 21Tổng quan về WinCC 22 Các bước cơ bản để xây dựng một Project 23Lập trình C cho WinCC 23 Lập trình theo thuộc tính Properties 24Lập trình theo sự kiện Events 24Các hàm hỗ trợ trong WinCC 25 Phần II: KHẢO SÁT LINH KIỆN CHÍNH 26 VI ĐIỀU KHIỂN AVR- MEGA 16 26 Những thông số cơ bản của mega 16 26Sơ đồ chân mega16 27Cấu trúc bên trong của mega 16 27 VI ĐIỀU KHIỂN AVR -MEGA 8 . 28 Những thông số cơ bản của mega 8 . 28Sơ đồ chân mega8 . 28Cấu trúc bên trong của mega 8 29 VI ĐIỀU KHIỂN AVR-TINY 13 . 29 Những thông số cơ bản của Tiny 13: . 29Sơ đồ chân Tiny13 30Cấu trúc bên trong Tiny13 30 CẢM BIẾN NHIỆT LM335 31OPTO 4N35 32MOSFET . 32 Phần III: THI CÔNG ĐỀ TÀI . 34 YÊU CẦU ĐỀ TÀI . 34ĐIỀU KHIỂN ĐỘNG CƠ AC 1 PHA . 35 Phân tích tổng quát sơ đồ khối hệ thống . 35 Sơ lược hoạt động của toàn bộ hệ thống: 35Sơ đồ khối hệ thống . 36Sơ đồ nguyên lý và chức năng các khối . 36 Khối nguồn . 36Khối cảm biến nhiệt 37Khối đồng bộ 37Khối công suất 38Khối vi xử lý . 38Khối đếm 39Khối nút nhấn . 40Khối hiển thị . 40Khối giao tiếp máy tính 41Sơ đồ nguyên lý 43Lưu đồ giải thuật mega 16(master) 44 Lưu đồ chương trình chính . 44Lưu đồ xử lý ngắt timer1 45Lưu đồ xử lý ngắt timer2 46Lưu đồ giải thuật mega 8(slaver) . 47 Chương trình chính 47Lưu đồ xử lý tín hiệu điều khiển 47ĐIỀU KHIỂN ĐỘNG CƠ AC 3 PHA . 48 Sơ đồ khối hệ thống 48Giải thích chức năng từng khối 48 Source . 48Starter . 49Switching power . 493 Phase driver . 50Inductive sensor 503 Phase MC 50Main MC 51LCD 20 * 4 . 51Key pad variable resistor 52RS 485 52Tem sensor . 52Cooling MC 53Fan driver . 53DC motor & 3phase motor . 53Sơ đồ mạch của hệ thống . 54 Sơ đồ nguyên lý mạch xử lý . 54Sơ đồ nguyên lý mạch công suất 55Lưu đồ giải thuật hệ thống . 56 Lưu đồ giải thuật VĐK trung tâm . 56 Chương trình chính . 56Chương trình ngắt . 57Lưu đồ giải thuật VĐK 3 pha . 57 Chương trình chính 57Chương trình ngắt 58Lưu đồ giải thuật VĐK làm mát . 58THIẾT KẾ GIAO DIỆN HMI ĐK & GIÁM SÁT 59 Màn hình đăng nhập . 59Màn hình điều khiển . 60 Giao diện giám sát, điều khiển động cơ AC 1 pha 60Giao diện giám sát, điều khiển động cơ AC 3 pha 62 Phần IV: KẾT LUẬN . 65 Phần phụ lục . 66 Tài liệu tham khảo

doc101 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2875 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Đồ án Điều khiển giám sát động cơ ac với avr và wincc, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nếu = 2 (dừng bởi lỗi ngoài) thì chương trình truyền lệnh stop xuống VXL slaver và thông báo “External Trouble”. Nếu = 0 (slaver không có lỗi) chương trình sẽ đọc trạng thái của VXL master để đưa ra các thông báo phù hợp như: “No Alarm”, “Stop by Master”, “Master I2C”, “Slaver I2C”, “I2C Busy”, “Overheat”. Tiếp theo sẽ thực hiện chương trình con xuất dữ liệu hiển thị lên LCD 20*4. Dữ liệu hiện thị bao gồm: trạng thái hoạt động Start/Stop, chế độ hoạt động Auto/Man_1/Man_2, tốc độ cài đặt, thông số chỉnh biến trở, nhiệt độ hoạt động và trạng thái hoạt động của mạch. Cuối cùng thực hiện chương trình con chờ 100ms rồi quay trở về đoạn chương trình kiểm tra thông số đặt chế độ hoạt động. Lưu đồ xử lý ngắt Timer 1 (2,5s): Khi mới khởi động, chương trình ngắt này được cho phép và chu kỳ xử lý ngắt 2,5s này sẽ được thực hiện liên tục. Khi có ngắt xảy ra thì đặt lại giá trị định thời cho Timer. Tiếp theo đọc biến đếm tốc độ sau đó reset biến đếm này. Kế đến thực hiện chương trình con đọc kênh ADC 0 lấy giá trị nhiệt độ rồi kiểm tra. Nếu lớn hơn hoặc bằng nhiệt độ đặt thì truyền lệnh stop xuống VXL slaver và thông báo “Overheat”. Nếu nhỏ hơn nhiệt độ đặt thì không làm gì cả. Lưu đồ xử lý ngắt Timer 2 (33ms): Khi mới khởi động, chương trình ngắt này được cho phép và chu kỳ xử lý ngắt 33ms này sẽ được thực hiện liên tục. Khi có ngắt xảy ra, kiểm tra giá trị đếm Timer. Nếu không bằng 300ms thì không làm gì cả và thoát khỏi ngắt. Nếu bằng 300ms, kiểm tra thông số đặt chế độ hoạt động. Nếu = 0 (ở chế độ Auto), kiểm tra tiếp xung lấy mẫu. Nếu ≠ 0 (ở chế độ Man_1 hoặc Man_2), thực hiện chương trình con truyền giá trị đọc ở biến trở cho VXL slaver để thực hiện việc điều chỉnh xung kích α. Trường hợp kiểm tra tiếp xung mẫu, nếu lớn hơn tốc độ đặt thì giảm dữ liệu 1 đơn vị, ngược lại nhỏ hơn tốc độ đặt thì tăng dữ liệu 1 đơn vị. Sau đó quay về thực hiện chương trình con truyền dữ liệu cho slaver. Lưu đồ giải thuật mega 8 (slaver): Chương trình chính: Bắt đầu chương trình sẽ kiểm tra các trạng thái hoạt động như ngõ vào enable, ngõ vào báo lỗi ngoài. Nếu có lỗi ngoài thì chương trình sẽ cấm ngắt ngoài, và báo lỗi qua đèn vàng. Nếu không có lỗi thì kiểm tra lệnh điều khiển và tín hiệu enable đã tích cực chưa. Nếu đúng thì cho phép ngắt ngoài hoạt động và báo đèn xanh (Run). Ngược lại không cho phép ngắt ngoài và tắt đèn xanh (Stop). Sau đó chu trình trở về ban đầu. Lưu đồ xử lý tín hiệu điều khiển: Khi nhận được tín hiệu đồng bộ sẽ làm phát sinh sự kiện ngắt ngoài. Lúc đó chương trình sẽ được xử lý: nạp dữ liệu nhận được từ VXL master vào giá trị định thời Timer 0 và cho chạy Timer. Tiếp theo khi có sự kiện ngắt Timer 0 thì dừng Timer và thực hiện công việc phát xung kích độ rộng 10us. Vậy kết hợp tín hiệu đồng bộ và giá trị nhận được từ master thì slaver có thể thay đổi được độ rộng xung kích α một cách chính xác và linh hoạt. ĐIỀU KHIỂN ĐỘNG CƠ AC 3 PHA: Sơ đồ khối hệ thống: Dựa trên yêu cầu thiết kế của mạch ta có thể phân tích sơ đồ ra làm các khối chính như sau: Giải thích chức năng từng khối: Source: Chỉnh lưu và nắn tạo ra nguồn DC từ lưới điện cấp cho mạch nghịch lưu 3 pha điều khiển motor cũng như cấp nguồn cho toàn mạch hoạt động. Do phần nghịch lưu có 4 nguồn kích là độc lập nên ta phải dùng 4 nguồn cách ly để tránh hiện tượng ngắn mạch cho phần công suất. Starter: Mạch khởi động có chức năng nạp điện cho tụ trong khoảng thời gian quá độ tránh làm hỏng mối nối NP của cầu diode khi cấp nguồn. sau đó VĐK sẽ đóng relay cấp nguồn trực tiếp cho mạch nghịch lưu để đảm bảo công suất cho tải. Switching power: Đây là bộ nghịch lưu áp bao gồm 6 mosfet IRFP460 nhận tín hiệu điều khiển từ bộ đệm 3 pha để nghịch lưu từ nguồn một chiều chỉnh lưu để tạo ra nguồn 3 pha có tần số thay đổi cấp cho motor hoạt động. 3 Phase driver: Mạch gồm 6 opto cách ly phần điều khiển và phần công suất. nhận tín hiệu từ VĐK cấp cho mạch nghịch lưu hoạt động. Inductive sensor: Đây là cảm biến tiện cận loại điện cảm. Đo tốc độ động cơ thông qua các đinh ốc bắt trên trục động cơ. Khi động cơ quay các đinh ốc quét qua mặt sensor làm ngõ ra xuất hiện xung điện áp. Tín hiệu này được cấp cho counter của VĐK để xử lý và hiển thị tốc độ lên màn hình. 3 Phase MC: Đây là VĐK ATMEGA 8 có nhiệm vụ nhận dữ liệu về tần số và chiều quay, sau đó xuất ra 6 tín hiệu điều khiển cấp cho mạch cách li để đưa vào mạch nghịch lưu hoạt động, để tạo ra nguồn 3 pha cấp cho motor hoạt động. Main Mc: Đây là VĐK trung tâm sử dụng ATMEGA 16 có nhiện vụ nhận và xử lý phím nhấn, xuất thông tin hiển thị cho LCD 20 * 4, truyền thông với máy tính qua mạng MODBUS, xuất data tần số và chiều cho 3 PHASE MC, kiểm soát quạt giải nhiệt. LCD 20 * 4: Màn hình tinh thể lỏng gồm 20 cột và 4 dòng. Hiển thị các thông tin trạng thái động cơ, chiều quay, tốc độ, tần số….từ VĐK trung tâm. Key pad variable resistor: Gồm 5 phím nhấn & biến trở đển chọn mode, chỉnh tốc độ, chiều quay, đóng mở động cơ. Khi 1 phím được nhấn tạo ra 1 ngắt trên VĐK và thông qua mức điện áp trên từng chân VĐK biết phím nhấn và xử lý lệnh của phím đó. RS 485: Đây là IC truyền thông MAX 485 nhận tín hiệu điều khiển từ VĐK trung tâm để xác lập trạng thái thu phát cho mạch. Được kết nối với mạng Bus 485 thông qua 2 chân A, B. Tem sensor: Đây là IC cảm biến nhiệt, nó được gắn vào miếng nhôm giải nhiệt của 6 mosfet công suất. Nó có chức năng cảm biến nhiệt độ toả ra trên mosfet công suất rồi xuất ra tín hiệu điện áp cấp cho VĐK để điều khiển tốc độ quạt giải nhiệt theo phương pháp PWM, giúp hệ thống hoạt động tối ưu hơn. Cooling MC: Đây là VĐK TINY 13 nhận trực tiếp tín hiệu áp từ cảm biến nhiệt độ sau đó điều khiển quạt giải nhiệt DC bằng phương pháp điều rộng xung PWM để tối ưu hoá việc giải nhiệt cho hệ thống. Fan driver: Đây là transistor công xuất nhận tín hiệu từ VĐK Tiny 13 lái cho quạt DC hoạt động. DC motor & 3phase motor: Sơ đồ mạch của hệ thống: Sơ đồ nguyên lý mạch xử lý: Sơ đồ nguyên lý mạch công suất: Lưu đồ giải thuật hệ thống: Lưu đồ giải thuật VĐK trung tâm: Chương trình chính: - Khi khởi động chương trình sẽ thiết lập các thông số như port, LCD, timer, ADC, truyền thông, watchdog. Sau đó chương trình sẽ tích cực mạch starter thông qua relay và quạt giải nhiệt thông qua VĐK điều khiển quạt. - Thông qua phím mode trên panel ta có thể chọn mode cho chương trình để xác lập một trạng thái hoạt động gồm 3 mode như: manual, comunucation, infomation (mặc định là mode manual). Sau đây là hoạt động của từng mode riêng biệt. Manual: khi ở mode này chương trình sẽ lấy mẫu ADC của biến trở để xác định tần số cài đặt từ (0-250). Ngoài ra ta cũng có thể chỉnh tần số qua hai phím UP, DOWN đảo chiều động cơ qua phím DIRECT và phím RUN/STOP để cho phép động cơ chạy. khi đó màn hình sẽ hiện thông số tần số cài đặt và tốc độ đo được từ sensor. Communication: khi ở mode này chương trình cho phép bộ thu phát không đồng bộ hoạt động và cấm các phím trên panel trừ phím MODE để trở về trạng thái manual. Chương trình sẽ đáng ứng những yêu cầu của phần mềm SCADA thông qua cổng truyền thông 485 và giao thức MODBUS. Lúc này INVERTER sẽ hoạt động dưới sự điều khiển và giám sát của phầm mềm SCADA. Information: mode này có nhiện vụ thể hiện các thông tin cơ bản của một INVERTER. Chương trình ngắt: - Khi một ngắt được phát hiện chương trình chính sẽ tạm ngừng và thực thi chương trình ngắt tuỳ thuộc vào loại ngắt nào được phát hiện. Chẳng hạn khi ta nhấn 1 phím trên panel sẽ tạo ra một ngắt ngoài, thông qua mức logic trên mỗi chân VĐK mà chương trình xác định được phím nào đã được nhấn mà thực thi chương trình tương ứng.Tương tự như thế khi ngắt truyền thông xảy ra do bộ đệm nhận nhận được 1 byte chương trình sẽ thực thi để kiểm tra tính hợp lệ của khung truyền theo chuẩn MODBUS rồi thực thi theo yêu cầu của phần mềm SCADA thông qua từng gói lệnh. Đồng thời khi chương trình chạy ngắt từ timer1 cũng phát ra liên tục để lấy kết quả tốc độ động cơ sau mỗi 600ms. Ngoài ra chương trình còn sử dụng watchdog để phần cứng tự reset khi chương trình bị treo với chu kỳ 2s. Lưu đồ giải thuật VĐK 3 pha: Chương trình chính: - Khi khởi động chương trình sẽ cấu hình port, timer, watchdog, ADC rồi đọc thông số tần số từ VĐK trung tâm thông qua port. Chương trình sẽ phân tần số nhận được ra làm 3 mức: Mức 0 khi tần số nhận được bằng 0 lúc này ngõ ra port cấp cho mạch cách li sẽ bị khoá xem như động cơ không hoạt động. Mức 0< tần số <40 chương trình sẽ cài cho timer1 thời gian tương ứng với tần số nhận được và timer2 là tần số băm có nhiệm vụ băm điện áp ngõ ra để tăng cảm kháng cho motor tránh làm hỏng motor. Mức >=40 chương chình chỉ cài thông số cho timer1 hoạt động theo tần số đã cài đặt. Chương trình ngắt: - Khi một ngắt được phát hiện chương trình chính sẽ tạm ngừng và thực thi chương trình ngắt tuỳ thuộc vào loại ngắt nào được phát hiện. trong chương trình sử dụng 2 ngắt timer để định thời xuất tín hiệu ngõ ra điều khiển phần công suất và watchdog để reset cứng khi chương trình treo. Ngắt timer1: khi nhận được tần số, chương trình sẽ cài cho timer1 tần số thích hợp, để đị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 timer2: khi tần số nhận được nhỏ hơn 40 timer2 được cho phép hoạt động và cài thời gian cố định để băng điện áp ngõ ra tăng cảm kháng bảo vệ motor. Lưu đồ giải thuật VĐK làm mát: - Khi khởi động chương trình sẽ cấu hình port, ADC và đợi tín hiệu cho phép hoạt động từ VĐK trung tâm. Khi đã được hoạt động chương trình sẽ lấy mẫu ADC liên tục và nhận giá trị nhiệt độ mỗi chu kỳ quét thông qua cảm biến nhiệt LM355. Tương ứng với mỗi giá trị nhiệt độ nhận được chương trình sẽ điều rộng xung tương ứng để thay đổi tốc độ quạt DC làm mát cho các mosfet công suất. THIẾT KẾ GIAO DIỆN HMI ĐIỀU KHIỂN & GIÁM SÁT HỆ THỐNG: Màn hình đăng nhập: : Ô đăng nhập passworld : Nút OK Đối tượng được lấy trong thư viện có sẵn trong WinCC theo đường dẫn Global Library/Displays/Text Fields/Text. Màn hình đăng nhập có nhiệm vụ để bảo mật hệ thống. Chỉ khi nhập đúng password đã được cài đặt trước mới cho phép người dùng vào trang màn hình điều khiển chính. Màn hình điều khiển: Giao diện giám sát, điều khiển động cơ AC 1 pha: Đối tượng được lấy trong thư viện có sẵn trong WinCC theo đường dẫn Global Library/ Operation/ Controller/DR21. Giao diện có chức năng điều khiển và hiển thị ở cả 2 chế độ Auto và Man. Ngoài ra còn có chức năng thông báo lỗi mất kết nối và lỗi phát sinh trong quá trình hoạt động của mạch. Chức năng của các thành phần trong màn hình: : Hiển thị trạng thái kết nối với thiết bị Thông báo cho người sử dụng biết trạng thái kết nối của thiết bị với hệ thống. Đèn ở trạng thái chớp báo hiệu kết nối tốt, ngược lại nếu mất kết nối đèn sẽ ở trạng thái tắt. :Thông báo tình trạng kết nối Cũng có mục đích báo cho người sử dụng biết tình trạng kết nối của thiết bị dưới dạng văn bản. Khi kết nối sẽ hiển thị “Connected”, ngược lại sẽ báo “Disconnected”. Làm cho hệ thống trở nên sinh động và trực quan hơn. : Thang báo nhiệt độ Hiển thị thông tin nhiệt độ hoạt động của mạch dưới dạng mức. : Hiển thị nhiệt độ dưới dạng số Hiển thị thông tin nhiệt độ dưới dạng số. : Điều khiển Start/Stop và hiển thị trạng thái đang hoạt động Chức năng chính là điều khiển trạng thái run/stop của hệ thống. Đồng thời cũng hiển thị trạng thái đang hoạt động hiện tại của mạch giúp cho việc giám sát thuận lợi hơn. Trạng thái màu vàng chỉ ra hệ thống đang ở chế độ stop, còn trạng thái màu cam chỉ ra hệ thống đang ở chế độ run. : Điều khiển Auto/Man và hiển thị trạng thái đang hoạt động Chức năng chính là thiết lập chế độ hoạt động của hệ thống. Có 2 trạng thái thiết lập là Auto (trạng thái màu cam) và Man (trạng thái màu vàng). Ở trạng thái Auto người sử dụng có thể nhập thông số tốc độ vào ô bên dưới để thiết lập trạng thái chạy ổn định ở tốc độ đó. Còn ở chế độ Man người sử dụng chỉ có quyền giám sát hệ thống đang hoạt động ở mức bao nhiêu phần trăm tải (thông số này chỉ được phép thay đổi bằng biến trở trên mạch). : Hiển thị thông số cài đặt ở chế độ Auto/Man. Ngoài ra có thể thay đổi thông số cài đặt xuống thiết bị khi ở chế độ Auto. Có chức năng hiển thị thông số tốc độ được cài đặt (ở chế độ Auto) và hiển thị mức độ hoạt động theo phần trăm (ở chế đột Man). Có thể thay đổi thông số tốc độ cài đặt khi nhập vào ô hiển thị. Thông số cài đặt sẽ được truyền xuống VXL và được lưu vào bộ nhớ EEPROM phòng ngừa việc mất dữ liệu cài đặt khi mất nguồn. : Hiển thị tốc độ thiết bị ở trạng thái hiện tại Hiển thị thông số tốc độ hiện tại của motor. Được tính theo đơn vị rpm (revolutions per minute). : Thông báo lỗi ở thiết bị. Trong suốt quá trình hoạt động của hệ thống, những trạng thái cũng như lỗi phát sinh đều được đưa về hiển thị. Chức năng này rất hữu ích cho người giám sát, giúp biết được tình trạng hoạt động hiện tại cũng như thông báo những sự cố khi hệ thống bị hỏng. Bảng thông báo bao gồm: -No alarm: hệ thống hoạt động bình thường. -Stop by Master: hệ thống được dừng bởi nhấn phím stop. -Stop by Slaver: hệ thống được dừng bởi tín hiệu điều khiển enable bên ngoài. -Master I2C: lỗi phát sinh ở VXL master xảy ra trong quá trình giao tiếp với VXL slaver như: sai địa chỉ slaver, không có tín hiệu trả lời từ slaver, master nhận sai dữ liệu. -Slaver I2C: lỗi phát sinh ở VXL slaver xảy ra trong quá trình giao tiếp với VXL master như: nhận sai dữ liệu, mất dữ liệu nhận, không có tín hiệu trả lời từ master. -External Trouble: sự cố xảy ra ở thiết bị, đường mạch vít rơlay nhiệt bị hở do thiết bị quá nóng. -I2C busy: báo trạng thái bận trên đường truyền I2C (đường truyền chưa sẵn sàng). Nguyên nhân có thể hư VXL master hoặc slaver. -Overheat: báo quá nhiệt ở phần công suất. Sensor cảm biến nhiệt sẽ kiểm soát hoạt động này, tránh cho mạch hoạt động quá tải. -EEProm writed: đang lưu dữ liệu cài đặt vào EEProm, tránh việc mất thông số cài đặt khi mất nguồn. Giúp cho hệ thống hoạt động tối ưu hơn. -EEProm readed: đọc dữ liệu cài đặt từ EEProm, thực hiện mỗi khi khởi động hệ thống. Giao diện giám sát, điều khiển động cơ AC 3 pha: Giao diện có chức năng điều khiển, hiển thị tốc độ và thay đổi chiều quay động cơ. Bên cạnh đó cũng thông báo trạng thái kết nối với thiết bị. Đồng hồ hiển thị tốc độ động cơ. CB đóng cắt điều khiển động cơ chạy hay dừng. Công tắt đảo chiều quay động cơ Icon hiển thị trạng thái hoạt động của động cơ. Slider cài đặt tốc độ cho động cơ. Icon hiển thị trạng thái kết nối PC với thiết bị. Biểu đồ hiển thị tốc tộ động cơ theo thời gian thực. Thông số tốc độ của 2 mạch điều khiển được biểu diễn đồng thời trên đồ thị ứng với thời gian thực. Chức năng đồ thị có thể biểu diễn đồng thời nhiều thông số cùng một thời điểm. Ngoài ra còn có chức năng in ấn, phóng to thu nhỏ rất thuận tiện cho việc giám sát và báo cáo Phần IV:KẾT LUẬN Qua thời gian thực hiện đề tài dưới sự hướng dẫn của thầy TRẦN VĂN TRINH cùng sự giúp đỡ của quý thầy cô trong Khoa điện tử nên nhóm đã hoàn thành đồ án theo đúng yêu cầu và thời gian qui định. Trong đồ án nhóm đã thực hiện được những công việc sau: Phần lý thuyết: - Nghiên cứu các phương pháp điều khiển động cơ 1,3 pha. - Khảo sát vi xử lý và các IC sử dụng trong mạch. - Khảo sát chuẩn truyền thông 485 và giao thức MODBUS. - Khảo sát phần mềm WINCC . Thi công phần cứng: - Mạch điện điều khiển và giám sát động cơ AC 1 pha. - Mạch điện điều khiển và giám sát động cơ AC 3 pha. - Mạch điện chuyển đổi RS232-RS485. Phần mềm - Viết chương trình cho các vi điều khiển họ AVR dùng ngôn ngữ cấp cao C và BASIC. - Thiết kế giao diện giám sát điều khiển qua phần mềm WINCC. Kết quả thực tế đạt được so với nội dung đề tài yêu cầu: Mạch hoạt động như ý đồ thiết kế. Truyền thông giữa hệ thống và thiết bị chính xác, tin cậy. Tần số ngõ ra rộng (0-250 hz). Động cơ chạy ổn định. Mặt hạn chế: Đồ thị hiển thị tốc độ còn chưa tinh do phần mềm WINCC không cho lấy mẫu với tần suất cao. Mạch điều khiển động cơ AC 1 pha phải chỉnh lại thông số giới hạn cho góc kích α theo góc pha φ mỗi khi thay tải khác. Nhằm tránh hiện tượng hoạt động như mạch chỉnh lưu như trình bày ở lý thuyết. Đặc điểm của mạch hoạt động còn phụ thuộc nhiều vào tải. Biến tần mới điều khiển được tốc độ chưa điều khiển được điện ápnên moment thay đổi theo tần số.. PHẦN PHỤ LỤC Một số hình ảnh đề tài: Chương trình trên Mega 16 (1-pha). /***************************************************** This program was produced by the CodeWizardAVR V1.25.9 Professional Automatic Program Generator © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. Project : Version : Date : 12/30/2008 Author : F4CG Company : F4CG Comments: Chip type : ATmega16 Program type : Application Clock frequency : 8.000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include #include #include #include #include #include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x18 ;PORTB #endasm #define LIGHT PORTB.3 #define CONTROL_485 PORTD.4 #define F_XTAL 8000000L #define INIT_TIMER0 TCNT0=0x100L-F_XTAL/1024L/500L #define ADC_VREF_TYPE 0x00 #define KEYIN PINC #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) #define SL_ADD 3 // USART Receiver buffer #define RX_BUFFER_SIZE 8 unsigned char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // USART Transmitter buffer #define TX_BUFFER_SIZE 15 unsigned char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE<256 unsigned char tx_wr_index,tx_rd_index,tx_counter; #else unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif #define TWINT 7 #define TWSTA 5 #define TWSTO 4 #define TWEN 2 #define TWEA 6 #define TWIE 0 #define START 0x08 #define REPEATED_START 0x10 #define SL_SLA_ACK 0x18 #define SL_R_SLA_ACK 0x40 #define SL_DATA_ACK 0x28 #define MT_DATA_ACK 0x80 #define MT_R_DATA_ACK 0x58 #define SL_1 0x04 unsigned char getchar(void); void putchar(char); void i2c_transmit(unsigned char,unsigned char,unsigned char); char mode[5][10]={"Run","Stop","Auto","Man_1","Man_2"}; char message[11][21]={"***** No Alarm *****","** Stop By Master **","** Stop By Slaver **","**** Master I2c ****" ,"**** Slaver I2c ****","* External Trouble *","***** I2c Busy *****","***** Overheat *****","** Load Not Ready **","** EEPROM Writed **","** EEPROM Readed **"}; unsigned char a=1,b=2,d,e,t2,repeat,speed_hi,speed_lo,set_speed_hi,set_speed_lo,keys,temp,temp_1,temp_2,lcd_buffer[4][21]; unsigned int c,f,clk,speed,set_speed=240,sample,var; unsigned int hold_time; unsigned char status,error,error_1,error_2; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // Place your code here ++clk; ++sample; } // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here GICR=0x40; INIT_TIMER0; TCCR0=0x05; } // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { unsigned char status,data; status = UCSRA; data = UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { if ((data == SL_ADD) && (rx_counter == 0)) { rx_buffer[rx_wr_index=0]=data; ++rx_wr_index; ++rx_counter; } else if (((rx_buffer[1] == 4) || (rx_buffer[1] == 5) || (rx_buffer[1] == 6)) && (rx_buffer[0] == SL_ADD)) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; CRC16(rx_buffer,6); if ((CRCHi == rx_buffer[6]) && (CRCLo == rx_buffer[7])) { //UART transmit switch (rx_buffer[1]) { case 4: putchar(rx_buffer[0]); putchar(rx_buffer[1]); putchar(10); set_speed_hi=set_speed >> 8; set_speed_lo=set_speed & 0x00ff; putchar(set_speed_hi); putchar(set_speed_lo); putchar(0); putchar(var); speed_hi=speed >> 8; speed_lo=speed & 0x00ff; putchar(speed_hi); putchar(speed_lo); putchar(0); putchar(temp); putchar(0); error_2=error; if (a==0) error_2 |=0x10; if (b==2) error_2 |=0x20; putchar(error_2); CRC16(tx_buffer,13); putchar(CRCHi); putchar(CRCLo); break; case 5: switch (rx_buffer[3]) { case 0: a=rx_buffer[4]+1; if (a==0) error_1=0; break; case 1: b=rx_buffer[4]+3; break; }; break; case 6: switch (rx_buffer[3]) { case 2: set_speed_hi = rx_buffer[4]; set_speed_lo = rx_buffer[5]; set_speed = ((unsigned int)set_speed_hi << 8 | set_speed_lo); EEPROM_write(0x10,set_speed_hi); EEPROM_write(0x11,set_speed_lo); lcd_gotoxy(0,3); lcd_puts(message[9]); delay_ms(2000); break; }; break; }; } else goto reset; }; } else if (((data == 4) || (data == 5) || (data == 6)) && (rx_counter == 1)) { rx_buffer[1]=data; ++rx_wr_index; ++rx_counter; } else if (data != SL_ADD) goto reset; } else { reset: rx_counter=0; rx_buffer[0]=0; rx_buffer[1]=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ unsigned char getchar(void) { unsigned char data; data=rx_buffer[rx_rd_index]; if(++rx_rd_index==RX_BUFFER_SIZE) rx_rd_index=0; return data; } #pragma used- #endif // USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (--tx_counter) UDR=tx_buffer[++tx_rd_index]; else { CONTROL_485=0; UCSRB=0xD0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { tx_buffer[tx_wr_index]=c; if (++tx_wr_index==TX_BUFFER_SIZE) tx_wr_index=0; if (++tx_counter==TX_BUFFER_SIZE) { UCSRB=0xC8; CONTROL_485=1; UDR=tx_buffer[tx_rd_index=0]; }; } #pragma used- #endif // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { hold_time=0; ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0) { if (++hold_time==250) goto end; }; end: ADCSRA|=0x10; return ADCW; } // Timer 0 overflow interrupt service routine // TIMER 0 interrupt at every 2 ms interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here static unsigned char key_pressed_counter=4; static unsigned char key_released_counter; static unsigned char row_data,crt_key; row_data=0; row_data|=~KEYIN&0xf8; if (row_data==0) { key_pressed_counter=4; TCCR0=0x00; GICR=0xC0; }; if (key_released_counter) --key_released_counter; else { if (--key_pressed_counter==2) crt_key=row_data; else { if (row_data!=crt_key) { key_pressed_counter=3; key_released_counter=0; goto end_key; }; if (!key_pressed_counter) { switch (keys=row_data) { case 0x80: switch (++a) { case 1: error_1=1;break; case 2: a=0;error_1=0;e=210;break; } i2c_transmit(SL_1,a,c=210); break; case 0x40: if(++b==5) b=2; break; case 0x20: switch (b) { case 0x02: if(++set_speed==2433U) set_speed=240; break; } break; case 0x10: switch (b) { case 0x02: if(--set_speed==239U) set_speed=2432U; break; } break; case 0x08: set_speed_hi=set_speed >> 8; set_speed_lo=set_speed & 0x00ff; EEPROM_write(0x10,set_speed_hi); EEPROM_write(0x11,set_speed_lo); lcd_gotoxy(0,3); lcd_puts(message[9]); delay_ms(2000); break; }; keys=0; key_released_counter=3; key_pressed_counter=4; }; }; }; end_key: row_data=0; } // Timer 1 overflow interrupt service routine // TIMER 1 interrupt at every 2.5 s interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer 1 value 2.5s TCNT1H=0xB3; TCNT1L=0xB4; // Place your code here speed=clk*8; clk=0; temp_2=(read_adc(0)*4.8828125)/10-273.15; if (temp_1==temp_2) repeat++; else temp_1=temp_2; if (repeat==1) { repeat=0; temp=temp_2; if (temp>=60) { a=1; error_1=7; }; } else repeat=0; } // Timer 2 overflow interrupt service routine // TIMER 2 interrupt at every 300 ms interrupt [TIM2_OVF] void timer2_ovf_isr(void) { // Place your code here if (++t2==9) { if(b==2) { if (sample*200<set_speed*3)++e; else if (sample*200>set_speed*3)--e; if (e==231) e=230; if (e==206) e=207; c=e; }; sample=0; i2c_transmit(SL_1,a,c); t2=0; }; } //TWI transmit-receive void i2c_transmit(unsigned char SLA_W,unsigned char DATA_1,unsigned char DATA_2) { hold_time=0; TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while (!(TWCR & (1<<TWINT))) { if (++hold_time==350) goto end_transmit; }; if (((status=TWSR) & 0xF8) !=START) error_1=6; TWDR=SLA_W; TWCR=(1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))) { if (++hold_time==350) goto end_transmit; }; if (((status=TWSR) & 0xF8) != SL_SLA_ACK) error_1=4; TWDR=DATA_1; TWCR=(1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))) { if (++hold_time==350) goto end_transmit; }; if (((status=TWSR) & 0xF8) !=SL_DATA_ACK) error_1=4; TWDR=DATA_2; TWCR=(1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))) { if (++hold_time==350) goto end_transmit; }; if (((status=TWSR) & 0xF8) !=SL_DATA_ACK) error_1=4; TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while (!(TWCR & (1<<TWINT))) { if (++hold_time==350) goto end_transmit; }; if (((status=TWSR) & 0xF8) !=REPEATED_START) error_1=6; TWDR=(SLA_W | 0x01); TWCR=(1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))) { if (++hold_time==350) goto end_transmit; }; if (((status=TWSR) & 0xF8) != SL_R_SLA_ACK) error_1=4; TWCR=(1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))) { if (++hold_time==350) goto end_transmit; }; if (((status=TWSR) & 0xF8) != MT_R_DATA_ACK) error_1=4; d=TWDR; end_transmit: TWCR=(1<<TWINT) | (1<<TWEN) | (1<<TWEA) | (1<<TWSTO); } void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T PORTB=0x00; DDRB=0x08; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=P State6=P State5=P State4=P State3=P State2=P State1=T State0=T PORTC=0xFC; DDRC=0x00; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In // State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0xF0; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 7.813 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x05; TCNT1H=0xB3; TCNT1L=0xB4; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 7.813 kHz // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x07; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // INT1: On // INT1 Mode: Falling Edge // INT2: Off GICR|=0xC0; MCUCR=0x0A; MCUCSR=0x00; GIFR=0xC0; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x45; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 19200 UCSRA=0x00; UCSRB=0xD0; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 62.500 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x87; // 2 Wire Bus initialization // Generate Acknowledge Pulse: On // 2 Wire Bus Slave Address: 01h // General Call Recognition: Off // Bit Rate: 250.000 kHz TWSR=0x00; TWBR=0x08; TWAR=0x02; TWCR=0x45; // LCD module initialization LIGHT=1; if (lcd_init(20)!=0) { // The LCD is present lcd_putsf(" LCD connected "); } else { // The LCD is not present lcd_putsf(" LCD disconnected "); }; delay_ms(2500); set_speed_hi = EEPROM_read(0x10); set_speed_lo = EEPROM_read(0x11); set_speed = ((unsigned int)set_speed_hi << 8 | set_speed_lo); if (set_speed >= 2432U) set_speed = 2432U; lcd_clear(); lcd_gotoxy(0,0); lcd_puts(message[10]); delay_ms(2500); // Global enable interrupts #asm("sei") while (1) { switch (b) { case 3: f=read_adc(2); c=207+f/44.47; var=(f/10.23)*100/100; if (var==0) var=1; break; case 4: f=read_adc(1); c=207+f/44.47; var=(f/10.23)*100/100; if (var==0) var=1; break; }; switch (d) { case 0: error=error_1; break; case 1: error=2; break; case 2: a=1; error=5; break; }; sprintf(lcd_buffer[3],"%s",message[error]); sprintf(lcd_buffer[0],"Status:%-5s%4u/rpm",mode[a],speed); sprintf(lcd_buffer[2],"Temp:%2u\xdfC",temp); if (b==2) sprintf(lcd_buffer[1],"Mode:%-7s%4u/rpm",mode[b],set_speed); else sprintf(lcd_buffer[1],"Mode:%-11s%3u%%",mode[b],var); //LCD Display lcd_gotoxy(0,0); lcd_puts(lcd_buffer[0]); lcd_gotoxy(0,1); lcd_puts(lcd_buffer[1]); lcd_gotoxy(0,2); lcd_puts(lcd_buffer[2]); if (error==0) { lcd_gotoxy(0,3); lcd_puts(lcd_buffer[3]); } else { lcd_gotoxy(0,3); lcd_puts(lcd_buffer[3]); delay_ms(500); lcd_gotoxy(0,3); lcd_putsf(" "); delay_ms(500); }; // delay_ms(100); }; } Chương trình trên Mega 8 (1-pha). /***************************************************** This program was produced by the CodeWizardAVR V1.25.9 Professional Automatic Program Generator © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. Project : Version : Date : 12/23/2008 Author : F4CG Company : F4CG Comments: Chip type : ATmega8L Program type : Application Clock frequency : 8.000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include #include #define ALARM PORTD.6 #define RUN PORTD.7 #define TRIAC PORTD.0 #define INPUT PIND #define TWINT 7 #define TWSTA 5 #define TWSTO 4 #define TWEN 2 #define TWEA 6 #define TWIE 0 #define SL_DATA_ACK 0x80 #define SL_R_DATA_ACK 0xA8 #define MT_1 0x02 #define RECEIVE_BUFFER_SIZE 2 unsigned char d,x=210,y=211,status,receive_wr_index,receive_counter; long int receive_buffer[RECEIVE_BUFFER_SIZE],mode=1; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // Place your code here TCNT0=y; TCCR0=0x05; } // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here TCNT0=x; TCCR0=0x05; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here TCCR0=0x00; TRIAC=1; delay_us(10); TRIAC=0; }; // 2 Wire bus interrupt service routine interrupt [TWI] void twi_isr(void) { // Place your code here if ((status=TWSR)==SL_DATA_ACK) { receive_buffer[receive_wr_index]=TWDR; if (++receive_wr_index == RECEIVE_BUFFER_SIZE) receive_wr_index=0; if (++receive_counter == RECEIVE_BUFFER_SIZE) { receive_counter=0; mode=receive_buffer[0]; x=receive_buffer[1]; y=x+1; }; }; if ((status=TWSR)==SL_R_DATA_ACK) TWDR=d; TWCR=(1<<TWINT) | (1<<TWEN) | (1<<TWEA) | (1<<TWIE); } // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=Out Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out // State7=0 State6=0 State5=P State4=P State3=T State2=T State1=T State0=0 PORTD=0x00; DDRD=0xC1; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 7.813 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT0 Mode: Rising Edge // INT1: Off // INT1 Mode: Falling Edge GICR|=0x00; MCUCR=0x0B; GIFR=0xC0; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // 2 Wire Bus initialization // Generate Acknowledge Pulse: On // 2 Wire Bus Slave Address: 02h // General Call Recognition: Off // Bit Rate: 250.000 kHz TWSR=0x00; TWBR=0x08; TWAR=0x04; TWCR=0x45; // Global enable interrupts #asm("sei") while (1) { // Place your code here if (INPUT.4) d=1; else if (INPUT.5) d=2; else d=0; while (INPUT.5) { GICR=0x00; RUN=0; ALARM=1; delay_ms(100); ALARM=0; delay_ms(100); }; if ((INPUT.4 || mode)==0) { GICR=0xC0; RUN=1; } else { GICR=0x00; RUN=0; }; }; } Chương trình trên Mega16 (3-pha). $regfile = "m16def.dat" $lib "modbus.lbx" $baud = 19200 '------------------------------------------------------------------------------- Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Portb.6 , Db6 = Portb.5 , Db7 = Portb.4 , E = Portb.2 , Rs = Portb.3 Config Adc = Single , Prescaler = 128 Config Lcd = 20 * 4 Config Timer0 = Counter , Edge = Falling , Capture Edge = Falling , Noise Cancel = 8 , , Prescale = 8 Config Int0 = Low Level Config Timer2 = Timer , Prescale = 1024 Config Timer1 = Timer , Prescale = 256 '********************************************************* Dim Mbuf(12) As Byte , Modc As Byte Dim Modt As Byte , Modw As Word , Count As Byte , Control As Byte , Tem As Byte , Online As Byte Dim Adc_val As Word , Adc_val_new As Word , Sensor As Byte , Xuat_w As Word Dim Bell_delay As Byte , Int0_delay As Byte , Le As Single , Percent As Byte , State As Byte Dim Run_bit As Bit , Direct_bit As Bit , Spee As Word , Hold As Bit , Adc_change As Integer , Xuat As Byte '------------------------------------------------- On Int0 Keypress On Timer1 Isr_timer1 On Timer2 Isr_timer2 On Urxc Urxc_isr '********************************************************* Declare Sub 1beep Declare Sub State1 Declare Sub State2 Declare Sub State3 Deflcdchar 1 , 32 , 32 , 14 , 14 , 14 , 32 , 32 , 32 '********************************************************* Ddra = &B10000010 Porta = &B01111101 '--------------------------- Ddrb.0 = 0 Ddrb.1 = 1 '--------------------------- Ddrd = &B10011000 Portd = &B01100111 '--------------------------- Ddrc = 255 Portc = 0 '--------------------------- '********************************************************* Light Alias Portb.1 Bell Alias Portd.3 Speed Alias Pinb.0 Rts Alias Portd.4 Fan Alias Portd.7 Func Alias Pina.6 Up Alias Pina.5 Down Alias Pina.4 Ok Alias Pina.3 Run Alias Pina.2 Direct Alias Porta.7 Boot Alias Porta.1 Mega8 Alias Portc '********************************************************* '********************************************************* Const _on = 1 Const _off = 0 Const Nhan = 0 Const Fat = 1 '****************************** Const Slave = 1 '****************************** Enable Interrupts '********************* INITIAL **************************** Cls Cursor Off Light = _on Rts = Nhan Wait 1 Set Bell Waitms 100 Reset Bell Locate 1 , 8 : Lcd "BOOT..." Wait 1 Set Bell Waitms 100 Reset Bell Fan = _on Locate 2 , 1 : Lcd "Cooler............ok" Wait 1 Boot = _on Wait 1 Set Bell Waitms 100 Reset Bell Locate 3 , 1 : Lcd "Power.............ok" Wait 1 . Locate 4 , 1 : Lcd "........READY......." Waitms 500 Locate 4 , 1 : Lcd " " Waitms 500 Locate 4 , 1 : Lcd "........READY......." Wait 1 Cls Waitms 500 Set Bell Waitms 100 Reset Bell Call State1 Fan = _on Boot = _on Control = 2 '************************************** Timer1 = 36735 Start Adc Enable Int0 Enable Timer1 '******************************************************************************8 Do Select Case State Case 0 Adc_val = Getadc(0) Adc_val = 1023 - Adc_val Adc_change = Adc_val - Adc_val_new Adc_change = Abs(adc_change) If Adc_change > 3 Then Adc_val_new = Adc_val Le = Adc_val_new / 4.018 Xuat = Le Xuat_w = Xuat If Hold = 0 Then If State = 0 Then Timer1 = 36735 Timer0 = 0 Disable Int0 Locate 3 , 7 Lcd " " Locate 3 , 6 Lcd Xuat Enable Int0 End If End If End If If Run_bit = 1 Then Mega8 = Xuat Else Mega8 = 0 End If Waitms 80 Case 1 Tem = Control Mod 2 If Tem = 0 Then Run_bit = 0 Else Run_bit = 1 End If Tem = Control \ 4 If Tem = 1 Then Direct_bit = 1 Else Direct_bit = 0 End If If Run_bit = 1 Then Mega8 = Xuat Else Mega8 = 0 End If Direct = Direct_bit Incr Online If Online > 20 Then Control = Control And 254 Waitms 80 End Select Loop '******************************************************************************8 End '******************************************************************************8 Isr_timer2: If Bell_delay 0 Then Decr Bell_delay Bell = _on Else Bell = _off End If '************************ If Int0_delay 0 Then Decr Int0_delay Else Enable Int0 Disable Timer2 End If Return '******************************************************************************8 Sub 1beep Timer2 = 0 Disable Int0 Enable Timer2 Bell_delay = 4 Int0_delay = 15 End Sub '*************************************** Keypress: Hold = 1 Timer1 = 36735 Timer0 = 0 'loai ngat Call 1beep If Func = 0 Then Incr State If State = 3 Then State = 0 Cls Select Case State Case 0 Call State1 Case 1 Call State2 Case 2 Call State3 End Select End If If Up = 0 And Xuat < 250 Then If State = 0 Then Incr Xuat Xuat_w = Xuat Locate 3 , 7 Lcd " " Locate 3 , 6 Lcd Xuat End If End If If Down = 0 And Xuat > 1then If State = 0 Then Decr Xuat Xuat_w = Xuat Locate 3 , 7 Lcd " " Locate 3 , 6 Lcd Xuat End If End If If Ok = 0 Then If State = 0 Then If Direct_bit = 0 Then Direct_bit = 1 Direct = 1 Locate 4 , 17 : Lcd "REV" Else Locate 4 , 17 : Lcd "FWD" Direct_bit = 0 Direct = 0 End If End If End If If Run = 0 And State = 0 Then If Run_bit = 1 Then Run_bit = 0 Locate 4 , 7 : Lcd "STOP" Else Run_bit = 1 Locate 4 , 7 : Lcd "RUN " End If End If Hold = 0 Return '*************************************** Urxc_isr: sbis usr,7 rjmp urxc_isr Modt = Udr If Modc = 0 Then If Modt = Slave Then Modc = Modc + 1 Mbuf(1) = Modt End If Elseif Modc = 1 Then If Modt = 4 Or Modt = 6 Then Mbuf(2) = Modt Modc = Modc + 1 Elseif Modt = 3 Then Mbuf(2) = Modt Modc = Modc + 1 Elseif Modt = Slave Then Mbuf(1) = Modt Else Modc = 0 End If Else Modc = Modc + 1 Mbuf(modc) = Modt If Modc = 8 Then Modw = Makeint(mbuf(7) , Mbuf(8)) If Modw = Crcmb(mbuf(1) , 6) Then Online = 0 Rts = Fat If Mbuf(2) = 4 Then Mbuf(3) = 4 Mbuf(4) = Control Mbuf(5) = Xuat Mbuf(6) = High(spee) Mbuf(7) = Low(spee) Modw = Crcmb(mbuf(1) , 7) Mbuf(8) = Low(modw) Mbuf(9) = High(modw) Printbin Mbuf(1) ; 9 End If If Mbuf(2) = 6 Then Control = Mbuf(5) Xuat = Mbuf(6) Printbin Mbuf(1) ; 8 End If If Mbuf(2) = 3 Then Mbuf(3) = 2 Mbuf(4) = Control Mbuf(5) = Xuat Modw = Crcmb(mbuf(1) , 5) Mbuf(6) = Low(modw) Mbuf(7) = High(modw) Printbin Mbuf(1) ; 7 End If Waitms 2 Rts = Nhan End If Modc = 0 End If End If Return '********************************************* Isr_timer0: Return '******************* STATE1 ****************** Sub State1: Locate 1 , 7 : Lcd "-MANUAL-" Locate 2 , 1 : Lcd "Mode: STABLE " Locate 3 , 1 : Lcd "Fre: hz/Spd: " Locate 4 , 1 : Lcd "State: /Dir: " If Run_bit = 1 Then Locate 4 , 7 : Lcd "RUN " End If If Run_bit = 0 Then Locate 4 , 7 : Lcd "STOP" End If If Direct_bit = 0 Then Locate 4 , 17 : Lcd "FWD" Else Locate 4 , 17 : Lcd "REV" End If Locate 3 , 7 Lcd " " Locate 3 , 6 Lcd Xuat Disable Urxc End Sub '********************STATE2************************* Sub State2: Locate 1 , 4 : Lcd "-COMMUNICATION-" Locate 2 , 1 : Lcd Chr(1) ; "Protocol:modbus-rtu" Locate 3 , 1 : Lcd Chr(1) ; "Type: 485" Locate 4 , 1 : Lcd Chr(1) ; "Format: 19200,8,N,1" Run_bit = 0 Mega8 = 0 Enable Urxc End Sub '********************STATE3************************* Sub State3: Locate 1 , 5 : Lcd "-INFORMATION-" Locate 2 , 1 : Lcd Chr(1) ; "Frequency:0->250 hz" Locate 3 , 1 : Lcd Chr(1) ; "Power: 4KW " Locate 4 , 1 : Lcd Chr(1) ; "By:Nguyen Quang Hoa " Disable Urxc End Sub '********************************************* Isr_timer1: Timer1 = 36735 '36735 Sensor = Timer0 Spee = Sensor * 30 Timer0 = 0 If State = 0 Then Disable Int0 Locate 3 , 18 : Lcd " " Locate 3 , 17 : Lcd Spee Enable Int0 End If Return Chương trình trên Mega 8 (3-pha). Config Watchdog = 2048 Config Timer1 = Timer , Prescale = 64 Config Timer2 = Timer , Prescale = 64 On Timer1 Pulse On Timer2 Cut Enable Interrupts Enable Timer1 Ddrc = 255 Portc = 0 Ddrb = 0 Portb = 255 Portd = 255 Ddrd = 0 K1 Alias Portc.0 K2 Alias Portc.1 K3 Alias Portc.2 K4 Alias Portc.3 K5 Alias Portc.4 K6 Alias Portc.5 In Alias Pind Xuat Alias Portc Way Alias Pinb.0 Dim Run As Byte , T As Byte , Fre As Byte , Fre_load As Byte , Le As Single Dim Chan As Word , Nap As Word , Run2 As Byte Dim Bit_change As Bit , Bit_new As Bit '*************************************** Const T1 = 21 Const T2 = 49 Const T3 = 35 Const T4 = 42 Const T5 = 14 Const T6 = 28 Const Dead = 320 '*************************************** Timer1 = 60000 Wait 1 Run = 255 Start Watchdog '*************************************** Do If Way Bit_new Then Set Bit_change End If If Fre > 0 And Fre < 40 Then Enable Timer2 Else Disable Timer2 End If If Bit_change = 0 Then If In > Fre Then Incr Fre If In < Fre Then Decr Fre Else If Fre 0 Then Decr Fre Else Reset Bit_change Bit_new = Way End If End If If Fre < 3 Then Fre_load = 3 Elseif Fre > 250 Then Fre_load = 250 Else Fre_load = Fre End If Select Case Fre Case 0 Run = 0 Case 1 To 250 Run = 255 End Select '*************************************** Le = 1 / Fre_load Le = Le * 1000000 Chan = Le / 6 Chan = Chan / 8 Chan = 65538 - Chan Nap = Chan '*************************************** Waitms 20 '*************************************** Reset Watchdog Loop End ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 'xuat xung co ban dieu khien toc do Pulse: Timer1 = Nap If T = 6 Then T = 0 Incr T If Bit_new = 0 Then If Fre > 39 Then Select Case T Case 1 Xuat = 0 Waitus Dead Xuat = T1 And Run Case 2 Xuat = 0 Waitus Dead Xuat = T2 And Run Case 3 Xuat = 0 Waitus Dead Xuat = T3 And Run Case 4 Xuat = 0 Waitus Dead Xuat = T4 And Run Case 5 Xuat = 0 Waitus Dead Xuat = T5 And Run Case 6 Xuat = 0 Waitus Dead Xuat = T6 And Run End Select Else Xuat = 0 End If Else If Fre > 39 Then Select Case T Case 1 Xuat = 0 Waitus Dead Xuat = T5 And Run Case 2 Xuat = 0 Waitus Dead Xuat = T4 And Run Case 3 Xuat = 0 Waitus Dead Xuat = T3 And Run Case 4 Xuat = 0 Waitus Dead Xuat = T2 And Run Case 5 Xuat = 0 Waitus Dead Xuat = T1 And Run Case 6 Xuat = 0 Waitus Dead Xuat = T6 And Run End Select Else Xuat = 0 End If End If Return '*************************************** 'xuat xung bam trong xung co ban tang cam khang cho motor de han dong Cut: If Run2 = 255 Then Timer2 = 120 Run2 = 0 Else Timer2 = 230 Run2 = 255 End If If Bit_new = 0 Then Select Case T Case 1 Xuat = T1 And Run2 Waitus Dead Case 2 Xuat = T2 And Run2 Waitus Dead Case 3 Xuat = T3 And Run2 Waitus Dead Case 4 Xuat = T4 And Run2 Waitus Dead Case 5 Xuat = T5 And Run2 Waitus Dead Case 6 Xuat = T6 And Run2 Waitus Dead End Select Else Select Case T Case 1 Xuat = T5 And Run2 Waitus Dead Case 2 Xuat = T4 And Run2 Waitus Dead Case 3 Xuat = T3 And Run2 Waitus Dead Case 4 Xuat = T2 And Run2 Waitus Dead Case 5 Xuat = T1 And Run2 Waitus Dead Case 6 Xuat = T6 And Run2 Waitus Dead End Select End If Return '*************************************** Chương trình trên Tiny 13 (3-pha). Config Adc = Single , Prescaler = Auto Start Adc Ddrb.2 = 1 Ddrb.1 = 0 Portb.1 = 1 Fan Alias Pinb.1 Led Alias Portb.2 Dim W As Word Do W = Getadc(2) If Fan = 1 Then Select Case W Case 500 To 600 Set Led Waitms 2 Reset Led Waitms 8 Case 601 To 607 Set Led Waitms 3 Reset Led Waitms 7 Case 608 To 614 Set Led Waitms 4 Reset Led Waitms 6 Case 615 To 621 Set Led Waitms 5 Reset Led Waitms 5 Case 622 To 628 Set Led Waitms 6 Reset Led Waitms 4 Case 629 To 635 Set Led Waitms 7 Reset Led Waitms 3 Case 636 To 642 Set Led Waitms 8 Reset Led Waitms 2 Case 643 To 649 Set Led Waitms 9 Reset Led Waitms 1 Case Else Reset Led End Select Else Reset Led End If Loop End TÀI LIỆU THAM KHẢO Kỹ thuật VĐK AVR – Ngô Diên Tập, NXB Khoa Học và Kỹ Thuật. Điện tử công suất – Nguyễn Bính, NXB Khoa Học và Kỹ Thuật. Lý thuyết điều khiển tự động – Nguyễn Thị Phương Hà, NXB Đại Học Quốc Gia TP.HCM Mạng truyền thông công nghiệp – Hoàng Minh Sơn, NXB Khoa Học và Kỹ Thuật. Tự động hóa trong công nghiệp với WinCC – TS. Trần Thu Hà, NXB Hồng Đức. Modbus Protocol – MODICON, Industrial Automation Systems. Simatic WinCC – SIEMENS. Có nhiều bạn thắc mắc vì sao biến tần lại có thể tiết kiểm điện? sau đây là bài viết của tôi trên dientvietnam.net sẽ giải thích một cách đơn giảm để các bạn hiểu thêm. Ta có công thức P=U.I.Cos(phi) (Xin lỗi vì không biết cách gõ ký hiệu này). Ở đây ta không thấy có đại lượng tần số nến nói giảm tần số đồng nghĩa với giảm công suất tiêu thụ là không chính xác. Vậy điều này sẽ mâu thuẫn khi các nhà sản xuất biến tần cũng như lý thuyết nói "dùng biến tần sẽ tiết kiệm điện". Thực ra vấn đề này nói sẽ rất dài nhưng tối chỉ nói đơn giản thế này nhé. "Dùng biến tần tiêt kiệm điện hoàn toàn đúng" nhưng nó chỉ dúng khi chúng ta biết sử dụng các ưu điểm của biến tần. Chắc các bạn đều biết trong biến tần có các chế độ diều khiển V/F khi các bạn lập trình cho biến tần. Đây là một công thức (tạm gọi) điều khiển chuẩn của biến tần mà trong tất cả các biến tần cái nào cũng có. Motor sẽ làm việc khi moment cản bằng với moment động cơ, người ta lợi dụng đặc điểm này để ứng dụng điều khiển làm sao cho tỉ lệ V/F là không đổi tức là từ thông cảm ứng vấn là giá trị maximum trong khi tần số và điện áp giảm theo tỷ lệ V/F=constant. Muốn điều khiển được tỷ lệ này thì chỉ có dùng biến tấn mới làm được và đến đây bạn đã thấy mối liên hệ P và U, I rồi đúng không vì khi giảm tần số và điện áp sao chi tỷ lệ V/F là không đổi thì có nghĩa là moment cũng không đổi mà P=U*I*cos(phi) do U giảm nên P giảm theo. Ở đây tôi chỉ phân tích một phần của lý thuyết thôi còn nhiều và rất nhiều cái khác nữa nhưng tôi không phải là chuyên gia về lý thuyết nên không muốn múa rìu qua mắt các giao sư, tiến sỹ (rất mong được thông cảm vì đã ...). Trên diễn đàn vietnamautomation.com tôi cũng có viết một số bài về biến tần dưới tên dinhbang, anh co thể tham khảo thêm ở đây. Ngoài ra thì tên manato ở trong diễn đàn này cũng có một số bài viết khác về PLC, SCADA, Drive ... có thể tham khảo thêm.

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

  • docdo an chuyen nghanh.doc
  • rar183482_Điều khiển g_.rar
  • pptdo an chuyen nganh.ppt