From eee38b6a0cc9fb816258dad43f76b92aca73c718 Mon Sep 17 00:00:00 2001 From: aiden Date: Thu, 28 May 2026 10:35:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9B=BB=E6=B5=81=E7=92=B0=20ff=5Fterm?= =?UTF-8?q?=20tune=20done=20ff=5Fterm=20=3D=20(2800=20-=20vac=5Favg1)=20*?= =?UTF-8?q?=20PFC=5FDUTY=5FMAX=20/=202800=20-=20200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PFC_LLC_2026-05-20_2P2Z_ok/inc/main.h | 2 +- .../PFC_LLC_2026-05-20_2P2Z_ok/src/main.c | 173 +++++++++++------- 2 files changed, 109 insertions(+), 66 deletions(-) diff --git a/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/inc/main.h b/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/inc/main.h index deb51b7..3f7303d 100644 --- a/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/inc/main.h +++ b/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/inc/main.h @@ -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 diff --git a/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/src/main.c b/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/src/main.c index 0feb497..969f3ce 100644 --- a/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/src/main.c +++ b/pec930_sdk-v1.0.1/Examples/template/PFC_LLC_2026-05-20_2P2Z_ok/src/main.c @@ -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