Dựa trên kết quả mô phỏng trên Matlab và trên giao diện chương trình ta có thể
đánh giá: 
- Đặc tính hệ thống sau thực hiện bộ điều khiển là tương đối tốt đáp ứng chỉ tiêu 
chất lượng : độ quá điều chỉnh nhỏ, thòi gian qua độ nhỏ khoàng 200-600ms 
- Trên giao diện chương trình vẫn thấy rõ sai lệch so mô phỏng Matlab: đặc tính 
chưa thật mịn, và vẫn tồn tại sai số so với tốc độ đặt khoảng sai số dao động từ
2% tới 10%.
                
              
                                            
                                
            
 
            
                 111 trang
111 trang | 
Chia sẻ: lylyngoc | Lượt xem: 7058 | Lượt tải: 2 
              
            Bạn đang xem trước 20 trang tài liệu Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
này. Bên cạnh đĩ kit điều khiển cũng phải cĩ khả 
năng giao tiếp với nhiều đối tượng và thiết bị cảm biến khác nhau, hiển thị các tham số 
chế độ hoạt động đồng thời cĩ khả năng cĩ thể giao tiếp máy tính thực hiện chức năng 
điều khiển giám sát …Trên cơ sỏ đĩ việc thiết kế kit điều khiển trong đồ án thieets kế 
đảm bảo chức năng: 
- Kit cĩ các đầu vào tương tự theo các chuẩn cơng nghiệp 0-20mA, 4 -20mA, 
0-10V và đầu vào đo điện trở, bên cạnh đĩ là các đầu vào số cho phép thu 
thập các giá trị logic số, đếm xung, nhận tín hiệu ngắt từ bên ngồi. 
- Kit cĩ các đầu ra tương tự theo các chuẩn cơng nghiệp 0-20mA, 4 -20mA, 0 -
10V, các đầu ra số, bao gồm đầu ra logic số, đầu ra xung cho phép băm xung 
hoặc phát tần số. 
- Kit giao tiếp với máy tính qua cổng nối tiếp RS 232, cho phép gửi và nhận dữ 
liệu với máy tính. 
- Kit cĩ các phần tử cho phép hiển thị là LCD hoặc LED . 
- Kit cĩ khối bàn phím cho phép nhập một số tham số và chế độ hoạt động. 
- Kit cĩ các chân vào ra cho phép kết nối một số modul chức năng khác… 
Như vậy mơ hình khối chức năng của kit mạch điều khiển cĩ dạng: 
Hình 2.1 Mơ hình khối mạch điều khiển 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 58
Cấu tạo của kít điều khiển : Ở đây các đầu vào-ra tương tự là các tín hiệu chuẩn 
điều khiển 0-20mA, 4 -20mA, 0-10V cịn các đầu vào ra số là các tín hiệu logic hoặc 
xung số. Khối vi điều khiển trung tâm là thành phần quan trọng nhất của kit nĩ giám 
sát thu thập xử lý dữ liệu từ cảm biến và cơ cấu chấp hành để điều khiển truyền thơng 
nối tiếp với máy tính qua chuẩn RS232. Bàn phím và LCD là hai modul tác dụng hỗ 
trợ quá trình điều khiển và giám sát hệ thống hoạt động. 
2.1.2. Các khối chức năng trên kit điều khiển 
a) Khối vi điều khiển trung tâm 
Hinh 2.2.Sơ đồ khối vi điều khiển trung tâm 
Khối vi điều khiển trung tâm cĩ nhiệm vụ điều khiển quản lý, giám sát, điều khiển 
hoạt động tồn bộ các modul sử dụng trong mạch cĩ nghĩa là mọi hoạt động trong hệ 
thống trên cơ sở diều khiển Pic18F4520. Ngồi ra: 
- Vi điều khiển Pic18F4520 sử dụng mạch dao động thạch anh ngồi tần số 
10MHz. 
- Sử dụng mạch nạp PicKit2 riêng để nạp chương trình cho PIC18F4520 
Hinh 2.3 Mạch nạp cho vi điều khiển trung tâm 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 59
b) Khối giao tiếp máy tính qua cổng nối tiếp 
Hinh 2.4 Khối giao tiếp máy tính Max232 
Cổng nối tiếp của máy tính là cổng COM( Comunication Port) để giao tiếp dữ 
liệu hai chiều giữa máy tính PC và ngoại vi với nhiều ưu điểm . Ngày nay, mỗi máy 
tính cá nhân đều cĩ một hoặc một vài cổng nối tiếp theo chuẩn RS-232 (cổng COM), 
cĩ thể sử dụng để kết nối với các thiết bị ngoại vi hoặc các máy tính khác. Nhiều thiết 
bị cơng nghiệp cũng tích hợp cổng RS-232 phục vụ cho cơng việc lập trình hoặc tham 
số hĩa. 
Cấu tạo cổng COM 
- TxD (Transmit Data): đường gửi dữ liệu 
- RxD (Receive Data): đường nhận dữ liệu 
- RTS (Request To Send): Yêu cầu gửi; bộ truyền đặt đường này lên mức 
hoạt động khi sẵn sàng truyền dữ liệu. 
- CTS (Clear To Send): Xố để gửi; bộ nhận đặt đường này lên mức hoạt 
động để thơng báo cho bộ truyền là nĩ sẵn sàng nhận dữ liệu. 
Hình 2.5 : Cấu tạo cổng COM 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 60
- DSR (Data Set Ready): Dữ liệu sẵn sàng; tính hoạt động giống với CTS 
nhưng được kích hoạt bởi bộ truyền khi nĩ sẵn sàng nhận dữ liệu. 
- SG (Signal Ground): Đất của tín hiệu. 
- DCD (Data Carrier Detect): Phát hiện tín hiệu mang dữ liệu. 
- DTR (Data Terminal Ready): Đầu cuối dữ liệu sẵn sàng; tính hoạt động 
giống với RTS nhưng được kích hoạt bởi bộ nhận khi muốn truyền dữ 
liệu. 
- RI (Ring Indicate): Báo chuơng, cho biết là bộ nhận đang nhận tín hiệu 
rung chuơng. 
 Cổng nối tiếp cĩ nhiều ưu điểm và đặc điểm nổi trội: 
