Ревич, Ю.В. Программирование микроконтроллеров 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 отсчета. Еще пол-отсчета можно

RkJQdWJsaXNoZXIy MTExODQxMg==