Уважаемые объясните пожалуйста, как правильнее реализовать программно детектор нуля синусоидального сигнала 50Гц-10кГц на мк стм32 на HAL. Начиная от алгоритма до реализации, до меня самого до конца не доходит. Используя АЦП, Таймеры либо АЦП, ДМА, таймеры
Пробовал:
1) использовать оконный компаратор АЦП (Типо в референсе он как раз применяется для детектирования), задаю окно, но получается, что каждый раз, когда значение выходит за min или max у меня вызывается флаг и прерывание я считываю и проверяю значение АЦП и так постоянно это не то что нужно и ресурсно-затратно, мне нужно наоборот чтобы когда значение ацп было в окне (тоесть около нуля+ учет на дребезг) я вызывал функцию единожды, считывал ещё раз значение АЦП убеждался то что это переход через 0 с + на - или наоборот и далее делал уже то что мне нужно и опять это нужно делать единожды до следующего перехода.
2)По таймеру через каждые ххх мкс запускаю ацп, считываю значение, вычитаю середину и смотрю получился переход через ноль или нет?
3) Использую АЦП+ ДМА по набору буфера считаю среднее делаю вычисления и выводы
Но до правильного результата так и не дошел
Алгоритм нужен исходя из условий, то что одновременно переходов через ноль нужно считать до 5 штук ( пять сигналов) Ну и минимально ресурсно и трудозатратно для контроллера.
Может кто поделится опытом
Спасибо!


