uart 可以使用 debug_epwm_en等等指令

This commit is contained in:
roy01
2026-04-23 17:34:52 +08:00
parent bb5621a3fd
commit e6fdabcd3a
10 changed files with 186 additions and 70 deletions
+47 -1
View File
@@ -16,6 +16,14 @@ extern "C"
#define FW_VERSION "0.0.1"
enum phase_e
{
PHASE_U = 0,
PHASE_V = 1,
PHASE_W = 2,
PHASE_CH = 3,
};
enum notify_type_e
{
NOTIFY_TYPE_NODATA = 0,
@@ -24,7 +32,7 @@ extern "C"
NOTIFY_TYPE_PERIOD = 3,
};
struct cmd_param_t
struct old_cmd_param_t
{
int32_t dds_ftw;
uint32_t dds_amp;
@@ -43,6 +51,44 @@ extern "C"
} soft_start;
};
struct dds_output_t
{
uint32_t phase_acc;
uint8_t lut_idx;
uint8_t nquadrant;
uint8_t last_quadrant;
int16_t lut_sin_val;
int16_t lut_cos_val;
uint16_t duty;
};
struct dds_feedback_t
{
int16_t current_corrected;
int32_t sum_sine;
int32_t sum_cos;
int16_t m_point;
int32_t in_phase;
int32_t q_over_i;
int32_t err_sig;
int32_t magnitude;
};
struct motor_ctx_t
{
uint16_t mode;
uint32_t phase_acc_base;
int32_t begin_dds_ftw; // max: 2^22
int32_t begin_dds_amp; // max: 2^7*1250
int32_t goal_dds_ftw;
int32_t goal_dds_amp;
struct dds_output_t phase_out[PHASE_CH];
struct dds_feedback_t phase_fb[PHASE_CH];
};
extern struct motor_ctx_t g_motor_ctx_t;
#ifdef __cplusplus
}
#endif
+1 -1
View File
@@ -61,7 +61,7 @@ extern "C"
struct dds_cal_param *dds_get_cal_param(uint16_t phase_idx);
struct dds_phase_error_cal_param *dds_get_phase_error_cal_param(void);
void dds_get_ftw_amp_setting(int32_t *ftw, uint32_t *amp);
void dds_pwm_duty_cycle_update(struct cmd_param_t *cmd_param, uint8_t motor_mode);
void dds_pwm_duty_cycle_update(struct old_cmd_param_t *cmd_param, uint8_t motor_mode);
uint8_t dds_is_change_duty_flags(void);
void dds_tim_period_elapsed(void);
+7 -7
View File
@@ -6,15 +6,15 @@ extern "C"
{
#endif
#include "main.h"
#include "app_cfg.h"
#define EPWM_PWM_PERIOD 2500U
#define HIRC_Freq 60000000U
#define CurrentLoopIsrFreq 24000U
#define EPWM_PWM_PERIOD 2500U
void epwm_init(void);
void epwm_en(bool en);
void epwm_set_duty(uint16_t ch1_val, uint16_t ch2_val, uint16_t ch3_val);
uint32_t epwm_take_24khz_ticks(void);
uint32_t epwm_get_ms(void);
void epwm_drv_init(void);
void epwm_drv_output_en(bool en);
void epwm_drv_set_duty(uint16_t ch1_val, uint16_t ch2_val, uint16_t ch3_val);
#ifdef __cplusplus
}
+3 -3
View File
@@ -51,9 +51,9 @@ extern "C"
#error "Motor type not defined"
#endif
void motor_ctrl_init_cmd_param(struct cmd_param_t *cmd_param);
void motor_ctrl_apply_default_settings(struct cmd_param_t *cmd_param);
void motor_ctrl_update_task(struct cmd_param_t *cmd_param);
void motor_ctrl_init_cmd_param(struct old_cmd_param_t *cmd_param);
void motor_ctrl_apply_default_settings(struct old_cmd_param_t *cmd_param);
void motor_ctrl_update_task(struct old_cmd_param_t *cmd_param);
void motor_ctrl_set_amp_ftw_mode(enum amp_ftw_control_mode_e mode);
void motor_ctrl_set_mode(enum motor_mode_e mode);
enum motor_mode_e motor_ctrl_get_mode(void);
+3 -2
View File
@@ -9,6 +9,7 @@ extern "C"
#include "app_cfg.h"
#define UART_RX_BUF_SIZE 64
#define UART_TX_BUF_SIZE 256
extern volatile char g_uart_rx_buf[UART_RX_BUF_SIZE];
extern volatile uint16_t g_uart_rx_idx;
@@ -17,8 +18,8 @@ extern "C"
#define uart_send_msg(str, ...) printf(str, ##__VA_ARGS__);
int uart_drv_init(void);
int uart_write(void *p_src, int src_size);
void uart_clear_rx_frame(void);
int uart_drv_write(void *p_src, int src_size);
void uart_drv_clr_rx_frame(void);
bool uart_is_frame_ready(void);
#ifdef __cplusplus
+6 -6
View File
@@ -201,7 +201,7 @@ static void print_period_data(uint16_t print_type, struct dds_cal_param *phase,
{
uint8_t buffer[64] = { 0 };
uint8_t *ptr = buffer;
uint32_t mcu_timestamp = epwm_get_ms();
uint32_t mcu_timestamp = sys_get_tick();
*ptr++ = 0x55;
*ptr++ = 0xAA;
@@ -234,7 +234,7 @@ static void print_period_data(uint16_t print_type, struct dds_cal_param *phase,
*ptr++ = 0x0D;
*ptr++ = 0x0A;
uart_write(buffer, (uint16_t)(ptr - buffer));
uart_drv_write(buffer, (uint16_t)(ptr - buffer));
}
static void fix_amp_fb(int32_t err_sig)
@@ -287,12 +287,12 @@ void dds_pwm_start(void)
g_phase[i].last_quadrant = 0;
}
epwm_en(true);
epwm_drv_output_en(true);
}
void dds_pwm_stop(void)
{
epwm_en(false);
epwm_drv_output_en(false);
}
void dds_set_phase_acc_ftw(uint32_t ftw)
@@ -337,7 +337,7 @@ void dds_get_ftw_amp_setting(int32_t *ftw, uint32_t *amp)
}
}
void dds_pwm_duty_cycle_update(struct cmd_param_t *cmd, uint8_t motor_mode)
void dds_pwm_duty_cycle_update(struct old_cmd_param_t *cmd, uint8_t motor_mode)
{
uint16_t adc_iu_lf = 0;
@@ -401,7 +401,7 @@ void dds_pwm_duty_cycle_update(struct cmd_param_t *cmd, uint8_t motor_mode)
g_phase_cal.m_point = 0;
}
epwm_set_duty(g_phase[PHASE_U].duty, g_phase[PHASE_V].duty, g_phase[PHASE_W].duty);
epwm_drv_set_duty(g_phase[PHASE_U].duty, g_phase[PHASE_V].duty, g_phase[PHASE_W].duty);
g_change_duty_flags &= (uint8_t)~1U;
}
+6 -30
View File
@@ -1,12 +1,6 @@
#include "epwm_drv.h"
#define HIRC_Freq 60000000U
#define CurrentLoopIsrFreq 24000U
#define PWM_PERIOD EPWM_PWM_PERIOD
static volatile uint32_t g_epwm_pending_ticks = 0;
static volatile uint32_t g_epwm_ms = 0;
static volatile uint8_t g_epwm_sub_ms_ticks = 0;
static volatile bool g_epwm_24khz_tick = false;
__INTERRUPT void epwm_irq_handler(void)
{
@@ -15,20 +9,14 @@ __INTERRUPT void epwm_irq_handler(void)
/* Overflow happens once per PWM period -> 24kHz tick */
if ((EPWM->SR & 0x10000U) == 0x10000U)
{
g_epwm_pending_ticks++;
g_epwm_sub_ms_ticks++;
if (g_epwm_sub_ms_ticks >= (CurrentLoopIsrFreq / 1000U))
{
g_epwm_sub_ms_ticks = 0;
g_epwm_ms++;
}
g_epwm_24khz_tick = true;
TIM_ClearITPendingBit(EPWM, 0x10000U); // clear OVIF
}
RESTORE_IRQ_CSR_CONTEXT();
}
void epwm_en(bool en)
void epwm_drv_output_en(bool en)
{
if (en)
{
@@ -42,26 +30,14 @@ void epwm_en(bool en)
}
}
void epwm_set_duty(uint16_t ch1_val, uint16_t ch2_val, uint16_t ch3_val)
void epwm_drv_set_duty(uint16_t ch1_val, uint16_t ch2_val, uint16_t ch3_val)
{
TIM_SetCompare1(EPWM, ch1_val);
TIM_SetCompare2(EPWM, ch2_val);
TIM_SetCompare3(EPWM, ch3_val);
}
uint32_t epwm_take_24khz_ticks(void)
{
uint32_t ticks = g_epwm_pending_ticks;
g_epwm_pending_ticks = 0;
return ticks;
}
uint32_t epwm_get_ms(void)
{
return g_epwm_ms;
}
void epwm_init(void)
void epwm_drv_init(void)
{
GPIO_InitTypeDef epwm_gpio_cfg = { 0 };
TIM_TimeBaseInitTypeDef tim_base_cfg = { 0 };
@@ -83,7 +59,7 @@ void epwm_init(void)
TIM_TimeBaseStructInit(&tim_base_cfg);
tim_base_cfg.TIM_Prescaler = 0;
tim_base_cfg.TIM_CounterMode = TIM_CounterMode_Up;
tim_base_cfg.TIM_Period = PWM_PERIOD - 1;
tim_base_cfg.TIM_Period = EPWM_PWM_PERIOD - 1;
tim_base_cfg.TIM_ClockDivision = TIM_CKD_Div1;
tim_base_cfg.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(EPWM, &tim_base_cfg);
+104 -11
View File
@@ -37,8 +37,9 @@
//=============================================================================
// Private Function Definition
//=============================================================================
static struct cmd_param_t g_cmd_param = { 0 };
static struct old_cmd_param_t g_cmd_param = { 0 };
static bool g_motor_running = false;
struct motor_ctx_t g_motor_ctx_t;
static void sysclk_init(void)
{
@@ -73,11 +74,11 @@ static void app_stop_motor(void)
motor_ctrl_stop();
}
static void motor_ctrl_print_basic_data(struct cmd_param_t *cmd_param)
static void motor_ctrl_print_basic_data(struct old_cmd_param_t *cmd_param)
{
uint8_t buffer[64] = { 0 };
uint8_t *ptr = buffer;
uint32_t mcu_timestamp = epwm_get_ms();
uint32_t mcu_timestamp = sys_get_tick();
uint16_t adc_values[ADC_BUF_LEN] = { 0 };
uint32_t dds_amp = 0;
int32_t dds_ftw = 0;
@@ -114,13 +115,13 @@ static void motor_ctrl_print_basic_data(struct cmd_param_t *cmd_param)
*ptr++ = 0x0D;
*ptr++ = 0x0A;
uart_write(buffer, (uint16_t)(ptr - buffer));
uart_drv_write(buffer, (uint16_t)(ptr - buffer));
}
static void print_motor_data_task(struct cmd_param_t *cmd_param)
static void print_motor_data_task(struct old_cmd_param_t *cmd_param)
{
static uint32_t notify_time = 0;
uint32_t now = epwm_get_ms();
uint32_t now = sys_get_tick();
if ((now - notify_time) >= cmd_param->notify_time_ms && cmd_param->notify_type != NOTIFY_TYPE_PERIOD)
{
@@ -133,10 +134,71 @@ static void print_motor_data_task(struct cmd_param_t *cmd_param)
}
}
void tool(uint32_t val)
{
switch (val)
{
case 1:
epwm_drv_output_en(1);
break;
case 2:
epwm_drv_output_en(0);
break;
}
}
static bool cmd_match_with_arg(const volatile char *buf, const char *prefix, const char **arg_out)
{
size_t len = strlen(prefix);
for (size_t i = 0; i < len; i++)
{
if (buf[i] != prefix[i])
return false;
}
if (buf[len] == ' ')
{
*arg_out = (const char *)&buf[len + 1];
return true;
}
return false;
}
static int32_t cmd_parse_int_list(const char *arg, int32_t *out, int32_t max_count)
{
int32_t count = 0;
char *end = NULL;
const char *p = arg;
while (*p != '\0' && count < max_count)
{
while (*p == ' ')
p++;
if (*p == '\0')
break;
out[count] = strtol(p, &end, 10);
if (end == p)
return -1;
count++;
p = end;
}
while (*p == ' ')
p++;
if (*p != '\0')
return -1;
return count;
}
static void handle_cmd_task(void)
{
struct cmd_param_t *c_p = &g_cmd_param;
struct old_cmd_param_t *c_p = &g_cmd_param;
char *data = (char *)g_uart_rx_buf;
const char *arg = NULL;
if (!uart_is_frame_ready())
{
@@ -190,12 +252,44 @@ static void handle_cmd_task(void)
{
uart_send_msg("FW_VER_PEC930_%s\r\n", FW_VERSION);
}
else if (cmd_match_with_arg(data, "debug_epwm_set_duty", &arg))
{
int32_t values[3] = { 0 };
int32_t parsed = cmd_parse_int_list(arg, values, 3);
if (parsed <= 0)
{
uart_send_msg("ERR usage: epwm_set_duty duty1 duty2 duty3\r\n");
}
else
{
epwm_drv_set_duty(values[0], values[1], values[2]);
uart_send_msg("OK epwm_set_duty: %ld %ld %ld\r\n", values[0], values[1], values[2]);
}
}
else if (cmd_match_with_arg(data, "debug_epwm_en", &arg))
{
if (arg[0] == '1')
{
epwm_drv_output_en(1);
uart_send_msg("OK epwm on\r\n");
}
else if (arg[0] == '0')
{
epwm_drv_output_en(0);
uart_send_msg("OK epwm off\r\n");
}
else
{
uart_send_msg("ERR usage: epwm_en 1/0\r\n");
}
}
else
{
uart_send_msg("Unknown command. Type 'help' for available commands.\r\n");
uart_send_msg("ERR unknown cmd\r\n");
}
uart_clear_rx_frame();
uart_drv_clr_rx_frame();
}
//=============================================================================
@@ -206,8 +300,8 @@ int main(void)
sysclk_init();
test_pin_init();
uart_drv_init();
epwm_drv_init();
// epwm_init();
// adc_drv_init();
// motor_ctrl_init_cmd_param(&g_cmd_param);
@@ -218,7 +312,6 @@ int main(void)
while (1)
{
// uint32_t pending_ticks = epwm_take_24khz_ticks();
// while (pending_ticks-- > 0U)
// {
+5 -5
View File
@@ -75,7 +75,7 @@ static uint32_t motor_ctrl_vf_formula_cal(enum vf_control_use_type_e vf_control_
return (uint32_t)damp > DDS_AMP_MAX ? DDS_AMP_MAX : (uint32_t)damp;
}
static void motor_ctrl_soft_start_mode(struct cmd_param_t *cmd_param)
static void motor_ctrl_soft_start_mode(struct old_cmd_param_t *cmd_param)
{
static int32_t dftw_step = 0;
static int32_t dftw_goal = 0;
@@ -129,7 +129,7 @@ static void motor_ctrl_soft_start_mode(struct cmd_param_t *cmd_param)
}
}
void motor_ctrl_init_cmd_param(struct cmd_param_t *cmd_param)
void motor_ctrl_init_cmd_param(struct old_cmd_param_t *cmd_param)
{
cmd_param->dds_ftw = DDS_FTW_100HZ;
cmd_param->dds_amp = DDS_AMP_100;
@@ -144,17 +144,17 @@ void motor_ctrl_init_cmd_param(struct cmd_param_t *cmd_param)
cmd_param->soft_start.soft_start_time_ms = 5000;
}
void motor_ctrl_apply_default_settings(struct cmd_param_t *cmd_param)
void motor_ctrl_apply_default_settings(struct old_cmd_param_t *cmd_param)
{
adc_duty_cycle_set(0.18f);
dds_set_phase_acc_ftw((uint32_t)cmd_param->dds_ftw);
dds_set_phase_acc_amp(cmd_param->dds_amp);
}
void motor_ctrl_update_task(struct cmd_param_t *cmd_param)
void motor_ctrl_update_task(struct old_cmd_param_t *cmd_param)
{
static uint32_t update_damp_dftw_time = 0;
uint32_t now = epwm_get_ms();
uint32_t now = sys_get_tick();
if ((now - update_damp_dftw_time) >= 1U)
{
+4 -4
View File
@@ -12,12 +12,12 @@
#define UART_RX_PIN GPIO_Pin_05
#define UART_RX_AF GPIO_AF_1
char g_uart_tx_buf[UART_TX_BUF_SIZE];
volatile char g_uart_rx_buf[UART_RX_BUF_SIZE];
volatile uint16_t g_uart_rx_idx = 0;
volatile bool g_uart_rx_complete = false;
char g_uart_tx_buf[256];
__INTERRUPT void uart_rx_handler(void)
{
SAVE_IRQ_CSR_CONTEXT();
@@ -87,7 +87,7 @@ int uart_drv_init(void)
return 0;
}
int uart_write(void *p_src, int src_size)
int uart_drv_write(void *p_src, int src_size)
{
if (p_src == NULL)
return 0;
@@ -103,7 +103,7 @@ int uart_write(void *p_src, int src_size)
return src_size;
}
void uart_clear_rx_frame(void)
void uart_drv_clr_rx_frame(void)
{
g_uart_rx_idx = 0;
g_uart_rx_complete = false;