alexsk
New member
Всем привет!
Собираю wi-fi диммер для ламп накаливания. Если кто не в курсе, то основная задача, генерировать короткий (~40 микросекунд) импульс раз в 10 миллисекунд (при прохождении синусоиды через ноль) с задержкой 500-9000 микросекунд. Очевидно, что нормальное решение на таймерах. В качестве концепта сделал реализацию на os_timer - в целом работает, но точности таймера явно не хватает (задержки гуляют с разбросом в 500-2500 микросекунд), из-за чего есть заметное мерцание ламп.
Попробовал перевести на аппаратный таймер (пример взял отсюда: GitHub - Theb-1/ESP8266-wifi-light-dimmer ), в итоге калбэк таймера не вызывается никогда. Код hw_timer полностью взял из примера, в setup() инициализирую аппаратный таймер так же как в примере:
В обработчике перехода через ноль вызываю hw_timer_arm(dimDelay), по аналогии с примером, но dimTimerISR никогда не вызывается.
Подскажите, в чем может быть проблема? Если это поможет, могу выложить полный код скетча. Платка, с которой эксперементирую - esp01.
И более общий вопрос: я не совсем понимаю, как устроен порт esp sdk для Arduino IDE. В документации sdk упомянаются функции работы с аппаратным таймером, но из скетча Arduino IDE они по какой-то причине не доступны и их нужно реализовать - содержимое hw_timer.с для меня выглядит как магия. Есть ли где-нибудь описание того, как это работает и почему нельзя напрямую обращаться к espressif sdk? Или как это правильно делать?
Собираю 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);
...
}
Подскажите, в чем может быть проблема? Если это поможет, могу выложить полный код скетча. Платка, с которой эксперементирую - esp01.
И более общий вопрос: я не совсем понимаю, как устроен порт esp sdk для Arduino IDE. В документации sdk упомянаются функции работы с аппаратным таймером, но из скетча Arduino IDE они по какой-то причине не доступны и их нужно реализовать - содержимое hw_timer.с для меня выглядит как магия. Есть ли где-нибудь описание того, как это работает и почему нельзя напрямую обращаться к espressif sdk? Или как это правильно делать?