Đây là BTL môn VXL cô Thuỳ ĐHBKHN, Để lấy code cũng như mạch mô phỏng, liên hệ mình qua FB: https:www.facebook.comHieu2705 Ngoài ra mình còn có đề tài về Đèn GT cũng như nhận làm các đề tài khác theo yêu cầu.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Hà Nội, 05-2018
Trang 21
MỤC LỤC
MỤC LỤC 1
DANH MỤC HÌNH ẢNH 2
CHƯƠNG 1 LƯU ĐỒ THUẬT TOÁN 3
CHƯƠNG 2 MẠCH MÔ PHỎNG 4
2.1 Các khối linh kiện 4
2.2 Sơ đồ mạch mô phỏng 7
2.3 Kết luận 7
CHƯƠNG 3 CHƯƠNG TRÌNH CHO VĐK 8
3.1 Khối khởi tạo 8
3.2 Khối đo tốc độ 11
3.3 Khối điều khiển 12
3.4 Khối hiển thị tốc độ 14
3.5 Chương trình tạo trễ 15
3.6 Chương trình chính 16
3.7 Kết luận 16
CHƯƠNG 4 CHẠY MÔ PHỎNG 17
4.1 Kiểm tra thoạt động mức STOP 17
4.2 Kiểm tra hoạt động mức 10% đến 90% 17
4.3 Kiểm tra hoạt động mức MAX 21
4.4 Kết luận 21
Trang 32
DANH MỤC HÌNH ẢNH
Hình 2.1 VĐK 89C51 trên Proteus 4
Hình 2.2 Khối động cơ 4
Hình 2.3 LED7-3 số 5
Hình 2.4 Bảng điều khiển 6
Hình 2.5 Mạch mã hoá 74LS147 6
Hình 2.6 Ngắt điều khiển 7
Hình 2.7 Sơ đồ mạch nguyên lý trên phần mềm mô phỏng Proteus 7
Hình 4.1 Mô phỏng với mức điều khiển STOP 17
Hình 4.2 Mô phỏng với mức điều khiển 10% 18
Hình 4.3 Thông số xung PWM ở mức điều khiển 10% 18
Hình 4.4 Mô phỏng với mức điều khiển 50% 19
Hình 4.5 Thông số xung PWM ở mức điều khiển 50% 19
Hình 4.6 Mô phỏng với mức điều khiển 80% 20
Hình 4.7 Thông số xung PWM ở mức điều khiển 80% 20
Hình 4.8 Mô phỏng với mức điều khiển MAX 21
Trang 43
CHƯƠNG 1 LƯU ĐỒ THUẬT TOÁN
Trong chương đầu tiên này, em sẽ trình bày lưu đồ thuật toán “Đo và điều khiển tốc độ động cơ DC bằng phương pháp điều chế độ rộng xung sử dụng Vi Điều Khiển 8051”
Theo lưu đồ thuật toán trên, em sẽ sử dụng 4 ngắt: ngắt INT0 để nhận điều khiển, ngắt Timer 0 kết hợp ngắt INT1 để đo tốc độ, ngắt Timer 1 dùng để để tạo xung PWM Trong bước tiếp theo em sẽ triển khai thiết kế mạch bằng cách dùng phần mềm mô phỏng Proteus
Y - Nhận giá trị điều khiển
- Xử lý, lưu giá trị điều khiển
- Hiển thị giá trị đang điều khiển
- Đếm số lần ngắt
- Tại lần ngắt thứ 20 (1 giây):
+Trả về số xung và tính toán tốc độ + Reset biến đếm xung
Tăng biến đếm xung
-Đếm số lần ngắt, cứ 10 ngắt tạo thành
1 chu kỳ PWM (10ms)
- So sánh biến đếm với giá trị điều khiển, nếu biến đếm bằng giá trị điều khiển thì tắt Xung PWM, đợi chu kỳ PWM mới, nếu chưa bằng thì bật PWM -Reset biến đếm tại lần ngắt thứ 10
Trang 54
CHƯƠNG 2 MẠCH MÔ PHỎNG
Từ ý tưởng đã thể hiện trong lưu đồ thuật toán, trong chương này, em sẽ trình bày sơ lược các linh kiện được sử dụng, cách ghép nối và phân tích các chức năng của chúng Sử dụng phần mềm mô phỏng: Proteus 8.5 SP0 build 22067
2.1 Các khối linh kiện
Trang 65
Motor DC có cảm biến tốc độ với ba đầu ra, trong đó hai đầu ra có độ phân giải: 12 xung/ vòng và một đầu ra có độ phân giải 1 xung/ vòng
Vì dòng ra từ VĐK nhỏ, chỉ tầm 15mA-20mA nên em đã sử dụng Transistor
để chịu được dòng tải của động cơ Transistor là loại NPN, hoạt động ở trạng thái bão hoà, động cơ hoạt động khi chân PWM của VĐK có mức logic 1
Điện trở và diode có chức năng tiêu tán dòng từ động cơ khi Transitor chuyển thạng thái từ dẫn sang không dẫn
2.1.3 Khối hiển thị
Khối hiển thị có chức năng hiện thì tốc độ của động cơ, đơn vị: Vòng/giây
LED 7 thanh được dùng là loại led 7 thanh- 3 số chung cực Dương (LED này được chỉnh sửa thủ công từ LED 7- 4 số) LED có hình dạng và phân bố chân như hình 1.3
Hi ̀nh 2.3 LED7-3 số
Như trên hình 1.3, dữ liệu đưa vào LED và cổng P1 Ngoài ra còn sử dụng
3 chân P3.5 P3.6 P3.7 để chọn LED sáng (sử dụng phương pháp quét LED- Tần
số quét led là 666Hz)
2.1.4 Khối điều khiển
Khối điều khển có chức năng điều khiển tốc độ động cơ Với bước nhảy cấp
là 10% (từ trạng thái đứng yên đến tốc độ định mức)
Trang 76 (do đẩu ra Bộ giải mã tích cực mức thấp)
Hi ̀nh 2.5 Mạch mã hoá 74LS147
Như mô tả ở hình 1.5, mạch giải mã chỉ có 9 chân đầu vào nên 2 tín hiệu STOP và MAX (tốc độ định mức) được đưa trực tiếp vào 2 chân P2.4 và P2.5
Trang 87
Ngoài hai khối chính trên, để VĐK nhận biết được thời điểm thay đổi tốc
độ, trong khối này em còn sử dụng thêm mạch AND với 6 đầu vào và 1 đầu ra Trong đó, 6 đầu vào của phần tử AND nối với 4 đầu ra của Mạch giải mã và 2 tín hiệu STOP và MAX Đầu ra mạch AND nối vào ngõ vào ngắt INT0
Hi ̀nh 2.6 Ngắt điều khiển
Hình 1.6 mô tả cách ghép nối phần tử AND
2.2 Sơ đồ mạch mô phỏng
Hình 2.7 là sơ đồ mạch nguyên lý trên phần mềm mô phỏng Proteus
Hi ̀nh 2.7 Sơ đồ mạch nguyên lý trên phần mềm mô phỏng Proteus
2.3 Kết luận
Từ sơ đồ nguyên lý đã vẽ, em đã có tiến hành viết chương trình cho VĐK 89C51
Trang 98
CHƯƠNG 3 CHƯƠNG TRÌNH CHO VĐK
Trong chương này, em sẽ trình bày chương trình và giải thích hoạt động của chương trình Chương trình được viết và dịch trên Keil C C51 version 9.01
Chương trình đo được tốc độ tối đa: 20 vòng/giây
3.1 Khối khởi tạo
3.1.1 Bắt đầu chương trình
3.1.1.1 Đặt tên gọi
Để thuận tiện trong khi lập trình, em đã đặt tên một số Byte và Bit được sử dụng như sau:
; Tên các bit, byte liên quan đến điều khiển
level DATA P0; Đặt tên cổng P0 là level, cổng báo mức điều khiển
bdieukhien bit P3.2; Đặt tên bit P3.2 là bdieukhien, bit báo điều khiển
input DATA P2; Đặt tên cổng P2 là inout, cổng vào điều khiển khiển
bstop bit P2.4; Đặt tên bit P2.4 là bstop, bit điều khiển STOP
bmax bit P2.5; Đặt tên bit P2.5 là bmax, bit điều khiển MAX
bpwm bit P3.0; Đặt tên bit P3.0 là bpwm, bit ra PWM
;Tên bit vào ngắt INT1 (đo tốc độ)
btocdo bit P3.3; Đặt tên bit P3.3 là btocdo, bit xung động cơ
;Tên các bit, byte liên quan đến hiển thị tốc độ
led DATA P1; Đặt tên cổng P1 là led, cổng ra hiển thị LED
dot bit P1.7; Đặt tên bit P1.7 là dot, bit hiển thị dấu chấm
seled1 bit P3.5; Đặt tên bit P3.5 là seled1, bit chọn LED hàng chục
seled2 bit P3.6; Đặt tên bit P3.6 là seled2, bit chọn LED đơn vị
seled3 bit P3.7; Đặt tên bit P3.7 là seled3, bit chọn LED hàng thập phân
Trang 109
;Tên của các biến dùng để lưu giá trị
t DATA 00H; Đặt tên Byte có địa chỉ 00H (R0) là t, Byte đếm ngắt Timer 0
n DATA 01H; Đặt tên Byte có địa chỉ 01H (R1) là n, Byte lưu kết quả xung count DATA 02H; Đặt tên Byte có địa chỉ 02H (R2) là count, Byte đếm ngắt INT1
KQ_Nguyen DATA 03H;Đặt tên Byte có địa chỉ 03H (R3) là KQ_Nguyen,
Byte lưu kết quả phần thập nguyên (Vòng/Giây)
KQ_ThPhan DATA 04H; Đặt tên Byte có địa chỉ 04H (R4) là KQ_ThPhan,
Byte lưu kết quả phần thập phân (Vòng/Giây)
Tx DATA 05H; Đặt tên Byte có địa chỉ 05H (R5) là Tx, Byte đếm thời gian
xung đầu ra PWM
REF DATA 06H; Đặt tên Byte có địa chỉ 06H (R6) là REF, Byte lưu giá trị dữ
liệu điều khiển
3.1.1.2 Bắt đầu chương trình
Bắt đầu chương trình:
ORG 000H; Điểm nhập hệ thống
LJMP MAIN; Nhảy đến nhãn MAIN
ORG 0003H; Vector ngắt INT0 (Ngắt điều khiển)
LJMP DIEUKHIEN; Nhảy đến chương trình ngắt INT0 (DIEU KHIEN) ORG 000BH; Vector ngắt TIMER0 (Ngắt tạo thời gian thực 1 giây)
SJMP SECOND; Nhảy đến chương trình ngắt TIMER0 (SECOND)
ORG 0013H; Vector Ngắtt INT1 (Ngắt xung tốc độ động cơ)
SJMP DEMXUNG; Nhảy đến chương trình ngắt INT1 (DEMXUNG)
ORG 001BH; Vector ngắt TIMER0 (Ngắt tạo xung PWM)
LJMP PWM; Nhảy đến chương trình ngắt TIMER 1 (PWM)
ORG 30H; Điểm nhập chương trình
Trang 1110
3.1.2 Khởi tạo giá trị
Trong chương trình này, em có sử dụng 4 ngắt bao gồm: Ngắt ngoài INT0; Ngắt Timer 0; Ngắt ngoài INT1 và ngắt Timer 1 với thứ tự ưu tiên mặc định:
KHOITAO:
;Khởi tạo ngắt
SETB EA; Cho phép ngắt toàn cục
; Khởii tạo Ngắt Timer0/1
MOV TMOD,#11H; Timer 0 chế độ 1 và Timer 1 chế độ 1
SETB ET0; Cho phép ngắt Timer 0
SETB TR0; Khởi động bộ định thời Timer 0
SETB TR1; Khởi động bộ định thời Timer 1
;Khởi tạo ngắt INT0/INT1
SETB bdieukhien; Khai báo bdieukhien là ngõ vào
SETB EX0; Cho phép ngắt ngoài INT 0
SETB IT0; INT0 ngắt theo chế độ sườn xuống
SETB btocdo;Khai báo btocdo là ngõ vào
SETB EX1; Cho phép ngắt ngoài INT 1
SETB IT1; INT1 ngắt theo chế độ sườn xuống
;Cài đặt các ngõ, cổng chế độ vào
MOV input, #0FFH; Khai báo input là cổng vào
SETB bstop; Khai báo bstop là ngõ vào
SETB bmax; Khai báo bmax là ngõ vào
;Khởi tạo các giá trị cần thiết
MOV DPTR, #ALED; Nạp giá trị Bảng mã ALED cho thanh ghi DPTR;
MOV level, #0C0H; Khởi tạo #0C0H cho level (Đèn báo điều khiển hiển thị số 0) RET; Kết thúc chương trình con (KHOITAO)
Trang 12INC count; Đếm xung tốc độ
RETI ; Kết thúc chương trình ngắt (DEMXUNG)
3.2.2 Khối tạo thời gian thực
Khối này sử dụng ngắt Timer 0 để tạo thời gian thực 1s
SECOND:
PUSH ACC; Sao lưu thanh ghi A vào ngăn xếp
PUSH B; Sao lưu thanh ghi B vào ngăn xếp
MOV TH0, #3CH
MOV TL0, #0B0H; Đếm 50.000 xung (50ms)
SETB TR0; Khởi động bộ định thời Timer 0
INC t; Tăng biến t đếm số lần ngắt Timer 0
MOV A, t; Chuyển dữ liệu của t vào A để chuẩn bị so sánh
CJNE A, #20, CONTINUE; Kiểm tra xem đã đủ 20 lần ngắt (1s) hay chưa
;Nếu chưa thì nhảy đến nhãn CONTINUE để kết thúc ngắt Timer 0
;Nếu t=20 thì trả về kết quả, khởi tạo lại biến đếm, tính toán kết quả rồi thoát
MOV n, count; Trả về kết quả đếm xung
MOV count,#0H; Khởi tạo lại biến đếm xung
MOV t, #0H; Khởi tạo lại biến đếm số lần ngắt Timer 0
ACALL KETQUA; Gọi chương trình con tính kết quả
CONTINUE:
POP B; Khôi phục lại thanh ghi B từ ngăn xếp
POP ACC; Khôi phục lại thanh ghi A từ ngăn xếp
RETI ; Thoát khỏi chương trình ngắt Timer 0
Trang 1312
3.3 Khối điều khiển
Khối điều khiển có nhiệm vụ nhận tín hiệu vào và đưa ra tín hiệu điều khiển tương ứng Trong khối này em dùng ngắt INT0 để nhận biết đang có tín hiệu điều khiển và gọi hàm tính toán giá trị điều khiển Ngắt Timer1 dùng để phát xung trên
cơ sở tín hiệu điều khiển đã nhận được
3.3.1 Khối nhận giá trị điều khiển
Khối nhận tín hiệu điều khiển sử dụng cổng vào P2 và tín hiệu báo điều khiển
là ngắt INT0 theo sườn xuống, vì vậy khối này là chương trình ngắt INT0
DIEUKHIEN:
PUSH ACC; Sao lưu thanh ghi A vào ngăn xếp
MOV A, P2; Nhận giá trị điều khiển từ P2, đưa vào A
JNB bstop, STOP; Kiểm tra xem có phải tín hiệu STOP
JNB bmax, MAX; Kiểm tra xem có phải tín hiệu MAX
SJMP ADJ; Nhảy đến nhãn ADJ nếu không phải STOP hoặc MAX
STOP: ; Nếu là tín hiệu STOP
MOV REF, #0; Gán giá trị đặt REF bằng 0
MOV A, REF;Chuyển giá trị điều khiển REF cho A
MOVC A,@A+DPTR; Lấy số có thứ thự A trong Bảng ALED (DPTR chứa địa chỉ
đầu tiên bảng ALED đã khai báo ở chương trình khởi tạo) và lưu vào A
MOV level, A; Xuất giá trị A (mức điều khiển) ra led báo mức điều khiển
POP ACC; Khôi phục lại thanh ghi A từ ngăn xếp
RETI; Kết thúc chương trình ngắt INT0 (DIEUKHIEN)
MAX:
MOV REF, #10; Gán giá trị đặt REF bằng 10
MOV A, REF;Chuyển giá trị điều khiển REF cho A
MOVC A,@A+DPTR; Lấy số có thứ thự A trong Bảng ALED
MOV level, A; Xuất giá trị A (mức điều khiển) ra led báo mức điều khiển
POP ACC; Khôi phục lại thanh ghi A từ ngăn xếp
RETI; Kết thúc chương trình ngắt INT0 (DIEUKHIEN)
Trang 1413
ADJ: Nếu không phải là tín hiệu STOP hoặc START
CPL A; Hiệu chính kết quả do tín hiệu điều khiển tích cực mức thấp
MOV REF, A; Chuyển giá trị điều khiển đã hiệu chỉnh vào REF
MOVC A,@A+DPTR; Lấy số có thứ thự A trong Bảng ALED
MOV level, A; Xuất giá trị A (mức điều khiển) ra led báo mức điều khiển
POP ACC; Khôi phục lại thanh ghi A từ ngăn xếp
RETI; Kết thúc chương trình ngắt INT0 (DIEUKHIEN)
3.3.2 Khối tạo xung PWM
Khối tạo xung có chức năng dựa vào dữ liệu ở REF để đưa ra tín hiệu PWM tương ứng Khối này sử dụng ngắt Timer 0, tần số PWM là 100Hz (cứ 10 ngắt Timer lại tạo 1 xung) Vì vậy có thể chia xung PWM với 10 độ rộng khác nhau
MOV A, Tx; Chuyển dữ liệu từ Tx vào A
INC Tx; Tăng biến đếm thời gian PWM lên 1
CHECK1: ;
CJNE A, #9, CHECK2; Nếu Tx khác 9 (chưa bằng 9) thì nhảy đển CHECK2
MOV Tx, #0 ; Nếu Tx bằng 9 (lần ngắt thứ 10) thì khởi tạo lại biến đếm Tx
CHECK2:
CJNE A, REF, CHECK3; Kiểm tra xung PWM đạt độ rộng điều khiển chưa
CLR bpwm; Xung ra PWM ở mức thấp
POP ACC; Khôi phục lại thanh ghi A từ ngăn xếp
RETI; Kết thúc chương trình ngắt Timer 1
CHECK3:
JNZ EXIT; Kiểm tra xem có phải chu kỳ PWM mới, (Tx=0)( A đang bằng Tx) SETB bpwm; Xung ra PWM ở mức cao
EXIT: ;Nếu chưa bắt đầu chu kỳ mới (Tx khác 0)
POP ACC; Khôi phục lại thanh ghi A từ ngăn xếp
RETI; Kết thúc chương trình ngắt Timer 1
Trang 15MOV A,n; Nạp giá trị xung đã đo n vào thanh ghi A
MOV B, #12; Nạp giá trị 12 cho B vì Động cơ có 12 xung/vòng
DIV AB; Quy đổi đơn vị xung/giây ra vòng/giây
MOV KQ_Nguyen, A; Lưu giữ kết quả phần nguyên (Lớn nhất là 255/12=21)
;Lấy thêm 1 số thập phân
MOV A, #10; Nạp giá trị 10 cho A
MUL AB; Nhân A với B (Nhân phần dư ở B với 10)
MOV B,#12; Nạp giá trị 12 cho B vì Động cơ có 12 xung/vòng
DIV AB; Quy đổi đơn vị xung/giây ra vòng/giây
MOV KQ_ThPhan, A; Lưu giữ kết quả phần thập phân (Lớn nhất là 110/12=9) RET ; Kết thúc chương trình con (KETQUA)
3.4.2 Khối hiển thị tốc độ
Sau khối xử lý tốc độ, kết quả đo tốc độ đã có đơn vị vòng trên giây, được chia thành 2 phần là phần nguyên (giá trị lớn nhất là 21) và phần thập phân (giá trị lớn nhất là 9) Vì vậy phần hiển thị sẽ hiển thị 3 số: hàng chục, đơn vị và thập phân
HIENTHI:
;Hàng chục
MOV A,KQ_NGUYEN; Nạp giá trị phần nguyên tốc độ cho A
MOV B, #10; Nạp giá trị 10 cho B
DIV AB; Tìm hàng chục (Thanh ghi A)
MOVC A,@A+DPTR; Lấy số có thứ thự A trong Bảng ALED
MOV led,A; Xuất giá trị A (hàng chục) ra led
SETB seled1; Bật LED hàng chục;
ACALL DELAY; Trễ LED hàng chục sáng
CLR seled1; Tắt LED hàng chục
Trang 1615
;Hàng đơn vị
MOV A, B; Chuyển hàng đơn vị từ B đến A (B chứa dư phép chia KQ_Nguyen với 10)
MOVC A,@A+DPTR; Lấy số có thứ thự A trong Bảng ALED và lưu vào A
MOV led, A; Xuất giá trị A (hàng đơn vị) ra LED
CLR dot; Hiển thị dấu chấm ngăn cách hàng đơn vị và hàng thập phân
SETB seled2; Bật LED hàng đơn vị
ACALL DELAY ; Trễ LED hàng đơn vị sáng
CLR seled2; Tắt LED hàng đơn vị
;Hàng thập phân
MOV A, KQ_ThPhan; Chuyển hàng thập phân vào A
MOVC A,@A+DPTR; Lấy số có thứ thự A trong Bảng ALED và lưu vào A
MOV led, A; Xuất giá trị A (hàng thập phân) ra LED
SETB seled3; Bật LED hàng thập phân
ACALL DELAY ; Trễ LED hàng thập phân sáng
CLR seled3; Tắt LED hàng thập phân
SJMP HIENTHI ; Lặp lại chương trình hiển thị (Chạy vô tận)
RET; Kết thúc chương trình hiển thị
DJNZ R7, BACK; Giảm R7 rồi nhảy đến BACK nếu R7 khác 0; (2 chu kỳ)
NOP; Không làm gì (1 chu kỳ)
RET; Kết thúc chương trình Delay 500us (2 chu kỳ)
Thời gian trễ: Tđ=1 +248*2+1+2= 500uS
Trang 1716
3.6 Chương trình chính
MAIN:
ACALL KHOITAO; Gọi chương trình khởi tạo
ACALL HIENTHI; Gọi chương trình hiển thị (chạy vô tận)
Chương trình viết cho động cơ một chiều có độ phân giải cảm biến đo tốc độ
là 12 xung/vòng đã hoàn chính Qua chương trình đã viết, em rút ra một số kết luận sau đây
3.7.1 Giới hạn đo tốc độ
Vì chương trình sử dụng biến đếm 1 byte để đếm xung tốc độ trong 1 giây, vì vậy giới hạn tốc độ là: 𝑁𝑚𝑎𝑥 =255
12 = 21.2 vòng/ giây (1272 vòng/ phút) Để đảm bảo tính dự phòng khi có sai số, tốc độ tối đa khuyên dùng không vượt quá
20 vòng/giây (1200 vòng/phút)
Khi vượt quá giới hạn tốc độ tối đa, tốc độ đo được là số dư của tốc độ thực tế khi chia cho 21.2: 𝑁𝐻𝑖ể𝑛 𝑡ℎị = 𝑁𝑇ℎự𝑐 𝑡ế − 𝐾 ∗ 21.2 với K nguyên, K ≥ 2
3.7.2 Giới hạn điều khiển
Chương trình không có giới hạn về điều khiển, giới hạn điều khiển phục thuộc vào các linh kiện phần cứng
Đặc tính điều khiển: Điều khiển nhảy cấp, bước nhảy 10%