Главная arrow Программирование arrow AVR arrow ATmega16 - PWM с помощью T/C0, T/C1, T/C2 Friday, June 23 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

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 специальных значения, по которым могут происходить определенные события:
   BOTTOM== 0x00
   MAX== 0xFF
   TOP== MAX или OCR0

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 режима:
Mode|WGM01 |WGM00 | режим           | TOP |  изменение |установка
    |(CTC0)|(PWM0)| T/C0            |     |    OCR0    | TOV
----+------+------+-----------------+-----+------------+--------
 0     0     0    Normal             0xFF  сразу        MAX
 1     0     1    PWM, Phase Correct 0xFF  TOP          BOTTOM
 2     1     0    CTC                OCR0  сразу        MAX
 3     1     1    Fast PWM           0xFF  BOTTOM       MAX

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:
COM01 COM00 Описание
0          0   Нормальная работа порта PB3, OC0 отсоединен
0          1   переключение OC0 в противоположное состояние при compare match
1          0   сброс OC0 при compare match
1          1   установка OC0 при compare match
   Режим Normal самый простой - в этом режиме TCNT0 всегда считает в инкремент (вверх, в сторону увеличения), и не происходит очистка TCNT0. При переполнении (переход 0xFF->0x00) Timer/Counter Overflow Flag (TOV0) устанавливается в 1, и возможен вызов прерывания TIMER0_OVF. Флаг TOV0 работает как девятый бит с тем отличием, что он только устанавливается. Однако можно программно увеличить разрядность таймера, если использовать вызов прерывания TIMER0_OVF (при этом TOV0 автоматически очищается).

11. В режиме Clear Timer on Compare или CTC mode (WGM01:0 = 2), регистр OCR0 используется для изменения разрешения (диапазона счета) счетчика TCNT0 - счетчик сбрасывается в ноль, когда он равен OCR0. Таким образом, OCR содержит предельную величину TOP счетчика, что определяет его разрешающую способность. В момент достижения счетчиком величины TOP может генерироваться прерывание (по флагу OCF0). В обработчике прерываний можно изменить величину TOP в регистре OCR0. Нужно быть внимательным с малыми величинами OCR, иначе возможна потеря срабатывания компаратора, и счетчик продолжит считать до 0xFF.
   Режим CTC хорош для генерирования меандра, для этого выход OC0 включается в режим переключения (COM01:0 = 1). Максимальная частота будет равна fOC0 = fclk_IO/2, когда OCR0==0x00. Общая формула вычисления частоты
   fOC0 = fclk_IO / (2 * N * (1 + OCR0)), где N равен коэффициенту деления (prescale factor 1, 8, 64, 256, или 1024).
   Флаг TOV0 устанавливается MAX -> 0x00.

12. Fast PWM Mode, влияние события Compare Match на ножку 4 OC0:
COM01 COM00 Описание
0      0   Нормальная работа порта PB3, OC0 отсоединен
0      1   зарезервировано
1      0   сброс OC0 при compare match, установка при BOTTOM (PWM без инверсии)
1      1   установка OC0 при compare match, сброс при BOTTOM (PWM с инверсией)
   Этот режим генерирует в 2 раза бОльшую частоту, чем режим Phase Correct PWM Mode. Как работает Fast PWM Mode, понятно из таблицы. Остается добавить, что Timer/Counter Overflow Flag (TOV0) устанавливается, когда TCNT0 достигает MAX (0xFF). Общая формула вычисления частоты PWM:
   fOC0PWM = fclk_IO / N * 256, где N равен коэффициенту деления (prescale factor 1, 8, 64, 256, или 1024).

13. Phase Correct PWM Mode, влияние события Compare Match на ножку 4 OC0:
COM01 COM00 Описание
0      0   Нормальная работа порта PB3, OC0 отсоединен
0      1   зарезервировано
1      0   сброс OC0 при compare match, когда счет вверх, установка при счете вниз (PWM без инверсии)
1      1   установка OC0 при compare match, когда счет вверх, сброс при счете вниз (PWM с инверсией)
   Режим отличается вдвое меньшей частотой PWM, но более высокое качество формирования сигнала, вплоть до предельных значений OCR0 (0x00 и 0xFF). Режим хорошо подходит для управления моторами. В этом режиме TCNT0 сначала считает вверх, достигает 0xFF, потом начинает считать вниз, достигает 0x00, начинает считать вверх и процесс повторяется. Timer/Counter Overflow Flag (TOV0) устанавливается каждый раз, когда TCNT0 достигает BOTTOM (0x00).
   Общая формула вычисления частоты PWM:
   fOC0PWM = fclk_IO / N * 510, где N равен коэффициенту деления (prescale factor 1, 8, 64, 256, или 1024).

