uart 可以使用 debug_epwm_en等等指令
This commit is contained in:
+47
-1
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
// {
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user