- Tính chống nhiễu tương đối tốt, khoảng cách truyền xa hơn cổng song song. 
- Số lượng dây kết nối ít tối thiểu 3 dây: TxD, RxD , GND. 
- Ghép nối dễ dàng vi điều khiển hoặc PLC. 
- Cĩ khả năng kết nối mạng… 
Trong sơ đồ mạch giao tiếp máy tính này chúng ta sử dụng 3 dây truyền nhận dừ 
liệu TxD, RxD, GND khơng dùng chế độ bắt tay phần cứng, nếu khi cần bắt tay chúng 
ta cĩ thể sử dụng phần mềm. Ngày nay vi xử lý và máy tính tốc độ hoạt độngcao 
khơng nư trước lên thuận lợi khi chúng ta truyền nhận . 
Trên vi điều khiển chúng ta sử dụng modul USART giao tiếp bất đồng bộ máy tính 
cài đặt thơng số: tốc độ 9600 baud, 1bit start, 1 bit stop, 8 bit dữ liệu khơng sủ dụng bit 
Parity. 
c) Khối bàn phím 
Hinh 2.6 Modul bàn phím 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 61
Nguyên tắc sử dụng khố bàn phím là :Dùng ngắt để nhận biết cĩ phím nhấn. Ban 
đầu khởi tạo các COL1 : COL4 là 0000, và ngắt ngồi INT0 được kích hoạt khi cĩ 
sườn xuống (1 Ỉ 0). Khi nhấn một phím bất kỳ thì chân INT0 xuât hiện sườn xuống 
chương trình chuyển sang phục vụ ngắt. Trong thủ tục ngắt ta xác định phím nào được 
nhấn, để xác định được ta cần xác định ra hàng và cột của phím được nhấn. Đầu tiên ta 
kiểm tra các hàng ROW1 Ỉ ROW4 nếu hàng nào cĩ giá trị bằng “0” thì hàng đĩ cĩ 
phím nhấn. Tiếp theo ta xác định cột, đầu tiên ta cho COL1=1 và 
COL2=COL3=COL4=0 sau đĩ kiểm tra tích ROW1*ROW2* ROW3*ROW4, nếu tích 
bằng “1” thì cột 1 cĩ phím nhấn, từ đĩ xác định được phím nào đã nhấn. Nếu tích đĩ 
bằng “0” thì khơng phải cột 1 cĩ phím nhấn, ta lại chuyển sang kiểm tra cột 2 với 
COL2=1 và COL1=COL3=COL4=0. Cứ tiếp tục như vậy ta sẽ xác định được cột cĩ 
phím nhấn. 
d) Khối hiển thị LCD 2x16(2 dịng, 16cột) 
LCD làm việc chế độ 8 bit ghép nối Port D của vi điều khiển trung tâm 
Bảng sơ lược chức năng LCD 2x16 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 62
Hình 2.7 Khối hiển thị LCD 
- Sử dụng một biến trở 100K điều chỉnh độ tương phản của LCD. 
- Chỉ dùng LCD để hiển thị (Write) nên chân R/W được nối mass. 
e) Khối mạch động lực điều khiển 
Hinh 2.8 Khối thiết bị chấp hành 
Khối mạch lực này làm việc đúng theo nguyên lý trình cơ cấu chấp hành (IC L298) 
trình bày chương 3 ứng dụng bộ điều khiển PID số điều khiển động cơ một chiều . 
f) Khối nguồn 12V/5V 
Hình 2.9 Sơ đồ khối nguồn 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 63
Trong mạch sử dụng hai modul nguồn 5V(cung cáp mạch điều khiển) và 12V(cung 
cấp cho động cơ): 
- Mạch cung cấp đầu ra 5V cho mạch điều khiển: điện áp đầu vào xoay chiều 
khoảng 18-24V xoay chiều lấy từ biến áp, qua chỉnh lưu 2 nửa chu kỳ bằng 
cầu diode, thu được điện áp 1 chiều 18 - 24V sau đĩ qua IC ổn áp LM7805 
mắc song song để thu được điện áp đầu ra 5V. Trước IC ổn áp ta mắc thêm 
trở nhiệt và diode để tản nhiệt 1 phần cho IC và bảo vệ ngăn dịng đánh 
ngược. Ở đầu vào và đầu ra của IC ổn áp đều mắc thêm tụ, gồm cả tụ hĩa (cĩ 
phân cực) và tụ keo (khơng phân cực) để ổn định điện áp. Ngồi ra cịn thêm 
đèn báo và cơng tắc bật, và cầu chì bảo vệ đầu vào khi lấy nguồn từ biến áp. 
- Mạch nguồn 12V cũng tương tự hoạt động như trên nhưng thay vì dùng 
ICLM7805 chúng ta dùng LM7812 tạo nguồn 12V điều khiển động cơ. 
g) Các khối khác 
Trên Kit cịn cĩ một số khối phụ khác như cịi chip, led, ADC, ISP&ISCP để kết 
nối mạch nạp ngồi cho Chip, hai chân vào ra cho phép kết nối đầu vào ra khác, 
Encoder, truyền thơng cổng Com. 
Sơ đồ nguyên lý kit điều khiển 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 64
Sơ đồ mạch in hai lớp 
2.2 Thiết kế phần mềm trên nền vi điều khiển PIC 
2.2.1. Yêu cầu phần mềm 
Chương trình phần mềm cho vi điều khiển Pic18F4520 cĩ thể viết theo nhiều cơng 
cụ như CCS, ngơn ngữ Asembly hoặc C18 . Trong đồ án chúng ta thực hiện lập trình 
vi điều khiển Pic18F4520 sử dụng C18 trên mơi trường MPLAB của nhà sản suất 
Mỉcochip. Phần mềm nhúng trên vi điều khiển PIC thực hiện các nhiệm vụ sau: 
- Nhận dữ liệu thơng số từ máy tính và bàn phím. 
- Xử lý và nhận các tín hiệu từ các đầu vào số hoặc tương tự trên modul phần 
cứng. 
- Truyền dữ liệu lên máy tính qua cổng truỳen thơng nối tiếp RS232. 
- Hiển thị dữ liệu lên LCD và tín hiệu đèn led. 
- Tính tốn đầu ra cho bộ điều khiển thiết kế, trong đề tài là bộ điều khiển PID 
số. 
Khi viết chương trình cho vi điều khiển chúng ta cĩ thể sử dụngthư viện khối chức 
năng hỗ trợ sãn nhà sản xuất về các modul PWM, Timer, ADC, Led, các hàm bộ điều 
khiển PID… 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 65
No 
Yes 
Digital 
Analog 
2.2.2. Giải thuật chương trình 
a) Loop điều khiển 
Hình 2.10 Lưu đồ loop điều khiển 
BEGIN 
Khởi tạo các khối chức năng: 
PWM,LCD,TIMER… 
Khởi tạo các giá trị ban đầu 
Start ? 
Cập nhật dữ liệu từ 
ADC Ỉ CPU 
Tính tốn thuật tốn 
PID 
Kiểu cổng 
ra ? 
PWM 
CPU Ỉ ADC 
Xử lý truyền thơng 
END 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 66
Khi thực hiện chương trình chúng ta quản lý theo ngắt để tạo chu kì trích mẫu. 
Hình 2.11 Lưu đồ hàm ngắt dùng tạo chu lì trích mẫu 
Trong đĩ gọi T là chu kỉ trích mẫu chương trình thì ta sẽ xây dựng được quan hệ 
biến “Constant” và T theo khung thời gian hoạt động của “timer”. Điều đĩ cĩ nghĩa 
lớn trong việc quản lý chính xác việc tạo thời gian trích mẫu. 
b) Thuật tốn PID số 
* ) Luật PID trên miền thời gian ( liên tục ) được mơ tả bởi cơng thức: 
 (3.1) 
Trong đĩ: KR = Hệ số tỷ lệ 
TC = Hằng số thời gian tích phân 
TV = Hằng số thời gian vi phân 
* ) Xấp xỉ thành phần I 
 (3.2) 
Bản chất là phép tính xấp xỉ diện tích của hàm e (t) 
- Xấp xỉ theo nguyên tắc hình chữ nhật : 
- Xấp xỉ theo nguyên tắc hình thang : 
Trong đĩ T là chu kì trích mẫu . 
*) Xấp xỉ thành phần D 
- Khai triền thành chuỗi 
Start Interrupt 
If (Biến đếm < Constant) then biến 
đếm++ 
Else biến đếm=Constant; 
thực hiện thuật tốn Flag=1;
End Interrupt 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 67
- Vi phân xấp xỉ bậc 2 : 
- Vi phân xấp xỉ bậc 1 : 
*) Xấp xỉ luật PID 
Thay các cơng thức xấp xỉ trên vào cơng thức: 
uk = upk + uik + udk 
- Với xấp xỉ thành phần I theo phương pháp hình chữ nhật và thành phần D theo bậc 1 
 (3.3) 
- Với xấp xỉ thành phần I theo phương pháp hình chữ thang và thành phần D theo 
bậc2: 
- Theo Takahashi cĩ thể làm giảm bớt biên độ độ lớn điều khiển khi đại lượng chủ đạo 
( giá trị đặt ) cĩ đột biến nhanh bằng cách, thay vì ek = wk – xk chỉ sử dụng ek = - xk. Từ 
đĩ ta cĩ : 
 (3.4) 
