Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 9. Программирование таймеров 239 Ч астотомер Предположим, измеряемая частота находится в диапазоне около 4 МГц, и нам же лательно измерить ее с разрешением до 1 Гц. Прежде всего, напомним, что такто вая частота контроллера должна превышать измеряемую не менее, чем в два раза, - таково требование руководств. Обнаружение изменения внешнего сигнала производится по фронту тактового, и если период измеряемого сигнала слишком короткий, то в регистрации могут быть пропуски. Так что нам следует ориентиро ваться на МК с тактовой частотой не менее 8 МГц. Выберем опять АTmega8 (при необходимости легко модифицировать алгоритм для любого АVR) с кварцевым резонатором 8 МГц. Для измерения мы задействуем два таймера: один 1 6-раз рядный Тimer 1 - для отсчета собственно внешней частоты и второй 8-разрядный TimerO - для отсчета измерительного интервала. ЗАМЕТКИ НА ПОЛЯХ Регистрация перепада уровней внешнего сигнала производится автономной асин хронной схемой. Потому из руководства не следует, что тактовая частота должна быть выше измеряемой именно в два раза , - достаточно простого превышения . Однако окончательное суждение по этому вопросу я оставляю на усмотрение читателей - изложение в руководстве не очень толковое · (не до конца прояснен вопрос с задерж ками регистрации фронта сигнала) , и , конечно, лучше «на всякий случай» следовать фирменным рекомендациям . Результат измерения частоты до 4 МГц с точностью до герца в общем случае займет не менее трех 8-битовых реrистров. Но реальное их число , которое требуется задей ствовать , будет зависеть от диапазона изменения измеряемой частоты . В самом деле - предположим , что частота может меняться не более, чем на 256 Гц относи тельно номинальной величины З МГц. Тогда старшие два регистра всегда будут пока зывать одно и то же число (и точно известно, какое) , а все изменения будут регистри роваться только в самом младшем регистре самого таймера. Если же частота 3 МГц не меняется более чем на 65 кГц, то можно оставить только два регистра (тоже собст венные счетчики таймера) . Важно только , чтобы в процессе изменений частота не переваливала за границу, когда старший регистр тоже должен меняться (что в нашем сл � ае произойдет, например, если средняя частота колеблется около значения 2 2 = 2 097 1 52 Гц) , иначе возникнет неоднозначность (которую, впрочем, также в не которых случаях можно учесть) . Иногда (например, при измерении частоты термочув ствительных «кварцев» , вариации которой невелики) эти соображения позволяют экономить регистры. Здесь мы будем рассматривать общий случай и «тупо» предпо ложим, что частота в пределах емкости трех регистров может быть любой (т. е. с большим запасом - до 1 6 ,7 МГц) . Для измерения нам потребуется ввести прерывание Timer i по переполнению, в ко тором третий регистр (назовем его countз ) будет всякий раз увеличиваться на еди ницу. Входной сигнал подадим на вход внешнего тактового сигнала T l (вывод 1 1 для АTmega8), с которого внешние импульсы поступают прямо на счетчик таймера, если ему задать соответствующий режим. Теперь разберемся с формированием измерительного интервала. При 8 МГц такто вой частоты и коэффициенте предделителя для TimerO, равном 1 / 2 5 6 , прерывания переполнения будут происходить с частотой 1 22,07 Гц. Нам же требуется 1 с ( 1 Гц), потому мы введем счетчик ( count_sek ) и станем его с каждым прерыванием увели чивать, пока он не отсчитает ровно 1 22 таких прерывания. После этого можно фик-
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==