mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
mcpwm: allow compare equals to period
This commit is contained in:
parent
88b71f6416
commit
ad376e2d99
@ -129,7 +129,7 @@ esp_err_t mcpwm_comparator_set_compare_value(mcpwm_cmpr_handle_t cmpr, uint32_t
|
||||
mcpwm_group_t *group = oper->group;
|
||||
mcpwm_timer_t *timer = oper->timer;
|
||||
ESP_RETURN_ON_FALSE_ISR(timer, ESP_ERR_INVALID_STATE, TAG, "timer and operator are not connected");
|
||||
ESP_RETURN_ON_FALSE_ISR(cmp_ticks < timer->peak_ticks, ESP_ERR_INVALID_ARG, TAG, "compare value out of range");
|
||||
ESP_RETURN_ON_FALSE_ISR(cmp_ticks <= timer->peak_ticks, ESP_ERR_INVALID_ARG, TAG, "compare value out of range");
|
||||
|
||||
portENTER_CRITICAL_SAFE(&cmpr->spinlock);
|
||||
mcpwm_ll_operator_set_compare_value(group->hal.dev, oper->oper_id, cmpr->cmpr_id, cmp_ticks);
|
||||
|
@ -644,3 +644,82 @@ TEST_CASE("mcpwm_generator_deadtime_classical_configuration", "[mcpwm]")
|
||||
printf("Bypass A, RED + FED on B\r\n");
|
||||
mcpwm_deadtime_test_template(1000000, 500, 350, 350, 0, 2, redfedb_only_set_generator_actions, redfedb_only_set_dead_time);
|
||||
}
|
||||
|
||||
TEST_CASE("mcpwm_duty_empty_full", "[mcpwm]")
|
||||
{
|
||||
const int gen_gpio_num = 0;
|
||||
mcpwm_timer_handle_t timer;
|
||||
mcpwm_oper_handle_t oper;
|
||||
mcpwm_cmpr_handle_t comparator;
|
||||
mcpwm_gen_handle_t gen;
|
||||
|
||||
mcpwm_timer_config_t timer_config = {
|
||||
.group_id = 0,
|
||||
.clk_src = MCPWM_TIMER_CLK_SRC_DEFAULT,
|
||||
.resolution_hz = 1 * 1000 * 1000,
|
||||
.period_ticks = 50, // 50us <-> 20KHz
|
||||
.count_mode = MCPWM_TIMER_COUNT_MODE_UP,
|
||||
};
|
||||
mcpwm_operator_config_t operator_config = {
|
||||
.group_id = 0,
|
||||
};
|
||||
mcpwm_comparator_config_t comparator_config = {
|
||||
.flags.update_cmp_on_tep = true,
|
||||
.flags.update_cmp_on_tez = true,
|
||||
};
|
||||
printf("install timer, operator and comparator\r\n");
|
||||
TEST_ESP_OK(mcpwm_new_timer(&timer_config, &timer));
|
||||
TEST_ESP_OK(mcpwm_new_operator(&operator_config, &oper));
|
||||
TEST_ESP_OK(mcpwm_new_comparator(oper, &comparator_config, &comparator));
|
||||
|
||||
printf("connect MCPWM timer and operators\r\n");
|
||||
TEST_ESP_OK(mcpwm_operator_connect_timer(oper, timer));
|
||||
TEST_ESP_OK(mcpwm_comparator_set_compare_value(comparator, 0));
|
||||
|
||||
printf("install MCPWM generator\r\n");
|
||||
mcpwm_generator_config_t gen_config = {
|
||||
.gen_gpio_num = gen_gpio_num,
|
||||
.flags.io_loop_back = true, // we want to read the output level as well
|
||||
};
|
||||
TEST_ESP_OK(mcpwm_new_generator(oper, &gen_config, &gen));
|
||||
|
||||
printf("set generator actions on timer and compare events\r\n");
|
||||
TEST_ESP_OK(mcpwm_generator_set_actions_on_timer_event(gen,
|
||||
MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH),
|
||||
MCPWM_GEN_TIMER_EVENT_ACTION_END()));
|
||||
TEST_ESP_OK(mcpwm_generator_set_actions_on_compare_event(gen,
|
||||
MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comparator, MCPWM_GEN_ACTION_LOW),
|
||||
MCPWM_GEN_COMPARE_EVENT_ACTION_END()));
|
||||
|
||||
printf("start timer\r\n");
|
||||
TEST_ESP_OK(mcpwm_timer_enable(timer));
|
||||
TEST_ESP_OK(mcpwm_timer_start_stop(timer, MCPWM_TIMER_START_NO_STOP));
|
||||
|
||||
// check if the output is a const low level
|
||||
for (int i = 0; i < 100; i++) {
|
||||
TEST_ASSERT_EQUAL(0, gpio_get_level(gen_gpio_num));
|
||||
esp_rom_delay_us(1);
|
||||
}
|
||||
|
||||
// set the compare equals to the period
|
||||
TEST_ESP_OK(mcpwm_comparator_set_compare_value(comparator, 50));
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
// so the output should be a const high level
|
||||
for (int i = 0; i < 100; i++) {
|
||||
TEST_ASSERT_EQUAL(1, gpio_get_level(gen_gpio_num));
|
||||
esp_rom_delay_us(1);
|
||||
}
|
||||
|
||||
TEST_ESP_OK(mcpwm_comparator_set_compare_value(comparator, 49));
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
TEST_ESP_OK(mcpwm_comparator_set_compare_value(comparator, 1));
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
|
||||
printf("uninstall timer, operator and comparator\r\n");
|
||||
TEST_ESP_OK(mcpwm_timer_start_stop(timer, MCPWM_TIMER_STOP_EMPTY));
|
||||
TEST_ESP_OK(mcpwm_timer_disable(timer));
|
||||
TEST_ESP_OK(mcpwm_del_generator(gen));
|
||||
TEST_ESP_OK(mcpwm_del_comparator(comparator));
|
||||
TEST_ESP_OK(mcpwm_del_operator(oper));
|
||||
TEST_ESP_OK(mcpwm_del_timer(timer));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user