You are on page 1of 13

Báo cáo giữa kì Đồ Án 2

Võ Thái Linh
Nhiệm vụ:

 Tính toán thông số mạch Buck Converter, Gate Driver


 Mô phỏng hệ thống với tải thuần trở trên psim

Mạch Buck converter cơ bản:

 Các yêu cầu cho trước:


- Điện áp đầu vào, đầu ra: Ui = 24V, Uo = 12V.
- Dòng điện đầu ra Idm = 0.8A
- Độ đập mạch điện áp đầu ra∆ Uo=0.5%Uo=0.06 V
- Độ đập mạch dòng qua cuộn cảm ∆ IL=20 %IL=¿0.16A

 Các bước tính toán


- Xác định hệ số điều chế D = Ton/Ts = Uo/Ui = 12/24 = 0.5
Ts = 1/f = 25us
- Xác định giá trị L C
L = (Ts/∆ IL)*(1- Uo2 /Ui) = 0.781mH
C = (Ts2 /(8 LC) ¿∗¿ 1- Uo2 /Ui) = 8uC
- Lựa chọn MOSFET, Diode
Iv.max = Id.max = IL+∆ IL/2 = 0.88A
- Sử dụng tải định mức để mô phỏng
Rdm = 12/0.8 = 15Ω

 Mô phỏng Buck cơ bản bằng PSIM


Dạng điện áp và dòng điện trên cuộn cảm L
Dạng điện áp đầu ra Uo

 MOSFET và Gate Driver

 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ụ:

 Mô hình hóa bộ Buck trên các trạng thái làm việc


 Thiết lập hàm truyền của đối tượng, mô phỏng hệ thống trên MATLAB Simulink

Sơ đồ Buck converter ở 2 trạng thái

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 

Từ mô hình trạng thái đã xây dựng ta có hàm truyền của hệ thống:


vout ( s )
 C  sI  A B
1
G( s) 
D( s)
1
 1 1
 sI  RC  
C
0
 G ( s )   1 0   v 
 1  in 
0  L
 L 
vin
 G ( s)  LC
1 1
s2  s
RC LC
Kết hợp các thông số L, C, R đã tính toán, ta mô phỏng hệ thống sử dụng bộ điều khiển
PI với thông số Kp = 0.074602, Ki = 25.9197 thu được từ công cụ PID Tuner:
Kết quả mô phỏng:
Nguyễn Tuấn Minh
Nhiệm vụ:

 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:

Hình 1. Mô hình mô phỏng


Hình 2. Dạng xung PWM đầu ra
Kết quả mô phỏng cho thấy điện áp đầu ra giao động quanh điện áp 12V, tần số của xung đo
được là 39kHz. Khi triển khai mô hình thực tế ta phải sử dụng hàm analogWrite() để đảm bảo
tần số được chính xác, tuy nhiên ta sẽ phải thay đổi tần số mặc định bằng cách truy cập vào
các thanh ghi điều khiển ( sẽ triển khai sau do không thể mô phỏng ESP8266).

- Đo điện áp bằng ADC của vi điều khiển


Board arduino uno có chân ADC gồm các chân từ A0 đến A5, đây là 1 bộ ADC 10bit

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

ek là độ lệch giữa tín hiệu đầu vào và đầu ra thứ k

Ta là chu kì trích mẫu

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

Code thuật toán PID:

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;
}

You might also like