Если вы знакомы с микропроцессорами, то, возможно, считаете, что таймеры используются только для обеспечения заданной задержки. В микроконтроллерах таймеры используются для решения гораздо более широкого круга задач.
Обычно для переключения таймера используются тактовые импульсы процессора. Загрузив в таймер начальное значение, можно отсчитывать определенные интервалы времени, фиксируя окончание интервала по моменту переполнения таймера.
Часто перед таймером включают предварительный делитель тактовой частоты, чтобы иметь возможность отсчитывать более длинные интервалы времени. Делитель обеспечивает инкремент содержимого таймера после поступления определенного числа тактовых импульсов.
Если требуется реализовать задержку в 10 mc (0.01с) в системе с тактовой частотой 10 МГц, то можно использовать схему, показанную на рис. 2.19, следующим образом. Сначала надо определить требуемый коэффициент деления. При тактовой частоте 10 МГц таймер должен переключиться до переполнения 10000 раз, что невозможно для 8-разрядного счетчика. Чтобы обеспечить заданную задержку, необходимо выбрать коэффициент деления для предварительного делителя, который обычно является степенью двойки (то есть 1, 2, 4, 8,...256). Если выбрать коэффициент деления 64, то таймер переключится 156 раз при поступлении на вход делителя 64 х 156 = 9984 тактовых импульсов, что достаточно близко к требуемой величине. Более точное значение задержки может быть достигнуто путем добавления команд NOP или других команд, используемых для заполнения определенных промежутков времени. Для отсчета заданного времени таймер можно очистить, а затем непрерывно сравнивать его содержимое со значением 156.
|
|
Рис. 2.19 - Структура таймера в микроконтроллере.
Более эффективный способ отсчета - загрузить в таймер число 100 = 256 - 156 и ждать, когда флаг прерывания по переполнению таймера установится в 1. Используя данный метод, можно реализовать мультизадачный режим выполнения программ. Переключение задач будет производиться, когда таймер отсчитает 10 мс.
Не рекомендуется использовать этот метод для создания часов реального времени. Так как при перезагрузке таймера значение коэффициента деления делителя неизвестно, а его содержимое сбрасывается в 0 при записи в регистр таймера, то при отсчете времени могут возникать ошибки. Вместо этого лучше дать возможность таймеру считать непрерывно (тогда делитель никогда не сбрасывается), а при его переполнении увеличивать содержимое счетчика часов реального времени. Когда программе требуется узнать текущее время, она выбирает и преобразует содержимое этого счетчика, получая правильное значение времени. Такой метод используется в IBM PC, где переключение («тик») таймера происходит 18,2 раз в секунду.
|
|
Глядя на рис. 2.19 можно заметить, что таймер может быть использован для подсчета внешних событий, если использовать для его переключения внешний сигнал.
Если микроконтроллер содержит два таймера, то можно легко реализовать простой тахометр - счетчик числа событий, происходящих за единицу времени (рис. 2.20). Программа реализации тахометра сначала сбрасывает в 0 содержимое счетчика TMR2, а затем устанавливает определенный интервал времени для срабатывания таймера TMR1. По истечении этого интервала TMRI срабатывает (устанавливается в 1 бит переполнения TMR1), вызывая считывание текущего содержимого из TMR2.
Рис. 2.20 - Реализация тахометра.
Таймеры в микроконтроллерах часто используются для ввода-вывода сигналов с широтно-импульсной модуляцией PWM (Pulse Width Modulated). PWM сигнал часто используется для передачи значения аналогового сигнала в цифровую систему или из нее. Сигнал имеет повторяющуюся форму, где длительность импульса пропорциональна значению передаваемой аналоговой величины (рис. 2.21).
PWM-сигналы часто используется для управления электродвигателями, задавая скорость вращения или положение вала в сервоприводе. На рис. 2.22 показана схема генерации PWM-сигнала на выходе микроконтроллера. Пока заданное значение «длительности импульса» больше, чем содержимое таймера, на выходе этой схемы будет поддерживаться высокий потенциал (вершина импульса). Когда содержимое таймера станет равно или больше, чем заданное значение «периода», то таймер сбрасывается в 0, и процесс повторяется. Такой метод получения PWM-сигнала требует минимального участия процессора - надо только задать необходимые значения периода и длительности импульса. При этом значение длительности импульса может изменяться процессором в любое время без остановки процесса вывода.
Рис. 2.21 - Сигнал с широтно-импульсной модуляцией PWM.
Рис. 2.22 - Схема генератора PWM-сигнала
Если необходимо сформировать прямоугольный импульсный сигнал определенной частоты, то можно использовать ту же схему, задав период в два раза больше длительности импульса.
Измерение длительности импульса PWM-сигнала может быть произведено с помощью схемы, приведенной на рис. 2.23. В этой схеме на вход RESET таймера подается сигнал сброса до тех пор, пока входной сигнал имеет низкий уровень. При поступлении высокого уровня входного сигнала таймер запускается, и его содержимое поступает в регистр длительности импульса. По окончании импульса, когда на входе снова устанавливается низкий уровень, содержимое таймера сохраняется в регистре длительности импульса, а таймер сбрасывается в 0 до прихода следующего импульса. Для упрощения на схеме не показаны некоторые элементы задержки, которые гарантируют, что значение таймера будет записано в регистр длительности до его сброса.
Рис. 2.23 - Схема измерения длительности импульса.