Печать

Занятие №8. Реализация ШИМ

Автор: AntonChip Опубликовано . Опубликовано в Программирование на Си

Рейтинг:   / 31
ПлохоОтлично 

Аппаратная реализация ШИМ дает безусловные преимущества перед программной,так как разгружает процессор как лишним и громоздким кодом, так и временем на его обслуживание, а также дает больше возможностей использования работы с ШИМ. Достаточно провести инициализацию таймер/счетчика (занести необходимые значения в регистры используемые таймер/счетчиком) как таймер/счетчик может работать независимо от процессора, соответственно процессор может заниматься другими задачами,только иногда обращаясь в необходимый момент для корректировки или изменения режима или получения результатов от таймер/счетчика.

Описание флагов прерываний

T1 может генерировать прерывание при наступлении:

  1. переполнения счетного регистра TCNT1;
  2. при равенстве счетного регистра TCNT1 и регистра сравнения OCR1A и OCR1B (по отдельности для каждого регистра);
  3. при сохранении счетного регистра в регистре захвата ICR1.

T2 может генерировать прерывание при наступлении:

  1. переполнения счетного регистра TCNT2;
  2. при равенстве счетного регистра TCNT2 и регистра сравнения OCR2.

Флаги всех прерываний находится в регистре TIFR,а разрешение/запрещение прерываний в регистре TIMSK.

Разряды регистра TIMSK
Регистр76543210
TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2 - Флаг разрешения прерывания по событию "совпадение" таймера/счетчика Т2
  • TOIE2 - Флаг разрешения прерывания по переполнению таймера/счетчика Т2
  • TICIE1 - Флаг разрешения прерывания по событию "захват" таймера/счетчика Т1
  • OCIE1A - Флаг разрешения прерывания по событию "совпадение А" таймера/счетчика Т1
  • OCIE1B - Флаг разрешения прерывания по событию "совпадение В" таймера/счетчика Т1
  • TOIE1 - Флаг разрешения прерывания по переполнению таймера/счетчика Т1
  • OCIE0* - Флаг разрешения прерывания по событию "совпадение" таймера/счетчика Т0 (* - отсутствует в ATmega8)
  • TOIE0 - Флаг разрешения прерывания по переполнению таймера/счетчика Т0

Для индикации наступления прерываний от таймеров/счетчиков Т0,Т1,Т2 предназначен регистр флагов прерываний TIFR. При наступлении какого либо события соответствующий флаг регистра TIFR устанавливается в "1". При переходе на подпрограмму обработки прерывания он аппаратно сбрасывается в "0".Также любой флаг может быть сброшен в "0" программно путем записи в него "1"

Разряды регистра TIFR
Регистр76543210
TIFR OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0
  • OCF2 - Флаг прерывания по событию "совпадение" таймера/счетчика Т2
  • TOV2 - Флаг прерывания по переполнению таймера/счетчика Т2
  • ICF1 - Флаг прерывания по событию "захват" таймера/счетчика Т1
  • OCF1A - Флаг прерывания по событию "совпадение А" таймера/счетчика Т1
  • OCF1B - Флаг прерывания по событию "совпадение В" таймера/счетчика Т1
  • TOV1 - Флаг прерывания по переполнению таймера/счетчика Т1
  • OCF0 - Флаг прерывания по событию "совпадение" таймера/счетчика Т0
  • TOV0 - Флаг прерывания по переполнению таймера/счетчика Т0

Описание работы тайтер/счетчика Т1 в контроллере ATmega8/16

Шеснадцатиразрядный таймер/счетчик Т1 может использоватся для формирования временных интервалов, подсчета количества внешних сигналов, и для генерации сигналов с ШИМ разной скважности и длительности на выводах OC1A и OC1B. Кроме того по внешнему сигналу с вывода ICP1 или от аналогового компаратора, Т1 может сохранять свое текущее состояние в отдельном регистре захвата ICR1.

Разряды регистров TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Регистр76543210
TCCR1A COM1A1 COM1A0 COM1B1 COM1BO FOC1A FOC1B WGM11 WGM10
TCCR1B ICNC1 ICES1 * WGM13 WGM12 CS12 CS11 CS10
TCNT1:H R/W R/W R/W R/W R/W R/W R/W R/W
TCNT1:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1A:L R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:H R/W R/W R/W R/W R/W R/W R/W R/W
OCR1B:L R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:H R/W R/W R/W R/W R/W R/W R/W R/W
ICR1:L R/W R/W R/W R/W R/W R/W R/W R/W

Каждый 16-разрядный регистр физически размещается в двух 8-разрядных регистрах поэтому при чтении записи в них нужно выполнить две операции. При записи первым загружается старший байт потом младший,при чтении наоборот сначала младший прочитывается потом старший.

TCCR1A:TCCR1B - 8-разрядные регистры управления таймером/счетчиком Т1

