|
|
@@ -61,24 +61,26 @@ static void bldc_set_phase_up_vm(mcpwm_gen_handle_t (*gens)[2])
|
|
|
// U+ = PWM, U- = _PWM_
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_HIGH], -1, true);
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], -1, true);
|
|
|
- // V+ = 0, V- = 1
|
|
|
+
|
|
|
+ // V+ = 0, V- = 1 --[because gen_low is inverted by dead time]--> V+ = 0, V- = 0
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
- // W+ = 0, W- = 0
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
+
|
|
|
+ // W+ = 0, W- = 0 --[because gen_low is inverted by dead time]--> W+ = 0, W- = 1
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
}
|
|
|
|
|
|
// W+U-
|
|
|
static void bldc_set_phase_wp_um(mcpwm_gen_handle_t (*gens)[2])
|
|
|
{
|
|
|
- // U+ = 0, U- = 1
|
|
|
+ // U+ = 0, U- = 1 --[because gen_low is inverted by dead time]--> U+ = 0, U- = 0
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
|
|
|
- // V+ = 0, V- = 0
|
|
|
+ // V+ = 0, V- = 0 --[because gen_low is inverted by dead time]--> V+ = 0, V- = 1
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
|
|
|
// W+ = PWM, W- = _PWM_
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_HIGH], -1, true);
|
|
|
@@ -88,13 +90,13 @@ static void bldc_set_phase_wp_um(mcpwm_gen_handle_t (*gens)[2])
|
|
|
// W+V-
|
|
|
static void bldc_set_phase_wp_vm(mcpwm_gen_handle_t (*gens)[2])
|
|
|
{
|
|
|
- // U+ = 0, U- = 0
|
|
|
+ // U+ = 0, U- = 0 --[because gen_low is inverted by dead time]--> U+ = 0, U- = 1
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
|
|
|
- // V+ = 0, V- = 1
|
|
|
+ // V+ = 0, V- = 1 --[because gen_low is inverted by dead time]--> V+ = 0, V- = 0
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
|
|
|
// W+ = PWM, W- = _PWM_
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_HIGH], -1, true);
|
|
|
@@ -104,33 +106,33 @@ static void bldc_set_phase_wp_vm(mcpwm_gen_handle_t (*gens)[2])
|
|
|
// V+U-
|
|
|
static void bldc_set_phase_vp_um(mcpwm_gen_handle_t (*gens)[2])
|
|
|
{
|
|
|
- // U+ = 0, U- = 1
|
|
|
+ // U+ = 0, U- = 1 --[because gen_low is inverted by dead time]--> U+ = 0, U- = 0
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
|
|
|
// V+ = PWM, V- = _PWM_
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_HIGH], -1, true);
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], -1, true);
|
|
|
|
|
|
- // W+ = 0, W- = 0
|
|
|
+ // W+ = 0, W- = 0 --[because gen_low is inverted by dead time]--> W+ = 0, W- = 1
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
}
|
|
|
|
|
|
// V+W-
|
|
|
static void bldc_set_phase_vp_wm(mcpwm_gen_handle_t (*gens)[2])
|
|
|
{
|
|
|
- // U+ = 0, U- = 0
|
|
|
+ // U+ = 0, U- = 0 --[because gen_low is inverted by dead time]--> U+ = 0, U- = 1
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
|
|
|
// V+ = PWM, V- = _PWM_
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_HIGH], -1, true);
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], -1, true);
|
|
|
|
|
|
- // W+ = 0, W- = 1
|
|
|
+ // W+ = 0, W- = 1 --[because gen_low is inverted by dead time]--> W+ = 0, W- = 0
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
}
|
|
|
|
|
|
// U+W- / A+C-
|
|
|
@@ -140,13 +142,13 @@ static void bldc_set_phase_up_wm(mcpwm_gen_handle_t (*gens)[2])
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_HIGH], -1, true);
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_U][BLDC_MCPWM_GEN_INDEX_LOW], -1, true);
|
|
|
|
|
|
- // V+ = 0, V- = 0
|
|
|
+ // V+ = 0, V- = 0 --[because gen_low is inverted by dead time]--> V+ = 0, V- = 1
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_V][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
|
|
|
- // W+ = 0, W- = 1
|
|
|
+ // W+ = 0, W- = 1 --[because gen_low is inverted by dead time]--> W+ = 0, W- = 0
|
|
|
mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true);
|
|
|
- mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 1, true);
|
|
|
+ mcpwm_generator_set_force_level(gens[BLDC_MCPWM_OP_INDEX_W][BLDC_MCPWM_GEN_INDEX_LOW], 0, true);
|
|
|
}
|
|
|
|
|
|
static const bldc_hall_phase_action_t s_hall_actions[] = {
|
|
|
@@ -255,6 +257,8 @@ void app_main(void)
|
|
|
}
|
|
|
|
|
|
ESP_LOGI(TAG, "Set generator actions");
|
|
|
+ // gen_high and gen_low output the same waveform after the following configuration
|
|
|
+ // we will use the dead time module to add edge delay, also make gen_high and gen_low complementary
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generators[i][BLDC_MCPWM_GEN_INDEX_HIGH],
|
|
|
MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
|
|
|
@@ -264,6 +268,15 @@ void app_main(void)
|
|
|
MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
|
|
|
ESP_ERROR_CHECK(mcpwm_generator_set_action_on_brake_event(generators[i][BLDC_MCPWM_GEN_INDEX_HIGH],
|
|
|
MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
|
|
|
+
|
|
|
+ ESP_ERROR_CHECK(mcpwm_generator_set_action_on_timer_event(generators[i][BLDC_MCPWM_GEN_INDEX_LOW],
|
|
|
+ MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
|
|
|
+ ESP_ERROR_CHECK(mcpwm_generator_set_action_on_compare_event(generators[i][BLDC_MCPWM_GEN_INDEX_LOW],
|
|
|
+ MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comparators[i], MCPWM_GEN_ACTION_LOW)));
|
|
|
+ ESP_ERROR_CHECK(mcpwm_generator_set_action_on_brake_event(generators[i][BLDC_MCPWM_GEN_INDEX_LOW],
|
|
|
+ MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
|
|
|
+ ESP_ERROR_CHECK(mcpwm_generator_set_action_on_brake_event(generators[i][BLDC_MCPWM_GEN_INDEX_LOW],
|
|
|
+ MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
|
|
|
}
|
|
|
|
|
|
ESP_LOGI(TAG, "Setup deadtime");
|
|
|
@@ -278,14 +291,14 @@ void app_main(void)
|
|
|
.flags.invert_output = true,
|
|
|
};
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
- ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generators[i][BLDC_MCPWM_GEN_INDEX_HIGH], generators[i][BLDC_MCPWM_GEN_INDEX_LOW], &dt_config));
|
|
|
+ ESP_ERROR_CHECK(mcpwm_generator_set_dead_time(generators[i][BLDC_MCPWM_GEN_INDEX_LOW], generators[i][BLDC_MCPWM_GEN_INDEX_LOW], &dt_config));
|
|
|
}
|
|
|
|
|
|
ESP_LOGI(TAG, "Turn off all the gates");
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
- for (int j = 0; j < 2; j++) {
|
|
|
- ESP_ERROR_CHECK(mcpwm_generator_set_force_level(generators[i][j], 0, true));
|
|
|
- }
|
|
|
+ ESP_ERROR_CHECK(mcpwm_generator_set_force_level(generators[i][BLDC_MCPWM_GEN_INDEX_HIGH], 0, true));
|
|
|
+ // because gen_low is inverted by dead time module, so we need to set force level to 1
|
|
|
+ ESP_ERROR_CHECK(mcpwm_generator_set_force_level(generators[i][BLDC_MCPWM_GEN_INDEX_LOW], 1, true));
|
|
|
}
|
|
|
|
|
|
ESP_LOGI(TAG, "Create Hall sensor capture channels");
|