Программирование ARM ESP-IDF: компонент Knob для подключения поворотного энкодера Sun, July 13 2025  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


ESP-IDF: компонент Knob для подключения поворотного энкодера Печать
Добавил(а) microsin   

Knob это компонент, который предоставляет программный PCNT, его можно использовать на недорогих чипах (наподобие esp32c2, esp32c3), у которых нет аппаратной фичи PCNT. Благодаря компоненту knob вы можете быстро подключить и использовать физический энкодер (knob), такой как EC11.

Применение Knob подойдет для сценариев подключения низкоскоростных поворотных энкодеров, где частота импульсов не превышает 30 импульсов в секунду (обычный энкодер для пользовательского интерфейса, такой как EC11). В таких сценариях допускается не 100% точность подсчета импульсов.

Примечание: для точного или быстрого подсчета импульсов используйте аппаратный PCNT, который поддерживается чипами ESP32, ESP32-C6, ESP32-H2, ESP32-S2, ESP32-S3.

Энкодер подключается по следующей простой схеме:

knob connecting

Примечание: компонент Knob подключает на входах фаз энкодера внутренний pull-up, ток замыкания на GND составляет порядка 0.07 мА. Сигнал C от кнопки энкодера в компоненте Knob не обрабатывается. Для обработки кнопки необходимо подключать отдельный обработчик, например на основе OneButton [2].

[События Knob Event]

Каждый knob имеет 5 событий, перечисленных в следующей таблице:

Событие Условия генерации события
KNOB_LEFT Поворот влево.
KNOB_RIGHT Поворот вправо.
KNOB_H_LIM Счетчик импульсов достиг верхнего предела.
KNOB_L_LIM Счетчик импульсов достиг нижнего предела.
KNOB_ZERO Счетчик вернулся к позиции 0.

Каждому knob можно привязать функцию обратного вызова (callback) для обработки событий. Причем каждое событие может иметь отдельный callback, вызываемый при возникновении этого события. Такой способ эффективен в реальном времени, так что ни одно событие не потеряется.

[Элементы конфигурации]

KNOB_PERIOD_TIME_MS: длительность цикла сканирования.
KNOB_DEBOUNCE_TICKS: количество импульсов накопления для подавления дребезга.
KNOB_HIGH_LIMIT: максимальное значение количества импульсов, которое может быть подсчитано.
KNOB_LOW_LIMIT: минимальное значение количества импульсов, которое может быть подсчитано.

[Пример применения]

Создайте дескриптор Knob:

knob_config_t cfg = {
    .default_direction =0,
    .gpio_encoder_a = GPIO_KNOB_A,
    .gpio_encoder_b = GPIO_KNOB_B,
};
s_knob = iot_knob_create(&cfg);
if(NULL == s_knob) { ESP_LOGE(TAG, "Ошибка создания knob"); }

Зарегистрируйте callback-функцию:

static void _knob_left_cb(void *arg, void *data)
{
    ESP_LOGI("", "KNOB: KNOB_LEFT,count_value:%d",
                 iot_knob_get_count_value((knob_handle_t)arg));
}
iot_knob_register_cb(s_knob, KNOB_LEFT, _knob_left_cb, NULL);

Аналогично подключается callback для события KNOB_RIGHT. Пример вывода в лог:

...
I (2171) : KNOB: KNOB_LEFT,count_value:-2
I (2221) : KNOB: KNOB_LEFT,count_value:-3
I (2231) : KNOB: KNOB_LEFT,count_value:-4
I (2281) : KNOB: KNOB_LEFT,count_value:-5
I (2291) : KNOB: KNOB_LEFT,count_value:-6
I (2761) : KNOB: KNOB_RIGHT,count_value:-5
I (2781) : KNOB: KNOB_RIGHT,count_value:-4
I (2871) : KNOB: KNOB_RIGHT,count_value:-3
I (2891) : KNOB: KNOB_RIGHT,count_value:-2
I (3011) : KNOB: KNOB_RIGHT,count_value:-1
I (3041) : KNOB: KNOB_RIGHT,count_value:0
I (3181) : KNOB: KNOB_RIGHT,count_value:1
I (3201) : KNOB: KNOB_RIGHT,count_value:2
I (3371) : KNOB: KNOB_RIGHT,count_value:3

[Поддержка пониженного энергопотребления]

В режиме light_sleep таймер esp_timer выводит CPU из сна, что приводит к повышенному потреблению энергии. Компонент Knob предоставляет поддержку режима пониженного потребления через функцию пробуждения от изменения уровня на ножке порта (GPIO level wake-up).

Для использования этой функции разрешите опцию enable_power_save в структуре конфигурации knob_config_t.

Потребление энергии в течение без low power mode, одно вращение в течение 250 мс:

knob without low power mode 250ms

В режиме low power, одно вращение в течение 250 мс:

knob with low power mode 250ms

В режиме low power, 10 вращений в течение 4.5 с:

knob with low power mode 4 5s

Таким образом, компонент Knob в режиме low power mode обеспечивает значительное экономию энергии.

[Разрешение и запрет Knob]

Поддержка компонента может быть в любой момент разрешена и запрещена.

// Остановка knob:
iot_knob_stop();
// Возобновление работы knob: iot_knob_resume();

[API компонента Knob]

Для использования компонента необходимо подключение заголовка components/knob/include/iot_knob.h:

#include "iot_knob.h"

В сдедующей таблице приведено краткое описание API-функций. Полное описание параметров этих функций, используемых структур и определений типов см. в документации [1].

Функция Описание
iot_knob_create Создает экземпляр компонента Knob.
iot_knob_delete Удалит экземпляр компонента, созданный ранее вызовом iot_knob_create.
iot_knob_register_cb Зарегистрирует функцию обратного вызова (callback) для события.
iot_knob_unregister_cb Отменит регистрацию функции обратного вызова.
iot_knob_get_event Получение события.
iot_knob_get_count_value Получение значения счетчика.
iot_knob_clear_count_value Сброс в 0 значения счетчика.
iot_knob_resume Возобновление работы таймера экземпляра Knob, если таймер остановлен. Перед вызовом этой функции обязательно должна быть вызвана функция iot_knob_create().
iot_knob_stop Остановка работы таймера экземпляра Knob, если таймер работает. Перед вызовом этой функции обязательно должна быть вызвана функция iot_knob_create().

[Ссылки]

1. Knob component software PCNT site:espressif.com.
2. Arduino OneButton Library.

 

Добавить комментарий


Защитный код
Обновить

Top of Page