TCNT1 - 16-разрядный счетный регистр таймера/счетчика Т1. Взависимости от режима работы содержимое этого регистра обнуляется,инкрементируется(увеличивается значение на 1) или декрементируется(уменьшается значение на 1) по каждому импульсу тактового сигнала таймера/счетчика.

OCR1A:OCR1B - 16-разрядные регистры сравнения

ICR1 - 16-разрядный регистр захвата,сохраняет значение TCNT1 при подаче активного фронта сигнала на вывод ICP1 или по сигналу от компаратора.

Назначение битов

COM1A1:COM1A0:COM1B1:COM1B0 - Эти разряды определяют поведение вывода OC1A:OC1B при совпадении значения счетного регистра TCNT1 и регистра сравнения OCR1A:OCR1B

FOC1A:FOC1B - Эти разряды служат для прнудительного изменения состояния вывода OC1A:OC1B

ICNC1 - Разряд управления схемой помех,если бит равен "0" захват будет по первому активному фронту, если "1" захват будет после четвертой одинаковой выборки сигнала захвата.

ICES1 - Разряд выбора активного фронта сигнала,если его значение равно "0", сохранение счетного регистра TCNT1 в регистре захвата OCR1 будет по спадающему фронту сигнала, если "1" по нарастающему.

WGM13:WGM12:WGM11:WGM10 - Эти разряды определяют режим работы таймера/счетчика Т1

CS22:CS21:C20 - Разряды, определяющие источник тактового сигнала таймера/счетчика Т1.

Выбор режима работы таймера/счетчика Т1
WGM13WGM12WGM11WGM10Режим работыМодуль счета (TOP)
0 0 0 0 Normal $FFFF
0 0 0 1 Phase correct PWM

8-разрядный

$00FF
0 0 1 0 Phase correct PWM

9-разрядный

$01FF
0 0 1 1 Phase correct PWM

10-разрядный

$03FF
0 1 0 0 CTC (сброс при совпадении) OCR1A
0 1 0 1 Fast PWM

8-разрядный

$00FF
0 1 1 0 Fast PWM

9-разрядный

$01FF
0 1 1 1 Fast PWM

10-разрядный

$03FF
1 0 0 0 Phase and Freguensy Correct PWM ICR1
1 0 0 1 Phase and Freguensy Correct PWM OCR1A
1 0 1 0 Phase correct PWM ICR1
1 0 1 1 Phase correct PWM OCR1A
1 1 0 0 CTC (сброс при совпадении) ICR1
1 1 0 1 Зарезервировано *
1 1 1 0 Fast PWM ICR1
1 1 1 1 Fast PWM OCR1A

Выбор источника тактового сигнала

CS12CS11CS10Источник тактового сигнала
0 0 0 Таймер/счетчик остановлен
0 0 1 slk
0 1 0 slk/8
0 1 1 slk/64
1 0 0 slk/256
1 0 1 slk/1024
1 1 0 Таймер/счетчик подключен к выводу Т1 контроллера

Счет осуществляется по спадающему фронту импульсов

1 1 1 Таймер/счетчик подключен к выводу Т1 контроллера

Счет осуществляется по нарастающему фронту импульсов

Режим Normal

Самый простой режим работы Т1. По каждому импульсу тактового сигнала происходит инкремент счетного регистра TCNT1 (увеличение значения на 1). При переходе через значение $FFFF модуля счета (ТОР) возникает переполнение и вследующем такте начинается счет со значения $0000, в этот же момент устанавливается флаг TOV1=1 в регистре TIFR, и может быть сгенерировано прерывание если установлен флаг TOIE1=1 в регистре TIMSK. Для того, чтобы сгенерировать сигна заданной частоты в этом режиме необходимо записать в разряды COM1A1=0:COM1A0=1 для вывода OC1A или COM1B1=0:COM1B0=1 для вывода OC1B контроллера.

Кроме того по каждому такту происходит сравнение счетного регистра TCNT1 и регистра сравнения OCR1A:OCR1B, при совпадении устанавливается флаг прерывания OCF1A=1:OCF1B=1 и если разряд OCIE1A=1:OCIE1B=1 регистра TIMSK генерируется прерывание. В тот же момент может быть изменено состояние вывода OC1A:OC1B в зависимости от установок битов COM1A1:COM1A0:COM1B1:COM1B0.

Поведение вывода ОС1A при совпадении
COM1A1COM1A0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1A
0 1 Состояние вывода меняется на противоположное

(только в режимах Normal и CTC)

1 0 "Вывод сбрасывается "0"
1 1 "Вывод устанавливается "1"
Поведение вывода ОС1B при совпадении
COM1B1COM1B0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1B
0 1 Состояние вывода меняется на противоположное

(только в режимах Normal и CTC)

1 0 "Вывод сбрасывается "0"
1 1 "Вывод устанавливается "1"


Режим СТС (сброс при совпадении)

