ATmega16 - PWM с помощью T/C0, T/C1, T/C2 |
Написал microsin | |
07.04.2007 | |
В статье описаны методы запуска и формирования PWM (Pulse-Width Modulation, или по-русски ШИМ) в микроконтроллерах AVR с помощью встроенных таймеров/счетчиков T/C0, T/C1 и T/C2. [Использование T/C0] 1. T/C0 является 8-восьмибитным, сам счетчик находится в регистре TCNT0. При переполнении (переход 0xFF->0x00) может генерироваться прерывание TIMER0_OVF (Timer/Counter0 Overflow, флаг TOV0). Это прерывание запрещается (маскируется) битом TOIE0 (бит 0 регистра TIMSK). Флаг TOV0 автоматически очищается при выполнении процедуры прерывания.
2. Для счетчика TCNT0 определены 3 специальных значения, по которым могут происходить определенные события: 3. TCNT0 может считать как вверх (инкрементироваться), так и вниз (декрементироваться). Это определяется выбранным режимом работы. 4. Для TCNT0 источник тактирования и его частота выбирается битами CS02:0 (биты 0..2 регистра TCCR0). Можно даже совсем запретить работу TCNT0 (записав в CS02:0 все нули). 5. Имеется 8-битный регистр OCR0 - регистр цифрового компаратора. При совпадении TCNT0 == OCR0 устанавливается Output Compare Flag (OCF0) и может генерироваться прерывание TIMER0_COMP (Timer/Counter0 Compare Match). Флаг OCF0, как водится, автоматически очищается при выполнении процедуры прерывания. Прерывание TIMER0_COMP запрещается (маскируется) битом OCIE0 (бит 1 регистра TIMSK). Кроме того, это событие может генерировать аппаратный PWM-сигнал на выводе OC0 процессора (ножка 4 корпуса DIP40, порт PB3). Сигнал Timer/Counter0 Compare Match используется генератором сигнала PWM.
6. Тип PWM выбирается битами Waveform Generation Mode - WGM01:0 (биты 3 и 6 регистра TCCR0 соответственно). От них также зависит, когда устанавливается флаг The Timer/Counter Overflow (TOV0). По этому флагу может генерироваться прерывание TIMER0_OVF. Всего существует 4 режима: 7. Генератор PWM использует сигнал OCF0 (Timer/Counter0 Compare Match) и установки битов WGM01:0 и Compare Output mode (COM01:0, биты 5 и 4 регистра TCCR0), а также сигналы BOTTOM и TOP. 8. Бит Force Output Compare (FOC0) может принудительно изменить состояние ножки OC0 процессора, при этом счетчик не сбрасывается и прерывание не генерируется. 9. Состояние ножки 4 OC0 принудительно переключается в режим PWM, если установлен хотя бы один бит COM01:0, однако вход будет ножка 4 или выход, по прежнему определяется регистром DDR, поэтому регистр DDR надо обязательно настроить на выход перед включением режима PWM.
10. Режим Normal, не PWM (WGM01:0 = 0), влияние события Compare Match на ножку 4 OC0:
11. В режиме Clear Timer on Compare или CTC mode (WGM01:0 = 2), регистр OCR0 используется для изменения разрешения (диапазона счета) счетчика TCNT0 - счетчик сбрасывается в ноль, когда он равен OCR0. Таким образом, OCR содержит предельную величину TOP счетчика, что определяет его разрешающую способность. В момент достижения счетчиком величины TOP может генерироваться прерывание (по флагу OCF0). В обработчике прерываний можно изменить величину TOP в регистре OCR0. Нужно быть внимательным с малыми величинами OCR, иначе возможна потеря срабатывания компаратора, и счетчик продолжит считать до 0xFF.
12. Fast PWM Mode, влияние события Compare Match на ножку 4 OC0:
13. Phase Correct PWM Mode, влияние события Compare Match на ножку 4 OC0:
14. При работе от внутренней тактовой частоты 1 МГц (значение по умолчанию) максимальная частота ШИМ в режиме fast PWM будет равна
15. Пример настройки PWM в режиме fast PWM: [Использование T/C1] 1. Счетчик T/C1 значительно отличается от T/C0 хотя бы тем, что 16-битный, и имеет два регистра цифрового компаратора OCR1A и OCR1B и 2 аппаратных выхода PWM - OC1A и OC1B, и имеет 2 регистра управления TCCR1A и TCCR1B.
2. Для счетчика TCNT1 определены 3 специальных значения, по которым могут происходить определенные события: 3. К 16-битным регистрам (TCNT1, OCR1A, OCR1B и ICR1) нужны специальные методы обращения, читаются и записываются через 2 восьмибитные операции с участием временного 8-бит регистра (он общий для всех 16-бит регистров одного таймера). Через этот промежуточный регистр передается значение старшего байта, а обращение к младшему (отдельному для каждого 16-бит регистра) запускает выполнение 16-бит операции. Не все 16-бит регистры используют временный регистр для high-байта, например OCR1A и OCR1B.
Для 16-бит операций при чтении low-байт должен быть прочитан первым, а при записи high-байт должен быть записан первым. Пример обращения к регистру TCNT1 (обращение к OCR1A, OCR1B и ICR1 производится так же), предполагается, что прерывания не обращаются к TCNT1 (иначе они должны быть запрещены во время операции из этого примера):
Вот тот же пример с запретом прерываний: Если записывается сразу несколько 16-битных регистра с одинаковым high-байтом, то high-байт можно записать только 1 раз. 4. Как и в T/C0, флаги прерываний (ICF1, OCF1A, OCF1B, TOV1) находятся в регистре Timer Interrupt Flag Register (TIFR). Как и в T/C0, каждое из прерываний может маскироваться через Timer Interrupt Mask Register (TIMSK), биты маскирования TICIE1, OCIE1A, OCIE1B, TOIE1. 5. Тактирование T/C1 такое же, как и у T/C0. Источник тактов выбирается регистром Timer/Counter Control Register B (TCCR1B). [Использование T/C2] Почти все написанное ранее про T/C0 справедливо и для T/C2, поскольку отличаются они только в том, что T/C2 имеет более точный предделитель для тактовой частоты (немного по-другому работают биты управления предделителем CS22:0 - биты 2..3 регистра TCCR2), а также если T/C0 мог тактироваться от внешнего сигнала на T0, ножка 1, порт PB0, то T/C2 может тактироваться от дополнительного кварцевого генератора, так называемого External 32 kHz Watch Crystal, независимого от основной тактовой частоты (не от ножек XTAL2 выв. 12 и XTAL1 выв. 13, а от TOSC2 порт PC7 ножка 29 и TOSC1 порт PC6 ножка 28). |
|
Последнее обновление ( 03.12.2009 ) |