Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 9. Программирование таймеров 227 Формирование заданного значения частоты Надо сказать, что в Arduino такая функциональность реализована достаточно удоб но - в виде единственной функции tone ( ) , которая позволяет формировать любое значение частоты (в пределах от 30 Гц до по крайней мере сотен килогерц) на про извольном выводе платы Arduino. На практике это применяется для генерации зву ка, но, конечно, может быть использовано для любых целей, - правда, точность задания частоты и ее стабильность здесь нуждаются в отдельной проверке. Есть и множество альтернативных Аrduinо-библиотек, которые преодолевают те или иные ограничения функции tone ( ) , но все они, во-первых, не годятся для произвольного значения частот (а что делать, если нужна стабильная «мигалка>> 0,5 или 0, 1 гер ца?), во-вторых, их точностные характеристики также никто не указывает и не исследует. Поэтому давайте рассмотрим, что может в этом плане предложить ас семблер. В примере, приведенном в главе 6, мы рассматривали функционирование 8-разряд ного таймера в самом простом режиме - непрерывного счета тактовых импульсов с подсчетом числа переполнений его счетного регистра для формирования нужной задержки. При этом выбор значений частоты следования прерываний (а значит, и значения задержки) ограничен комбинациями тактовой частоты на входе таймера с допустимыми коэффициентами предделителя, да еще полученная величина ока зывается поделенной на «некруглое» число 256, соответствующее объему счетного регистра ТimerO (для 1 6-разрядного Timer l это число, соответственно, будет равно 65 536) . А как быть, если нам требуется получить точную частоту, например, 1 кГц, 1 00 или 1 Гц? Есть два способа достижения такого результата. Первый способ при меним ко всем таймер ам, независимо от их разрядности и особенностей, и мы его сейчас рассмотрим. Способ заключается в том, что каждый цикл счета мы начинаем не с нуля, а с опре деленного заранее рассчитанного числа. Обратим внимание, что счетчики-таймеры АVR, вообще говоря, могут только суммировать (реверсирование счета также мо жет производиться, но только в режимах РWМ, к которым мы сейчас обращаться не станем) . Исходя из этого, нам и нужно рассчитать предварительно записываемое число. Опять будем ориентироваться на простейший ТimerO (в 1 6-разрядных таймерах це лесообразнее выбрать другой способ, о котором далее) и предположим, что нам требуется сформировать частоту 1 кГц. Рассмотрим типовой порядок рассуждений в подобном случае . Частоту тактовых импульсов необходимо выбирать так, чтобы она бьmа больше 1 кГц, но не превышала значение 1 кГц х 256 = 256 кГц. Если, как мы договорились, тактовая частота контроллера равна 4 МГц, то можно выбрать коэффициент предделителя, равный 1 : 64, - тогда частота на входе таймера будет 62 500 Гц. В этом случае, чтобы получить частоту ровно 1 кГц, число 62 500 нужно поделить на 62,5 . Нецелое число отсчетов в таймере организовать сложно, но теоретически возможно. Для этого можно, например, начинать с числа 1 94, что до переполнения (значения 256, т. е. О в счетном регистре) даст 62 отсчета. Еще пол-отсчета можно
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==