В этом режиме Т1 работает по такому же принципу как и в режиме Normal. Отличие заключается в том, что максимально возможное значение счетного регистра TCNT1 ограничивается значением регистра сравнения OCR1A или ICR1 (смотрите таблицу выбора режима таймер/счетчика). При достижении TCNT1 значения OCR1A или ICR1, значение TCNT1 обнуляется в TCNT1=$0000 В этот же момент устанавливается флаг TOV1=1 COM1A1:COM1A0:COM1B1:COM1B0 Опрелеляют поведение вывода ОС1A:OC1B при совпадении.

Поведение вывода ОС1A при совпадении
COM1A1COM1A0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1A
0 1 Состояние вывода меняется на противоположное

(только в режимах Normal и CTC)

1 0 "Вывод сбрасывается "0"
1 1 "Вывод устанавливается "1"
Поведение вывода ОС1B при совпадении
COM1B1COM1B0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1B
0 1 Состояние вывода меняется на противоположное

(только в режимах Normal и CTC)

1 0 "Вывод сбрасывается "0"
1 1 "Вывод устанавливается "1"


Режим Fast PWM (быстродействующий ШИМ)

С помощью этого режима можно генерировать высокочастотный сигал ШИМ. Принцип и порядок работы не отличается от режима Normal, кроме наличия двойной буферизации регистра OCR1A:OCR1B, благодаря которому исключается появление несиметричных импульсов сигнала, а также отличается поведением выводов ОС1A:OC1B (смотрите таблицу).

Поведение вывода ОС1A при совпадении
COM1A1COM1A0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1A
0 1 Зарезервировано
1 0 Сбрасывается в "0" при прямом счете ,когда TCNT1=OCR1A,

устанавливается "1" при обнулении TCNT1=$0000

1 1 Устанавливается в "1" при прямом счете ,когда TCNT1=OCR1A,

сбрасывается "0" при обнулении TCNT1=$0000

Поведение вывода ОС1B при совпадении
COM1B1COM1B0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1B
0 1 Зарезервировано
1 0 Сбрасывается в "0" при прямом счете ,когда TCNT1=OCR1B,

устанавливается "1" при обнулении TCNT1=$0000

1 1 Устанавливается в "1" при прямом счете ,когда TCNT1=OCR1B,

сбрасывается "0" при обнулении TCNT1=$0000


Режим Phase Correct PWM (ШИМ с точной фазой)

Отличие этого режима от предыдущих заключается в том, что счетный регистр работает как реверсивный счетчик. Так как этот режим рекомендуется Atmel как наиболее подходящий для регулировки двигателей, мы его рассмотрим наиболее подробно. При достижении счетным регистром TCNT1 значения модуля счета (ТОР) (или значения регистра ICR1 или значения регистра OCR1A, смотрите таблицу выбора режима таймер/счетчика), происходит изменение направления счета. При достижении счетным регистром TCNT1 минимального значения ($0000) также происходит изменение направления счета и в тот же момент устанавливается флаг прерывания TOV1 регистра TIFR. Так же при равенстве содержимого счетного регистра TCNT1 и регистра сравнения OCR1A:OCR1B ,устанавливается флаг OCF1A:OCF1B регистра TIFR и изменяется состояние вывода OC1A:OC1B,согласно таблице.

Поведение вывода ОС1A при совпадении
COM1A1COM1A0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1A
0 1 Зарезервировано
1 0 Сбрасывается в "0" при прямом счете, когда TCNT1=OCR1A

устанавливается "1" при обратном,когда TCNT1=OCR1A

1 1 Устанавливается в "1" при прямом счете, когда TCNT1=OCR1A,

сбрасывается "0" при обратном,когда TCNT1=OCR1A

Поведение вывода ОС1B при совпадении
COM1B1COM1B0Режим работы
0 0 Таймер/счетчик отключен от вывода ОС1B
0 1 Зарезервировано
1 0 Сбрасывается в "0" при прямом счете, когда TCNT1=OCR1B

устанавливается "1" при обратном, когда TCNT1=OCR1AB

1 1 Устанавливается в "1" при прямом счете, когда TCNT1=OCR1B,

сбрасывается "0" при обратном, когда TCNT1=OCR1B

Во избежание несимметричных выбросов во время записи значения в регистр OCR1A:OCR1B, в этом режиме реализована двойная буферизация записи. Благодаря этому действительное изменение значения регистра изменяется в момент достижения счетным регистром TCNT1 значения модуля счета (ТОР) (или значения регистра ICR1 или значения регистра OCR1A смотрите таблицу выбора режима таймер/счетчика). Поэтому в самом начале, при инициализации таймер/счетчика вывод ОС1A:OC1B не изменит свое состояние при совпадении до тех пор, пока регистр не достигнет значения (ТОР).

Комментарии  

0 #41 AxMeD 17.12.2014 23:02
А где рисунок со схемой?
Сообщить модератору

Рекомендуем посмотреть