ESP32 Hardware Timer Gives Unreliable Results
Posted: 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)
And toggled io26 on the esp32:
Scope looks like this:
And this is what I am trying to create (pwm at 36.41hz with sub ms resolution):
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?
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
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);
}
}
And this is what I am trying to create (pwm at 36.41hz with sub ms resolution):
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?