feat: 開啟Vol_Loop_LLC()
開啟 vac brown out protector
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user