Mơ hình bộ điều khiển PID số: 
Hình 2.12 Sơ đồ bộ điều khiển PID số 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 68
Sơ đồ như trên giúp chúng ta cĩ thể lựa chọn nhiều giải pháp sử dụng bộ điều 
khiển PID theo nhiều luật khác nhau. 
Khi thiết kế thuật tốn PID số cho vi điều khiển chúng ta cũng thực hiện thuật tốn 
PID theo nguyên tắc chung như trên nhưng sử dụng các khối Timer để quản lý việc 
thực hiện thuật tốn. Các thơng số đầu vào bộ điều khiển là Ref_Input và Mea_Input 
luơn được cập nhập từ các cổng vào ra số và tương tự trên kit điều khiển để vi điều 
khiển thực hiện thuật tốn PID áp đặt lên cơ cấu chấp hành điều khiển đối tượng. 
Trong quá trình điều khiển dựa trên sai lệch đầu vào giữa Ref_Input và Mea_Input bộ 
điều khiển PID số tác dụng vừa đưa sai lệch mơ hình về khơng vừa đảm bảo các chỉ 
tiêu chất lượng điều khiển . Mỗi một chu kì thực hiện thuật tốn PID trên vi điều khiển 
thì tín hiệu đầu ra của hệ thống điều khiển luơn được cập nhập qua cảm biến chuyển 
đổi phản hồi về tạo tín hiệu Mea_Input . 
Cĩ nhiều cách xấp xỉ bộ điều khiển PID nên việc thực thi các thuật tốn PID trên vi 
điều khiển cũng khác nhau. Một vấn đề quan trọng cần quan tâm khi thiết kế bộ điều 
khiển PID cần quan tâm là việc hạn chế các hiện tượng bão hồ tích phân (Winup). 
Vấn dề này rất thường gặp khi thực thi luật điều khiển PID. Hiện tượng bão hồ tích 
phân là hiện tượng đầu ra của bộ điều khiển vẫn tiếp tục tăng quá mức giới hạn do tích 
luỹ của thành phần tích phân vẫn cịn khi sai lệch điều khiển đã trở về khơng. Giải 
quyết vấn đề này cĩ thể sử dụng phương pháp: 
- Khi sai lệch mơ hình bằng khơng ta thực hiện tách bỏ thành phần tích phân 
hoặc xố trạng thái của nĩ bằng vịng lặp. 
- Giảm hệ số khuếch đại để đầu ra nằm trong dải cho phép khơng quá lớn. 
- Thực hiện thuật tốn bù thành phần tích phân bằng phản hồi giá trị thực đo 
được. 
- Đặt một khâu giới hạn ở dầu ra của bộ điều khiển và sử dụng thuật tốn bù. 
Hai phương pháp cuối cĩ ưu điểm hơn cả và thường được hầu hết các bộ điều 
khiển cơng nghiệp hỗ trợ. Giả pháp đa năng và áp dụng nhiều trên thực tế thực hiện 
Anti_Winup là điều khiển bám(tracking) thực chất cải thiện thành phần tích phân I: 
Hình 2.13 Chống bão hào tích phân 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 69
2.2.3. Thiết kế phần mềm điều khiển và giám sát trên máy tính 
Chúng ta thực hiện thiết kế giao diện giao tiếp vi điều khiẻn và máy tính bằng 
ngon ngữ Visual Basic6.0(VB).Trong mơi trường lập trình VB, việc tạo ra một giao 
diện đồ họa là tương đối đơn giản. VB đã hỗ trợ cho người sử dụng những mơ đun đối 
tượng phổ biến giúp cho cơng việc của người lập trình trở nên nhẹ nhàng hơn rất 
nhiều. Việc tạo giao diện chỉ là lựa chọn những đối tượng vẽ vào một giao diện (form) 
cĩ sẵn cùng với việc thiết lập các thơng số cho đối tượng. 
Ở đây, giao diện được tạo tương đối đơn giản nhưng đủ đáp ứng được những 
yêu cầu mà cơng việc đặt ra. 
Yêu cầu cơng việc: 
• Thu nhận dữ liệu do người dùng nhập vào (các giá trị Kp, Ki, Kd , thơng 
số cần đạt được …) 
• Phân tích, xử lý dữ liệu đã nhận, truyền xuống cho vi điều khiển PIC qua 
cổng nối tiếp 
• Nhận dữ liệu truyền về từ PIC và hiển thị lên màn hình đồ họa để thấy 
được khả năng đáp ứng của hệ thống 
Hình 2.14. Giao diện giao tiếp PC 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 70
Trên giao điện đồ hoạ gồm cĩ các button điều khiển, các textbox hiển thị số liệu, 
combobox cho phép lựa chọn các chế độ, và picturebox dùng để nhận dữ liệu của 
người sử dụng vẽ vào, đồng thời cũng là nơi hiển thị dữ liệu thu nhận được cho thấy 
đáp ứng của hệ thống. Cụ thể hoạt động các phím chức năng như sau: 
- Khối chức năng điều khiển động cơ bao gồm:comand button và textbox biểu 
thị và điều khiển chế độ hoạt đọng động cơ DC. Button ‘Start’Button “Start” 
dùng để bắt đầu gởi giá trị vị trí mong muốn xuống cho vi điều khiển, lúc đĩ 
chương trình sẽ nhận được giá trị tốc độ được gởi lên bởi vi điều khiển thơng 
qua giao triếp RS232, rồi vẽ trên đồ thì và hiển thị giá trị tốc độ của động cơ 
trên đồ thị theo miền thời gian, từ đĩ ta cĩ thể quan sát được hoạt động của hệ 
thống cĩ đáp ứng đúng yêu cầu đề ra khơng (như sai lệch, thời gian đạt được 
…).Button ‘Inverser’ điều khiển đảo chièu quay động cơ. Button ‘Stop’ dừmg 
hoạt động của động cơ Button ‘update’ là để cập nhập thơng số khi điều 
khiển. Hai Textbox ‘tốc độ đặt’ và ‘Chu kì’ tạo thơng số cho điều khiển động 
cơ xuống vi điều khiển. 
- Khối Parameter Sattus Motor là các texbox chỉ cĩ chức năng hiển thị thơng tin 
cập nhập trong quá trình điều khiển. 
- Khối bộ điều khiển cho người sử dụng cĩ thể nhập dừ liệu ban đầu điều khiển. 
Trên cơ sở đĩ xây dựng thuật tốn phía dưới vi điều khiển. 
- Khối đồ thị cĩ button ‘Export’ nhiệm vụ xuất dữ liệu ra màn hình điều khiển 
quan sát chất lượng hệ thống. 
- Cịn lại Button ‘Exit’ thực hiện thốt khỏi chương trình khi cần thiết . 
- Màn hình đồ thị cho ta hai đặc tính đĩ là đặc tính điều khiển tốc độ động cơ 
và điện áp đầu vào. 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 71
2.3 Kit điều khiển 
Sản phẩm kit điều khiển cĩ được sau khi thiết kế cĩ các khối chức năng như đã nêu 
phần trên với đặc điểm : 
- Cĩ các cổng vào tương tự : 0 - 5V, 0 - 20mA. 
- Cĩ các cổng ra số ( xung số và logic) 
- Thời gian trích mẫu tối thiểu là 2.55*10-5 s, tuy nhiên với thời gian trích mẫu 
nhỏ ta phải lưu ý tới thời gian tính tốn của các câu lệnh. Với thời gian trích 
mẫu lớn ( ví dụ trong ứng dụng điều khiển nhiệt độ…) ta cĩ thể bỏ qua thời 
gian tính tốn của VXL. 
- Cĩ các khối hiển thị LCD, Led . 
- Cĩ khối giao tiếp truyền thơng nối tiếp máy tính RS232. 
- Khối nguồn 5V và 12V 
- Cịi cảnh báo 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 72
Chương 3: Ứng dụng bộ điều khiển PID số điều 
khiển động cơ một chiều 
3.1 Đối tượng điều khiển 
3.1.1. Thơng số kĩ thuật 
Hình 3.1 Động cơ sủ dụng trong đồ án 
Chúng ta sử dụng Servo Motor với các thơng số cơ bản như sau: 
- Điện áp nguồntối đa là 24V. 
- Tốc độ tối đa là 3000 vịng/phút. 
- Cĩ gắn liền Encoder quang tương đối 100xung . 
- Cơng suất 30-50w. 
3.1.2. Nhận dạng mơ hình động học của động cơ điện một chiều 
Cấu trúc mơhình động học của đọng cơ điện được đề suất tài liệu tham khảo [3], 
[4], [6] cĩ mơ hình dạng: 
2DT )(*21
)(W
TsTs
Ks ++= η (3-1) 
Các tham số mơ hình động cơ điện một chiều sẽ được nhận dạng từ thực nghiệm 
và giới thiệu trong phần tiếp theo. 
3.1.3. Thu thập dừ liệu vào/ra của động cơ điện một chiều từ thựcnghiệm 
Chúng ta sử dụng kit điều khiển để thu thập dữ liệu nhận dạng động cơ điện một 
chiều theo mơ hình : 
Hinh 3.2 Sơ đồ thu thập dữ liệu nhận dạng 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 73
Hình 3.2 Đặc tính thu thập dữ liệu nhận dạng 
Trong giao điện phần mềm giám sát hệ thống chúng ta cĩ thể lấy trực tiếp dữ liệu 
vào/ra xuất ra file định dạng Exel. Như vậy chúng ta cĩ tập dữ liệu đối tưọng lưu trên 
file: ’C:\data.xls’. Chúng ta hồn tồn cĩ thể chuyển dữ liệu dạng khác để sử dụng 
nhạn dạng như file ‘.mat’, ‘.dat’… Matlab vẫn hỗ trợ các dữ liệu định dạng này. 
Khi thu thập dữ liệu đối tượng ta cho điện áp dầu vào động cơ là 9V, thời gian trích 
mầu 5ms . 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 74
3.1.4. Nhận dạng động cơ điên một chiều bằng Toolbox Identification cảu 
Matlab 
Sau khi thu thập dữ liệu vào ra của động cơ ta tiến hành nhận dạng đối tượng sử 
dụng toolbox của Matlab (System Identification toolbox) . Khi nhận dạng đối tượng sử 
dụng dữ liệu trong miền thời gian Time – Domain Data. Các bước tiến hành nhận dạng 
trên Matlab tĩm lược như sau : 
 Các câu lệnh để tiến hành nhận dạng dữ liệu trong cửa sổ Matlab: 
>> X=xlsread('D:\data.xls',1) // Đọc dữ liệu lưu trong data1.xls 
>> u1=X(:,1) // Đầu vào điện áp bước nhảy 
>> y1=X(:,2) // đầu ra tốc độ y1 
>> save identdata u1 y1 // lưu file dữ liệu dưới dạng identdata.mat 
>> ident // mở của sổ nhận dạng 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 75
Hình 3.3Chọn đầu vào và mơ hình nhận dạng của đối tượng 
Hình 3.4Phương thức nhận dạng và đánh giá mơ hình thu được 
Sau khi tiến hành nhận dạng chúng ta thu được mơ hình của đối tượng vĩi hàm 
truyền: 2DT )(*21
)(W
TsTs
Ks ++= η Với η=0.31528 ,T=0.0057876 , K=138.67 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 76
Hình 3.5 Đặc tính quá độ đối tượng sau khi nhận dang 
3.1.5. Đánh giá chất lượng mơ hình 
Cũng trong Toolbox này Matlab cịn cho ta thấy sai lệch tương đối giữa đối tượng 
nhận dạng và tập dừ liệu ban đầu thu thập được. 
Hình 3.6 Sai lệch mơ hình nhận dạng 
Cĩ thể đánh giá sai lệch mơ hình thực đối tượng là khoảng 5.5% làcĩ thể chấp 
nhận được. Mơ hình đố tượng động cơ điện một chiều chúng ta nhận dạng được là khá 
chính xác. 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 77
3.2 Thiết kế luật điều khiển PID 
3.2.1. Phương pháp Ziegler-Nichols1 
 Để thiết kế bộ điều khiển PID ta dùng phương pháp Ziegler – Nichols thứ nhất 
dựa trên cơ sở đặc tính của đối tượng . 
Từ hình vẽ trên ta cĩ L = 0,00375 ; T = 0,041và hệ số k = 71.2 
Kp= 0.16 
Ti = 0.0075 
Td = 0.0019 
3.2.2. Phương pháp IMC 
Phương pháp này cĩ ưu điểm là thiết kế tính tốn các tham số bộ điều khiển PID 
cho từng loại mơ hình đối tượng khác nahu qua một số biểu thức trung gian. Chúng ta 
sử dụng phương pháp này cho đối tượng động cơ một chiều là vì nĩ đã cĩ sẵn luật 
thiết kế .Đối tượng động cơ điện một chiều cĩ mơ hình : 
2DT )(*21
)(W
TsTs
Ks ++= η Với η=0.31528 ,T=0.0057876 , K=138.67 
Ta cĩ : Chon tc=0.06 
Kp=Ti/(tc*K)= 0.0004 
 Ti=2*η*T=0.00365=>Ki=0.12 
 Td=T/(2*η)=0.092=>Kd=0.000037 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 78
3.2.3. Mơ phỏng và đánh giá chất lượng bộ điều khiển 
Mơ hình Simulink: 
Hình 3.7 Mơ phỏng trên Simulink các phương pháp điều khiển 
Hình 3.9 Đặc tính mơ phỏng 
Rõ dàng hai phương pháp đều cho đặc tính hệ thống sai lệch và đoọ quá điều 
chỉnh bằng khơng nhưng IMC cho ta thời gian quá độ Tqd=140ms, cịn Ziegler- 
Nichols cho Tqd=230ms. Như vậy phương pháp IMC cho ta kết quả tốt hơn. 
3.3 Thiết bị chấp hành(IC L298) 
Đảm nhiệm vai trị thiết bị chấp hành trong hệ thống điều khiển thực thi thuật tốn 
điều khiển là mạch cơng suất L298.L298 là một Driver tích hợp sẵn 2 mạch cầu H bên 
trong với chuẩn điều khiển TTL, khơng cĩ Diode nội bảo vệ Mosfet. Chịu tải tối đa 
trên mỗi cầu là 2A, điện áp 40VDC. Logic “0” ở ngõ vào lên tới 1.5V ( khả năng khử 
nhiễu cao). Sử dụng dạng đĩng gĩi Multiwatt15. 
Một số đặc điểm của mạch cơng suất L298: 
 Điện áp cấp lên đến 46V 
 • Tổng dịng DC chịu đựng lên đến 4A 
 • Chức năng bảo vệ quá nhiệt 
 • Điện áp logic ‘0’ từ 0V đến 1.5V nên tính chống nhiễu tốt. 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 79
Hình 3.10 Sơ đồ chân L298 
Chức năng các chân : 
 MW.15 Power SO Tên Chức năng 
 1.15 2;19 Sense A 
sense B 
Nối chân này qua điện trở cảm ứng dịng 
xuống GND để điều khiển dịng tải . 
 2;3 4;5 Out1 
 Out2 
Ngõ ra của cầu A . Dịng của tải mắc giữa 2 
chân này được qui định bởi chân 1. 
 4 6 Vs Chân cấp nguồn cho tầng cơng suất. Cần cĩ một tụ điện khơng cảm kháng 100nF nối giữa 
chân này và chân GND 
 5;7 7;9 Input1 
Input2 
Chân ngõ vào của cầu A, tương thích chuẩn 
TTL 
 6;11 8;14 EnableA 
EnableB 
Chân ngõ vào enable (cho phép) tương thích 
chuẩn TTL. Mức thấp ở chân này sẽ cấm 
(disable) ngõ ra cầu A (đối với chân EnableA) 
và/hoặc cầu B ( đối với chân EnableB) 
 8 1;10;11;20 GND Chân đất (Ground) 
 9 12 VSS Chân cấp nguồn cho khối logic. Cần cĩ tụ 
điện 100nF nối giữa chân này với GND 
 10;12 13;15 Input3 
Input4 
Các chân logic ngõ vào của cầu B 
 13;14 16;17 Output3 
Output4 
Ngõ ra của cầu B. Dịng của tải mắc giữa hai 
chân này được qui định bởi chân 15. 
 - 3;18 N.C Khơng kết nối . 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 80
Hình 3.11: Các chế độ của L298 
Hai chân C,D của L298 để điều khiển chiều động cơ, phanh động cơ. Chân Enable 
của L298 dùng làm đầu vào băm xung PWM cho động cơ để cĩ thể điều khiển tốc độ 
động cơ. 
Bảng chế độ của trong quá trình điều khiển động cơ : 
Đầu vào Chức năng 
M1A=1; M1B=0 Tiến động cơ 
M1A=0; M1B=1 Lùi động cơ M1E=1 
M1A=M1B Dừng khẩn cấp (phanh) 
M1E=0 M1A=X; M1B=X Dừng khơng phanh 
Trong thực tế ứng dụng này, động cơ DC chỉ cĩ dịng tải 200mA khi hoạt động 
bình thường, và lên đến tối đa 2A khi quá tải. Tuy nhiên cũng cần thiết kế một bộ điều 
khiển mở cĩ thể sử dụng cho các động cơ lên đến 4A. 
Việc hạn chế dịng cho động cơ là rất cần thiết, cĩ nhiều tình huống khơng mong 
đợi xảy ra, vì vậy cần phải cĩ chế độ hạn dịng bằng phần mềm. 
Trong các trường hợp nguy hiểm như ngắn mạch do va chạm, hoặc tuột dây nối, 
cần cĩ mạch bảo vệ chống ngắn mạch bằng phần cứng để đáp ứng kịp thời. 
Cần điều khiển PWM ở tần số cao để tránh tiếng ồn do động cơ tạo ra, nhất là 
những tiếng kêu nghe rất rõ ở khoảng tần số 1KHz đến 3KHz. Bộ điều khiển PWM 
thơng thường được điều khiển ở 5KHz.Nối song song hai cầu H để điều khiển động cơ 
lên đến 4A. 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 81
Hình 3.12 : Sơ đồ giải pháp 
 L298 khơng cĩ Diode nội bảo vệ, do đĩ cần cĩ 4 Diode ngồi bảo vệ. Để đảm 
bảo điều khiển PWM ở tần số cao, cần dùng Diode nhanh cĩ điện trở thấp. Diode 
chuyên dụng để điều khiển động cơ là các Diode “fast recovery Schottky”. Nhưng ở 
tần số khoảng 5KHz vẫn cĩ thể dùng loại 1N4007. 
 Lưu ý rằng, khi hoạt động L298 rất nĩng, do vậy cần cần phải lắp miếng tản 
nhiệt. 
 Hai chân RC0 và RC1 để điều khiển chiều quay của động cơ: 
 + ) RC0 = 1 và RC1 = 0 quay thuận 
 + ) RC0 = 0 và RC1 = 1 quay nghịch 
 + ) RC0 = RC1 = 0 hoặc RC0 = RC1 = 1 động cơ dừng quay 
 Chân PWM được đưa vào chân Enable của L298, do vậy chỉ cần điều chỉnh độ 
