Есть замечательная програмка Timer Calculator от mikroe.com, которая считает оптимальную пару в прескалер-регистр PSC и период таймера ARR на компе. НО!!! что если я хочу предоставить пользователю задавать частоту самому в диапазоне от 1 до 20 кГц, это значит я должен в программе контроллера просчитать эту пару. Тогда возникает ряд неудобств, для получения частоты 1 Гц я должен тактирующую частоту 72МГц поделить на 72000000, а это никак не влезает в 16 битные регистры и необходимо разбивать 72000000 на пары, например, 60000 и 1200, и так далее для каждой частоты. Для некоторых частот пары могут давать разную погрешность, если деление не происходит нацело: например для получения 7 это 29138 и 353, а пара 65535 и 183 даст гораздо большую погрешность 0,0591599783% против 0,0000027778% как было у первой пары. Но ведь эту пару надо еще найти. Другой пример: для 23Гц пара 56917 и 55 с погрешностью 0,0000069444%. Общий принцип, который советуют - это факторизация или разложение на множители путем перебора одного из множителей начиная от минимального числа (72МГц/("необходимая частота")*65535) и до корня квадратного из (72МГц/("необходимая частота")), а затем выбор пары с наименьшей погрешностью получения нужной частоты (просто попаданию в коридор разрешенной погрешности). Кто-то советует использовать для этого только простые числа (вель это сократит количество циклов) и даже рекомендует ознакомиться с решетом Сундарама для их поиска, но тут есть проблемки, некоторые пары, как например для 23Гц имеет малый множитель, которые не относится к простым числам, а ближайшее простое число 173 у которого пара с 18095 дает такую же погрешность, требует перебора уже большого числа циклов (для 23Гц перебираем от 48 до 55 - это 8 числе, а в случае с простыми числами 25 чисел), в нагрузке которых деление итп. Еще одна из проблем - пары могут дать разные по величине множители и если использовать период по назначению, то будет меняться глубина регулирования, не знаю на сколько это страшно, но возможно где-то это прям камень преткновения.
В итоге прошу у сообщества советов по данному вопросу.


