8 Commits

6 changed files with 1970 additions and 1979 deletions
@@ -1,20 +1,20 @@
/**
* Copyright (c) 2026 Wisetop. All Rights Reserved.
*/
#ifndef INC_INIT_H_
#define INC_INIT_H_
#include "main.h"
void SYS_Config(void);
void sysclk_init(void);
void gpio_init(void);
void opa_init(void);
void adc_init(void);
void tim0_init(void);
void llc_pwm_init(void);
void pfc_pwm_init(void);
void pwm_brake();
#endif /* INC_INIT_H_ */
/**
* Copyright (c) 2026 Wisetop. All Rights Reserved.
*/
#ifndef INC_INIT_H_
#define INC_INIT_H_
#include "main.h"
void SYS_Config(void);
void sysclk_init(void);
void gpio_init(void);
void opa_init(void);
void adc_init(void);
void tim0_init(void);
void llc_pwm_init(void);
void pfc_pwm_init(void);
void pwm_brake();
#endif /* INC_INIT_H_ */
@@ -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 150 // 150 = 400khz (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 150 // MIN, 150 = 400KHZ (>760不會振)
#define LLC_PERIOD_MAX 400 // MAX, 400 = 150KHZ // 可調範圍太大會共振
#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 600
// 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);
@@ -219,6 +219,8 @@ void uart_cmd_parse(char *cmd_buf, uint32_t size)
msg(" flash_bodeplot? - show raw flash content for bode plot parameters\r\n");
msg(" notify_en=0 or notify_en=1 or notify_en=255,n\r\n");
msg(" notify_packet_gap=GAP_MS\r\n");
msg(" epwm_arr=VAL\r\n");
msg(" epwm_en=0 or epwm_en=1\r\n");
}
else if (strcmp(cmd_buf, "version") == 0)
{
@@ -298,6 +300,25 @@ void uart_cmd_parse(char *cmd_buf, uint32_t size)
{
capture_packet_gap_ms = atoi(arg) < 10 ? 10 : atoi(arg); // 設置最小間隔為10ms
}
else if (cmd_match_with_arg(cmd_buf, "epwm_arr=", &arg))
{
uint32_t arr_val = atoi(arg);
llc_set_period(atoi(arg));
}
else if (cmd_match_with_arg(cmd_buf, "epwm_en=", &arg))
{
uint8_t epwm_enable = atoi(arg);
if (epwm_enable)
{
llc_pwm_enable();
}
else
{
llc_pwm_disable();
A_Para_Reset();
}
}
else
{
msg("Unknown command: %s\r\n", cmd_buf);
File diff suppressed because it is too large Load Diff
@@ -1,144 +1,161 @@
/**
* Copyright (c) 2026 Wisetop. All Rights Reserved.
*/
#include "init.h"
#include "app.h"
#include "hal_device.h"
//=============================================================================
// Constant Definition
//=============================================================================
//=============================================================================
// Public Function Definition
//=============================================================================
void gpio_init(void)
{
GPIO_InitTypeDef gpio_init = { 0 };
// PA12, PWOK
gpio_init.GPIO_Pin = GPIO_Pin_12;
gpio_init.GPIO_Mode = GPIO_Mode_OUT;
gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &gpio_init);
}
//===================================================================================
void adc_init(void)
{
// gpio
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = GPIO_Pin_08; // PA8 AIN2 VBUS
gpio_init.GPIO_Pin |= GPIO_Pin_09; // PA9 AIN3 IP_CS
gpio_init.GPIO_Pin |= GPIO_Pin_10; // PA10 AIN4 VCOMP
gpio_init.GPIO_Mode = GPIO_Mode_ANAL;
GPIO_Init(GPIOA, &gpio_init);
// adc
ADC_InitTypeDef adc_init = { 0 };
ADC_StructInit(&adc_init);
adc_init.SelChannels = ADC_Channel_02;
adc_init.SelChannels |= ADC_Channel_03;
adc_init.SelChannels |= ADC_Channel_04;
adc_init.ClkPrescaler = ADC_ClkDiv_4; // 60M/4 = 15MHz, ADC max working clock is 16MHz
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 interrupt config
sys_irq_attr_t irq_attr = {
.disable_vector = false,
.trig_mode = SYS_IRQ_TRIGGER_LEVEL,
.level = SYS_IRQ_LEVEL_H,
.priority = SYS_IRQ_PRIORITY_MIDDEN,
};
sys_register_IRQ(ADC0_IRQn, isr_adc_handle, &irq_attr);
ADC0->CON0_b.INT_EN = 1; // ADC interrupt enable
}
//===================================================================================
void llc_pwm_init(void)
{
// gpio
// PA0(EPWM0P), PA1(EPWM0N)
GPIO_InitTypeDef gpio_init = {
.GPIO_Pin = GPIO_Pin_00 | GPIO_Pin_01,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_AF_Mode = GPIO_AF_6,
};
GPIO_Init(GPIOA, &gpio_init);
// tim
TIM_TimeBaseInitTypeDef tim_init = {
.TIM_Prescaler = 0,
.TIM_CounterMode = TIM_CounterMode_Up,
.TIM_Period = LLC_PERIOD_SS,
.TIM_ClockDivision = TIM_CKD_Div1,
.TIM_RepetitionCounter = 0,
};
TIM_DeInit(EPWM);
TIM_TimeBaseInit(EPWM, &tim_init);
TIM_ARRPreloadConfig(EPWM, ENABLE);
// pwm
TIM_OCInitTypeDef pwm_init = {
.TIM_OCMode = TIM_OCMode_PWM1,
.TIM_OutputState = TIM_OutputState_Disable,
.TIM_OCPolarity = TIM_OCPolarity_High,
.TIM_OCIdleState = TIM_OCIdleState_Reset,
.TIM_OutputNState = TIM_OutputNState_Disable,
.TIM_OCNPolarity = TIM_OCPolarity_High,
.TIM_Pulse = 1,
};
TIM_OC1Init(EPWM, &pwm_init);
TIM_OC2Init(EPWM, &pwm_init);
{ /* Automatic Output enable, Break, dead time and lock configuration */
TIM_BDTRInitTypeDef bdtr_init = { 0 };
bdtr_init.TIM_LOCKLevel = TIM_LockLevel_OFF;
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)
{
LPTIM_InitTypeDef tim0_init = {
.LPTIM_Prescaler = 0,
.LPTIM_ClockSource = LPTIM_CLK_Src_SysClk,
.LPTIM_MatchMode = LPTIM_MatchMode_IRQ | LPTIM_MatchMode_Reset,
.LPTIM_MatchValue = TIM0_PERIOD,
};
LPTIM_Init(TIM0, &tim0_init);
LPTIM_Enable(TIM0);
}
//===================================================================================
void sysclk_init(void)
{
SYSCFG_ClkInitTypeDef SysClkInit = {
.ClkSource = SYSCFG_ClkSrc_HSI,
};
SYSCFG_SysClkConfig(&SysClkInit);
sys_config_systick(SYS_TICK_1_MS);
}
//===================================================================================
void SYS_Config(void)
{
sysclk_init();
gpio_init();
adc_init();
llc_pwm_init();
uart_init();
}
/**
* Copyright (c) 2026 Wisetop. All Rights Reserved.
*/
#include "init.h"
#include "app.h"
#include "hal_device.h"
//=============================================================================
// Constant Definition
//=============================================================================
//=============================================================================
// Public Function Definition
//=============================================================================
void gpio_init(void)
{
GPIO_InitTypeDef gpio_init = { 0 };
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)
{
// gpio
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = GPIO_Pin_08; // PA8 AIN2 VBUS
gpio_init.GPIO_Pin |= GPIO_Pin_09; // PA9 AIN3 IP_CS
gpio_init.GPIO_Pin |= GPIO_Pin_10; // PA10 AIN4 VCOMP
gpio_init.GPIO_Mode = GPIO_Mode_ANAL;
GPIO_Init(GPIOA, &gpio_init);
// adc
ADC_InitTypeDef adc_init = { 0 };
ADC_StructInit(&adc_init);
adc_init.SelChannels = ADC_Channel_02;
adc_init.SelChannels |= ADC_Channel_03;
adc_init.SelChannels |= ADC_Channel_04;
adc_init.ClkPrescaler = ADC_ClkDiv_4; // 60M/4 = 15MHz, ADC max working clock is 16MHz
adc_init.DataAlign = ADC_DataAlign_Right;
adc_init.Mode = ADC_Mode_Scan; // Scan mode
ADC_Init(ADC0, &adc_init);
ADC_ExtTrigConfig(ADC0, ADC_ExtTrigSource_TIM0, ADC_ExtTrigMode_Enable);
// ADC interrupt config
sys_irq_attr_t irq_attr = {
.disable_vector = false,
.trig_mode = SYS_IRQ_TRIGGER_LEVEL,
.level = SYS_IRQ_LEVEL_H,
.priority = SYS_IRQ_PRIORITY_MIDDEN,
};
sys_register_IRQ(ADC0_IRQn, isr_adc_handle, &irq_attr);
ADC0->CON0_b.INT_EN = 1; // ADC interrupt enable
}
//===================================================================================
void llc_pwm_init(void)
{
// gpio
// PA0(EPWM0P), PA1(EPWM0N)
GPIO_InitTypeDef gpio_init = {
.GPIO_Pin = GPIO_Pin_00 | GPIO_Pin_01,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_AF_Mode = GPIO_AF_6,
};
GPIO_Init(GPIOA, &gpio_init);
// gpio
// PA11(BKIN)
GPIO_InitTypeDef gpio_bkin = { 0 };
gpio_bkin.GPIO_Pin = GPIO_Pin_11;
gpio_bkin.GPIO_Mode = GPIO_Mode_IN;
gpio_bkin.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &gpio_bkin);
GPIO_PeriAFConfig(GPIOA, GPIO_Peri_BKIN, GPIO_PeriAF_6);
// tim
TIM_TimeBaseInitTypeDef tim_init = {
.TIM_Prescaler = 0,
.TIM_CounterMode = TIM_CounterMode_Up,
.TIM_Period = LLC_PERIOD_SS,
.TIM_ClockDivision = TIM_CKD_Div1,
.TIM_RepetitionCounter = 0,
};
TIM_DeInit(EPWM);
TIM_TimeBaseInit(EPWM, &tim_init);
TIM_ARRPreloadConfig(EPWM, ENABLE);
// pwm
TIM_OCInitTypeDef pwm_init = {
.TIM_OCMode = TIM_OCMode_PWM1,
.TIM_OutputState = TIM_OutputState_Disable,
.TIM_OCPolarity = TIM_OCPolarity_High,
.TIM_OCIdleState = TIM_OCIdleState_Reset,
.TIM_OutputNState = TIM_OutputNState_Disable,
.TIM_OCNPolarity = TIM_OCPolarity_High,
.TIM_Pulse = LLC_PERIOD_SS >> 1,
};
TIM_OC1Init(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 };
bdtr_init.TIM_LOCKLevel = TIM_LockLevel_OFF;
bdtr_init.TIM_DeadTime = DEAD_TIME_VALUE;
// bdtr_init.TIM_Break = TIM_Break_Enable;
// bdtr_init.TIM_BreakPolarity = TIM_BreakPolarity_High;
// bdtr_init.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
TIM_BDTRConfig(EPWM, &bdtr_init);
}
}
//===================================================================================
void tim0_init(void)
{
LPTIM_InitTypeDef tim0_init = {
.LPTIM_Prescaler = 0,
.LPTIM_ClockSource = LPTIM_CLK_Src_SysClk,
.LPTIM_MatchMode = LPTIM_MatchMode_IRQ | LPTIM_MatchMode_Reset,
.LPTIM_MatchValue = TIM0_PERIOD,
};
LPTIM_Init(TIM0, &tim0_init);
}
//===================================================================================
void sysclk_init(void)
{
SYSCFG_ClkInitTypeDef SysClkInit = {
.ClkSource = SYSCFG_ClkSrc_HSI,
};
SYSCFG_SysClkConfig(&SysClkInit);
sys_config_systick(SYS_TICK_1_MS);
}
//===================================================================================
void SYS_Config(void)
{
sysclk_init();
gpio_init();
adc_init();
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();
}
File diff suppressed because it is too large Load Diff