• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Аппаратный таймер

alexsk

New member
Всем привет!

Собираю wi-fi диммер для ламп накаливания. Если кто не в курсе, то основная задача, генерировать короткий (~40 микросекунд) импульс раз в 10 миллисекунд (при прохождении синусоиды через ноль) с задержкой 500-9000 микросекунд. Очевидно, что нормальное решение на таймерах. В качестве концепта сделал реализацию на os_timer - в целом работает, но точности таймера явно не хватает (задержки гуляют с разбросом в 500-2500 микросекунд), из-за чего есть заметное мерцание ламп.

Попробовал перевести на аппаратный таймер (пример взял отсюда: GitHub - Theb-1/ESP8266-wifi-light-dimmer ), в итоге калбэк таймера не вызывается никогда. Код hw_timer полностью взял из примера, в setup() инициализирую аппаратный таймер так же как в примере:
Код:
setup ()
{
...
  hw_timer_init(NMI_SOURCE, 0);
  hw_timer_set_func(dimTimerISR);
...
}
В обработчике перехода через ноль вызываю hw_timer_arm(dimDelay), по аналогии с примером, но dimTimerISR никогда не вызывается.

Подскажите, в чем может быть проблема? Если это поможет, могу выложить полный код скетча. Платка, с которой эксперементирую - esp01.

И более общий вопрос: я не совсем понимаю, как устроен порт esp sdk для Arduino IDE. В документации sdk упомянаются функции работы с аппаратным таймером, но из скетча Arduino IDE они по какой-то причине не доступны и их нужно реализовать - содержимое hw_timer.с для меня выглядит как магия. Есть ли где-нибудь описание того, как это работает и почему нельзя напрямую обращаться к espressif sdk? Или как это правильно делать?
 

Сергей_Ф

Moderator
Команда форума
@nikolz
Так в тех hw_timer.h и hw_timer.c именно это и написано. Зачем это к себе в код вставлять?
@alexsk
У меня подозрение, что дело в инициализации.
hw_timer_init(NMI_SOURCE, 0)
Вы уверены, что это то что вам нужно?
 

alexsk

New member
Внимательно посмотрел на код, нашел в чем проблема. С таймером не связано. Исправил, все отлично заработало. Спасибо)
 

Гриша37

New member
Внимательно посмотрел на код, нашел в чем проблема. С таймером не связано. Исправил, все отлично заработало. Спасибо)
Доброго времени суток! Тоже заинтересовался эти примером, не могли бы вы пояснить в чем все таки была проблема?
 
Последнее редактирование:
Сверху Снизу