2023-08-15 22:51:30 -04:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
#include "unity.h"
|
|
|
|
#include "esp_private/mcpwm.h"
|
|
|
|
#include "test_mcpwm_utils.h"
|
|
|
|
#include "driver/mcpwm_prelude.h"
|
|
|
|
|
|
|
|
TEST_CASE("mcpwm_set_interrupt_priority", "[mcpwm]")
|
|
|
|
{
|
|
|
|
printf("install timer\r\n");
|
|
|
|
mcpwm_timer_config_t timer_config = {
|
|
|
|
.group_id = 0,
|
|
|
|
.clk_src = MCPWM_TIMER_CLK_SRC_DEFAULT,
|
|
|
|
.resolution_hz = 1 * 1000 * 1000,
|
|
|
|
.period_ticks = 20 * 1000,
|
|
|
|
.count_mode = MCPWM_TIMER_COUNT_MODE_UP,
|
|
|
|
.intr_priority = 3,
|
|
|
|
};
|
|
|
|
mcpwm_timer_handle_t timer = NULL;
|
|
|
|
TEST_ESP_OK(mcpwm_new_timer(&timer_config, &timer));
|
|
|
|
printf("register event callbacks\r\n");
|
|
|
|
mcpwm_timer_event_callbacks_t timer_cbs = {
|
|
|
|
.on_stop = NULL,
|
|
|
|
.on_full = NULL,
|
|
|
|
.on_empty = NULL,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_timer_register_event_callbacks(timer, &timer_cbs, NULL));
|
|
|
|
timer_config.intr_priority = 1;
|
|
|
|
mcpwm_timer_handle_t timer2 = NULL;
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, mcpwm_new_timer(&timer_config, &timer2));
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, mcpwm_timer_register_event_callbacks(timer2, &timer_cbs, NULL));
|
|
|
|
|
|
|
|
printf("install operator\r\n");
|
|
|
|
mcpwm_operator_config_t operator_config = {
|
|
|
|
.group_id = 0,
|
|
|
|
.intr_priority = 0,
|
|
|
|
};
|
|
|
|
mcpwm_oper_handle_t oper = NULL;
|
|
|
|
TEST_ESP_OK(mcpwm_new_operator(&operator_config, &oper));
|
|
|
|
printf("register event callbacks\r\n");
|
|
|
|
mcpwm_operator_event_callbacks_t oper_cbs = {
|
|
|
|
.on_brake_cbc = NULL,
|
|
|
|
.on_brake_ost = NULL,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_operator_register_event_callbacks(oper, &oper_cbs, NULL));
|
|
|
|
operator_config.intr_priority = 1;
|
|
|
|
mcpwm_oper_handle_t oper2 = NULL;
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, mcpwm_new_operator(&operator_config, &oper2));
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, mcpwm_operator_register_event_callbacks(oper2, &oper_cbs, NULL));
|
|
|
|
|
|
|
|
printf("install comparator\r\n");
|
|
|
|
mcpwm_comparator_config_t comparator_config = {
|
|
|
|
.intr_priority = 0,
|
|
|
|
};
|
|
|
|
mcpwm_cmpr_handle_t comparator = NULL;
|
|
|
|
TEST_ESP_OK(mcpwm_new_comparator(oper, &comparator_config, &comparator));
|
|
|
|
TEST_ESP_OK(mcpwm_operator_connect_timer(oper, timer));
|
|
|
|
printf("register event callback\r\n");
|
|
|
|
mcpwm_comparator_event_callbacks_t comparator_cbs = {
|
|
|
|
.on_reach = NULL,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_comparator_register_event_callbacks(comparator, &comparator_cbs, NULL));
|
|
|
|
comparator_config.intr_priority = 1;
|
|
|
|
mcpwm_cmpr_handle_t comparator2 = NULL;
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, mcpwm_new_comparator(oper, &comparator_config, &comparator2));
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, mcpwm_comparator_register_event_callbacks(comparator2, &comparator_cbs, NULL));
|
|
|
|
|
|
|
|
printf("install gpio fault\r\n");
|
|
|
|
const int fault_gpio = 0;
|
|
|
|
mcpwm_fault_handle_t fault = NULL;
|
|
|
|
mcpwm_gpio_fault_config_t gpio_fault_config = {
|
|
|
|
.group_id = 0,
|
|
|
|
.gpio_num = fault_gpio,
|
|
|
|
.intr_priority = 0,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_new_gpio_fault(&gpio_fault_config, &fault));
|
|
|
|
|
|
|
|
printf("register event callback\r\n");
|
|
|
|
mcpwm_fault_event_callbacks_t fault_cbs = {
|
|
|
|
.on_fault_enter = NULL,
|
|
|
|
.on_fault_exit = NULL,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_fault_register_event_callbacks(fault, &fault_cbs, NULL));
|
|
|
|
gpio_fault_config.intr_priority = 1;
|
|
|
|
mcpwm_fault_handle_t fault2 = NULL;
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, mcpwm_new_gpio_fault(&gpio_fault_config, &fault2));
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, mcpwm_fault_register_event_callbacks(fault2, &fault_cbs, NULL));
|
|
|
|
|
|
|
|
printf("install capture timer\r\n");
|
|
|
|
mcpwm_cap_timer_handle_t cap_timer = NULL;
|
|
|
|
mcpwm_capture_timer_config_t cap_timer_config = {
|
|
|
|
.clk_src = MCPWM_CAPTURE_CLK_SRC_DEFAULT,
|
|
|
|
.group_id = 0,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_new_capture_timer(&cap_timer_config, &cap_timer));
|
|
|
|
printf("install capture\r\n");
|
|
|
|
mcpwm_cap_channel_handle_t cap_channel = NULL;
|
|
|
|
mcpwm_capture_channel_config_t cap_chan_config = {
|
|
|
|
.gpio_num = -1,
|
|
|
|
.prescale = 2,
|
|
|
|
.intr_priority = 3,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_new_capture_channel(cap_timer, &cap_chan_config, &cap_channel));
|
|
|
|
|
|
|
|
printf("register event callback\r\n");
|
|
|
|
mcpwm_capture_event_callbacks_t cap_cbs = {
|
|
|
|
.on_cap = NULL,
|
|
|
|
};
|
|
|
|
TEST_ESP_OK(mcpwm_capture_channel_register_event_callbacks(cap_channel, &cap_cbs, NULL));
|
|
|
|
cap_chan_config.intr_priority = 1;
|
|
|
|
mcpwm_cap_channel_handle_t cap_channel2 = NULL;
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, mcpwm_new_capture_channel(cap_timer, &cap_chan_config, &cap_channel2));
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, mcpwm_capture_channel_register_event_callbacks(cap_channel2, &cap_cbs, NULL));
|
|
|
|
|
|
|
|
printf("delete all mcpwm objects\r\n");
|
|
|
|
TEST_ESP_OK(mcpwm_del_comparator(comparator));
|
|
|
|
TEST_ESP_OK(mcpwm_del_operator(oper));
|
|
|
|
TEST_ESP_OK(mcpwm_del_capture_channel(cap_channel));
|
|
|
|
TEST_ESP_OK(mcpwm_del_capture_timer(cap_timer));
|
|
|
|
TEST_ESP_OK(mcpwm_del_timer(timer));
|
|
|
|
TEST_ESP_OK(mcpwm_del_fault(fault));
|
|
|
|
}
|
2023-08-22 03:43:30 -04:00
|
|
|
|
|
|
|
TEST_CASE("mcpwm_group_set_prescale_dynamically", "[mcpwm]")
|
|
|
|
{
|
|
|
|
mcpwm_timer_config_t timer_config = {
|
|
|
|
.clk_src = MCPWM_TIMER_CLK_SRC_DEFAULT,
|
|
|
|
.resolution_hz = 100 * 1000, // 100kHz
|
|
|
|
.period_ticks = 400,
|
|
|
|
.count_mode = MCPWM_TIMER_COUNT_MODE_UP_DOWN,
|
|
|
|
.group_id = 0,
|
|
|
|
};
|
|
|
|
|
|
|
|
mcpwm_timer_handle_t timer = NULL;
|
|
|
|
printf("create mcpwm timer\r\n");
|
|
|
|
TEST_ESP_OK(mcpwm_new_timer(&timer_config, &timer));
|
|
|
|
|
|
|
|
mcpwm_operator_config_t operator_config = {
|
|
|
|
.group_id = 0,
|
|
|
|
};
|
|
|
|
mcpwm_oper_handle_t oper = NULL;
|
|
|
|
TEST_ESP_OK(mcpwm_new_operator(&operator_config, &oper));
|
|
|
|
|
|
|
|
mcpwm_generator_config_t generator_config = {
|
|
|
|
.gen_gpio_num = 0,
|
|
|
|
};
|
|
|
|
mcpwm_gen_handle_t generator = NULL;
|
|
|
|
TEST_ESP_OK(mcpwm_new_generator(oper, &generator_config, &generator));
|
|
|
|
|
|
|
|
printf("add carrier to PWM wave\r\n");
|
|
|
|
mcpwm_carrier_config_t carrier_config = {
|
|
|
|
.clk_src = MCPWM_CARRIER_CLK_SRC_DEFAULT,
|
|
|
|
.frequency_hz = 100000, // 100KHz carrier need higher group prescale
|
|
|
|
.duty_cycle = 0.5,
|
|
|
|
.first_pulse_duration_us = 10,
|
|
|
|
};
|
|
|
|
|
|
|
|
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, mcpwm_operator_apply_carrier(oper, &carrier_config));
|
|
|
|
carrier_config.frequency_hz = 2000000; // 2MHz carrier
|
|
|
|
carrier_config.first_pulse_duration_us = 5;
|
|
|
|
TEST_ESP_OK(mcpwm_operator_apply_carrier(oper, &carrier_config));
|
|
|
|
|
|
|
|
|
|
|
|
TEST_ESP_OK(mcpwm_del_generator(generator));
|
|
|
|
TEST_ESP_OK(mcpwm_del_operator(oper));
|
|
|
|
TEST_ESP_OK(mcpwm_del_timer(timer));
|
|
|
|
}
|