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 3f7303d..4d4cb15 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,11 +32,11 @@ extern "C" #define YN_MAX (PFC_DUTY_MAX << 14) #define YN_MIN (PFC_DUTY_MIN << 14) // VBUS 參數 -#define VBUS_SET 350 // unit: volt (Transformer N = 14) +#define VBUS_SET 340 // 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 -#define VBUS_OVP 410 // 420V 電容 +#define VBUS_OVP 420 // 420V 電容 #define VBUS_2ADC 149.15f // 4M + 27K #define VCOMP_2DUTY 0 // vbus_comp control duty #define V_COMP_MAX 16000 // (PFC_DUTY_MAX * 32) // 480 * 32 = 16360 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 969f3ce..456422b 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 @@ -319,6 +319,36 @@ void pfc_pwm_disable() REG_CLR_BITS(TIM2->CCER, TIM_CCER_CC1E_Msk); } //====================================================================================== +// Cr 1P1Z 回授,做負載驟變補償,執行頻率 10KHZ +// 抓取 vcr 的動態變化趨勢,並在穩態時回歸平靜 +void Load_Loop_1P1Z(void) +{ + int32_t x0; + int64_t temp_y0; // 使用 64 位元暫存,完全避免 32 位元相乘時溢位 + int32_t y0; + + // 1. 讀取當前 vcr + x0 = vcr; + + // 2. 執行 1P1Z 差分方程計算: + temp_y0 = ((int64_t)CR_1P1Z_B0_Q14 * x0) + ((int64_t)CR_1P1Z_B1_Q14 * vcr_x1_q14) - ((int64_t)CR_1P1Z_A1_Q14 * vcr_y1_q14); + + // 將 Q28 格式還原回 Q14 格式(右移 14 位元 + y0 = (int32_t)(temp_y0 >> 14); + + // 更新歷史狀態變數 (Q14 格式) + vcr_x1_q14 = x0; + vcr_y1_q14 = y0; + + // 定點數安全限幅 (Saturation) + if (y0 > CR_FF_MAX_Q14) + y0 = CR_FF_MAX_Q14; // 868352 = 53 duty + else if (y0 > -CR_FF_MIN_Q14) + y0 = -CR_FF_MIN_Q14; + + cr_feed_forward_output_q14 = y0; +} +//========================================================================== void Vol_Loop_PFC_1P1Z(void) // TEST OK { // 1. 計算誤差 @@ -922,6 +952,15 @@ int main(void) #endif // main loop + + /* PFC 電流環參數*/ + // Z1=200, Z2=100000, P1=10, P2=20000, G=8000 + // bplot_p->b0 = 3353681; + // bplot_p->b1 = -1577632; + // bplot_p->b2 = -1712512; + // bplot_p->a1 = -20114; + // bplot_p->a2 = 3737; + cur_loop_fun_en = 1; // 開啟電流環,專測電流環 while (1) { @@ -935,17 +974,28 @@ int main(void) // 高速信號濾波 (簡易位移算法減少算力消耗) --- vac_avg1 = (vac_avg1 - (vac_avg1 >> 3)) + (vac >> 3); // for current loop vbus_avg = (vbus_avg - (vbus_avg >> 4)) + (vbus >> 4); // for voltage loop + vcr_avg = (vcr_avg - (vcr_avg >> 3)) + (vcr >> 3); // 系統安全監控 (軟體第二道防護) + // vbus ovp if (vbus > vbus_ovp) { sys_state = STATE_FAULT; Power_Off(); - } // vbus ovp + } + + // vac over voltage if (vac_pk2 > 2600) { sys_state = STATE_FAULT; Power_Off(); - } // vac over voltage + } + + // vac brown out + if (vac_pk2 < VOLT_BROWN_OUT && pfc_running == 1) + { + sys_state = STATE_FAULT; + Power_Off(); + } Vac_Peak_Detector(); // VAC 峰值偵測 @@ -954,7 +1004,7 @@ int main(void) switch (sys_state) { case STATE_INIT: // 0 - // 等待約 100ms,並按下按鍵 + // 等待約 100ms,並按下按鍵 if (sys_get_tick() > 100 && power_on_cmd == 1) { sys_state = STATE_STANDBY; @@ -962,7 +1012,7 @@ int main(void) break; case STATE_STANDBY: // 1 - // Brown-in 判斷 + // Brown-in 判斷 if (is_brown_in == 1) { sys_state = STATE_PFC_SOFT_START; // 先進 PFC SS @@ -1041,59 +1091,29 @@ int main(void) // 先算前饋,再算主環,最後疊加 // Load_Loop_1P1Z(); // Cr 前饋 Vol_Loop_PFC_1P1Z(); // PFC 電壓環 - // Vol_Loop_PFC(); // Vol_Loop_LLC(); // LLC 電壓環 v_loop_cnt = 0; } + if (++v_loop_cnt2 >= 15) + { + Vol_Loop_LLC(); // LLC 電壓環 + v_loop_cnt2 = 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; - } - /* 有問題 - // Brown-out 判斷 - if (vac_pk2 < VAC_BROWN_OUT) { - brownout_cnt++; - if (brownout_cnt > BROWNOUT_DELAY) { - Power_Off(); - sys_state = STATE_STANDBY; - } - } - else { - brownout_cnt = 0; - } - */ - /* 先不做 - // --- BURST / SKIP 邏輯 (帶滯後區間) --- - // 只在過零點判斷 - if (is_zero_crossing == 1) { - if (vbus_avg > vbus_set_h) { // 上限觸發停機 - pfc_pwm_disable(); - burst_mode_active = 1; - } - else if (vbus_avg < vbus_set_l && burst_mode_active == 1) { // 下限觸發回復 - reset_pid_parameters(); - pfc_pwm_enable(); - burst_mode_active = 0; - } - } - */ break; - case STATE_FAULT: // 5 + case STATE_FAULT: // 6 // 立即封鎖所有輸出 pfc_pwm_disable(); llc_pwm_disable(); // 記錄故障代碼,等待手動重置 break; - case STATE_PAUSE: // 6 + case STATE_PAUSE: // 7 break; } // switch case