14. При работе от внутренней тактовой частоты 1 МГц (значение по умолчанию) максимальная частота ШИМ в режиме fast PWM будет равна
1000000/256 = 3906,25 Гц.
   Такая частота подойдет для медленно меняющихся процессов. Если поднять тактовую частоту до 8 МГц (для этого надо записать fuses CKSEL3..0 в значение 0100), то частота ШИМ будет
8000000/256 = 31250 Гц
   Такая частота не слышима человеческим ухом, и может применяться для генерации звуков.

15. Пример настройки PWM в режиме fast PWM:
//скважность импульсов будет 50 %
OCR0 = 127;
//clear OC0 at compare match (1<<COM01), fast PWM mode ((1<<WGM01)|(1<<WGM00))
// clkI/O (1<<CS00)
TCCR0 = (1<<COM01)|(1<<WGM01)|(1<<WGM00)|(1<<CS00);
//PB3 (OC0) set as output
DDRB = 1<<DDB3;
   После такой настройки частота ШИМ на выходе будет 3906,25 Гц, скважность сигнала 50 %.

[Использование T/C1]

1. Счетчик T/C1 значительно отличается от T/C0 хотя бы тем, что 16-битный, и имеет два регистра цифрового компаратора OCR1A и OCR1B и 2 аппаратных выхода PWM - OC1A и OC1B, и имеет 2 регистра управления TCCR1A и TCCR1B.

2. Для счетчика TCNT1 определены 3 специальных значения, по которым могут происходить определенные события:
   BOTTOM== 0x0000
   MAX== 0xFFFF
   TOP== 0x00FF, 0x01FF, 0x03FF или OCR1A или ICR1

3. К 16-битным регистрам (TCNT1, OCR1A, OCR1B и ICR1) нужны специальные методы обращения, читаются и записываются через 2 восьмибитные операции с участием временного 8-бит регистра (он общий для всех 16-бит регистров одного таймера). Через этот промежуточный регистр передается значение старшего байта, а обращение к младшему (отдельному для каждого 16-бит регистра) запускает выполнение 16-бит операции. Не все 16-бит регистры используют временный регистр для high-байта, например OCR1A и OCR1B.

Для 16-бит операций при чтении low-байт должен быть прочитан первым, а при записи high-байт должен быть записан первым. Пример обращения к регистру TCNT1 (обращение к OCR1A, OCR1B и ICR1 производится так же), предполагается, что прерывания не обращаются к TCNT1 (иначе они должны быть запрещены во время операции из этого примера):
[Assembly Code Example]
...
; Set TCNT1 to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNT1H,r17
out TCNT1L,r16
; Read TCNT1 into r17:r16
in r16,TCNT1L
in r17,TCNT1H
...
[C Code Example]
unsigned int i;
...
/* Set TCNT1 to 0x01FF */
TCNT1 = 0x1FF;
/* Read TCNT1 into i */
i = TCNT1;
...

Вот тот же пример с запретом прерываний:
[Assembly Code Example]
TIM16_ReadTCNT1:
  ; Save global interrupt flag
  in r18,SREG
  ; Disable interrupts
  cli
  ; Read TCNT1 into r17:r16
  in r16,TCNT1L
  in r17,TCNT1H
  ; Restore global interrupt flag
  out SREG,r18
  ret
[C Code Example]
unsigned int TIM16_ReadTCNT1( void )
{
  unsigned char sreg;
  unsigned int i;
  /* Save global interrupt flag */
  sreg = SREG;
  /* Disable interrupts */
  _CLI();
  /* Read TCNT1 into i */
  i = TCNT1;
  /* Restore global interrupt flag */
  SREG = sreg;
  return i;

Если записывается сразу несколько 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 )
 

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017