Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 30716cbb45 | |||
| e4d2616bb9 | |||
| 85f0d9e863 |
@@ -21,7 +21,7 @@
|
|||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.249191345" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" value="true" valueType="boolean"/>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.249191345" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.243120876" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" value="true" valueType="boolean"/>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.243120876" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1566043258" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" value="true" valueType="boolean"/>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1566043258" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1801001334" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.optimize" valueType="enumerated"/>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1801001334" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.more" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.651682061" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" value="true" valueType="boolean"/>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.651682061" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.1219903449" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" value="true" valueType="boolean"/>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.1219903449" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.168524687" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" value="true" valueType="boolean"/>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.168524687" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -33,10 +33,10 @@ extern "C"
|
|||||||
#define YN_MIN (PFC_DUTY_MIN << 14)
|
#define YN_MIN (PFC_DUTY_MIN << 14)
|
||||||
// VBUS 參數
|
// VBUS 參數
|
||||||
#define VBUS_SET 340 // 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_H (VBUS_SET + 30) // burst mode in, 在過零區判斷
|
||||||
#define VBUS_SET_L (VBUS_SET - 20) // burst mode out, 在過零區判斷
|
#define VBUS_SET_L (VBUS_SET - 20) // burst mode out, 在過零區判斷
|
||||||
// #define VBUS_SET_H2 370 // for skip mode
|
// #define VBUS_SET_H2 370 // for skip mode
|
||||||
#define VBUS_OVP 420 // 420V 電容
|
#define VBUS_OVP 410 // 420V 電容
|
||||||
#define VBUS_2ADC 149.15f // 4M + 27K
|
#define VBUS_2ADC 149.15f // 4M + 27K
|
||||||
#define VCOMP_2DUTY 0 // vbus_comp control duty
|
#define VCOMP_2DUTY 0 // vbus_comp control duty
|
||||||
#define V_COMP_MAX 16000 // (PFC_DUTY_MAX * 32) // 480 * 32 = 16360
|
#define V_COMP_MAX 16000 // (PFC_DUTY_MAX * 32) // 480 * 32 = 16360
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -192,7 +192,7 @@ void adc_config(void)
|
|||||||
// ----------------------------------------------
|
// ----------------------------------------------
|
||||||
// vcr = PA11 = ADC_Channel_05 (未使用)
|
// vcr = PA11 = ADC_Channel_05 (未使用)
|
||||||
// vfb = PA12 = ADC_Channel_06 (使用 GPIO)
|
// vfb = PA12 = ADC_Channel_06 (使用 GPIO)
|
||||||
init1.SelChannels = ADC_Channel_04 | ADC_Channel_07 | ADC_Channel_09; // | ADC_Channel_05;
|
init1.SelChannels = ADC_Channel_04 | ADC_Channel_07 | ADC_Channel_09 | ADC_Channel_05;
|
||||||
// init1.SelChannels = ADC_Channel_09 ;// OP_O 指定到 PA7 時,ADC 需要用 CH_09 讀取
|
// init1.SelChannels = ADC_Channel_09 ;// OP_O 指定到 PA7 時,ADC 需要用 CH_09 讀取
|
||||||
init1.ClkPrescaler = ADC_ClkDiv_4; // 60M/4 = 15M,接近 1MSPS (1us 轉換時間), 最快速度
|
init1.ClkPrescaler = ADC_ClkDiv_4; // 60M/4 = 15M,接近 1MSPS (1us 轉換時間), 最快速度
|
||||||
init1.DataAlign = ADC_DataAlign_Right;
|
init1.DataAlign = ADC_DataAlign_Right;
|
||||||
|
|||||||
@@ -62,11 +62,12 @@ typedef enum
|
|||||||
SystemState_t sys_state = STATE_INIT;
|
SystemState_t sys_state = STATE_INIT;
|
||||||
uint8_t is_zero_crossing = 0;
|
uint8_t is_zero_crossing = 0;
|
||||||
uint8_t burst_mode_active = 0;
|
uint8_t burst_mode_active = 0;
|
||||||
|
uint8_t skip_mode_active = 0;
|
||||||
uint8_t llc_running = 0;
|
uint8_t llc_running = 0;
|
||||||
uint8_t pfc_running = 0;
|
uint8_t pfc_running = 0;
|
||||||
static uint8_t last_is_zero_crossing = 0;
|
static uint8_t last_is_zero_crossing = 0;
|
||||||
uint8_t is_brown_in = 0; // 0: 關機/保護中, 1: 正常工作
|
uint8_t is_brown_in = 0; // 0: 關機/保護中, 1: 正常工作
|
||||||
static uint8_t cur_loop_fun_en = 0;
|
uint8_t ff_active = 0;
|
||||||
|
|
||||||
// static volatile int32_t print1, print2;
|
// static volatile int32_t print1, print2;
|
||||||
// static volatile int64_t print3;
|
// static volatile int64_t print3;
|
||||||
@@ -127,7 +128,8 @@ static volatile uint16_t vac_pk1, vac_pk2;
|
|||||||
uint8_t hi_line = 0; // 0=110V, 1=220V
|
uint8_t hi_line = 0; // 0=110V, 1=220V
|
||||||
uint8_t vbus_ready = 0;
|
uint8_t vbus_ready = 0;
|
||||||
uint16_t hi_cnt, lo_cnt;
|
uint16_t hi_cnt, lo_cnt;
|
||||||
uint32_t static digital_vcomp = (LLC_PERIOD_MAX - LLC_PERIOD_MIN) << LLC_COMP_GAIN_BIT;
|
uint32_t static digital_vcomp = (LLC_PERIOD_MAX - LLC_PERIOD_MIN)
|
||||||
|
<< LLC_COMP_GAIN_BIT;
|
||||||
int16_t fb_enent;
|
int16_t fb_enent;
|
||||||
uint16_t llc_period_ss = LLC_SS_MIN;
|
uint16_t llc_period_ss = LLC_SS_MIN;
|
||||||
uint16_t llc_run_arr = LLC_PERIOD_MIN;
|
uint16_t llc_run_arr = LLC_PERIOD_MIN;
|
||||||
@@ -287,15 +289,18 @@ void Power_Off()
|
|||||||
//===================================================================================
|
//===================================================================================
|
||||||
void llc_set_period(uint16_t val)
|
void llc_set_period(uint16_t val)
|
||||||
{
|
{
|
||||||
if (val > LLC_PERIOD_MAX) val = LLC_PERIOD_MAX; // 可以小,不能過大
|
if (val > LLC_PERIOD_MAX)
|
||||||
|
val = LLC_PERIOD_MAX; // 可以小,不能過大
|
||||||
EPWM->ARR = val;
|
EPWM->ARR = val;
|
||||||
EPWM->CCR1 = val >> 1;
|
EPWM->CCR1 = val >> 1;
|
||||||
}
|
}
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
void pfc_set_duty(uint16_t val)
|
void pfc_set_duty(uint16_t val)
|
||||||
{
|
{
|
||||||
if (val > PFC_DUTY_MAX) val = PFC_DUTY_MAX;
|
if (val > PFC_DUTY_MAX)
|
||||||
if (val < PFC_DUTY_MIN) val = PFC_DUTY_MIN;
|
val = PFC_DUTY_MAX;
|
||||||
|
if (val < PFC_DUTY_MIN)
|
||||||
|
val = PFC_DUTY_MIN;
|
||||||
TIM2->CCR1 = val;
|
TIM2->CCR1 = val;
|
||||||
}
|
}
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
@@ -430,12 +435,12 @@ static void Vol_Loop_PFC_1P1Z_UI(void) // ZERO: 120HZ, POLE:0.1HZ, G:10
|
|||||||
vbus_comp_1 = y_n;
|
vbus_comp_1 = y_n;
|
||||||
|
|
||||||
// 5. 輸出 Duty >> 14
|
// 5. 輸出 Duty >> 14
|
||||||
// if (sys_state == STATE_PFC_SOFT_START || sys_state == STATE_RUN_SKIP) // 緩啟動期間直接控制 DUTY
|
//if (sys_state == STATE_PFC_SOFT_START || sys_state == STATE_RUN_SKIP) // 緩啟動期間直接控制 DUTY
|
||||||
TIM2->CCR1 = (vbus_comp_1 >> 14); // 0 ~ 540
|
TIM2->CCR1 = (vbus_comp_1 >> 14); // 0 ~ 540
|
||||||
|
|
||||||
// 6. 輸出 comp >> 9 (變大 32 倍) (MAX ~ 18000) (540*32=17280)差不多,>> 9 應該是對的
|
// 6. 輸出 comp >> 9 (變大 32 倍) (MAX ~ 18000) (540*32=17280)差不多,>> 9 應該是對的
|
||||||
// if (sys_state == STATE_RUN_NORMAL) // 正常工作時間輸出 COMP 值
|
//if (sys_state == STATE_RUN_NORMAL) // 正常工作時間輸出 COMP 值
|
||||||
vbus_comp2 = (vbus_comp_1 >> 9);
|
vbus_comp2 = (vbus_comp_1 >> 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
//========================================================================
|
//========================================================================
|
||||||
@@ -456,7 +461,8 @@ __attribute__((always_inline)) static inline void Cur_Loop_PFC_2P2Z(void) // 優
|
|||||||
local_iac = 0; // 避免負值
|
local_iac = 0; // 避免負值
|
||||||
|
|
||||||
// 計算電流給定值
|
// 計算電流給定值
|
||||||
int32_t local_iac_set = (local_vac_avg1 * local_vbus_comp2) >> 12; // >> 12 = / 4096
|
// int32_t local_iac_set = (local_vac_avg1 * local_vbus_comp2) / 5700;
|
||||||
|
int32_t local_iac_set = (local_vac_avg1 * local_vbus_comp2) >> 13; // >> 13 = / 8192 (解析度較高)
|
||||||
int32_t local_iac_err_0 = local_iac_set - local_iac; // err = set - meas
|
int32_t local_iac_err_0 = local_iac_set - local_iac; // err = set - meas
|
||||||
|
|
||||||
// 2. 2P2Z 運算 (Fixed-point Q14)
|
// 2. 2P2Z 運算 (Fixed-point Q14)
|
||||||
@@ -488,13 +494,10 @@ __attribute__((always_inline)) static inline void Cur_Loop_PFC_2P2Z(void) // 優
|
|||||||
uint16_t local_duty = 0;
|
uint16_t local_duty = 0;
|
||||||
|
|
||||||
int32_t ff_term;
|
int32_t ff_term;
|
||||||
ff_term = (2800 - vac_avg1) * PFC_DUTY_MAX / 2800 - 200;
|
if (vac_avg1 > 0) ff_term = ((uint32_t)(vbus_avg - vac_avg1) * PFC_DUTY_MAX) / vbus_avg;
|
||||||
|
// if (vac_avg1 > 0) ff_term = ((uint32_t) (2300 - vac_avg1) * PFC_DUTY_MAX) / 2300; // 2500=300V(不需要太高), 2300 會振??
|
||||||
if (ff_term < 0) ff_term = 0;
|
// 低一點中間不會有尖波,且輸出功率小一點
|
||||||
if (vbus_comp2 >= 1000)
|
local_duty = (uint16_t)((y_n >> 14) + ff_term);
|
||||||
local_duty = (uint16_t)((y_n >> 14) + ff_term);
|
|
||||||
else
|
|
||||||
local_duty = (uint16_t)(y_n >> 14);
|
|
||||||
|
|
||||||
// local_duty = (uint16_t)(y_n >> 14);
|
// local_duty = (uint16_t)(y_n >> 14);
|
||||||
// 4. 硬體 Duty 限幅與輸出
|
// 4. 硬體 Duty 限幅與輸出
|
||||||
@@ -547,7 +550,8 @@ void Vol_Loop_LLC(void) // 測試可工作
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 如果 GPIO 長時間沒翻轉,說明離目標還很遠
|
// 如果 GPIO 長時間沒翻轉,說明離目標還很遠
|
||||||
if (stable_timer < 1000) stable_timer++;
|
if (stable_timer < 1000)
|
||||||
|
stable_timer++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. 根據翻轉頻率決定步長
|
// 3. 根據翻轉頻率決定步長
|
||||||
@@ -558,7 +562,8 @@ void Vol_Loop_LLC(void) // 測試可工作
|
|||||||
current_step = 0; // 設為 0 表示進入死區,完全停止震盪
|
current_step = 0; // 設為 0 表示進入死區,完全停止震盪
|
||||||
|
|
||||||
// 為了防止永久卡死,當連續相同狀態一段時間後再恢復調整
|
// 為了防止永久卡死,當連續相同狀態一段時間後再恢復調整
|
||||||
if (stable_timer > 50) toggle_cnt = 0;
|
if (stable_timer > 50)
|
||||||
|
toggle_cnt = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -584,8 +589,10 @@ void Vol_Loop_LLC(void) // 測試可工作
|
|||||||
// 5. 計算並更新 ARR (原本的邏輯)
|
// 5. 計算並更新 ARR (原本的邏輯)
|
||||||
uint32_t new_arr = LLC_PERIOD_MIN + (digital_vcomp >> LLC_COMP_GAIN_BIT);
|
uint32_t new_arr = LLC_PERIOD_MIN + (digital_vcomp >> LLC_COMP_GAIN_BIT);
|
||||||
|
|
||||||
if (new_arr > LLC_PERIOD_MAX) new_arr = LLC_PERIOD_MAX;
|
if (new_arr > LLC_PERIOD_MAX)
|
||||||
if (new_arr < LLC_PERIOD_MIN) new_arr = LLC_PERIOD_MIN;
|
new_arr = LLC_PERIOD_MAX;
|
||||||
|
if (new_arr < LLC_PERIOD_MIN)
|
||||||
|
new_arr = LLC_PERIOD_MIN;
|
||||||
|
|
||||||
if (EPWM->ARR != new_arr)
|
if (EPWM->ARR != new_arr)
|
||||||
{
|
{
|
||||||
@@ -609,7 +616,7 @@ __INTERRUPT void isr_adc_handle(void)
|
|||||||
vbus = ADC0->DAT4_b.DATA; // PA10, AIN4
|
vbus = ADC0->DAT4_b.DATA; // PA10, AIN4
|
||||||
// vcr = ADC0->DAT5_b.DATA; // PA11, AIN5
|
// vcr = ADC0->DAT5_b.DATA; // PA11, AIN5
|
||||||
|
|
||||||
if (cur_loop_fun_en) Cur_Loop_PFC_2P2Z(); // current loop
|
//Cur_Loop_PFC_2P2Z(); // current loop
|
||||||
|
|
||||||
// GPIO_ResetBits(GPIOA, GPIO_Pin_06);
|
// GPIO_ResetBits(GPIOA, GPIO_Pin_06);
|
||||||
|
|
||||||
@@ -639,7 +646,7 @@ void Handle_UART_Monitor(void)
|
|||||||
{
|
{
|
||||||
// printf("%d %d %d\r\n", vac_pk1, vac_pk2, is_brown_in);
|
// 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);
|
// printf("%d %d %d %d %d %d", power_on_cmd, sys_state, vbus_comp2, print1, print2, print3);
|
||||||
msg("%d %d %d", power_on_cmd, sys_state, vbus_comp2);
|
msg("%d %d %d %d\r\n", power_on_cmd, sys_state, vbus_comp2, vbus_avg);
|
||||||
// 電壓環輸出最大 COMP,但是電流環輸出最小 DUTY
|
// 電壓環輸出最大 COMP,但是電流環輸出最小 DUTY
|
||||||
msg_timer = sys_get_tick();
|
msg_timer = sys_get_tick();
|
||||||
}
|
}
|
||||||
@@ -666,7 +673,8 @@ void Vac_Peak_Detector(void)
|
|||||||
{
|
{
|
||||||
is_zero_crossing = 0;
|
is_zero_crossing = 0;
|
||||||
last_is_zero_crossing = 0;
|
last_is_zero_crossing = 0;
|
||||||
if (vac > vac_pk1) vac_pk1 = vac; // 只有比目前紀錄大才更新,確保 vac_pk1 停在波峰
|
if (vac > vac_pk1)
|
||||||
|
vac_pk1 = vac; // 只有比目前紀錄大才更新,確保 vac_pk1 停在波峰
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -681,12 +689,14 @@ void Vac_Peak_Detector(void)
|
|||||||
if (is_brown_in == 0)
|
if (is_brown_in == 0)
|
||||||
{
|
{
|
||||||
// 目前處於關閉狀態,檢查是否達到啟動門檻
|
// 目前處於關閉狀態,檢查是否達到啟動門檻
|
||||||
if (vac_pk2 >= VOLT_BROWN_IN) is_brown_in = 1; // 執行 Brown-in
|
if (vac_pk2 >= VOLT_BROWN_IN)
|
||||||
|
is_brown_in = 1; // 執行 Brown-in
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 目前處於啟動狀態,檢查是否低於欠壓門檻
|
// 目前處於啟動狀態,檢查是否低於欠壓門檻
|
||||||
if (vac_pk2 < VOLT_BROWN_OUT) is_brown_in = 0; // 執行 Brown-out
|
if (vac_pk2 < VOLT_BROWN_OUT)
|
||||||
|
is_brown_in = 0; // 執行 Brown-out
|
||||||
}
|
}
|
||||||
|
|
||||||
vac_pk1 = 0; // 交接完後立即清零,為下半周做準備
|
vac_pk1 = 0; // 交接完後立即清零,為下半周做準備
|
||||||
@@ -734,13 +744,13 @@ int main(void)
|
|||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
/* PFC 電壓環參數*/
|
/* PFC 電壓環參數*/
|
||||||
// vloop_p->a2 = 0;
|
vloop_p->a2 = 0;
|
||||||
// vloop_p->b2 = 0;
|
vloop_p->b2 = 0;
|
||||||
|
|
||||||
// // 120HZ, 0.1Hz, 100G
|
// 120HZ, 0.1Hz, 100G
|
||||||
// vloop_p->b0 = 139;
|
vloop_p->b0 = 139;
|
||||||
// vloop_p->b1 = -129;
|
vloop_p->b1 = -129;
|
||||||
// vloop_p->a1 = -16383;
|
vloop_p->a1 = -16383;
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
/* PFC 電流環參數*/
|
/* PFC 電流環參數*/
|
||||||
// bplot_p->b0 = 12368803;
|
// bplot_p->b0 = 12368803;
|
||||||
@@ -750,73 +760,54 @@ int main(void)
|
|||||||
// bplot_p->a2 = 4545;
|
// bplot_p->a2 = 4545;
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
#if 0 // 單測 PFC 電壓環 (OK)
|
#if 1 // 單測 PFC 電壓環 (OK)
|
||||||
/* PFC 電壓環參數*/
|
|
||||||
|
while(1)
|
||||||
{
|
{
|
||||||
vloop_p->a2 = 0;
|
if (tim0_trigger == 1) // 100KHZ
|
||||||
vloop_p->b2 = 0;
|
{
|
||||||
|
tim0_trigger = 0;
|
||||||
|
// --- 1. 高速信號濾波 (簡易位移算法減少算力消耗) ---
|
||||||
|
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);
|
||||||
|
if (vbus > vbus_ovp) Power_Off(); // ovp
|
||||||
|
|
||||||
// 120HZ, 0.1Hz, 100G
|
Vac_Peak_Detector();
|
||||||
vloop_p->b0 = 139;
|
|
||||||
vloop_p->b1 = -129;
|
|
||||||
vloop_p->a1 = -16383;
|
|
||||||
}
|
|
||||||
|
|
||||||
cur_loop_fun_en = 0; // 關閉電流環,專測電壓環
|
if (power_on_cmd == 1)
|
||||||
while (1)
|
{
|
||||||
{
|
if (pfc_running == 0)
|
||||||
uart_rx_task();
|
{
|
||||||
|
pfc_pwm_enable();
|
||||||
|
pfc_running = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (tim0_trigger == 1) // 100KHZ
|
if (++v_loop_cnt >= 10) // 10KHZ
|
||||||
{
|
{
|
||||||
tim0_trigger = 0;
|
//Vol_Loop_PFC_1P1Z_UI();
|
||||||
// --- 1. 高速信號濾波 (簡易位移算法減少算力消耗) ---
|
Vol_Loop_PFC_1P1Z();
|
||||||
vac_avg1 = (vac_avg1 - (vac_avg1 >> 3)) + (vac >> 3); // for current loop
|
v_loop_cnt = 0;
|
||||||
vbus_avg = (vbus_avg - (vbus_avg >> 4)) + (vbus >> 4); // for voltage loop
|
}
|
||||||
vcr_avg = (vcr_avg - (vcr_avg >> 3)) + (vcr >> 3);
|
}
|
||||||
if (vbus > vbus_ovp) Power_Off(); // ovp
|
}
|
||||||
|
|
||||||
Vac_Peak_Detector();
|
Key1_Scan();
|
||||||
|
|
||||||
if (power_on_cmd == 1)
|
//Handle_UART_Monitor();
|
||||||
{
|
|
||||||
if (pfc_running == 0)
|
|
||||||
{
|
|
||||||
pfc_pwm_enable();
|
|
||||||
pfc_running = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (++v_loop_cnt >= 10) // 10KHZ
|
|
||||||
{
|
|
||||||
Vol_Loop_PFC_1P1Z_UI();
|
|
||||||
// Vol_Loop_PFC_1P1Z();
|
|
||||||
v_loop_cnt = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Key1_Scan();
|
if (is_full == 1)
|
||||||
|
{
|
||||||
|
sys_delay(10);
|
||||||
|
Handle_UART_Log();
|
||||||
|
}
|
||||||
|
|
||||||
// Handle_UART_Monitor();
|
|
||||||
|
|
||||||
if (is_full == 1)
|
|
||||||
{
|
|
||||||
sys_delay(10);
|
|
||||||
Handle_UART_Log();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0 // 單測 PFC 電流環 (OK)
|
#if 0 // 單測 PFC 電流環 (OK)
|
||||||
/* PFC 電流環參數*/
|
|
||||||
// Z1=200, Z2=1000000, P1=10, P2=20000, G=10000
|
|
||||||
bplot_p->b0 = 4192101;
|
|
||||||
bplot_p->b1 = -1972040;
|
|
||||||
bplot_p->b2 = -2140640;
|
|
||||||
bplot_p->a1 = -20114;
|
|
||||||
bplot_p->a2 = 3737;
|
|
||||||
|
|
||||||
cur_loop_fun_en = 1; // 開啟電流環,專測電流環
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
uart_rx_task();
|
uart_rx_task();
|
||||||
@@ -851,7 +842,7 @@ int main(void)
|
|||||||
// vbus_comp2: 4000, 267V / 0.25A = 66W
|
// vbus_comp2: 4000, 267V / 0.25A = 66W
|
||||||
// vbus_comp2: 5000, 293V / 0.25A = 73W
|
// vbus_comp2: 5000, 293V / 0.25A = 73W
|
||||||
|
|
||||||
// vbus_comp2: 2000, 298V / 0.25A = 75W ?? 波形不對 ff 的問題
|
// vbus_comp2: 2000, 298V / 0.25A = 75W ?? 波形不對
|
||||||
// vbus_comp2: 1000, 398V / 0.25A = 75W ??
|
// vbus_comp2: 1000, 398V / 0.25A = 75W ??
|
||||||
}
|
}
|
||||||
else if (sys_state == STATE_RUN_NORMAL)
|
else if (sys_state == STATE_RUN_NORMAL)
|
||||||
@@ -872,23 +863,8 @@ int main(void)
|
|||||||
TIM2->CCR1 = 12; // min duty
|
TIM2->CCR1 = 12; // min duty
|
||||||
sys_state = STATE_PFC_SOFT_START;
|
sys_state = STATE_PFC_SOFT_START;
|
||||||
|
|
||||||
cur_loop_fun_en = 0; // 一開始關閉電流環,專測電流環
|
Vac_Peak_Detector();
|
||||||
{
|
pfc_running = 0;
|
||||||
vloop_p->a2 = 0;
|
|
||||||
vloop_p->b2 = 0;
|
|
||||||
|
|
||||||
// 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)
|
while(1)
|
||||||
{
|
{
|
||||||
@@ -913,8 +889,7 @@ int main(void)
|
|||||||
|
|
||||||
if (++v_loop_cnt >= 10) // 10KHZ
|
if (++v_loop_cnt >= 10) // 10KHZ
|
||||||
{
|
{
|
||||||
//Vol_Loop_PFC_1P1Z_UI();
|
Vol_Loop_PFC_1P1Z_UI();
|
||||||
Vol_Loop_PFC_1P1Z();
|
|
||||||
v_loop_cnt = 0;
|
v_loop_cnt = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -926,7 +901,6 @@ int main(void)
|
|||||||
vbus_comp_1 = (10 << 14); // 假設從一個極小的係數開始
|
vbus_comp_1 = (10 << 14); // 假設從一個極小的係數開始
|
||||||
vbus_err_1 = 0; // 清除誤差歷史
|
vbus_err_1 = 0; // 清除誤差歷史
|
||||||
vbus_comp2 = (vbus_comp_1 >> 9); // 讓電流環拿到的初始值是 10
|
vbus_comp2 = (vbus_comp_1 >> 9); // 讓電流環拿到的初始值是 10
|
||||||
cur_loop_fun_en = 1; // 開啟電流環
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -939,8 +913,7 @@ int main(void)
|
|||||||
|
|
||||||
if (++v_loop_cnt >= 10) // 10KHZ
|
if (++v_loop_cnt >= 10) // 10KHZ
|
||||||
{
|
{
|
||||||
//Vol_Loop_PFC_1P1Z_UI();
|
Vol_Loop_PFC_1P1Z_UI();
|
||||||
Vol_Loop_PFC_1P1Z();
|
|
||||||
v_loop_cnt = 0;
|
v_loop_cnt = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -952,16 +925,6 @@ int main(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// main loop
|
// 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)
|
while (1)
|
||||||
{
|
{
|
||||||
uart_rx_task();
|
uart_rx_task();
|
||||||
@@ -980,23 +943,25 @@ int main(void)
|
|||||||
if (vbus > vbus_ovp)
|
if (vbus > vbus_ovp)
|
||||||
{
|
{
|
||||||
sys_state = STATE_FAULT;
|
sys_state = STATE_FAULT;
|
||||||
|
msg("%d %d %d %d \r\n", power_on_cmd, sys_state, vbus_comp_1, vbus_comp2);
|
||||||
|
// 1 6 196608, >> 9 = 384
|
||||||
Power_Off();
|
Power_Off();
|
||||||
}
|
}
|
||||||
|
|
||||||
// vac over voltage
|
// vac over voltage
|
||||||
if (vac_pk2 > 2600)
|
/*
|
||||||
{
|
if (vac_pk2 > 2600)
|
||||||
sys_state = STATE_FAULT;
|
{
|
||||||
Power_Off();
|
sys_state = STATE_FAULT;
|
||||||
}
|
Power_Off();
|
||||||
|
}
|
||||||
// vac brown out
|
|
||||||
if (vac_pk2 < VOLT_BROWN_OUT && pfc_running == 1)
|
|
||||||
{
|
|
||||||
sys_state = STATE_FAULT;
|
|
||||||
Power_Off();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// vac brown out
|
||||||
|
if (vac_pk2 < VOLT_BROWN_OUT && pfc_running == 1)
|
||||||
|
{
|
||||||
|
sys_state = STATE_FAULT;
|
||||||
|
Power_Off();
|
||||||
|
}
|
||||||
|
*/
|
||||||
Vac_Peak_Detector(); // VAC 峰值偵測
|
Vac_Peak_Detector(); // VAC 峰值偵測
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
@@ -1021,7 +986,6 @@ int main(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE_PFC_SOFT_START: // 2
|
case STATE_PFC_SOFT_START: // 2
|
||||||
// 若 vbus < 320 做 pre-charge
|
|
||||||
if (pfc_running == 0)
|
if (pfc_running == 0)
|
||||||
{
|
{
|
||||||
pfc_pwm_enable();
|
pfc_pwm_enable();
|
||||||
@@ -1086,24 +1050,87 @@ int main(void)
|
|||||||
pfc_running = 1;
|
pfc_running = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (vbus_avg > vbus_set_h) {
|
||||||
|
TIM2->ARR = 1200; // 沒變??
|
||||||
|
msg("1\r\n");
|
||||||
|
}
|
||||||
|
else if (vbus_avg < vbus_set) {
|
||||||
|
TIM2->ARR = 600;
|
||||||
|
msg("2\r\n");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (++v_loop_cnt >= 10)
|
if (++v_loop_cnt >= 10)
|
||||||
{
|
{
|
||||||
// 先算前饋,再算主環,最後疊加
|
// 先算前饋,再算主環,最後疊加
|
||||||
// Load_Loop_1P1Z(); // Cr 前饋
|
// Load_Loop_1P1Z(); // Cr 前饋
|
||||||
Vol_Loop_PFC_1P1Z(); // PFC 電壓環
|
Vol_Loop_PFC_1P1Z_UI(); // PFC 電壓環
|
||||||
// Vol_Loop_LLC(); // LLC 電壓環
|
// Vol_Loop_LLC(); // LLC 電壓環
|
||||||
v_loop_cnt = 0;
|
v_loop_cnt = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++v_loop_cnt2 >= 15)
|
/*
|
||||||
{
|
if (++v_loop_cnt2 >= 15) {
|
||||||
Vol_Loop_LLC(); // LLC 電壓環
|
Vol_Loop_LLC(); // LLC 電壓環
|
||||||
v_loop_cnt2 = 0;
|
v_loop_cnt2 = 0;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE_RUN_SKIP: // 5
|
case STATE_RUN_SKIP: // 5
|
||||||
|
// SKIP 時電壓環控制DUTY
|
||||||
|
/*
|
||||||
|
if (++v_loop_cnt >= 10) // 10KHZ
|
||||||
|
{
|
||||||
|
Vol_Loop_PFC_1P1Z();
|
||||||
|
v_loop_cnt = 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// 1638400 >> 14 = 100 duty
|
||||||
|
// if (vbus_comp2 > 3000 && is_zero_crossing == 1) // back to normal run
|
||||||
|
if (vbus_avg < vbus_set_l && is_zero_crossing == 1) // back to normal run
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 有問題
|
||||||
|
// 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;
|
break;
|
||||||
|
|
||||||
case STATE_FAULT: // 6
|
case STATE_FAULT: // 6
|
||||||
|
|||||||
Reference in New Issue
Block a user