lớn của Dutycycle của PWM ta cĩ thể điều chỉnh được điện áp đầu ra của L298 đưa 
vào động cơ ( 0V : 12V ). 
3.4 Cảm biến (Encoder) 
Nguyên lý hoạt động của cảm biến encoder : có nhiều loại encoder khác nhau 
như : Encoder tiếp xúc, Encoder từ trường, Encoder quang (Encoder quang tương 
đối và Encoder quang tuyệt đối). Mỗi loại lại có một nguyên lý hoạt động khác 
nhau, trong khuôn khổ báo cáo đồ án chỉ trình bày phần nguyên lý loại encoder sử 
dụng là Encoder quang tương đối ( incremental encoder). 
Mô hình thứ 1 
Hình 3.13 : Mơ hình1 - En coder quang tương đối 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 82
Incremental encoder về cơ bản là một đĩa tròn quay quanh một trục được đục lỗ 
như hình trên. 
Hình 3.14 : Phương thức hoạt động Encoder quang tương đối 
 Ở 2 bên mặt của cái đĩa tròn đó, sẽ có một bộ thu phát quang. Trong quá trình 
encoder quay quanh trục, nếu gặp lỗ rống thì ánh sáng chiếu qua được, nếu gặp 
mãnh chắn thì tia sáng không chiếu quá được. Do đó tín hiệu nhận được từ sensor 
quang là một chuổi xung. Mỗi encoder được chế tạo sẽ biết sẵn số xung trên một 
vòng. Do đó ta có thể dùng vi điều khiển đếm số xung đó trong một đơn vị thời gian 
và tính ra tốc độ động cơ. 
Cái encoder mà em sử dụng trong đồ án của mình, hoàn toàn giống với mô hình 
ở trên. Tuy nhiên, mô hình trên có nhược điểm lớn là : ta không thể xác định được 
động cơ quay trái hay quay phải, vì có quay theo chiều nào đi nữa thì chỉ có một 
dạng xung đưa ra. Ngoài ra điểm bắt đầu của động cơ, ta cũng không thể nào biết 
được. 
Cải tiến mô hình 1 bằng mô hình 2 như sau: 
Mô hình thứ 2 
Hình 3.15 : Mơ hình 2 -En coder quang tương đối 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 83
 Trong mô hình này, người ta đục tất cả là 2 vòng lỗ. Vòng ngoài cùng giống 
