CHƯƠNG 7 : GIẢI THUẬT CHƯƠNG TRÌNH
7.3 Lưu đồ giải thuật cho vi điều khiển trên các mơ-đun
7.3.2 Trình tự chi tiết trong các chương trình con và 5 chương trình phục vụ Ngắt
7.3.1.1 Trình tự chi tiết trong các chương trình con (dùng trong các lưu đồ giải thuật chương
trình MAIN )
· Chương trình con Khởi động các khối chức năng : Khởi động theo trình tự sau + Bộ PLL : Bus-Clock sẽ là 24 Mhz
+ Timer OC2 :dùng để lấy mẫu tốc độ động cơ – thời gian 20ms, cĩ sử dụng Ngắt ( Chỉ cĩ trên Node 1& 2 ; Khơng cĩ trên node 0 )
+ Bộ SCI0 : Tốc độ là 115200 Bit/s , cĩ sử dụng Ngắt khi nhận dữ liệu + Bộ điều xung PWM : Tần số xung điều khiển là 10 Khz
( Chỉ cĩ trên Node 1& 2 ; Khơng cĩ trên node 0 )
+ Bộ đếm xung A : Để đếm xung từ Encoder , đếm khi cạnh lên của xung ( Chỉ cĩ trên Node 1& 2 ; Khơng cĩ trên node 0 )
+ Bộ giao tiếp CAN0: tốc độ 1Mbit/s, sử dụng mã căn cước chuẩn ( Standard ID) + Chức năng Key-WakeUp ,dùng Ngắt để đọc giá trị phím được nhấn
+ Khởi động bộ giao tiếp IIC với hệ thống thời gian thực DS1307 và sử dụng Ngắt ngồi để đọc giá trị thời gian từ DS1307 ( Chỉ cĩ trên node 0 )
+ Khối hiển thị: LCD 2x16 ( đối với Node 0 là LCD 4x20 )
· Chương trình con Xử lý bức điện nhận từ CAN-Bus: ( dùng cho node 1 và 2 )
+ Dữ liệu được chứa trong biến chuỗi rxdata ( đã được lưu giá trị trong hàm Ngắt nhận bức điện CAN, bức điện nhận từ Node 0 gởi đến )
+ Cấu trúc dữ liệu trong biến chuỗi rxdata:
rxdata = khung truyền gốc (của PC trung tâm truyền xuống node 0) sau khi loại bỏ
Byte địa chỉ node cần điều khiển ( là byte 0)
+ Xĩa cờ báo hồn thành việc nhận dữ liệu từ CAN-Bus.
· Chương trình Xử lý dữ liệu nhận từ SCI0 ( dùng cho node 1 và 2 )
+ Dựa vào cấu trúc khung truyền của PC ở tại node truyền xuống node ( Chương 7 –
phần 7.2.1 ) để kiểm tra giá trị các byte điều khiển để thực hiện cơng việc tương ứng + Xĩa cờ báo hồn thành việc nhận dữ liệu từ cổng nối tiếp COM
· Chương trình con Xử lý phím được nhấn
- Giá trị nút được nhấn, đã được lưu lại trong biến key ( việc lưu là ở trong hàm ngắt ). Ở đây , ta chỉ cần kiểm tra giá trị biến key để thực hiện:
+ Nếu giá trị là 0xE0: Phím được nhấn là phím CHẠY à Cho động cơ chạy + Nếu giá trị là 0xD0: Phím được nhấn là phím DỪNG à Cho động cơ dừng + Nếu giá trị là 0xB0: Là phím TĂNG à Cho động cơ tăng tốc thêm 90 R.P.M + Nếu giá trị là 0x70 : Là phím GIẢM à Cho động cơ giảm tốc bớt 90 R.P.M - Xĩa cờ báo hồn thành việc phát hiện Phím nhấn ( cho giá trị cờ bằng 0 )
· Chương trình con Bộ điều khiển PI-Mờ
- Mờ hĩa các biến đầu vào ET và DET
- Giải mờ để tính các giá trị KP , KD, a - Suy ra giá trị KI theo cơng thức
D P I K K K a 2 =
- Điều rộng xung cho mạch động lực để điều khiển động cơ.
· Đoạn chương trình con Các việc thực thi khi động cơ dừng
- Điều rộng xung với Hiduty = 2% để dừng động cơ
- Khởi tạo lại (Reset) giá trị các tham số của bộ điều khiển PI-Mờ - Gởi lên PC khung truyền như sau: Gồm 6 byte
Bảng 7.10: Khung dữ liệu từ node 1 truyền lên PC tại đĩ – khi động cơ dừng
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 “1”hoặc “0” Ký tự “-” “S” “T” “O” “P” Byte 0 : + Cĩ giá trị là ký tự “1” khi động cơ hoạt động ở chế độ đồng bộ + Cĩ giá trị là ký tự “0” khi động cơ hoạt động ở chế độ độc lập
Hình 7.12: Hình minh họa dữ liệu truyền lên PC ở node 1 khi động cơ dừng
· Đoạn chương trình con Các việc thực thi khi động cơ chạy:
- Gởi lên PC một chuỗi byte với đầy đủ các thơng tin:
+ Giá trị xung đọc từ encoder trong 20ms ( Pulse: ) + Chế độ mà động cơ đang hoạt động
+ Giá trị vận tốc của động cơ 1 và động cơ 2
Hình 7.13: Hình minh họa dữ liệu truyền lên PC ở node 1 khi động cơ chạy
· Cấu trúc bức điện CAN mà mỗi node ( node 1 và node 2 ) gởi về cho node 0
- Cấu trúc bức điện này sẽ bao gồm các phần: Mã căn cước ID , độ ưu tiên , chiều dài của
khung dữ liệu trong bức điện và khung dữ liệu:
+ Bức điện của node 1 truyền về sẽ cĩ mã căn cước ID là 0x200 + Bức điện của node 2 truyền về sẽ cĩ mã căn cước ID là 0x300
Bảng 7.11: Khung truyền của bức điện CAN từ node 1 và node 2 truyền về node 0
Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7
Mã bắt đầu của dữ liệu Số hàng ngàn Số hàng trăm Số hàng chục Số hàng đơn vị Ký tự “ - ” Chế độ hoạt động Checksum (ký tự “E”) Trong đĩ:
Byte 0 : Là mã bắt đầu của dữ liệu
+ Là ký tự “A” : Khung truyền của Node 1 ; Là ký tự “B” : Khung truyền của Node 2 Byte [1:4] : là giá trị hàng ngàn , trăm, chục ,đơn vị của tốc độ thật động cơ ( mã hĩa ở
dưới dạng từng ký tự )
Byte 6 : Phản hồi cho trung tâm biết chế độ hoạt động hiện giờ của động cơ + Là ký tự “1” : Động cơ đang hoạt động ở chế độ đồng bộ
+ Là ký tự “0” : Động cơ đang hoạt động ở chế độ độc lập
Byte 7: Là byte checksum riêng của chuỗi khung truyền này – là ký tự “E” ( E: End )
Hình 7.14: Khung truyền của bức điện CAN từ node 1 và node 2 truyền về node 0
7.3.1.2 5 chương trình phục vụ Ngắt
· Chương trình ngắt Timer OC2 – dùng để lấy mẫu: ( chỉ dùng cho Node1 và Node 2) - Đối với node 1:
+ Đọc giá trị trong bộ đếm xung A ( tại thanh ghi PACN32) , lưu vào biến toc_do_do + Đọc giá trị tốc độ thật của động cơ 2 từ Port H
+ Tính các giá trị : Sai số tốc độ ET = toc_do_do – toc_do_dat ; và đạo hàm sai số (tốc độ tăng ): DET = ET_mới – ET_cũ
+ Gởi tốc độ thật của động cơ 1 ( giá trị toc_do_do) ra Port A ( nếu giá trị toc_do_do cĩ thay đổi )
+ Reset bộ đếm xung A (thanh ghi PACN32 = 0 ) ; khởi tạo lại giá trị cho Timer OC2 và xĩa cờ ngắt ( ở thanh ghi TFLG1 ) để cho phép timer ngắt ở lần 20ms kế tiếp.
+ Thốt khỏi chương trình phục ngắt. - Đối với node 2:
+ Đọc giá trị trong bộ đếm xung A ( tại thanh ghi PACN32) , lưu vào biến toc_do_do + Đọc các giá trị của động cơ 1 từ Port A , lưu vào giá trị toc_do_dat
+ Tính các giá trị : Sai số tốc độ ET = toc_do_do – toc_do_dat ; và đạo hàm sai số (tốc độ tăng ): DET = ET_mới – ET_cũ
+ Gởi tốc độ thật của động cơ 2 ( giá trị toc_do_do) ra Port H
+ Reset bộ đếm xung A (thanh ghi PACN32 = 0) ; khởi tạo lại giá trị cho Timer OC2 và xĩa cờ ngắt ( ở thanh ghi TFLG1 ) để cho phép timer ngắt ở lần 20ms kế tiếp
+ Thốt khỏi chương trình phục ngắt.
· Chương trình ngắt nhận dữ liệu từ cổng COM qua RS232
Ở đây , các vi điều khiển trên cả 3 mơ-đun (node) đều sử dụng bộ SCI0. Chỉ trình bày chương trình dành cho node 1&2 ( cịn chương trình dành cho node 0 đã được trình bày đầy đủ trên lưu đồ giải thuật của node 0 )
+ Đã khai báo trước 1 biến kiểu mảng ,gọi là SCI0_In[ index ] . Mỗi khi vào thực thi chương trình ngắt , giá trị từ bộ đệm sẽ được lưu vào mảng , giá trị chỉ số của mảng :
index sẽ được tăng thêm 1.
+ Dựa vào byte đầu tiên của dữ liệu nhận được ( khi đĩ đã lưu vào SCI0_In[0] ) , ta sẽ định biết khung truyền đang nhận này sẽ cĩ bao nhiêu byte . Từ đĩ xác định chính xác chiều dài của khung truyền , và lưu vào biến frame_len ( Để xác định được chiều dài hãy xem cấu trúc Khung truyền từ PC xuống node 1 tại Chương 7 - phần 7.2.1 )
+ Khi chỉ số index của mảng SCI0_In[ index ] bằng giá trị chiều dài frame_len , sẽ reset giá trị của biến index ( index = 0 ) và kiểm tra byte cuối cùng của chuỗi - Nếu byte đĩ đúng là byte CheckSum ( là ký tự “F” ) thì việc nhận dữ liệu thành cơng à Sẽ cho cờ
+ Xĩa cờ ngắt ( trong thanh ghi SCI0SR1 ) để chuẩn bị cho lần ngắt nhận kế tiếp và thốt khỏi chương trình phục ngắt.
· Chương trình ngắt nhận bức điện CAN :
+ Đọc giá trị chiều dài của bức điện trong thanh ghi CAN0RXDLR của bộ MSCAN0 + Lặp vịng để lưu tất cả dữ liệu trong bức điện vào biến mảng rxdata[index] ( với index là
chỉ số của mảng )
+ Kiểm tra byte CheckSum , nếu đúng là ký tự “F” thì cho cờ báo hồn thành việc nhận
dữ liệu từ CAN-Bus lên 1.
+ Xĩa cờ báo ngắt ( trong thanh ghi CAN0RFLG) để chuẩn bị cho lần ngắt nhận kế tiếp . + Thốt khỏi chương trình phục ngắt.
· Chương trình ngắt của Phím nhấn ( chức năng Key-WakeUp)
+ Cấm tất cả các chân thuộc 4 bit cao của Port P khơng được ngắt Key-WakeUp
+ Đọc giá trị 4 bit cao của Port P ( nơi kết nối với 4 phím nhấn) , rồi lưu vào biến key đã khai báo sẵn. Sau đĩ cho cờ báo hồn thành việc đọc giá trị phím nhấn lên 1.
+ Xĩa cờ ngắt và cho phép lại các chân thuộc 4 bit cao của Port P được thực hiện chức năng Key-WakeUp , sau cùng là thốt khỏi chương trình phục vụ ngắt
· Chương trình ngắt ngồi để cập nhật thời gian từ DS1307 : ( Ngắt này chỉ cĩ ở node 0 ) + Sử dụng giao tiếp IIC , đọc lần lượt các giá trị: giây , phút , giờ ở các địa chỉ RAM của
DS1307 tương ứng là: 0x00 , 0x01 , 0x02. Các giá trị ở dưới dạng BCD .
+ Chuyển các giá trị nhận được ở trên ( mã BCD) sang số dạng thập phân và lưu vào các biến: sec , minute , hour ( các biến này là biến tồn cục ,được khai báo từ trước )
+ Cho cờ báo hồn thành việc đọc giá trị thời gian lên 1. + Thốt khỏi chương trình phục vụ ngắt.