Cầu H để điều chỉnh tốc độ cũng như đảo chiều quay cho động cơ.. - Hai chân ENA và ENB dung để điều khiển các mạch cầu H trong L298.. Nếu ở mức logic “1” nối với nguồn 5V thì cho phép mạ
Trang 1Trường Đại Học Sư Phạm Kỹ Thuật TP.HCM
Khoa : Điện – Điện Tử
Giảng viên : TS Nguyễn Minh Tâm
BÁO CÁO
HỆ THỐNG ĐIỀU KHIỂN NÂNG CAO
ĐỀ TÀI: Điều khiển tốc độ động cơ bằng PID có hồi tiếp.
Trang 2
Tổng quan về hệ thống gồm có:
1 Động cơ DC có encoder hồi tiếp về
2 Pic 16f887 để điều khiển động cơ
3 Cầu H để điều chỉnh tốc độ cũng như đảo chiều quay cho động cơ
4 Keypad để set tốc độ mong muốn
5 LCD để hiện thị tốc độ
6 Một bộ nguồn để cấp cho hệ toàn hệ thống
Trang 31 Động cơ:
Động cơ DC có điện áp cấp định mức là 24V DC nhưng mạch thực tế nhóm làm cấp nguồn 12V
Tốc độ quay đình mức mà nhóm điều khiển là 1500 vòng/phút Thực tế tốc độ tối đa của động cơ khoảng trên 2500 vòng/phút
Encoder có 4 dây:
+ Vcc ( dây đỏ )
Trang 4+ GND ( dây đen )
+ 2 dây tín hiệu AB ( dây xanh lá, vàng )
2 Pic 16F887:
Nguồn cấp định mức 5V
Chức năng làm bộ điều khiển trung tâm cho toàn bộ hệ thống
Điều khiển động cơ DC quay thuận nghịch
Băm xung PWM điều khiển tốc độ động cơ RC1
Nguyên lý hoạt động là vi xử lý đảm nhiệm chức năng tính toán cũn như điều khiển cấp xung khi nhận giá trị set từ keypad
3 Cầu H (IC L298).
IC L298 là một IC tích hợp nguyên khối gồm 2 mạch cầu H bên trong Với điện áp làm tăng công suất đầu ra từ 5V – 47V , dòng lên đến 4A, L298 rất thích hợp trong những ứng dụng công suất nhỏ như động cơ DC loại vừa …
Chức năng các chân của L298:
- 4 chân INPUT: IN1, IN2, IN3, IN4 được nối lần lượt với các chân 5, 7, 10, 12 của L298
Đây là các chân nhận tín hiệu điều khiển
- 4 chân OUTPUT: OUT1, OUT2, OUT3, OUT4 (tương ứng với các chân INPUT) được
nối với các chân 2, 3, 13, 14 của L298 Các chân này sẽ được nối với động cơ
- Hai chân ENA và ENB dung để điều khiển các mạch cầu H trong L298 Nếu ở mức logic
“1” (nối với nguồn 5V) thì cho phép mạch cầu H hoạt động, nếu ở mức logic “0” thì mạch cầu H không hoạt động
Với bài toán của mình ở trên, các bạn chỉ cần lưu ý đến cách điều khiển chiều quay với L298:
-Khi ENA = 0: Động cơ không quay với mọi đầu vào
-Khi ENA = 1:
- INT1 = 1; INT2 = 0: động cơ quay thuân.
- INT1 = 0; INT2 = 1: động cơ quay nghịch.
- INT1 = INT2: động cơ dừng ngay tức thì.
(tương tự với các chân ENB, INT3, INT4).
Trang 5Nguyên lý hoạt động:
Đầu vào gồm 4 chân được kết nối với PIC được dùng để điều khiển động cơ Đầu ra gồm bốn chân kết nối tương ứng với module của L298 Chân Q1 và PWM1 dùng để điều khiển bánh trái của động cơ
Trang 6PWM1 là chân dùng xung để băm xung PWM để điều khiển tốc độ của động cơ Khi chân Q1=1 thì động cơ quay thuận Q1=0 thì động cơ quay ngược lại Xung PWM1 được điều chế từ bo điều khiển chính của PIC 16F887
Tương tự đối với chân Q2 và PWM2 dùng để điều khiển bánh phải động cơ
Khi chân Q2=1 thì động cơ quay thuận Q2=0 thì động cơ quay ngược lại Xung PWM1 được điều chế từ bo điều khiển chính của PIC 16F887
Chú ý: với mạch này ta có thể điều khiển quay thuận quay ngược của cả hai động cơ DC dễ dàng mà 2 xung PWM luôn luôn hoạt động, chỉ cần đỏi tín hiệu ở 2 chân Q là động cơ DC
tự đảo chiều.
Thông số cơ bản:
Điện áp cấp là 5V
Ngõ ra là 5 V
Giản đồ xung:
Nguyên lý : Trong khoảng thời gian 0 - to ta cho van G mỏ toàn bộ điện áp nguồn Ud được đưa
ra tải Còn trong khoảng thời gian to - T cho van G khóa, cắt nguồn cung cấp cho tải Vì vậy với
to thay đổi từ 0 cho đến T ta sẽ cung cấp toàn bộ , một phần hay khóa hoàn toàn điện áp cung
Trang 7cấp cho tải.
+ Công thức tính giá trị trung bình của điện áp ra tải :
Gọi t1 là thời gian xung ở sườn dương (khóa mở ) còn T là thời gian của cả sườn âm và dương, Umax là điện áp nguồn cung cấp cho tải
==> Ud = Umax.( t1/T) (V)
hay Ud = Umax.D
Ở đây nhóm tạo xung PWM bằng Pic 16F887 bằng cách dung chân RC1
Code ví dụ của microC:
void InitMain() {
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
PORTC = 0; // set PORTC to 0
TRISC = 0; // designate PORTC pins as output
PWM1_Init(5000); // Initialize PWM1 module at 5KHz
PWM2_Init(5000); // Initialize PWM2 module at 5KHz
}
void main() {
InitMain();
current_duty = 16; // initial value for current_duty
current_duty1 = 16; // initial value for current_duty1
PWM1_Start(); // start PWM1
PWM2_Start(); // start PWM2
PWM1_Set_Duty(current_duty); // Set current duty for PWM1
PWM2_Set_Duty(current_duty1); // Set current duty for PWM2
Trang 84 Keypad set tốc độ:
Bản chất thật sự của keypad là một ma trận bàn phím, dùng các nút nhấn để hiệu chỉnh tốc độ mong muốn từ người điều khiển
Một đoạn code mẫu trong microC:
unsigned short kp, cnt, oldstate = 0;
char txt[6];
// Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
void main() {
cnt = 0; // Reset counter
Keypad_Init(); // Initialize Keypad ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1, 1, "1");
Lcd_Out(1, 1, "Key :"); // Write message text on LCD
Lcd_Out(2, 1, "Times:");
do {
kp = 0; // Reset key code variable
// Wait for key to be pressed and released
do
// kp = Keypad _Key_Press(); // Store key code in kp variable
kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);
// Prepare value for output, transform key to it's ASCII value
switch (kp) {
//case 10: kp = 42; break; // '*' // Uncomment this block for
keypad4x3
//case 11: kp = 48; break; // '0'
Trang 9//case 12: kp = 35; break; // '#'
//default: kp += 48;
case 1: kp = 49; break; // 1 // Uncomment this block for
keypad4x4
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 4: kp = 65; break; // A
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 8: kp = 66; break; // B
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 12: kp = 67; break; // C
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
case 16: kp = 68; break; // D
}
if (kp != oldstate) { // Pressed key differs from
previous
cnt = 1;
oldstate = kp;
}
else { // Pressed key is same as previous
cnt++;
}
Lcd_Chr(1, 10, kp); // Print key ASCII value on LCD
if (cnt == 255) { // If counter varialble overflow
cnt = 0;
Lcd_Out(2, 10, " ");
}
WordToStr(cnt, txt); // Transform counter value to string
Lcd_Out(2, 10, txt); // Display counter value on LCD
} while (1);
}
Trang 105 LCD hiển thị:
Nhóm sử dụng LCD 16x2 (LCD HD44780 ).
1 Vss Chân nối đất cho LCD, khi thiết
kế mạch ta nối chân này với GND của mạch điều khiển
thiết kế mạch ta nối chân này với VCC=5V của mạch điều khiển
LCD.
select) Nối chân RS với logic
“0” (GND) hoặc logic “1” (VCC)
để chọn thanh ghi.
+ Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ “ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read) + Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên
Trang 11trong LCD.
(Read/Write) Nối chân R/W với logic “0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1”
để LCD ở chế độ đọc.
các tín hiệu được đặt lên bus DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào(chấp nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low transition) của tín hiệu chân E + Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân
E xuống mức thấp.
-DB7
Tám đường của bus dữ liệu dùng
để trao đổi thông tin với MPU
Có 2 chế độ sử dụng 8 đường bus này :
+ Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7.
+ Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7
Trang 136.Bộ nguồn:
Mạch nguồn được tận dụng từ mạch nguồn của máy tính để bàn củ mượn của xường 4A
Điều khiển động cơ bằng phương pháp PID
PWM1_Init(5000);
Kp1=1.2555;
Ki=0;
Kd=0;
Với các thông số PID như thế thì hệ thống ổn định ở 1500v/p
a=count*600/400; //la 1 vong 400 xung
count=0; // so xung trongm 0,1s
TMR1H=0b01011110;
TMR1L=0b01011000;
TMR1IF_bit=0;
Trang 14E1=set_value-a; // sai s0 //kp la he khuyet dai
I1=I1+0.05*(E1+E2); //ki la he khau tich phan
D1= (E2-E1)/0.1; //kd la he so vi phan
u=Kp1*E1+Ki*I1+Kd*D1;
E2=E1;
Và đây là đoạn code để tính các hệ số và tính cờ ngắt cho pic
L4 L5 L0 L1 L2 L3
K3
K1
K4
K6
K0
K7
K1 K3 K5
IN1
ENA
L0
L5
L1 L3
IN1 ENA IN2
X1
8MHz
C1
30p
C2
30p
R1
10k
RESET
RE3/MCLR/VPP 1
RA1/AN1/C12IN1-3 RA2/AN2/VREF-/CVREF/C2IN+
4 RA4/T0CKI/C1OUT 6
RA5/AN4/SS/C2OUT 7
RB0/AN12/INT 33 RB1/AN10/C12IN3-34
RB2/AN8 35 RA7/OSC1/CLKIN
13 RA6/OSC2/CLKOUT 14
RD5/P1B 28 RD6/P1C 29 RD7/P1D 30
RC4/SDI/SDA 23 RC5/SDO 24 RC3/SCK/SCL 18 RC2/P1A/CCP1 17 RC1/T1OSI/CCP2 16 RC0/T1OSO/T1CKI 15
RB7/ICSPDAT
40 RB6/ICSPCLK
39 RB5/AN13/T1G
38 RB4/AN11 37
RD3 22 RD2 21 RD1 20 RD0 19 RC7/RX/DT 26 RC6/TX/CK 25
RE2/AN7 10 RE1/AN6 9 RE0/AN5 8
RA3/AN3/VREF+/C1IN+
5
RD4 27
RB3/AN9/PGM/C12IN2-36
RA0/AN0/ULPWU/C12IN0-2
U2
PIC16F887 PROGRAM=hoi tiep encoder.hex
LCD1
LM016L
3
RV2
10k
1 2
1
1 2
2
1 2
3
1 2
4
1 2
5
1 2
6
1 2
7
1 2
8
1 2
9
1 2
0
1 2
CLEAN
1 2
SET
1 2
RW
1 2
FW
1 2
STOP
1 2
MUTE
R2
10k R3
10k R4
10k R5
10k
IN1 5 IN2 7
ENA 6
OUT1 2 OUT2 3 ENB
11 OUT3 13
OUT4 14
IN3 10 IN4 12
SENSA 1 SENSB
15 GND 8
VS 4 VCC
9 U1
L298
+24V
M1 M2
D1
1N4007
D2
1N4007
D3
1N4007
D4
1N4007
+88.8
+24V
LS1
SOUNDER CLK
Hình ảnh trên mô phỏng của nhóm
Hình ảnh thức tế đã nộp cho thầy lúc báo cáo