như mô hình 1, vòng giữa pha so với vòng ngoài là 90 độ. Khi đó, dạng xung ra từ 2 
vòng trên như sau : 
Hình 3.16 : Sơ đồ xung của En coder quang tương đối(mơ hình 2) 
Hai xung đưa ra từ 2 vòng lệch nhau 90 độ, nếu vòng ngoài nhanh pha hơn vòng 
trong thì chắc chắn động cơ quay từ trái sang phải và ngược lại. 
Một lỗ ở vòng trong cùng dùng để phát hiện điểm bắt đầu của động cơ. Có thể 
viết chương trình cho vi điều khiển nhận biết : nếu có một xung phát ra từ vòng 
trong cùng này, tức là động cơ đã quay đúng một vòng. 
Với những đặc tính trên, encoder dùng rất phổ biến trong việc xác định vị trí góc 
của động cơ….. 
Vấn đề quan trọng trong việc tìm mua những loại động cơ có gắn encoder như 
thế này để làm đồ án đối với sinh viên là : cặp mắt quang 2 bên encoder để tạo 
xung thường bị chết và không có đồ thay thế. 
Một loại encoder thứ 2 cũng phổ biến hiện nay, đó là :absolute encoder. 
Mô hình đĩa quang của loại này như sau: 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 84
 Cách tính tốc độ động sơ sử dụng trong đồ án 
 Ở đồ án động cơ được gắn Encoder 100 xung/vịng. 
Hai kênh xung A và B được đưa vào hai chân ngắt của VĐK là INT1 , INT2. Ta 
thiết lập khi cĩ sườn xuống thì tạo ngắt. Do vậy tổng số xung trên 1 vịng sẽ được nhân 
đơi lên thành 200 xung. 
Cách tính tốc độ : Tốc độ = (Counter*60)/(200*T) 
Ở đây: 
 T : là chu kỳ trích mẫu 
 Counter : là số xung đếm được trong khoảng thời gian T 
