Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Периодомер
В МК AVR имеется специальный режим работы таймеров с "захватом" (capture) внешнего перепада уровней и генерацией прерывания по этому поводу. Он удобен для измерения периода низких (с точки зрения МК) частот по второму способу — с помощью определения периода. Этот же режим годится для фиксации редких событий (например, прохождения частиц через счетчик Гейгера), тогда подсчет времени между событиями пригодится, например, для статистики. Рассмотрим, как это можно осуществить на примере все того же AT90S2313.
В режиме работы с "захватом" может функционировать 16-разрядный Timerl. Внешний импульс следует при этом подавать на специальный вывод ICP (совпадающий в данном случае с выводом PD6, так что в качестве контрольного придется задействовать какой-нибудь другой вывод). "Захват" фронта или спада выбирается установкой бита ICESI (бит 6) в регистре управления TCCRIB. При этом в системе "захвата" действует нечто вроде "антидребезга" — установкой бита ICNCI (бит 7) в том же регистре можно включить схему "подавления шума", которая после прихода фронта или, соответственно, спада 4 раза определяет уровень сигнала и принимает решение о "захвате", только если все четыре измерения одинаковы. Заметим, что для Timerl всех моделей AVR источником сигнала "захвата" вместо вывода ICP может быть аналоговый компаратор (см. главу 10). Собственно событие "захвата" состоит в том, что в момент, когда оно происходит, содержимое счетных регистров Timerl переносится в специальный 16-разрядный регистр ICRIH:ICRIL. Поэтому режим "захвата" специально включать не требуется — ни на счет, ни на другие функции таймера он никак не влияет. Для того чтобы можно было обнаружить факт "захвата", имеется соответствующее прерывание Timerl Capture (у AT90S2313 оно четвертое по счету, считая Reset), которое разрешается установкой бита TICIEI регистра

TIMSK.
При проведении точных измерений следует учесть, что между "захватом" и копированием счетного регистра имеется задержка около трех тактов ("захват" происходит синхронно с тактовым сигналом, потому разброс может составлять один такт). Включение схемы "подавления шума" увеличивает задержку еще на четыре такта. Следует отметить, что на практике данная схема малоэффективна — "настоящий" дребезг длится десятки миллисекунд, так что схема eFO не "отловит", и таким образом можно фильтровать только очень короткие "иголки" (длительностью менее четырех тактов)— явление довольно редкое.
Таким образом, схема действий при измерении периода такая: разрешается прерывание "захвата" и таймер запускается на счет с нужной частотой. Измеряемый сигнал подается на вывод ICP (у AT90S2313 это вывод 11, его необходимо оставить сконфигурированным на вход). В прерывании с содержимым регистров "захвата" ICRIH И ICRIL производятся нужные операции.

Вопросов о том, что делать с самим таймером при этом, возникает сразу несколько. Во-первых, для измерения не периода (т. е. промежутка времени между фронтами или между спадами), а интервала времени (т. е. промежутка времени между фронтом и спадом или между спадом и фронтом), в этом прерывании нужно переключать активный уровень с помощью установки/сброса бита ICESI в регистре TCCRIB. Тогда упрощаются также и последующие действия — мы имеем запас времени до прихода следующего фронта/спада, и за это время можем совершить достаточно много операций (полагая, что частота внешних событий невелика).

В этом случае порядок действий такой (предположим, что мы "ловим" положительные импульсы): сначала устанавливаем "захват" по фронту (установкой бита ICESI), разрешаем прерывания, но таймер не запускаем, только обнуляем его счетные регистры. В наступившем прерывании мы немедленно запускаем таймер и переключаем "захват" на реакцию по спаду (сбросом бита ICESI). В следующем прерывании мы фиксируем содержимое регистра захвата ICRIH:ICRIL, производим с ним необходимые действия, останавливаем таймер, очищаем его и переключаем опять "захват" на реакцию по фронту. При измерении именно периода переключать фронт/спад не нужно, а вот регистры таймера очищать все равно требуется. Так как, кроме задержки собственно "захвата", имеется еще задержка возникновения прерывания (6-7 тактов, в зависимости от модели) и на выполнение команд очистки также необходимо время (не менее двух тактов), то общая ошибка может составлять около 12 тактов, что при точных измерениях недопустимо. Эту ошибку можно учесть (просто прибавляя 12 тактов к числу, зафиксированному в счетчике), а для периодических сигналов можно поступить более радикально: проводить измерения лишь каждый второй период. Разумеется, если частота заполнения счетчика 1/8 от тактовой и ниже, то данная ошибка становится незначимой (чтобы ее снизить дополнительно, следует использовать возможность очистки регистров предделителя, имеющуюся в семействе Mega).

Листинг 8.10 иллюстрирует процесс измерения периода или "ловли" редких событий в простейшем случае без учета всех этих нюансов ("подавление шума" также не включаем — редкие события могут проявлять себя достаточно короткими импульсами).



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru