Professional Documents
Culture Documents
Võ Thái Linh
Nhiệm vụ:
IRFZ44N
- Để Mosfet có thể đóng cắt hiệu quả, tức là làm việc ở vùng bão hòa (ID
không phụ thuộc vào điện áp UDS) thì điện áp kích mosfet VGS = 12V
Gate driver
- Những khó khăn trong điều khiển Mosfet chủ yếu là tạo được các xung
điều khiển với sườn dựng đứng do các tụ điện kí sinh cản trở tốc độ thay
đổi của tín hiệu. Đã có nhiều vi mạch chuyên dụng phục vụ khâu này,
đó là các Driver
- Có các Driver có cách ly (TLP250, ...) hoặc không cách ly (IR2110, …)
Driver có cách ly tuy sẽ bảo vệ được VDK do có sự cách ly giữa chân
tín hiệu và chân công suất, nhưng có độ trễ khá cao so với tần số đóng
cắt của mạch (40kHz) nên dự tính chọn driver không cách ly: IR2110
- Mô phỏng mạch driver trên Proteus
Hoàng Ngọc Châu
Nhiệm vụ:
ton V 12
D out 0.5
ton toff Vin 24
Duty Cycle lý tưởng:
Ở trạng thái on, dòng đi qua MOSFET, điện áp trên cuộn cảm:
diL
L vin vout
dt
Ở trạng thái off, MOSFET mở, dòng đi qua Diode, điện áp trên cuộn cảm:
diL
L vout
dt
Vậy phương trình tổng hợp điện áp trên cuộn cảm:
diL
L (vin vout ) D ( vout )(1 D )
dt
diL vin v
D out
dt L L
Tương tự, ta có phương trình tổng hợp dòng qua tụ:
dvout v v
C (iL out ) D (iL out )(1 D )
dt R R
dvout iL vout
dt C RC
Biểu diễn 2 phương trình trạng thái trên không gian trạng thái:
dvout 1 1
dt RC 0
C vout
vin D
di
L 1 i
dt L 0 L L
v
vout 1 0 out
iL
Lập trình tạo xung PWM, đo điện áp đầu ra bằng ADC của vi điều khiển
Lập trình thuật toán phản hồi đầu ra PID
1. Lập trình tạo xung PWM, đo điện áp đầu ra bằng ADC của vi điều khiển
- Có 2 cách tạo xung PWM trên board arduino uno
Cách 1: Sử dụng hàm digitalWrite(pin, HIGH/LOW)
Hàm digitalWrite() có tác dụng xuất ra chân digital được chọn giá trị HIGH hoặc LOW ứng với 2
mức điện áp là 5V và 0V. Ta sẽ luân phiên set các giá trị HIGH và LOW trong khoảng thời gian
xác định để điều chế động rộng xung và chu kì.
VD: Ta cần xung có tần số 40kHz(T=25us), hệ số D=56%, tức là ta cần set mức HIGH trong
14us và mức LOW trong 11us
void loop() {
digitalWrite(9, HIGH);
delayMicroseconds(14);
digitalWrite(9, LOW);
delayMicroseconds(11);
}
Cách 2: Sử dụng hàm analogWrite( [chân phát xung PWM], [giá trị xung PWM]);
analogWrite() là lệnh xuất ra từ một chân trên mạch Arduino một xung PWM với tần số cố định
là 490Hz hoặc 976Hz.
Giá trị mức xung PWM nằm trong khoảng từ 0 đến 255, tương ứng với hệ số Duty cycle từ 0%
đến 100%
VD: analogWrite(5, 128) : phát xung PWM từ chân 5 với hệ số D=128/255=50%
digitalWrite analogWrite
Ưu điểm Có thể tùy chỉnh tần số và độ rộng Điều khiển chính xác, tần số cao,
bằng delay. Hoạt động độc lập và song song với
các tiến trình
Nhược Ảnh hưởng tới tốc độ xử lý 1 luồng. Tần số cố định là 976 hz (490 hz).
điểm Phụ thuộc delay.
Trong phần mô phỏng ta sẽ sử dụng chương trình dùng hàm digitalWrite()
Thực hiện mô phỏng trên phần mềm Proteus:
Sử dụng hàm analogRead(pin), ta nhận giá trị trả về từ 0-1023 (vì 2 1 = 1023)tương ứng với
10
dải điện áp từ 0-5V (5V là mức điện áp ngưỡng đối với board arduino uno)
Vậy nên giá trị điện áp đo được sẽ tính theo công thức:
adcValue *5
Vout
1023
2. Lập trình thuật toán PID
Bộ điều khiển PID được mô tả bằng mô hình vào ra có phương trình như sau
de(t )
u t k p ki * e d k d *
dt
Khi triển khai trên miền rời rạc ( với bộ điều khiển PI):
U k U k 1 k p * ek (ki * Ta k p ) * ek 1
Trong đó:
Uk
là tín hiệu điều khiển thứ k
Dựa vào thông số thu được khi mô phỏng trên MATLAB, ta có Kp=0.01; Ki=5; Ta=1ms
float Kp=0.01;
float Ki=5;
float T=pow(10,-2);
float heso0=Kp;
float heso1=-Kp+Ki*T;
//chu ki lay mau T=e-3
float u0=0;
float u1=0;
float e0=0;
float e1=0;
int pwm;
void setup()
{
pinMode(A0, INPUT);
pinMode(9, OUTPUT);
}
void loop()
{
// Đọc giá trị ADC tại chân A0
int adcValue = analogRead(A0);
// Tính toán giá trị điện áp đo được
float Vout = ((float)adcValue*5)/ 1023;
// Tính toán PID
e0=2.5-Vout;
u0=u1+heso0*e0+heso1*e1;
// Tạo xung điều khiển
pwm=ceil((u0/5)*255);
if (pwm <255 & pwm >0){
digitalWrite(9, HIGH);
delayMicroseconds(20-ceil(u0*4));
digitalWrite(9, LOW);
delayMicroseconds(ceil(u0*4));
}
if (pwm>255){
digitalWrite(9, HIGH);
delayMicroseconds(20);
}
if (pwm<=0){
digitalWrite(9, LOW);
delayMicroseconds(20);
}
u1=u0;
e1=e0;
}