Trong đồ án sử dụng T = 0.02 s nên : Tốc độ = Counter * 15 
3.5 Hệ thống điều khiển 
Trên cơ sỏ thiết kế bộ điều khiển PID số chương 2 chúng ta cĩ thể khái quát hệ 
thống điều khiển động cơ điện một chiều cĩ dạng: 
Hình 3.17 Sơ đồ hệ thốngđiều khiển động cơ 
Hình 3.18 Cấu trúc hệ thống điều khiển 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 85
Cơ sở nguyên lý thực hiện sơ đồ điều khiển tốc độ động cơ : 
- Thực hiện điều khiển động cơ bằng bộ điều khiển thiết kế cài dặt trên vi điều 
khiển. 
- Sử dụng encoder quang tương đối dùng dể phản hồi tốc độ động cơ. 
- Giao tiếp máy tính qua chuẩn RS232 thơng qua modul trên mcạh điều khiển 
hiển thị đặc tính hệ thống theo phương pháp điều chế độ rộng xung PWM. 
- Trên mạch cĩ khối hiển thị LCD hiển thị các chế độ hoạt động động cơ cùng 
như các thơng số: tốc độ , điện áp điều khiển… 
Hình 3.19 Cấu trúc khối điều khiển động cơ 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 86
3.6 Một số hình ảnh về Kit điều khiển động cơ sử dụng vi điều 
khiển PIC 
Một số hình ảnh mạch điều khiển động cơ một chiều 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 87
3.7 :Kết quả thực nghiệm 
Bộ điều khiển PI 
Hình 3.20 Đặc tính với bộ điều khiển PI 
Bộ điều khiển PID 
Hình 3.21 Đặc tính với bộ đièu khiển PID 
Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 88
Hình 3.22 Hệ thống khi cĩ nhiễu 
Hình 3.23 Đặc tính khi hệ thống cĩ thay đỏi giá trị đặt 
3.8 So sánh kết quả mơ phỏng và thực tế 
Dựa trên kết quả mơ phỏng trên Matlab và trên giao diện chương trình ta cĩ thể 
đánh giá: 
- Đặc tính hệ thống sau thực hiện bộ điều khiển là tương đối tốt đáp ứng chỉ tiêu 
chất lượng : độ quá điều chỉnh nhỏ, thịi gian qua độ nhỏ khồn 200-600ms 
- Trên giao diện chương trình vẫn thấy rõ sai lệch so mơ phỏng Matlab: đặc tính 
chưa thật mịn, và vẫn tồn tại sai số so với tốc độ đặt khoảng sai số dao động từ 
2% tới 10%. 
Kết luận 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 89
Kết luận 
Các kết quả đạt được 
Trên cơ sở thiết kế phần cứng và phần mềm khi thực hiện đồ án đã đạt được một số 
kết quả sau: 
- Về phần cứng: Tìm hiểu về vi điều khiển Pic 
- Đi sâu tìm hiểu một số thuật tốn điều khiển như bộ điều khiển PID, bộ điều 
khiển mờ… 
- Nhận dạng và mơ phỏng đối tượng điều khiển (động cơ một chièu kích từ độc 
lập) trên Matlab. 
- Thiết kế kit phần cứng cho vi điều khiển Pic 18F4520 cĩ khả năng điều khiển 
nhiều đối tượng (động cơ một chiều. lị nhiệt…). với các thuật tốn điều khiển 
khác nhau 
- Tạo được giao diện và giao tiếp được PC và vi điều khiển trung tâm 
Một số điểm hạn chế 
Trong gian đoạn làm đồ án, chúng em đã rất cố gắng nghiên cứu, thiết kế để cĩ 
được những kết quả đã nêu trên. Tuy nhiên do thời gian và kiến thức của chúng em cĩ 
hạn, mặt khác một số điều kiện về thiết bị khơng cho phép nên trong đồ án cịn những 
hạn chế : 
- Sử dụng Encoder cĩ độ phân giải chưa cao nên vẫn gây ra nhiều sai số trong 
quá trình tính tốn. 
- Pic 18F4520 là dịng vi điều khiển 8 bits cĩ tốc độ tính tốn và bộ nhớ chương 
trình khơng lớn nên khĩ áp dụng cho những bộ điều khiển cần nhiều bộ nhớ 
như : bộ điều khiển mờ... 
- Kết quả thu được vẫn cĩ sai số so với mơ hình lý tưởng thiết kế trên Matlab. 
- Một số modul trên Kit chưa được khai thác. 
Hướng khắc phục các điểm hạn chế 
Dựa trên cơ sỏ hạn chế chúng ta cĩ hướng khắc phục : 
- Cĩ thể sử dụng động cơ cĩ encoder 500 xung/vịng hoặc 1000 xung/vịng để 
khắc phục sai số . 
- Sử dụng dịng Pic 16 bits, 32 bits.......... 
Hướng phát triển đề tài 
- Thiết kế bộ điều khiển thích nghi PID, bộ điều khiển mờ học theo mơ hình 
mẫu : FMRLC, hoặc bộ điều khiển ứng dụng mạng Nơron. 
Kết luận 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 90
- Mở rộng thêm các đối tượng thực mà Kit cĩ thể làm việc được như lị nhiệt, 
bình mức… 
Do lí do về thời gian những lí do khách quan khác nên đồ án được thực hiện vẫn 
cịn nhiều khiếm khuyết. Chúng em rất mong nhận được nhũng ý kiến đĩng gĩp quý 
báu của các thầy cơ. 
Một lần nữa, chúng em xin chân thành cảm ơn cơ giáo PGS.TS Phan Xuân Minh 
đã hướng dẫn chúng em tận tình trong quá trình thực hiện đồ án này. 
----------------------------o0o---------------------------- 
Phụ lục- Tài liệu tham khảo 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 91
Tài liệu tham khảo 
1. Nguyễn Phùng Quang, Andreas Dittrich – Truyền động điện thơng minh 
– NXB KHKT, 2002 
2. Nguyễn Tăng Cường, Phan Quốc Thắng – Cấu trúc và lập trình họ vi điều 
khiển 8051 
3. Nguyễn Dỗn Phước : Lý thuyết điều khiển tuyến tính. Nhà xuất bản khoa học 
kỹ thuật, 2005 
4. Nguyễn Phùng Quang : Matlab & Simulink dành cho kỹ sư điều khiển tự 
động. Nhà xuất bản khoa học kỹ thuật, 2005 
5. Nguyễn Phùng Quang : Bài giảng điều kiển số 
6. Nguyễn Văn Hồ : Tự động hố quá trình cơng nghệ 
7. Hồng Minh Sơn : Điều khiển quá trình 
8. Phạm Cơng Ngơ (chủ biên) : Tự học Visual C++ từ cơ bản đến nâng cao. Nhà 
xuất bản thơng kê, 2002 
9. Dương Thủy Vỹ : Phương pháp tính. Nhà xuất bản khoa học kỹ thuật, 2002 
10. Bùi Quốc Khánh, Nguyễn Văn Liễn & Nguyễn Thị Hiền : Truyền động điện. 
Nhà xuất bản khoa học kỹ thuật, 2006 
11. Hãng MicroSoft : MSDN Library for Visual Studio 2005 
12. Hãng Texas Instruments : datasheet MAX232 
13. Hãng microchip:datasheet 18F4520 
14. Hãng ST : datasheet L298 
15. www.dientuvietnam.net 
16. www.diendandientu.com 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 92
Phụ lục Code phần mềm 
//code bàn phím// 
#ifndef __pvc_keypad_H 
#define __pvc_keypad_H 
#define row1 PORTAbits.RA2 
#define row2 PORTAbits.RA3 
#define row3 PORTAbits.RA4 
#define row4 PORTAbits.RA5 
#define col1 PORTBbits.RB4 
#define col2 PORTBbits.RB5 
#define col3 PORTBbits.RB6 
#define col4 PORTBbits.RB7 
/*******************************************************************/ 
unsigned char col(void) 
{ 
 col4 = 1; 
 if (row1 & row2 & row3 & row4) 
 { 
 col4 = 0; 
 return 4; 
 } 
 col4 = 0; 
 col3 = 1; 
 if (row1 & row2 & row3 & row4) 
 { 
 col3 = 0; 
 return 3; 
 } 
 col3 = 0; 
 col2 = 1; 
 if (row1 & row2 & row3 & row4) 
 { 
 col2 = 0; 
 return 2; 
 } 
 col2 = 0; 
 col1 = 1; 
 if (row1 & row2 & row3 & row4) 
 { 
 col1 = 0; 
 return 1; 
 } 
 col1 = 0; 
} 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 93
/*************************************************************/ 
unsigned char row(void) 
{ 
 if (!row4) return 4; 
 else if (!row3) return 3; 
 else if (!row2) return 2; 
 else if (!row1) return 1; 
} 
/************************************************************/ 
unsigned char get_keypad(void) 
{ 
 if((col()==1) && (row()==1)) return 7; 
 if((col()==1) && (row()==2)) return 4; 
 if((col()==1) && (row()==3)) return 1; 
 if((col()==1) && (row()==4)) return 0; 
 if((col()==2) && (row()==1)) return 8; 
 if((col()==2) && (row()==2)) return 5; 
 if((col()==2) && (row()==3)) return 2; 
 if((col()==2) && (row()==4)) return 'Q'; 
 if((col()==3) && (row()==1)) return 9; 
 if((col()==3) && (row()==2)) return 6; 
 if((col()==3) && (row()==3)) return 3; 
 if((col()==3) && (row()==4)) return 'L'; 
 if((col()==4) && (row()==1)) return 'P'; 
 if((col()==4) && (row()==2)) return 'V'; 
 if((col()==4) && (row()==3)) return 'C'; 
 if((col()==4) && (row()==4)) return 'M'; 
} 
#endif 
/////// code LCD///// 
#ifndef __pvc_lcd_H 
#define __pvc_lcd_H 
#define LCD_RS PORTEbits.RE1 
#define LCD_RW PORTCbits.RC3 
#define LCD_E PORTEbits.RE2 
#define LCD_DATA PORTD 
/***************************************************************/ 
void busy_lcd (void) 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 94
{ 
unsigned char data; 
 TRISD=0xff; 
 LCD_RS=0; 
 LCD_RW=1; 
 do 
 { 
 LCD_E=1; 
 Delay10TCYx(2); 
 LCD_E=0; 
 data=PORTD; 
 data=data&0x80; 
 } 
 while(data==0x80); 
} 
/*****************************************************************/ 
void write_cmd_lcd(char cmd) 
{ 
 busy_lcd(); 
 TRISD=0x00; 
 LCD_RW = 0; 
 LCD_RS = 0; 
 LCD_E = 1; 
 LCD_DATA = cmd; 
 LCD_E = 0; 
} 
/****************************************************************/ 
void init_lcd (void) 
{ 
 write_cmd_lcd(0b00111000); 
 write_cmd_lcd(0b00001100); 
 write_cmd_lcd(0b00000110); 
 write_cmd_lcd(0b00000001); 
 write_cmd_lcd(0x02); 
} 
/****************************************************************/ 
void write_data_lcd(char data) 
{ 
if(data=='\n') 
{ 
 write_cmd_lcd(0xC0); // Dua con tro ve dau dong thu 2 
 return; 
} 
if(data=='\1') 
{ 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 95
 write_cmd_lcd(0x01); // Xoa man hinh hien thi 
 return; 
} 
 busy_lcd(); 
 TRISD=0x00; 
 LCD_RW = 0; 
 LCD_RS = 1; 
 LCD_E = 1; 
 LCD_DATA = data; 
 LCD_E = 0; 
} 
/*****************************************************************/ 
void write_str_lcd(char *str) 
{ 
while(*str) 
{ 
 write_data_lcd(*str); 
 str++; 
} 
} 
#endif 
/******************************************* 
CPU PIC18F4520 
Frequency 40MHz 
*******************************************/ 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//============================================ 
#pragma config OSC=HSPLL 
#pragma config BOREN=OFF 
#pragma config WDT=OFF 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 96
#pragma config MCLRE=ON 
#pragma config PBADEN=OFF 
#pragma config LVP=OFF 
#pragma config PWRT=ON 
long vc=0; 
long w=0; 
long pc=0,ic=0,dc=0; 
char p_h=0,p_l=0,i_h=0,i_l=0,d_h=0,d_l=0; 
char mode=0; 
char w_h=0,w_l=0; 
//============================================= 
char flag=0; 
char co_tocdo=0; 
char timer0_flag=0; 
//============================================= 
 float u_p=0,u_i=0,u_d=0,k_p=0,k_i=0; 
