|
|
@@ -96,12 +96,39 @@ static void timer_frequency_test(ledc_channel_t channel, ledc_timer_bit_t timer_
|
|
|
frequency_set_get(ledc_ch_config.speed_mode, ledc_ch_config.timer_sel, 9000, 9025, 5);
|
|
|
}
|
|
|
|
|
|
+static void fade_setup(void)
|
|
|
+{
|
|
|
+ ledc_channel_config_t ledc_ch_config = {
|
|
|
+ .gpio_num = PULSE_IO,
|
|
|
+ .speed_mode = LEDC_HIGH_SPEED_MODE,
|
|
|
+ .channel = LEDC_CHANNEL_0,
|
|
|
+ .intr_type = LEDC_INTR_DISABLE,
|
|
|
+ .timer_sel = LEDC_TIMER_0,
|
|
|
+ .duty = 0,
|
|
|
+ .hpoint = 0,
|
|
|
+ };
|
|
|
+ ledc_timer_config_t ledc_time_config = {
|
|
|
+ .speed_mode = LEDC_HIGH_SPEED_MODE,
|
|
|
+ .duty_resolution = LEDC_TIMER_13_BIT,
|
|
|
+ .timer_num = LEDC_TIMER_0,
|
|
|
+ .freq_hz = 2000,
|
|
|
+ .clk_cfg = LEDC_USE_APB_CLK,
|
|
|
+ };
|
|
|
+
|
|
|
+ TEST_ESP_OK(ledc_channel_config(&ledc_ch_config));
|
|
|
+ TEST_ESP_OK(ledc_timer_config(&ledc_time_config));
|
|
|
+ vTaskDelay(5 / portTICK_PERIOD_MS);
|
|
|
+
|
|
|
+ //initialize fade service
|
|
|
+ TEST_ESP_OK(ledc_fade_func_install(0));
|
|
|
+}
|
|
|
+
|
|
|
static void timer_duty_set_get(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty)
|
|
|
{
|
|
|
TEST_ESP_OK(ledc_set_duty(speed_mode, channel, duty));
|
|
|
TEST_ESP_OK(ledc_update_duty(speed_mode, channel));
|
|
|
- vTaskDelay(1000 / portTICK_RATE_MS);
|
|
|
- TEST_ASSERT_EQUAL_INT32(ledc_get_duty(speed_mode, channel), duty);
|
|
|
+ vTaskDelay(100 / portTICK_RATE_MS);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(duty, ledc_get_duty(speed_mode, channel));
|
|
|
}
|
|
|
|
|
|
// use logic analyzer to view
|
|
|
@@ -274,9 +301,9 @@ TEST_CASE("LEDC set and get frequency", "[ledc][test_env=UT_T1_LEDC][timeout=60]
|
|
|
timer_frequency_test(LEDC_CHANNEL_0, LEDC_TIMER_13_BIT, LEDC_TIMER_3, LEDC_LOW_SPEED_MODE);
|
|
|
}
|
|
|
|
|
|
-// the duty need to be detected by waveform given by the logic analyzer
|
|
|
-// can't get it directly, so set it "ignore"
|
|
|
-TEST_CASE("LEDC set and get dut(with logic analyzer)", "[ledc][ignore]")
|
|
|
+// duty should be manually checked from the waveform using a logic analyzer
|
|
|
+// this test is enabled only for testting the settings
|
|
|
+TEST_CASE("LEDC set and get duty", "[ledc]")
|
|
|
{
|
|
|
ledc_timer_t timer_list[4] = {LEDC_TIMER_0, LEDC_TIMER_1, LEDC_TIMER_2, LEDC_TIMER_3};
|
|
|
#ifdef CONFIG_IDF_TARGET_ESP32
|
|
|
@@ -328,7 +355,7 @@ TEST_CASE("LEDC timer set", "[ledc][test_env=UT_T1_LEDC]")
|
|
|
count = wave_count(1000);
|
|
|
TEST_ASSERT_UINT32_WITHIN(10, count, freq_get);
|
|
|
|
|
|
- //set timer 3 as 500Hz, use APB_CLK
|
|
|
+ //set timer 0 as 500Hz, use APB_CLK
|
|
|
TEST_ESP_OK(ledc_timer_set(test_speed_mode, LEDC_TIMER_0, 5000, 13, LEDC_APB_CLK));
|
|
|
TEST_ESP_OK(ledc_timer_rst(test_speed_mode, LEDC_TIMER_0));
|
|
|
TEST_ASSERT_EQUAL_INT32(ledc_get_freq(test_speed_mode, LEDC_TIMER_0), 500);
|
|
|
@@ -400,102 +427,111 @@ TEST_CASE("LEDC timer pause and resume", "[ledc][test_env=UT_T1_LEDC]")
|
|
|
TEST_ASSERT_UINT32_WITHIN(5, count, 5000);
|
|
|
}
|
|
|
|
|
|
-TEST_CASE("LEDC fade with time(logic analyzer)", "[ledc][test_env=UT_T1_LEDC]")
|
|
|
+TEST_CASE("LEDC fade with time", "[ledc]")
|
|
|
{
|
|
|
-#ifdef CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE
|
|
|
- return;
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef CONFIG_IDF_TARGET_ESP32
|
|
|
const ledc_mode_t test_speed_mode = LEDC_HIGH_SPEED_MODE;
|
|
|
-#elif defined CONFIG_IDF_TARGET_ESP32S2BETA
|
|
|
- const ledc_mode_t test_speed_mode = LEDC_LOW_SPEED_MODE;
|
|
|
-#endif
|
|
|
- ledc_channel_config_t ledc_ch_config = {
|
|
|
- .gpio_num = PULSE_IO,
|
|
|
- .speed_mode = test_speed_mode,
|
|
|
- .channel = LEDC_CHANNEL_0,
|
|
|
- .intr_type = LEDC_INTR_DISABLE,
|
|
|
- .timer_sel = LEDC_TIMER_0,
|
|
|
- .duty = 0,
|
|
|
- .hpoint = 0,
|
|
|
- };
|
|
|
- TEST_ESP_OK(ledc_channel_config(&ledc_ch_config));
|
|
|
+ fade_setup();
|
|
|
|
|
|
- ledc_timer_config_t ledc_time_config = {
|
|
|
- .speed_mode = test_speed_mode,
|
|
|
- .duty_resolution = LEDC_TIMER_13_BIT,
|
|
|
- .timer_num = LEDC_TIMER_0,
|
|
|
- .freq_hz = 5000,
|
|
|
- .clk_cfg = LEDC_USE_APB_CLK,
|
|
|
- };
|
|
|
- TEST_ESP_OK(ledc_timer_config(&ledc_time_config));
|
|
|
-
|
|
|
- //initialize fade service
|
|
|
- TEST_ESP_OK(ledc_fade_func_install(0));
|
|
|
-
|
|
|
- TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 4000, 1000));
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 4000, 200));
|
|
|
TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_WAIT_DONE));
|
|
|
- vTaskDelay(1000 / portTICK_RATE_MS);
|
|
|
- TEST_ASSERT_EQUAL_INT32(ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0), 4000);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
|
|
|
- TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 0, 1000));
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 0, 200));
|
|
|
TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT));
|
|
|
- vTaskDelay(1000 / portTICK_RATE_MS);
|
|
|
- TEST_ASSERT_EQUAL_INT32(ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0), 0);
|
|
|
+ // duty should not be too far from initial value
|
|
|
+ TEST_ASSERT_INT32_WITHIN(20, 4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ vTaskDelay(210 / portTICK_PERIOD_MS);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(0, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
|
|
|
- //deinitial fade service
|
|
|
+ //deinitialize fade service
|
|
|
ledc_fade_func_uninstall();
|
|
|
}
|
|
|
|
|
|
-TEST_CASE("LEDC fade with step(logic analyzer)", "[ledc][test_env=UT_T1_LEDC]")
|
|
|
+TEST_CASE("LEDC fade with step", "[ledc]")
|
|
|
{
|
|
|
-#ifdef CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE
|
|
|
- return;
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef CONFIG_IDF_TARGET_ESP32
|
|
|
const ledc_mode_t test_speed_mode = LEDC_HIGH_SPEED_MODE;
|
|
|
-#elif defined CONFIG_IDF_TARGET_ESP32S2BETA
|
|
|
- const ledc_mode_t test_speed_mode = LEDC_LOW_SPEED_MODE;
|
|
|
-#endif
|
|
|
- ledc_channel_config_t ledc_ch_config = {
|
|
|
- .gpio_num = PULSE_IO,
|
|
|
- .speed_mode = test_speed_mode,
|
|
|
- .channel = LEDC_CHANNEL_0,
|
|
|
- .intr_type = LEDC_INTR_DISABLE,
|
|
|
- .timer_sel = LEDC_TIMER_0,
|
|
|
- .duty = 0,
|
|
|
- .hpoint = 0,
|
|
|
- };
|
|
|
- TEST_ESP_OK(ledc_channel_config(&ledc_ch_config));
|
|
|
-
|
|
|
- ledc_timer_config_t ledc_time_config = {
|
|
|
- .speed_mode = test_speed_mode,
|
|
|
- .duty_resolution = LEDC_TIMER_13_BIT,
|
|
|
- .timer_num = LEDC_TIMER_0,
|
|
|
- .freq_hz = 5000,
|
|
|
- .clk_cfg = LEDC_USE_APB_CLK,
|
|
|
- };
|
|
|
- TEST_ESP_OK(ledc_timer_config(&ledc_time_config));
|
|
|
+ fade_setup();
|
|
|
|
|
|
- //initialize fade service.
|
|
|
- TEST_ESP_OK(ledc_fade_func_install(0));
|
|
|
-
|
|
|
- TEST_ESP_OK(ledc_set_fade_with_step(test_speed_mode, LEDC_CHANNEL_0, 4000, 2, 1));
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_step(test_speed_mode, LEDC_CHANNEL_0, 4000, 4, 1));
|
|
|
TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_WAIT_DONE));
|
|
|
- vTaskDelay(1000 / portTICK_RATE_MS);
|
|
|
- TEST_ASSERT_EQUAL_INT32(ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0), 4000);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
|
|
|
- TEST_ESP_OK(ledc_set_fade_with_step(test_speed_mode, LEDC_CHANNEL_0, 0, 4, 2));
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_step(test_speed_mode, LEDC_CHANNEL_0, 0, 4, 1));
|
|
|
TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT));
|
|
|
- vTaskDelay(1000 / portTICK_RATE_MS);
|
|
|
- TEST_ASSERT_EQUAL_INT32(ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0), 0);
|
|
|
+ // duty should not be too far from initial value
|
|
|
+ TEST_ASSERT_INT32_WITHIN(20, 4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ vTaskDelay(525 / portTICK_PERIOD_MS);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(0, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
|
|
|
//scaler=0 check
|
|
|
TEST_ASSERT(ledc_set_fade_with_step(test_speed_mode, LEDC_CHANNEL_0, 4000, 0, 1) == ESP_ERR_INVALID_ARG);
|
|
|
|
|
|
- //deinitial fade service
|
|
|
+ //deinitialize fade service
|
|
|
+ ledc_fade_func_uninstall();
|
|
|
+}
|
|
|
+
|
|
|
+TEST_CASE("LEDC fast switching duty with fade_wait_done", "[ledc]")
|
|
|
+{
|
|
|
+ const ledc_mode_t test_speed_mode = LEDC_HIGH_SPEED_MODE;
|
|
|
+ fade_setup();
|
|
|
+
|
|
|
+ // fade function will block until fading to the target duty
|
|
|
+ int64_t fade_start, fade_stop;
|
|
|
+ fade_start = esp_timer_get_time();
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 4000, 200));
|
|
|
+ TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_WAIT_DONE));
|
|
|
+ TEST_ASSERT_EQUAL_INT32(4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 1000, 150));
|
|
|
+ TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_WAIT_DONE));
|
|
|
+ TEST_ASSERT_EQUAL_INT32(1000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ fade_stop = esp_timer_get_time();
|
|
|
+ int time_ms = (fade_stop - fade_start) / 1000;
|
|
|
+ TEST_ASSERT_TRUE(fabs(time_ms - 350) < 20);
|
|
|
+
|
|
|
+ // next duty update will not take place until last fade reaches its target duty
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 4000, 200));
|
|
|
+ TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_WAIT_DONE));
|
|
|
+ TEST_ASSERT_EQUAL_INT32(4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ TEST_ESP_OK(ledc_set_duty(test_speed_mode, LEDC_CHANNEL_0, 500));
|
|
|
+ TEST_ESP_OK(ledc_update_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ vTaskDelay(5 / portTICK_PERIOD_MS);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(500, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+
|
|
|
+ //deinitialize fade service
|
|
|
+ ledc_fade_func_uninstall();
|
|
|
+}
|
|
|
+
|
|
|
+TEST_CASE("LEDC fast switching duty with fade_no_wait", "[ledc]")
|
|
|
+{
|
|
|
+ const ledc_mode_t test_speed_mode = LEDC_HIGH_SPEED_MODE;
|
|
|
+ fade_setup();
|
|
|
+
|
|
|
+ // fade function returns immediately, but next fade still needs to wait for last fade ends
|
|
|
+ int64_t fade_start, first_fade_complete;
|
|
|
+ fade_start = esp_timer_get_time();
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 4000, 200));
|
|
|
+ TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT));
|
|
|
+ TEST_ASSERT_LESS_THAN(4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 1000, 150));
|
|
|
+ TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT));
|
|
|
+ first_fade_complete = esp_timer_get_time();
|
|
|
+ // duty should not be too far from first fade target duty
|
|
|
+ TEST_ASSERT_INT32_WITHIN(20, 4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ int time_ms = (first_fade_complete - fade_start) / 1000;
|
|
|
+ TEST_ASSERT_TRUE(fabs(time_ms - 200) < 20);
|
|
|
+ vTaskDelay(158 / portTICK_PERIOD_MS);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(1000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+
|
|
|
+ // next duty update will not take place until last fade reaches its target duty
|
|
|
+ TEST_ESP_OK(ledc_set_fade_with_time(test_speed_mode, LEDC_CHANNEL_0, 4000, 200));
|
|
|
+ TEST_ESP_OK(ledc_fade_start(test_speed_mode, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT));
|
|
|
+ TEST_ASSERT_LESS_THAN(4000, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ TEST_ESP_OK(ledc_set_duty(test_speed_mode, LEDC_CHANNEL_0, 500));
|
|
|
+ TEST_ESP_OK(ledc_update_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+ vTaskDelay(5 / portTICK_PERIOD_MS);
|
|
|
+ TEST_ASSERT_EQUAL_INT32(500, ledc_get_duty(test_speed_mode, LEDC_CHANNEL_0));
|
|
|
+
|
|
|
+ //deinitialize fade service
|
|
|
ledc_fade_func_uninstall();
|
|
|
}
|
|
|
|