feat: Synchronize ADC trigger with EPWM period via LPTIM0

This commit is contained in:
roy01
2026-06-30 10:20:16 +08:00
parent b8f23d9413
commit b7ab4a8fa6
3 changed files with 32 additions and 24 deletions
@@ -53,12 +53,12 @@ extern "C"
// 武士 12V 變壓器 + 47nF 諧振頻率 ~ 75KHZ
// 實測值 106uH + 47nF = 73KHZ --> PERIOD = 820 ~ 830
// 高正 40uH + 68nF ~ 95KHZ
#define LLC_PERIOD_SS 400 // 600 = 100khz (EPWM initial use)
#define LLC_PERIOD_SS 300 // 300 = 200khz (EPWM initial use)
#define DEAD_TIME 500 // ns
#define DEAD_TIME_VALUE (DEAD_TIME * 0.06) // double
// LLC free run, 改控 vbus_set
#define LLC_PERIOD_MIN 400 // MIN, 400 = 150KHZ (>760不會振)
#define LLC_PERIOD_MAX 820 // MAX, 800 = 75KHZ // 可調範圍太大會共振
#define LLC_PERIOD_MIN 300 // MIN, 300 = 200KHZ (>760不會振)
#define LLC_PERIOD_MAX 600 // MAX, 600 = 100KHZ // 可調範圍太大會共振
#define LLC_COMP_GAIN_BIT 10 // 要慢才不會振
#define LLC_COMP_MAX ((LLC_PERIOD_MAX - LLC_PERIOD_MIN) << LLC_COMP_GAIN_BIT)
// LLC Soft Start 掃頻 2倍 ~ 1倍 = 150KHZ ~ 73KHZ
@@ -66,7 +66,7 @@ extern "C"
#define LLC_SS_MAX (LLC_PERIOD_MAX << 2) // 精度不夠,放大 4 倍, 3280
#define LLC_SS_COUNT (LLC_SS_MAX - LLC_SS_MIN) // 3280 - 1600 = 1680 * 10us = 16.8ms
// TIM0 參數 = ADC 取樣頻率
#define TIM0_PERIOD 600 // 60M / 600 = 100KHZ
#define TIM0_PERIOD LLC_PERIOD_SS
// IAC 參數
#define I_COMP_MAX 16000 // = V_COMP_MAX * 1.414
#define I_INT_GAIN_BIT 2
@@ -124,7 +124,7 @@ extern "C"
void pfc_set_duty(uint16_t val);
void pfc_pwm_enable();
void pfc_pwm_disable();
void A_Pata_Reset();
void A_Para_Reset(void);
void Vol_Loop_LLC(void);
void Cur_Loop_PFC(void);
@@ -16,12 +16,15 @@
void gpio_init(void)
{
GPIO_InitTypeDef gpio_init = { 0 };
// PA12, PWOK
gpio_init.GPIO_Pin = GPIO_Pin_12;
gpio_init.GPIO_Pin = GPIO_Pin_12; // PA12, PWOK
gpio_init.GPIO_Pin |= GPIO_Pin_06; // PA6, test pin
gpio_init.GPIO_Pin |= GPIO_Pin_07; // PA7, test pin
gpio_init.GPIO_Mode = GPIO_Mode_OUT;
gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpio_init);
GPIO_WriteBit(GPIOA, GPIO_Pin_06, GPIO_PIN_LOW);
GPIO_WriteBit(GPIOA, GPIO_Pin_07, GPIO_PIN_LOW);
}
//===================================================================================
void adc_init(void)
@@ -44,7 +47,7 @@ void adc_init(void)
adc_init.DataAlign = ADC_DataAlign_Right;
adc_init.Mode = ADC_Mode_Scan; // Scan mode
ADC_Init(ADC0, &adc_init);
ADC_ExtTrigConfig(ADC0, ADC_ExtTrigSource_EPWM_CH1R, ADC_ExtTrigMode_Enable);
ADC_ExtTrigConfig(ADC0, ADC_ExtTrigSource_TIM0, ADC_ExtTrigMode_Enable);
// ADC interrupt config
sys_irq_attr_t irq_attr = {
@@ -79,7 +82,6 @@ void llc_pwm_init(void)
};
TIM_DeInit(EPWM);
TIM_TimeBaseInit(EPWM, &tim_init);
TIM_ARRPreloadConfig(EPWM, ENABLE);
// pwm
@@ -90,10 +92,10 @@ void llc_pwm_init(void)
.TIM_OCIdleState = TIM_OCIdleState_Reset,
.TIM_OutputNState = TIM_OutputNState_Disable,
.TIM_OCNPolarity = TIM_OCPolarity_High,
.TIM_Pulse = 1,
.TIM_Pulse = LLC_PERIOD_SS >> 1,
};
TIM_OC1Init(EPWM, &pwm_init);
TIM_OC2Init(EPWM, &pwm_init);
TIM_OC1PreloadConfig(EPWM, ENABLE); // Output Compare 1 preload enable
{ /* Automatic Output enable, Break, dead time and lock configuration */
TIM_BDTRInitTypeDef bdtr_init = { 0 };
@@ -101,10 +103,6 @@ void llc_pwm_init(void)
bdtr_init.TIM_DeadTime = DEAD_TIME_VALUE;
TIM_BDTRConfig(EPWM, &bdtr_init);
}
TIM_Cmd(EPWM, ENABLE);
TIM_CtrlPWMOutputs(EPWM, ENABLE);
EPWM->CCMR1_OUTPUT_b.OC1PE = 1; // Output Compare 1 preload enable
}
//===================================================================================
void tim0_init(void)
@@ -116,8 +114,6 @@ void tim0_init(void)
.LPTIM_MatchValue = TIM0_PERIOD,
};
LPTIM_Init(TIM0, &tim0_init);
LPTIM_Enable(TIM0);
}
//===================================================================================
void sysclk_init(void)
@@ -140,5 +136,14 @@ void SYS_Config(void)
llc_pwm_init();
tim0_init();
// EPWM enable
TIM_Cmd(EPWM, ENABLE); // enable EPWM
TIM_CtrlPWMOutputs(EPWM, ENABLE); // enable PWM OUT
// TIM0 enable
LPTIM_Enable(TIM0);
uart_init();
}
@@ -119,7 +119,7 @@ uint16_t capture_packet_gap_ms = 1000;
//=============================================================================
// Private Function Definition
//=============================================================================
void A_Para_Reset()
void A_Para_Reset(void)
{
digital_vcomp = (LLC_PERIOD_MAX - LLC_PERIOD_MIN) << LLC_COMP_GAIN_BIT;
// vbus_set = (VBUS_SET * 4096 / VBUS_2ADC / 3.3);
@@ -131,13 +131,12 @@ void A_Para_Reset()
iac_comp_2 = 0;
// set default value
TIM2->ARR = PFC_PERIOD;
TIM2->CCR1 = PFC_DUTY_MIN; // min for ss
TIM2->EGR |= 0x01;
EPWM->ARR = LLC_PERIOD_SS;
EPWM->CCR1 = (LLC_PERIOD_SS >> 1);
EPWM->CCR1 = LLC_PERIOD_SS >> 1;
EPWM->EGR |= 0x01;
llc_period_ss = 0;
llc_period_ss = LLC_SS_MIN;
TIM0->MR0 = LLC_PERIOD_SS;
pfc_running = 0;
llc_running = 0;
@@ -201,6 +200,7 @@ void llc_set_period(uint16_t val)
{
if (val > LLC_PERIOD_MAX) val = LLC_PERIOD_MAX; // 可以小,不能過大
EPWM->ARR = val;
TIM0->MR0 = val;
EPWM->CCR1 = val >> 1;
}
//===================================================================================
@@ -502,6 +502,7 @@ void Vol_Loop_LLC(void) // 測試可工作
//=================================================================================
__INTERRUPT void isr_adc_handle(void)
{
GPIO_TogglePin(GPIOA, GPIO_Pin_06); // debug
SAVE_IRQ_CSR_CONTEXT();
ADC_ClearITFlag(ADC0);
@@ -598,6 +599,7 @@ int main(void)
// system initial configuration
SYS_Config();
A_Para_Reset();
sys_delay(10); // delay 10ms
// read plot param from flash
@@ -616,6 +618,7 @@ int main(void)
cloop_p->a2 = 3737;
cur_loop_fun_en = 1; // 開啟電流環,專測電流環
while (1)
{
uart_rx_task();