feat: Synchronize ADC trigger with EPWM period via LPTIM0
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user