feat: 電流環 ff_term tune done
ff_term = (2800 - vac_avg1) * PFC_DUTY_MAX / 2800 - 200
This commit is contained in:
@@ -32,7 +32,7 @@ extern "C"
|
||||
#define YN_MAX (PFC_DUTY_MAX << 14)
|
||||
#define YN_MIN (PFC_DUTY_MIN << 14)
|
||||
// VBUS 參數
|
||||
#define VBUS_SET 340 // unit: volt (Transformer N = 14)
|
||||
#define VBUS_SET 350 // unit: volt (Transformer N = 14)
|
||||
#define VBUS_SET_H (VBUS_SET + 20) // burst mode in, 在過零區判斷
|
||||
#define VBUS_SET_L (VBUS_SET - 20) // burst mode out, 在過零區判斷
|
||||
// #define VBUS_SET_H2 370 // for skip mode
|
||||
|
||||
@@ -458,10 +458,13 @@ __attribute__((always_inline)) static inline void Cur_Loop_PFC_2P2Z(void) // 優
|
||||
uint16_t local_duty = 0;
|
||||
|
||||
int32_t ff_term;
|
||||
// if (vac_avg1 > 0) ff_term = ((uint32_t)(2800 - vac_avg1) * PFC_DUTY_MAX) / 2800;
|
||||
// 低一點中間不會有尖波,且輸出功率小一點
|
||||
ff_term = 0;
|
||||
local_duty = (uint16_t)((y_n >> 14) + ff_term);
|
||||
ff_term = (2800 - vac_avg1) * PFC_DUTY_MAX / 2800 - 200;
|
||||
|
||||
if (ff_term < 0) ff_term = 0;
|
||||
if (vbus_comp2 >= 1000)
|
||||
local_duty = (uint16_t)((y_n >> 14) + ff_term);
|
||||
else
|
||||
local_duty = (uint16_t)(y_n >> 14);
|
||||
|
||||
// local_duty = (uint16_t)(y_n >> 14);
|
||||
// 4. 硬體 Duty 限幅與輸出
|
||||
@@ -606,7 +609,7 @@ void Handle_UART_Monitor(void)
|
||||
{
|
||||
// printf("%d %d %d\r\n", vac_pk1, vac_pk2, is_brown_in);
|
||||
// printf("%d %d %d %d %d %d", power_on_cmd, sys_state, vbus_comp2, print1, print2, print3);
|
||||
msg("%d %d %d %d\r\n", power_on_cmd, sys_state, vbus_comp2, vbus_avg);
|
||||
msg("%d %d %d", power_on_cmd, sys_state, vbus_comp2);
|
||||
// 電壓環輸出最大 COMP,但是電流環輸出最小 DUTY
|
||||
msg_timer = sys_get_tick();
|
||||
}
|
||||
@@ -774,7 +777,7 @@ int main(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1 // 單測 PFC 電流環 (OK)
|
||||
#if 0 // 單測 PFC 電流環 (OK)
|
||||
/* PFC 電流環參數*/
|
||||
// Z1=200, Z2=1000000, P1=10, P2=20000, G=10000
|
||||
bplot_p->b0 = 4192101;
|
||||
@@ -808,7 +811,7 @@ int main(void)
|
||||
// vbus_comp_1 = (10 << 14); // 假設從一個極小的係數開始
|
||||
vbus_err_1 = 0; // 清除誤差歷史
|
||||
// vbus_comp2 = (vbus_comp_1 >> 9); // 讓電流環拿到的初始值是 10
|
||||
vbus_comp2 = 1000;
|
||||
vbus_comp2 = 3000;
|
||||
// vset / 5700
|
||||
// vbus_comp2: 3000, 275V / 0.25A = 68W
|
||||
// vbus_comp2: 4000, 314V / 0.25A = 78W
|
||||
@@ -818,7 +821,7 @@ int main(void)
|
||||
// vbus_comp2: 4000, 267V / 0.25A = 66W
|
||||
// vbus_comp2: 5000, 293V / 0.25A = 73W
|
||||
|
||||
// vbus_comp2: 2000, 298V / 0.25A = 75W ?? 波形不對
|
||||
// vbus_comp2: 2000, 298V / 0.25A = 75W ?? 波形不對 ff 的問題
|
||||
// vbus_comp2: 1000, 398V / 0.25A = 75W ??
|
||||
}
|
||||
else if (sys_state == STATE_RUN_NORMAL)
|
||||
@@ -839,10 +842,23 @@ int main(void)
|
||||
TIM2->CCR1 = 12; // min duty
|
||||
sys_state = STATE_PFC_SOFT_START;
|
||||
|
||||
Vac_Peak_Detector();
|
||||
pfc_running = 0;
|
||||
cur_loop_fun_en = 0; // 一開始關閉電流環,專測電流環
|
||||
{
|
||||
vloop_p->a2 = 0;
|
||||
vloop_p->b2 = 0;
|
||||
|
||||
cur_loop_fun_en = 1; // 開啟電流環,專測電流環
|
||||
// 120HZ, 0.1Hz, 100G
|
||||
vloop_p->b0 = 139;
|
||||
vloop_p->b1 = -129;
|
||||
vloop_p->a1 = -16383;
|
||||
}
|
||||
{
|
||||
bplot_p->b0 = 4192101;
|
||||
bplot_p->b1 = -1972040;
|
||||
bplot_p->b2 = -2140640;
|
||||
bplot_p->a1 = -20114;
|
||||
bplot_p->a2 = 3737;
|
||||
}
|
||||
|
||||
while(1)
|
||||
{
|
||||
@@ -867,7 +883,8 @@ int main(void)
|
||||
|
||||
if (++v_loop_cnt >= 10) // 10KHZ
|
||||
{
|
||||
Vol_Loop_PFC_1P1Z_UI();
|
||||
//Vol_Loop_PFC_1P1Z_UI();
|
||||
Vol_Loop_PFC_1P1Z();
|
||||
v_loop_cnt = 0;
|
||||
}
|
||||
|
||||
@@ -879,6 +896,7 @@ int main(void)
|
||||
vbus_comp_1 = (10 << 14); // 假設從一個極小的係數開始
|
||||
vbus_err_1 = 0; // 清除誤差歷史
|
||||
vbus_comp2 = (vbus_comp_1 >> 9); // 讓電流環拿到的初始值是 10
|
||||
cur_loop_fun_en = 1; // 開啟電流環
|
||||
}
|
||||
}
|
||||
|
||||
@@ -891,7 +909,8 @@ int main(void)
|
||||
|
||||
if (++v_loop_cnt >= 10) // 10KHZ
|
||||
{
|
||||
Vol_Loop_PFC_1P1Z_UI();
|
||||
//Vol_Loop_PFC_1P1Z_UI();
|
||||
Vol_Loop_PFC_1P1Z();
|
||||
v_loop_cnt = 0;
|
||||
}
|
||||
}
|
||||
@@ -927,92 +946,116 @@ int main(void)
|
||||
sys_state = STATE_FAULT;
|
||||
Power_Off();
|
||||
} // vac over voltage
|
||||
if (power_on_cmd == 0 && pfc_running == 1) Power_Off();
|
||||
|
||||
Vac_Peak_Detector(); // VAC 峰值偵測
|
||||
|
||||
if (sys_get_tick() > 100 && power_on_cmd == 1 && is_zero_crossing == 1)
|
||||
{
|
||||
sys_state = STATE_RUN_NORMAL;
|
||||
if (pfc_running == 0)
|
||||
{
|
||||
pfc_pwm_enable();
|
||||
pfc_running = 1;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
// --- 2. 核心狀態機邏輯 -----------------------------------------------------------------------
|
||||
switch (sys_state)
|
||||
{
|
||||
case STATE_INIT: // 0
|
||||
// 等待約 100ms,並按下按鍵
|
||||
if (sys_get_tick() > 100 && power_on_cmd == 1) {
|
||||
// 等待約 100ms,並按下按鍵
|
||||
if (sys_get_tick() > 100 && power_on_cmd == 1)
|
||||
{
|
||||
sys_state = STATE_STANDBY;
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_STANDBY: // 1
|
||||
// Brown-in 判斷
|
||||
if (is_brown_in == 1) {
|
||||
// Brown-in 判斷
|
||||
if (is_brown_in == 1)
|
||||
{
|
||||
sys_state = STATE_PFC_SOFT_START; // 先進 PFC SS
|
||||
TIM2->CCR1 = PFC_DUTY_MIN;
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_PFC_SOFT_START: // 2
|
||||
// 若 vbus < 320 做 pre-charge
|
||||
if (vbus_avg < vbus_set_l)
|
||||
// 若 vbus < 320 做 pre-charge
|
||||
if (pfc_running == 0)
|
||||
{
|
||||
if (pfc_running == 0) {
|
||||
pfc_pwm_enable();
|
||||
pfc_running = 1;
|
||||
}
|
||||
if (++v_loop_cnt >= 10) {
|
||||
Vol_Loop_PFC_1P1Z();
|
||||
|
||||
if (++v_loop_cnt >= 10) // 10KHZ
|
||||
{
|
||||
Vol_Loop_PFC_1P1Z_UI();
|
||||
v_loop_cnt = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//pfc_pwm_disable(); // 測試 OK
|
||||
//pfc_running = 0;
|
||||
// PFC 不關閉,在 LLC SS 期間進閉環
|
||||
// sys_state = STATE_PAUSE; // 先暫停,測試用
|
||||
// sys_state = STATE_LLC_SOFT_START;
|
||||
// 準備 LLC 軟啟動參數 (起點頻率 2倍諧振頻率)
|
||||
//llc_period_ss = LLC_SS_MIN; // 已經放大 4 倍
|
||||
sys_state = STATE_RUN_NORMAL; // 直接接電流環
|
||||
// 重要動作
|
||||
vbus_comp_1 = (10 << 14); // 假設從一個極小的係數開始
|
||||
vbus_err_1 = 0; // 清除誤差歷史
|
||||
|
||||
if (vbus_avg > vbus_set_l)
|
||||
{
|
||||
sys_state = STATE_LLC_SOFT_START;
|
||||
llc_period_ss = LLC_SS_MIN;
|
||||
pfc_pwm_disable();
|
||||
pfc_running = 0;
|
||||
TIM2->CCR1 = PFC_DUTY_MIN;
|
||||
// --- 關鍵修正:重新初始化電壓環內部狀態 ---
|
||||
// 給予一個極小的初始 COMP 值,讓它從輕載慢慢往上爬
|
||||
// vbus_comp_1 = (10 << 14); // 假設從一個極小的係數開始
|
||||
// vbus_err_1 = 0; // 清除誤差歷史
|
||||
// vbus_comp2 = (vbus_comp_1 >> 9); // 讓電流環拿到的初始值是 10
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_LLC_SOFT_START: // 3
|
||||
// LLC 軟啟動:頻率由高往低掃描 (掃向 1倍諧振頻率)
|
||||
llc_period_ss++;
|
||||
llc_ss_cnt++;
|
||||
llc_set_period(llc_period_ss >> 2); // 放大 4 倍,要除 4 回來
|
||||
|
||||
if (llc_running == 0)
|
||||
{
|
||||
llc_pwm_enable();
|
||||
llc_running = 1;
|
||||
}
|
||||
|
||||
if (llc_ss_cnt >= LLC_SS_COUNT && is_zero_crossing == 1)
|
||||
{
|
||||
sys_state = STATE_RUN_NORMAL;
|
||||
// sys_state = STATE_PAUSE; // 測試用
|
||||
// 重要動作 =====================================
|
||||
vbus_comp_1 = YN_MIN; // 假設從一個極小的係數開始
|
||||
vbus_comp2 = (vbus_comp_1 >> 9);
|
||||
vbus_err_1 = 0; // 清除誤差歷史
|
||||
iac_err_2 = 0;
|
||||
iac_err_1 = 0;
|
||||
iac_comp_2 = YN_MIN;
|
||||
iac_comp_1 = YN_MIN;
|
||||
// msg("%d %d %d %d \r\n", power_on_cmd, sys_state, vbus_comp_1, vbus_comp2);
|
||||
// 1 4 196608, = 12 << 14
|
||||
// E LOAD 抽太慢,導致 OVP ?? (是的)
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_RUN_NORMAL: // 4
|
||||
//if (pfc_running == 0) {
|
||||
// pfc_pwm_enable();
|
||||
// pfc_running = 1;
|
||||
//}
|
||||
if (pfc_running == 0)
|
||||
{
|
||||
pfc_pwm_enable();
|
||||
pfc_running = 1;
|
||||
}
|
||||
|
||||
if (++v_loop_cnt >= 10) {
|
||||
if (++v_loop_cnt >= 10)
|
||||
{
|
||||
// 先算前饋,再算主環,最後疊加
|
||||
//Load_Loop_1P1Z(); // Cr 前饋
|
||||
Vol_Loop_PFC_1P1Z(); // PFC 電壓環
|
||||
//Vol_Loop_PFC();
|
||||
//Vol_Loop_LLC(); // LLC 電壓環
|
||||
// Load_Loop_1P1Z(); // Cr 前饋
|
||||
Vol_Loop_PFC_1P1Z(); // PFC 電壓環
|
||||
// Vol_Loop_PFC();
|
||||
// Vol_Loop_LLC(); // LLC 電壓環
|
||||
v_loop_cnt = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case STATE_RUN_SKIP: // 5
|
||||
// 電壓外環計算 (10kHz)
|
||||
if (++v_loop_cnt >= 10) {
|
||||
//Vol_Loop_PFC(); // KP / KI 要快
|
||||
//Vol_Loop_LLC();
|
||||
v_loop_cnt = 0;
|
||||
}
|
||||
// 電壓外環計算 (10kHz)
|
||||
if (++v_loop_cnt >= 10)
|
||||
{
|
||||
// Vol_Loop_PFC(); // KP / KI 要快
|
||||
// Vol_Loop_LLC();
|
||||
v_loop_cnt = 0;
|
||||
}
|
||||
/* 有問題
|
||||
// Brown-out 判斷
|
||||
if (vac_pk2 < VAC_BROWN_OUT) {
|
||||
@@ -1043,14 +1086,14 @@ int main(void)
|
||||
*/
|
||||
break;
|
||||
|
||||
case STATE_FAULT: // 5
|
||||
case STATE_FAULT: // 5
|
||||
// 立即封鎖所有輸出
|
||||
pfc_pwm_disable();
|
||||
llc_pwm_disable();
|
||||
// 記錄故障代碼,等待手動重置
|
||||
break;
|
||||
|
||||
case STATE_PAUSE: // 6
|
||||
case STATE_PAUSE: // 6
|
||||
break;
|
||||
|
||||
} // switch case
|
||||
|
||||
Reference in New Issue
Block a user