ESP32 Hardware Timer Gives Unreliable Results

physiii
Posts: 23
Joined: Fri Nov 17, 2017 9:37 pm

ESP32 Hardware Timer Gives Unreliable Results

Postby physiii » Tue Jan 19, 2021 2:07 am

I need create a PWM signal using a hardware timer. I would have used RMT or something more native to esp32 but I am using an i2c gpio expander. I wrote the code which was straight forward but am getting unreliable results (eg. pulse width being much to short or the io sticking high or low).

To rule out the i2c and my code, I started back with the timer example. I changed TIMER_INTERVAL1_SEC to 0.009 (9ms)

Code: Select all

#define TIMER_INTERVAL1_SEC   (0.009)   // sample test interval for the second timer
And toggled io26 on the esp32:

Code: Select all

static void timer_example_evt_task(void *arg)
{
    bool on = true;
    while (1) {
        timer_event_t evt;
        xQueueReceive(timer_queue, &evt, portMAX_DELAY);

        /* Print information that the timer reported an event */
        if (evt.type == TEST_WITHOUT_RELOAD) {
            // printf("\n    Example timer without reload\n");
          	// gpio_set_level(BLOWER_MOTOR_PIN, on);
        } else if (evt.type == TEST_WITH_RELOAD) {
            // printf("\n    Example timer with auto reload\n");
          	gpio_set_level(BLOWER_MOTOR_PIN, on);
            on = !on;
        } else {
            // printf("\n    UNKNOWN EVENT TYPE\n");
        }
        // printf("Group[%d], timer[%d] alarm event\n", evt.timer_group, evt.timer_idx);
        //
        // /* Print the timer values passed by event */
        // printf("------- EVENT TIME --------\n");
        // print_timer_counter(evt.timer_counter_value);
        //
        // /* Print the timer values as visible by this task */
        // printf("-------- TASK TIME --------\n");
        // uint64_t task_counter_value;
        // timer_get_counter_value(evt.timer_group, evt.timer_idx, &task_counter_value);
        // print_timer_counter(task_counter_value);
    }
}
Scope looks like this:
SDS00001.png
SDS00001.png (22.38 KiB) Viewed 2298 times

And this is what I am trying to create (pwm at 36.41hz with sub ms resolution):
blower.png
blower.png (274.37 KiB) Viewed 2298 times
blower2.png
blower2.png (275.05 KiB) Viewed 2298 times

I tried adjusting the divider and setting the io value in the ISR instead of using a queue but saw the same results. Why am I not able to get reliable output when using the timer to set gpio especially at smaller time scales?

ESP_Minatel
Posts: 364
Joined: Mon Jan 04, 2021 2:06 pm

Re: ESP32 Hardware Timer Gives Unreliable Results

Postby ESP_Minatel » Tue Jan 19, 2021 9:37 am

Hi,

Have you tried to use the High Resolution Timer Example?

Who is online

Users browsing this forum: Baidu [Spider], Google [Bot] and 218 guests