//long u=0,v=0; 
float u=0,v=0; 
float e=0; 
float pre_e=0; 
float sum_e=0; 
float tocdothuc=0; 
float pre_tocdothuc=0; 
float pre_ui=0; 
float pre_u=0; 
unsigned long counter=0,dienap=0; 
unsigned long tocdodat=0; 
unsigned int dutycycle=0; 
//============================================= 
unsigned char temp,msg[35]; 
unsigned int j=0; 
unsigned int jlcd=0; 
unsigned short long k=0; 
unsigned int k_usart=0; 
char pad=0; 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 97
char message[35]; 
char pvcm[32]={"\1 Pham Van Manh \n My Brother "}; 
void delay10ms (void) 
{ 
 Delay10KTCYx(10); 
} 
void delay500ms (void) 
{ 
 Delay10KTCYx(500); 
} 
void counter1_isr(void); 
void counter2_isr(void); 
void usart_isr(void); 
void keypad_isr(void); 
void timer0_isr(void); 
void pvc(void) 
{ 
 e= tocdodat - tocdothuc; 
 u_p =pc*e; 
 u_i=pre_ui + 0.0457*ic*pre_e ; 
 u_d=dc*(e-pre_e)/0.0457; 
 u= (u_p+u_i+u_d/10)/12800; 
 pre_e=e; 
 pre_ui=u_i; 
 if(u>=11.8) 
 { 
 u=11.8; 
 sum_e -= e; 
 } 
 if(u<=0) 
 { 
 u=0; 
 sum_e -= e; 
 } 
 dutycycle = 256*u/12; 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 98
 SetDCPWM1(dutycycle); 
 return; 
} 
//=============================================== 
#pragma code high_vector=0x08 
void interrupt_at_high_vector(void) 
{ 
 _asm GOTO keypad_isr _endasm 
} 
#pragma code 
//=================================== 
#pragma interrupt keypad_isr 
void keypad_isr(void) 
{ 
INTCONbits.INT0IF=0; 
delay10ms(); 
co_tocdo=1; 
if(!(row1 & row2 & row3 & row4)) 
 { 
 pad = get_keypad(); 
 if (pad>=0 && pad<=9) 
 sprintf(&message[0],"\1 KeyPad = %u ",pad); 
 else 
 sprintf(&message[0],"\1 KeyPad = %c ",pad); 
 write_str_lcd(&message[0]); 
 } 
} 
//************************************************* 
#pragma code low_vector = 0x18 
void interurrupt_at_low_vector(void) 
{ 
 if(INTCON3bits.INT1IF) 
 { 
 _asm GOTO counter1_isr _endasm 
 } 
 if(INTCON3bits.INT2IF) 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 99
 { 
 _asm GOTO counter2_isr _endasm 
 } 
 if(PIR1bits.RCIF) 
 { 
 _asm GOTO usart_isr _endasm 
 } 
 if(INTCONbits.TMR0IF) 
 { 
 _asm GOTO timer0_isr _endasm 
 } 
} 
//******************************************************************** 
#pragma interruptlow usart_isr 
void usart_isr(void) 
 { 
 INTCONbits.GIE = 0; 
 pad=0; 
 if(k_usart==0) 
 { 
 mode=ReadUSART(); 
 } 
 if(k_usart==1) 
 { 
 w_h = ReadUSART(); 
 } 
 if(k_usart==2) 
 { 
 w_l = ReadUSART(); 
 } 
 if(k_usart==3) 
 { 
 p_h = ReadUSART(); 
 } 
 if(k_usart==4) 
 { 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 100
 p_l = ReadUSART(); 
 } 
 if(k_usart==5) 
 { 
 i_h = ReadUSART(); 
 } 
 if(k_usart==6) 
 { 
 i_l = ReadUSART(); 
 } 
 if(k_usart==7) 
 { 
 d_h = ReadUSART(); 
 } 
 if(k_usart==8) 
 { 
 d_l = ReadUSART(); 
 k_usart=0; 
 flag=1; 
 } 
 else k_usart++; 
 INTCONbits.GIE = 1; 
 } 
