Как работает 16-битный Таймер1 в микроконтроллерах AVR. Какие режимы работы доступны для Таймера1. Как настроить и использовать Таймер1 для различных задач. Какие преимущества дает использование Таймера1 в проектах на AVR.
Общая характеристика Таймера1 в микроконтроллерах AVR
Таймер1 — это мощный 16-битный таймер/счетчик, доступный во многих микроконтроллерах семейства AVR, включая популярные модели ATmega8 и ATmega32. Он обладает рядом уникальных возможностей:
- 16-битный счетчик с возможностью чтения и записи
- Два независимых модуля сравнения
- Модуль захвата входного сигнала
- Генератор ШИМ с возможностью коррекции фазы и частоты
- Предделитель с несколькими вариантами настройки
- Возможность генерации прерываний по различным событиям
Благодаря этим функциям Таймер1 находит широкое применение в различных проектах на базе AVR микроконтроллеров. Рассмотрим подробнее его устройство и возможности.
Основные режимы работы Таймера1
Таймер1 может работать в нескольких основных режимах:
- Нормальный режим
- Режим CTC (сброс при совпадении)
- Режим быстрого ШИМ
- Режим ШИМ с коррекцией фазы
- Режим ШИМ с коррекцией фазы и частоты
Выбор режима осуществляется с помощью битов WGM10-WGM13 в регистрах TCCR1A и TCCR1B. Каждый режим имеет свои особенности и области применения.
Нормальный режим работы
В нормальном режиме счетчик Таймера1 просто инкрементируется от 0 до 65535 и затем сбрасывается в 0. Этот режим подходит для простого отсчета временных интервалов или подсчета внешних событий.
Режим CTC (Clear Timer on Compare Match)
В режиме CTC счетчик сбрасывается при достижении заданного значения сравнения. Это позволяет генерировать прерывания или сигналы с точной частотой. Как настроить Таймер1 в режиме CTC?
- Установить биты WGM12=1, WGM13=WGM11=WGM10=0
- Записать нужное значение сравнения в регистр OCR1A
- Настроить предделитель с помощью битов CS10-CS12
- При необходимости разрешить прерывание по совпадению
Использование Таймера1 для генерации ШИМ сигналов
Одно из главных преимуществ Таймера1 — возможность генерации различных видов ШИМ сигналов. Какие режимы ШИМ доступны?
- Быстрый ШИМ — для высокочастотных сигналов
- ШИМ с коррекцией фазы — для управления двигателями
- ШИМ с коррекцией фазы и частоты — для прецизионного управления
Настройка ШИМ режима включает следующие шаги:
- Выбор нужного режима ШИМ битами WGM10-WGM13
- Настройка поведения выхода битами COM1A1-COM1A0
- Установка периода в регистре ICR1 или OCR1A
- Задание коэффициента заполнения в OCR1A/OCR1B
Прерывания Таймера1 и их обработка
Таймер1 может генерировать несколько видов прерываний:
- Прерывание по переполнению (TOV1)
- Прерывания по совпадению (OCF1A, OCF1B)
- Прерывание по захвату (ICF1)
Для использования прерываний необходимо:
- Разрешить нужное прерывание в регистре TIMSK
- Разрешить глобальные прерывания командой sei()
- Написать обработчик прерывания
Пример обработчика прерывания по переполнению:
ISR(TIMER1_OVF_vect) {
// Код обработки прерывания
}
Измерение временных интервалов с помощью Таймера1
Таймер1 позволяет точно измерять длительность событий. Как это сделать?
- Настроить Таймер1 в нормальном режиме
- Запустить счет в начале события
- Остановить счет по окончании события
- Считать значение счетчика TCNT1
Зная частоту тактирования таймера, можно вычислить длительность события. Этот метод позволяет измерять интервалы с микросекундной точностью.
Модуль захвата входного сигнала (Input Capture Unit)
Модуль захвата позволяет фиксировать момент наступления внешнего события. Как он работает?
- При появлении фронта на входе ICP1 значение счетчика копируется в регистр ICR1
- Можно выбрать активный фронт — нарастающий или спадающий
- Генерируется прерывание по захвату ICF1
Это дает возможность точно измерять период, частоту и длительность внешних импульсных сигналов.
Особенности настройки предделителя Таймера1
Предделитель позволяет снизить частоту тактирования таймера. Какие варианты предделителя доступны для Таймера1?
- 1 (без предделения)
- 8
- 64
- 256
- 1024
Выбор предделителя осуществляется битами CS10-CS12 в регистре TCCR1B. Правильный выбор предделителя критически важен для точной работы таймера.
Применение Таймера1 в реальных проектах
Рассмотрим несколько примеров использования Таймера1 в проектах на AVR:
- Генерация звуковых сигналов заданной частоты
- Управление сервоприводами в робототехнике
- Измерение скорости вращения энкодеров
- Создание точных временных задержек
- Измерение длительности радиоимпульсов
Во всех этих применениях Таймер1 обеспечивает высокую точность и гибкость настройки, недоступную при использовании программных методов отсчета времени.
работа с TIMER1 в режиме захвата. Измеряем частоту сигнала « схемопедия
Таймеры помимо прерывания по переполнению, могут работать в режиме захвата значения, это означает что по пришествии импульса на ногу ICP значение счетчика копируется в регистр хранеия Input Capture. Это дает нам возможность измерять время между соседними импульсами изменяющегося сигнала, тобишь его период и далее, если требуется, высчитать частоту. Для примера использую atmega32 и выведу показания на ЖКИ дисплей. Вывод ICP в atmega32 находится на 20 ноге (PortD.6), туда и заводим сигнал:
Настройка таймера в режим захвата практически такая-же как и в режиме прерывания по переполнению. Необходимо указать предделитель счетчика:Prescale = 1|8|64|256|1024
и фронт по которому будет происходить захват значения:
Capture Edge = Rising|Falling
От того какой предделитель выбран зависит минимальная частота измеряемого сигнала. Например при значении предделителя 64, переполнение таймера при частоте кварца 16 МГц будет происходить каждые 0,26214 сек. Значит минимальная частота которую точно сможем измерить ~ 4Гц. Максимальная же частота (по идее) упирается в тактовую частоту применяемого кварца. Но proteus почему-то некисло врет после 50 кГц. Поэтому пока оставлю этот вопрос =) В программе предусмотрена проверка значения таймера1, на случай того, если в нем окажется 0, для того чтобы предотвратить деление на этот 0. Что может произойти с МК в противном случаем, можете глянуть здесь.
$regfile = “m32def.dat”
$crystal = 16000000
‘ указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin, Rs=Portc.5, E=Portc.4, Db4=Portc.0, Db5=Portc.1, Db6=Portc.2, Db7=Portc.3
Config Lcd = 16*2 ‘ тип используемого дисплея
‘настраиваем таймер в режим захвата по восходящему фронту
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Rising
Dim Timercounter As Word
Dim Period As Single ‘ период измеряемого сигнала
Dim F1 As Single
Dim F As Word ‘ переменная для хранения значения частоты
Const T = 0. 000004 ‘ примерное время в секундах за которое значение
‘ счетчика увеличивается на 1
On Capture1 Zaxvat
Timercounter = 0
Waitms 50
Enable Interrupts
Enable Capture1
Cursor Off
Do ‘ главный цикл программы
If Timercounter = 0 Then ‘ проверка значения переменной
F = 0 ‘ если 0, то частота тоже 0
Else ‘ в обратном случае высчитываем частоту
Period = Timercounter * T ‘ определяем период
F1 = 1 / Period ‘ считаем частоту
F = Abs(F1) ‘ округляем до целого
EndIf
‘выводим показания на дисплей
Cls
Lcd “Frequency, Hz:”
Lowerline
Lcd F
Waitms 100
Loop
Zaxvat:
Timercounter = Timer1 ‘ копируем значение таймера в переменную
Timer1 = 0 ‘ обнуляем таймер
Return
End
Нога ICP у меня висит в воздухе и ни к чему не подключена.
Как видите, ловит нормальный радиационный электромагнитный фон =) Причем наводки сильнее в местах скопления электробытовой техники, получился простой детектор электромагнитной активности, способствующей разжижению мозга)) Файлы проекта, можно скачать ниже:
Файл протеуса
Файл прошивки
Заснял свеженькое видео, которое демонстрирует работу таймера1 в режиме захвата на Atmega8
ave!
Взято с: avrproject.ru
Категория: AVR
Метки: avr
Микроконтроллеры AVR: Таймер/счетчик T1 (16 бит)
Таймер/счетчик T1 (16 бит)
Характеристики таймера/счетчика T1 (16 бит):
- Два независимых выхода по совпадению
- Таймер сброса при совпадении
- Один вход захвата
- Блок шумоподавления входа захвата
- Изменяемый период ШИМ сигнала
- Фазовый корректор ШИМ сигнала
- Изменяемый период ШИМ сигнала
- Тактовый генератор
- Три независимых источника прерывания
Регистры таймера/счетчика T1:
- TCNT1 — счетный регистр таймера/счетчика T1 (16 бит)
- OCR1A — регистр сравнения A (16 бит)
- OCR1B — регистр сравнения B (16 бит)
- TIMSK1 — регистр маски прерываний для таймера/счетчика T1
- TIFR1 — регистр флагов прерываний для таймера/счетчика T1
- TCCR1A — регистр управления A
- TCCR1B — регистр управления B
- TCCR1C — регистр управления C
- ICR1 — регистр захвата (16 бит)
Источником тактового сигнала для таймера/счетчика T1 может быть как тактовый сигнал используемый для всего микроконтроллера с использованием предделителя, так и сигнал, поступающий на вход T1 (11 ножка).
Регистр TCCR1A:
7 | 6 | 5 | 4 | 3 | 2 | 1 | |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | WGM10 |
Режим работы таймера/счетчика T1 устанавливается регистрами TCCR1A и TCCR1B
Биты COM1A1 (7) и COM1A0 (6) влияют на то, какой сигнал появится на выводе OC1A (15 ножка) при совпадении с A (совпадение значения счетного регистра TCNT1 со значением регистра сравнения OCR1A):
1. Обычный режим
- 00 — вывод OC1A не функционирует
- 01 — изменение состояния вывода OC1A на противоположное при совпадении с A
- 10 — сброс вывода OC1A в 0 при совпадении с A
- 11 — установка вывода OC1A в 1 при совпадении с A
2. Режим ШИМ
- 00 — вывод OC1A не функционирует
- 01 — если биты WGM13 — WGM10 установлены в (0000 — 1101), вывод OC1A не функционирует
- 01 — если битыWGM13 — WGM10 установлены в 1110 или 1111, изменение состояния вывода OC0A на противоположное при совпадении с A
- 10 — сброс вывода OC1A в 0 при совпадении с A, установка вывода OC1A в 1 если регистр TCNT1 принимает значение 0x00 (неинверсный режим)
- 11 — установка вывода OC1A в 1 при совпадении с A, установка вывода OC1A в 0 если регистр TCNT1 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 — вывод OC1A не функционирует
- 01 — если биты WGM13 — WGM10 установлены в (0000 — 1100, 1010, 1100 — 1111), вывод OC1A не функционирует
- 01 — если битыWGM13 — WGM10 установлены в 1101 или 1011, изменение состояния вывода OC1A на противоположное при совпадении с A
- 10 — сброс вывода OC1A в 0 при совпадении с A во время увеличения значения счетчика, установка вывода OC1A в 1 при совпадении с A во время уменьшения значения счетчика
- 11 — установка вывода OC1A в 1 при совпадении с A во время увеличения значения счетчика, сброс вывода OC1A в 0 при совпадении с A во время уменьшения значения счетчика
Биты COM1B1 (5) и COM1B0 (4) влияют на то, какой сигнал появится на выводе OC0B (12 ножка) при совпадении с B (совпадение значения счетного регистра TCNT1 со значением регистра сравнения OCR1B):
1. Обычный режим
- 00 — вывод OC1B не функционирует
- 01 — изменение состояния вывода OC1B на противоположное при совпадении с B
- 10 — сброс вывода OC1B в 0 при совпадении с B
- 11 — установка вывода OC1B в 1 при совпадении с B
2. Режим ШИМ
- 00 — вывод OC1B не функционирует
- 01 — вывод OC1B не функционирует
- 10 — сброс вывода OC1B в 0 при совпадении с B, установка вывода OC1B в 1 если регистр TCNT1 принимает значение 0x00 (неинверсный режим)
- 11 — установка вывода OC1B в 1 при совпадении с B, установка вывода OC1B в 0 если регистр TCNT1 принимает значение 0x00 (инверсный режим)
3. Режим коррекции фазы ШИМ
- 00 — вывод OC1B не функционирует
- 01 — вывод OC1B не функционирует
- 10 — сброс вывода OC1B в 0 при совпадении с B во время увеличения значения счетчика, установка вывода OC1B в 1 при совпадении с B во время уменьшения значения счетчика
- 11 — установка вывода OC1B в 1 при совпадении с B во время увеличения значения счетчика, сброс вывода OC1B в 0 при совпадении с B во время уменьшения значения счетчика
Регистр TCCR1B:
7 | 6 | 5 | 4 | 3 | 2 | 1 | |
CS10 |
Биты WGM13 (4) , WGM12 (3) регистра TCCR1B и биты WGM11 (1) , WGM10 (0) регистра TCCR1A устанавливают режим работы таймера/счетчика T1:
- 0000 — обычный режим
- 0001 — коррекция фазы PWM, 8-бит
- 0010 — коррекция фазы PWM, 9-бит
- 0011 — коррекция фазы PWM, 10-бит
- 0100 — режим счета импульсов (OCR1A) (сброс при совпадении)
- 0101 — PWM, 8-бит
- 0110 — PWM, 9-бит
- 0111 — PWM, 10-бит
- 1000 — коррекция фазы и частоты PWM (ICR1)
- 1001 — коррекция фазы и частоты PWM (OCR1A)
- 1010 — коррекция фазы PWM (ICR1)
- 1011 — коррекция фазы и частоты PWM (OCR1A)
- 1100 — режим счета импульсов (ICR1) (сброс при совпадении)
- 1101 — резерв
- 1110 — PWM (ICR1)
- 1111 — PWM (OCR1A)
Бит ICNC1 (7) регистра TCCR1B управляет схемой подавления помех блока захвата (0 — выключена / 1 — включена).
Бит ICES1 (6) регистра TCCR1B выбирает активный фронт регистра захвата (0 — по спадающему фронту сигнала / 1 — по нарастающему фронту сигнала).
Биты CS12 (2), CS11 (1), CS10 (0) регистра TCCR1B устанавливают режим тактирования и предделителя тактовой частоты таймера/счетчика T1:
- 000 — таймер/счетчик T1 остановлен
- 001 — тактовый генератор CLK
- 010 — CLK/8
- 011 — CLK/64
- 100 — CLK/256
- 101 — CLK/1024
- 110 — внешний источник на выводе T1 (11 ножка) по спаду сигнала
- 111 — внешний источник на выводе T1 (11 ножка) по возрастанию сигнала
Регистр TCCR1C:
7 | 6 | 5 | 4 | 3 | 2 | 1 | |
— |
Биты FOC1A (7) и FOC1B (6) регистра TCCR1С принудительно устанавливают значение на выводах OC1A и OC1B.
Регистр TIMSK1:
7 | 6 | 5 | 4 | 3 | 2 | 1 | |
OCIE1B | OCIE1A | TOIE1 |
Управление прерываниями от таймера осуществляется в регистре TIMSK1.
Бит ICIE1 (5) разрешает прерывание по захвату, биты OCIE1B (2) и OCIE1A (1) разрешают прерывания при совпадении с A и B, бит TOIE1 (0) разрешает прерывание по переполнению при установке 1. Если в эти биты записать 0, прерывания от таймера/счетчика будут запрещены.
Также есть регистр флагов прерываний TIFR1, который показывает какое прерывание поступило от таймера/счетчика T0.
Регистр TIFR1:
7 | 6 | 5 | 4 | 3 | 2 | 1 | |
TOV1 |
Биты ICF1 (5), OCF1B (2), OCF1A (1) и TOV1 (0) устанавливаются в 1 в зависимости от того, какое прерывание поступило — захват, совпадение с A, B или переполнение.
Следующее Предыдущее Главная страница
Подписаться на: Комментарии к сообщению (Atom)
Программирование таймеров в AVR [avr-gcc] « [Curiosity,Experimentation]
Все микроконтроллеры Atmel® AVR имеют таймеры в качестве встроенного периферийного устройства. Их можно использовать для генерации волн ШИМ (широтно-импульсной модуляции), для генерации точно синхронизированных импульсов и для регистрации временных меток внешних событий (режим захвата входных данных). Микроконтроллеры ATMEGA 16 и ATMEGA 8 (на которых мы сосредоточимся в этом посте) имеют 3 встроенных таймера, один 16-битный таймер и два 8-битных таймера. Эти таймеры работают независимо от выполняемой программы и могут генерировать прерывания. Здесь я расскажу о 16-битном таймере 1 ATMEGA 8, и то же самое относится и к ATMEGA 16.
Таймер (также называемый счетчиком) — это просто устройство, которое считает при получении тактовых импульсов. Таймер увеличивает (или уменьшает в некоторых случаях) свой счетчик с каждым тактом, который он получает. Таймер обычно определяется максимальным значением, до которого он может рассчитывать ( MAX ), после которого он переполняется и сбрасывается до нуля ( BOTTOM ). Таким образом, 8-битный таймер/счетчик может считать от 0 до 255, а 16-битный таймер/счетчик может считать от 0 до 65 535.
Скорость счета можно контролировать, изменяя скорость ввода часов. Это делается путем предварительного масштабирования часов микроконтроллера. При предварительном масштабировании мы передаем часть тактовой частоты ЦП на таймер.
Скорость таймера = F_CPU / прескалер
, где F_CPU — тактовая частота процессора AVR. Нормальные значения прескалера: 1,8,64,256 и 1024 . Например, для тактовой частоты 1 МГц, если предварительный делитель равен 64, то скорость таймера составляет 1000000/64=15625, т. е. за одну секунду таймер может считать от 0 до 15625.
Когда таймер достигает максимального значения, которое он может считать, говорят, что он переполняется, автоматически сбрасывается на 0 и снова начинает отсчет. Мы можем установить прерывание, которое будет происходить при переполнении таймера.
Когда таймер 1 переполняется, Бит TOV1 будет установлен в регистре TIFR (регистр флага прерывания таймера), который будет очищен автоматически при выполнении соответствующего ISR, или его можно очистить, установив бит TOV1 в 1 (нечетное, но именно так ребята из ATMEL хотят, чтобы мы это очистили!).
Запуск таймера
Счетчик начинает отсчет, как только он настроен на использование источника тактового сигнала путем установки битов соответствующего значения предварительного делителя CS10 , CS11 и CS12 в TCCR1B Регистр 1 B )регистр . Мгновенное значение таймера доступно в любое время в регистре TCNT (счетчик таймеров). Обратитесь к таблице данных для получения дополнительной информации о различных битах в регистре.
Таймер в режиме сравнения (режим CTC)
Таймер, используемый в вышеуказанном режиме, сам по себе не очень полезен. Таймер AVR может работать в режиме, называемом режимом CTC или Clear on Timer Capture, режимом , в котором мы можем настроить таймер на сравнение его счетчика с определенным значением, установленным в регистре OCR1A (регистр сравнения выходов 1 A) или OCR1B. регистрировать и генерировать прерывание или манипулировать выводом OC1A или OC1B всякий раз, когда происходит совпадение (например, когда TCNT=OCR1A или TCNT=OCR1B ). Режим CTC можно использовать для генерирования точной синхронизации и прямоугольных сигналов желаемой частоты.
Режим CTC можно включить, установив WGM 12 бит=1 в регистре TCCR1B.
Когда TCNT=OCR1A, таймер сбрасывается и снова начинается с 0. Значение OCR1A можно изменить в любое время, и изменение на выходе будет немедленно отражено.
переключение вывода OC1A в режиме CTC
Когда происходит совпадение, мы можем установить, очистить или переключить вывод OC1A/OC1B. Действие вывода OC1A можно настроить, установив подходящие значения для COM1A0 и COM1A1 битов в TCCR1A (регистр управления счетчиком таймера 1 A) регистр (см. техническое описание).
Всякий раз, когда происходит совпадение сравнения, бит OCF1A будет установлен в TIFR (Регистр флага прерывания таймера), который будет автоматически очищаться при срабатывании связанного ISR, или же нам придется очистить его вручную, установив для него значение 1.
Следующий пример демонстрирует режим CTC Таймера 1. Светодиод подключен к контакту t0 PB1 (контакт 15) Atmega8, который мигает с частотой 1 Гц.
Таймер 1 Atmega8 в режиме переключения CTC
Генерация прямоугольных импульсов
Когда вывод OC1A настроен на переключение путем установки COM1A0=1 в регистре TCCR1A, этот режим можно использовать для генерации прямоугольных импульсов требуемой частоты (только 50% рабочего цикла) путем установки подходящего значение в регистре OCR1A.
Как сказано выше, значение OCR1A может быть изменено в любое время, и изменение на выходе будет немедленно отражено. ОКР1А))
Генерация прямоугольных сигналов в режиме CTC
Например, для генерации прямоугольных сигналов с частотой 50 Гц установите OCR1A=291
Таймеры и прерывания
Таймеры AVR могут генерировать 3 типа прерываний: (Захват ввода — это режим, в котором мы можем копировать значение регистра TCNT в регистр ICR всякий раз, когда на выводе ICP1 ATMEGA обнаруживается нарастающий/спадающий фронт), и мы можем выполнить указанную пользователем ISR для них, как показано ниже. .
Чтобы включить прерывания, сначала мы должны включить прерывание сравнения совпадений для таймера 1, установив бит OCIE1A (разрешение прерывания совпадения вывода) в регистре TIMSK , а затем мы должны разрешить глобальные прерывания с помощью sei(). макрос. Для обработки прерываний переполнения установите бит TOIE1 в регистре TIMSK равным 1 .
Следующий пример демонстрирует использование прерываний. Процедура обслуживания прерываний (ISR) переключает светодиод, подключенный к контакту 1 порта B.
Обработка прерываний таймера 1
Вот так:
Нравится Загрузка…
Эта запись была опубликована 16 июля 2010 г. в 22:24 и зарегистрирована как avr-gcc. Tagged: atmega, avr-gcc, таймеры. Вы можете следить за любыми ответами на эту запись через ленту RSS 2.0. Вы можете оставить отзыв или вернуться со своего сайта.
Векторы прерывания AVR
Векторы прерывания AVRВекторы прерываний AVR
Ниже приведены таблицы прерываний, доступных на микроконтроллерах AVR, используемых в классе. Имя вектора — это идентификатор, который следует использовать в начале процедура обслуживания прерывания (ISR). Например, ISR для вывода ATmega328P. Изменить запрос на прерывание 0 будет выглядеть так.
ISR(PCINT0_vect) { // ISR-код }
Примечание.