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
101 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2875 | Lượt tải: 5
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.