//======================================== 
#pragma interruptlow counter1_isr 
void counter1_isr(void) 
{ 
counter++; 
INTCON3bits.INT1IF=0; 
} 
//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 
#pragma interruptlow counter2_isr 
void counter2_isr(void) 
{ 
counter++; 
INTCON3bits.INT2IF=0; 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 101
} 
//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 
//tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt 
#pragma interruptlow timer0_isr 
void timer0_isr(void) 
{ 
 INTCONbits.GIE = 0; 
 if(j<7)//0.026s 
 { 
 j++; 
 } 
 else 
 { 
 j=0; 
 tocdothuc = counter*6.565; 
 counter=0; 
 timer0_flag=1; 
 } 
 INTCONbits.TMR0IF=0; 
 INTCONbits.GIE = 1; 
} 
//tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt 
void main() 
{ 
 OpenUSART (USART_TX_INT_OFF & 
 USART_RX_INT_ON & 
 USART_ASYNCH_MODE & 
 USART_EIGHT_BIT & 
 USART_CONT_RX & 
 USART_BRGH_HIGH,64); 
OpenADC( ADC_FOSC_32 &ADC_RIGHT_JUST 
&ADC_6_TAD,ADC_CH0&ADC_INT_OFF, 0); 
RCONbits.IPEN=1; // cho phep uu tien ngat 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 102
INTCON=0xC0; // mo tat ca cac ngat 
INTCONbits.INT0IE =1; 
INTCON2=0x00; // ngat tai INT1,INT2 on falling edge 
INTCON2bits.TMR0IP=0; //Ngat timer0 thap 
INTCON3=0x18; // cho phep ngat INT1,INT2 
PIE1bits.RCIE=1; 
IPR1bits.RCIP=0; 
PIE1bits.TXIE=0; // Khong cho ngat khi truyen du lieu 
ADCON1 = 0x0d; 
TRISC = 0x80; 
PORTCbits.RC5 =1; 
TRISD = 0x00; 
TRISE = 0x00; 
TRISA = 0xff; 
TRISB = 0b00001111; // Khoi tao cho Kepad 
PORTB = 0X00; // Khoi tao cho Kepad 
ADCON1 = 0x0E; // Lay nguon la 5V va 0v cua mach 
init_lcd(); 
write_str_lcd(&pvcm[0]); 
OpenTimer2( TIMER_INT_OFF & 
 T2_PS_1_1 & 
 T2_POST_1_16 ); 
delay500ms(); 
PORTCbits.RC5 = 1; 
//----------------------------------------------------------------------------------- 
 while(1) 
 { 
//fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ff 
 if(flag) 
 { 
 while(1) 
 { 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 103
 flag=0; 
 sum_e=0; 
 k=0; 
 j=0; 
 counter=0; 
 if((pad=='P')||(pad=='V')||(pad=='M')||(pad=='Q')) break; 
 if(mode) 
 { 
 tocdodat= w_h*256 + w_l; 
 pc=p_h*256+p_l; 
 ic=i_h*256+i_l; 
 dc=d_h*256+d_l; 
 OpenPWM1(63);//156.25kHz 256 
 PORTCbits.RC0 = 0; 
 PORTCbits.RC1 = 1; 
 } 
 else 
 { 
 dutycycle=0; 
 ClosePWM1(); 
 tocdodat=0; 
 PORTCbits.RC0 = 0; 
 PORTCbits.RC1 = 0; 
 pc=0; 
 ic=0; 
 dc=0; 
 u=0; 
 v=0; 
 pre_u=0; 
 pre_ui=0; 
 pre_e=0; 
 sum_e=0; 
 } 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 104
 OpenTimer0( TIMER_INT_ON & 
 T0_8BIT & 
 T0_SOURCE_INT & 
 T0_PS_1_256 ); 
 while(1) 
 { 
 if((pad=='P')||(pad=='V')||(pad=='M')||(pad=='Q')||(flag==1)) break; 
 if(timer0_flag) 
 { 
 timer0_flag=0; 
 k++; 
 jlcd++; 
 pvc(); 
 } 
 if(k==2) 
 { 
 k=0; 
 w=tocdothuc; 
 while (BusyUSART()); 
 WriteUSART(w/256); 
 while (BusyUSART()); 
 WriteUSART(w%256); 
 while (BusyUSART()); 
 vc=u*1000; 
 WriteUSART(vc/256); 
 while (BusyUSART()); 
 WriteUSART(vc%256); 
 } 
 if(jlcd==10) 
 { 
 jlcd=0; 
 w=tocdothuc; 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 105
 sprintf(&msg[0],"\1 Toc do la: \n %lu (rpm)",w); 
 write_str_lcd(&msg[0]); 
 } 
 } 
 } 
 } 
//ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 
//pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp 
 if(pad=='P') 
 { 
 while(1) 
 { 
 if((pad=='V')||(pad==0)||(pad=='M')||(pad=='C')) break; 
 OpenPWM1(63);//156.25khz 256 
 SetDCPWM1(192);// 9V 
 PORTCbits.RC0 = 0; 
 PORTCbits.RC1 = 1; 
 OpenTimer0( TIMER_INT_ON & 
 T0_8BIT & 
 T0_SOURCE_INT & 
 T0_PS_1_256 ); 
 while(1) 
 { 
 if((pad=='V')||(pad==0)||(pad=='M')||(pad=='C')) break; 
 if(timer0_flag) 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 106
 { 
 timer0_flag=0; 
 w=tocdothuc; 
 while (BusyUSART()); 
 WriteUSART(w/256); 
 while (BusyUSART()); 
 WriteUSART(w%256); 
 while (BusyUSART()); 
 WriteUSART(9000/256); 
 while (BusyUSART()); 
 WriteUSART(9000%256); 
 sprintf(&msg[0],"\1 Toc do la: \n %lu (rpm)",w); 
 write_str_lcd(&msg[0]); 
 } 
 } 
 } 
} 
//pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp 
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
 if(pad=='V') 
 { 
 while(1) 
 { 
 if((pad==0)||(pad=='P')||(pad=='M')||(pad=='C')) break; 
 dutycycle=0; 
 ClosePWM1(); 
 tocdodat=0; 
 pc=0; 
 ic=0; 
 dc=0; 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 107
 pre_e=0; 
 sum_e=0; 
 u=0; 
 v=0; 
 pre_u=0; 
 pre_ui=0; 
 PORTCbits.RC0 = 0; 
 PORTCbits.RC1 = 0; 
 write_str_lcd(&pvcm[0]); 
 } 
 } 
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 
 if(pad=='C') 
 { 
 tocdodat=0; 
 sprintf(&message[0],"\1Nhap toc do:\nNhan L de OK"); 
 write_str_lcd(&message[0]); 
 do{ 
 if(co_tocdo) 
 { 
 co_tocdo=0; 
 if((pad>=0)&&(pad<=9)) 
 { 
 tocdodat=tocdodat+pad; 
 sprintf(&message[0],"\1V dat: %lu (rpm)\nNhan L de OK ",tocdodat); 
 write_str_lcd(&message[0]); 
 tocdodat=tocdodat*10; 
 } 
 } 
 } 
 while(pad !='L'); 
 tocdodat = tocdodat/10; 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 108
 while(1) 
 { 
 sprintf(&message[0],"\1V dat: %lu (rpm)\nNhan Q(M) de chay ",tocdodat); 
 write_str_lcd(&message[0]); 
 if((pad==0)||(pad=='P')||(pad=='V')||(pad=='M')||(pad=='C')||(pad=='Q')) break; 
 } 
 } 
//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 
 if(pad=='M') 
 { 
 OpenPWM1(63);//156.25kHz 256 
 PORTCbits.RC0 = 0; 
 PORTCbits.RC1 = 1; 
 OpenTimer0( TIMER_INT_ON & 
 T0_8BIT & 
 T0_SOURCE_INT & 
 T0_PS_1_256 ); 
 pc=5; 
 ic=300; 
 sum_e=0; 
 while(1) 
 { 
 if((pad=='P')||(pad=='V')||(pad=='C')||(pad=='Q')||(pad==0)) 
break; 
 if(timer0_flag) 
 { 
 timer0_flag=0; 
 jlcd++; 
 pvc(); 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 109
 } 
 if(jlcd==10) 
 { 
 jlcd=0; 
 w=tocdothuc; 
 sprintf(&msg[0],"\1W dat: %lu(rpm)\nW thuc: %lu(rpm)",tocdodat,w); 
 write_str_lcd(&msg[0]); 
 } 
 } 
 } 
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 
//qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 
if(pad=='Q') 
 { 
 OpenPWM1(63);//156.25kHz 256 
 PORTCbits.RC0 = 0; 
 PORTCbits.RC1 = 1; 
 OpenTimer0( TIMER_INT_ON & 
 T0_8BIT & 
 T0_SOURCE_INT & 
 T0_PS_1_256 ); 
 pc=5; 
 ic=400; 
 sum_e=0; 
 while(1) 
 { 
 if((pad=='P')||(pad=='V')||(pad=='C')||(pad=='M')||(pad==0)) break; 
Phụ lục – Code phần mềm 
Phạm Văn Cường - Hồng Văn Quân. Lớp ĐKTĐ1-K49 110
 if(timer0_flag) 
 { 
 timer0_flag=0; 
 jlcd++; 
 pvc(); 
 } 
 if(jlcd==10) 
 { 
 jlcd=0; 
 w=tocdothuc; 
 sprintf(&msg[0],"\1W dat: %lu(rpm)\nW thuc: 
%lu(rpm)",tocdodat,w); 
 write_str_lcd(&msg[0]); 
 } 
 } 
 } 
//qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
//-------------------------------------------------------------------------------------------------- 
} 
} 
            Các file đính kèm theo tài liệu này:
 Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC.pdf Thiết kế bộ điều khiển PID số trên nền vi điều khiển PIC.pdf