AVR:ШИМ — различия между версиями
Vooon (обсуждение | вклад) (→Пример реализации ШИМ на классическом асемблере AVRstudio (для Atmega8)) |
Toise (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
[[Категория:Микроконтроллеры]] | [[Категория:Микроконтроллеры]] | ||
[[Категория:Цифровая электроника]] | [[Категория:Цифровая электроника]] | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
== Введение == | == Введение == | ||
Строка 11: | Строка 15: | ||
Также в статье приводятся в качестве примера простые исходники по реализации аппаратного ШИМ. | Также в статье приводятся в качестве примера простые исходники по реализации аппаратного ШИМ. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
== Описание флагов прерываний == | == Описание флагов прерываний == | ||
Строка 26: | Строка 34: | ||
Флаги всех прерываний находится в регистре TIFR,а разрешение/запрещение прерываний в регистре TIMSK. | Флаги всех прерываний находится в регистре TIFR,а разрешение/запрещение прерываний в регистре TIMSK. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 33: | Строка 45: | ||
|TIMSK ||OCIE2||TOIE2||TICIE1||OCIE1A||OCIE1B||TOIE1||OCIE0*||TOIE0 | |TIMSK ||OCIE2||TOIE2||TICIE1||OCIE1A||OCIE1B||TOIE1||OCIE0*||TOIE0 | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
* '''OCIE2''' - Флаг разрешения прерывания по событию "совпадение" таймера/счетчика Т2 | * '''OCIE2''' - Флаг разрешения прерывания по событию "совпадение" таймера/счетчика Т2 | ||
Строка 46: | Строка 62: | ||
При наступлении какого либо события соответствующий флаг регистра TIFR устанавливается в "1". | При наступлении какого либо события соответствующий флаг регистра TIFR устанавливается в "1". | ||
При переходе на подпрограмму обработки прерывания он аппаратно сбрасывается в "0".Также любой флаг может быть сброшен в "0" программно '''путем записи в него "1"''' | При переходе на подпрограмму обработки прерывания он аппаратно сбрасывается в "0".Также любой флаг может быть сброшен в "0" программно '''путем записи в него "1"''' | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 62: | Строка 82: | ||
* '''OCF0''' - Флаг прерывания по событию "совпадение" таймера/счетчика Т0 | * '''OCF0''' - Флаг прерывания по событию "совпадение" таймера/счетчика Т0 | ||
* '''TOV0''' - Флаг прерывания по переполнению таймера/счетчика Т0 | * '''TOV0''' - Флаг прерывания по переполнению таймера/счетчика Т0 | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
== Описание работы тайтер/счетчика Т1 в контроллере ATmega8/16 == | == Описание работы тайтер/счетчика Т1 в контроллере ATmega8/16 == | ||
Строка 67: | Строка 91: | ||
Шеснадцатиразрядный таймер/счетчик Т1 может использоватся для формирования временных интервалов, подсчета количества внешних сигналов, и для генерации сигналов с ШИМ разной скважности и длительности на выводах OC1A и OC1B. | Шеснадцатиразрядный таймер/счетчик Т1 может использоватся для формирования временных интервалов, подсчета количества внешних сигналов, и для генерации сигналов с ШИМ разной скважности и длительности на выводах OC1A и OC1B. | ||
Кроме того по внешнему сигналу с вывода ICP1 или от аналогового компаратора, Т1 может сохранять свое текущее состояние в отдельном регистре захвата ICR1. | Кроме того по внешнему сигналу с вывода ICP1 или от аналогового компаратора, Т1 может сохранять свое текущее состояние в отдельном регистре захвата ICR1. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 92: | Строка 120: | ||
|ICR1:L ||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 | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
Каждый 16-разрядный регистр физически размещается в двух 8-разрядных регистрах поэтому при чтении записи в них нужно выполнить две операции. | Каждый 16-разрядный регистр физически размещается в двух 8-разрядных регистрах поэтому при чтении записи в них нужно выполнить две операции. | ||
Строка 104: | Строка 136: | ||
'''ICR1''' - 16-разрядный регистр захвата,сохраняет значение TCNT1 при подаче активного фронта сигнала на вывод ICP1 или по сигналу от компаратора. | '''ICR1''' - 16-разрядный регистр захвата,сохраняет значение TCNT1 при подаче активного фронта сигнала на вывод ICP1 или по сигналу от компаратора. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Назначение битов === | === Назначение битов === | ||
Строка 118: | Строка 154: | ||
'''CS22:CS21:C20''' - Разряды, определяющие источник тактового сигнала таймера/счетчика Т1. | '''CS22:CS21:C20''' - Разряды, определяющие источник тактового сигнала таймера/счетчика Т1. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 173: | Строка 213: | ||
|1||1||1||1||Fast PWM||OCR1A | |1||1||1||1||Fast PWM||OCR1A | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 198: | Строка 242: | ||
Счет осуществляется по нарастающему фронту импульсов | Счет осуществляется по нарастающему фронту импульсов | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим Normal === | === Режим Normal === | ||
Строка 212: | Строка 260: | ||
при совпадении устанавливается флаг прерывания OCF1A=1:OCF1B=1 и если разряд OCIE1A=1:OCIE1B=1 регистра TIMSK генерируется прерывание. | при совпадении устанавливается флаг прерывания OCF1A=1:OCF1B=1 и если разряд OCIE1A=1:OCIE1B=1 регистра TIMSK генерируется прерывание. | ||
В тот же момент может быть изменено состояние вывода OC1A:OC1B в зависимости от установок битов COM1A1:COM1A0:COM1B1:COM1B0. | В тот же момент может быть изменено состояние вывода OC1A:OC1B в зависимости от установок битов COM1A1:COM1A0:COM1B1:COM1B0. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 240: | Строка 292: | ||
|1 ||1 ||"Вывод устанавливается "1" | |1 ||1 ||"Вывод устанавливается "1" | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим СТС (сброс при совпадении) === | === Режим СТС (сброс при совпадении) === | ||
Строка 247: | Строка 303: | ||
или ICR1 (смотрите таблицу выбора режима таймер/счетчика). | или ICR1 (смотрите таблицу выбора режима таймер/счетчика). | ||
При достижении TCNT1 значения OCR1A или ICR1, значение TCNT1 обнуляется в TCNT1=$0000 В этот же момент устанавливается флаг TOV1=1 COM1A1:COM1A0:COM1B1:COM1B0 Опрелеляют поведение вывода ОС1A:OC1B при совпадении. | При достижении TCNT1 значения OCR1A или ICR1, значение TCNT1 обнуляется в TCNT1=$0000 В этот же момент устанавливается флаг TOV1=1 COM1A1:COM1A0:COM1B1:COM1B0 Опрелеляют поведение вывода ОС1A:OC1B при совпадении. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 275: | Строка 335: | ||
|1 ||1 ||"Вывод устанавливается "1" | |1 ||1 ||"Вывод устанавливается "1" | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим Fast PWM (быстродействующий ШИМ) === | === Режим Fast PWM (быстродействующий ШИМ) === | ||
Строка 281: | Строка 345: | ||
Принцип и порядок работы не отличается от режима Normal, кроме наличия двойной буферизации регистра OCR1A:OCR1B, | Принцип и порядок работы не отличается от режима Normal, кроме наличия двойной буферизации регистра OCR1A:OCR1B, | ||
благодаря которому исключается появление несиметричных импульсов сигнала, а также отличается поведением выводов ОС1A:OC1B (смотрите таблицу). | благодаря которому исключается появление несиметричных импульсов сигнала, а также отличается поведением выводов ОС1A:OC1B (смотрите таблицу). | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 311: | Строка 379: | ||
сбрасывается "0" при обнулении TCNT1=$0000 | сбрасывается "0" при обнулении TCNT1=$0000 | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим Phase Correct PWM (ШИМ с точной фазой) === | === Режим Phase Correct PWM (ШИМ с точной фазой) === | ||
Строка 320: | Строка 392: | ||
При достижении счетным регистром TCNT1 минимального значения ($0000) также происходит изменение направления счета и в тот же момент устанавливается флаг прерывания TOV1 регистра TIFR. | При достижении счетным регистром TCNT1 минимального значения ($0000) также происходит изменение направления счета и в тот же момент устанавливается флаг прерывания TOV1 регистра TIFR. | ||
Так же при равенстве содержимого счетного регистра TCNT1 и регистра сравнения OCR1A:OCR1B ,устанавливается флаг OCF1A:OCF1B регистра TIFR и изменяется состояние вывода OC1A:OC1B,согласно таблице. | Так же при равенстве содержимого счетного регистра TCNT1 и регистра сравнения OCR1A:OCR1B ,устанавливается флаг OCF1A:OCF1B регистра TIFR и изменяется состояние вывода OC1A:OC1B,согласно таблице. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
Строка 351: | Строка 427: | ||
сбрасывается "0" при обратном, когда TCNT1=OCR1B | сбрасывается "0" при обратном, когда TCNT1=OCR1B | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
Во избежание несимметричных выбросов во время записи значения в регистр OCR1A:OCR1B, в этом режиме реализована двоиная буферизация записи. | Во избежание несимметричных выбросов во время записи значения в регистр OCR1A:OCR1B, в этом режиме реализована двоиная буферизация записи. | ||
Строка 356: | Строка 436: | ||
Поэтому в самом начале, при инициализации таймер/счетчика вывод ОС1A:OC1B не изменит свое состояние при совпадении до тех пор, | Поэтому в самом начале, при инициализации таймер/счетчика вывод ОС1A:OC1B не изменит свое состояние при совпадении до тех пор, | ||
пока регистр не достигнет значения (ТОР). | пока регистр не достигнет значения (ТОР). | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
== Пример реализации ШИМ (T1) на графическом асемблере AlgorithmBuilder (для Atmega8) == | == Пример реализации ШИМ (T1) на графическом асемблере AlgorithmBuilder (для Atmega8) == | ||
Строка 374: | Строка 458: | ||
5. Делаем пустой цикл по кругу. | 5. Делаем пустой цикл по кругу. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
== Пример реализации ШИМ (T1) на классическом асемблере AVRstudio (для Atmega8) == | == Пример реализации ШИМ (T1) на классическом асемблере AVRstudio (для Atmega8) == | ||
Строка 423: | Строка 511: | ||
</source> | </source> | ||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
После программирования контроллера на выводе ОС1A должны быть прямоугольные импульсы "1"=448 мксекунды "0"=32 мксекунд и для вывода ОС1B должны быть прямоугольные импульсы "1"=32 мксекунды "0"=448 мксекунд. | После программирования контроллера на выводе ОС1A должны быть прямоугольные импульсы "1"=448 мксекунды "0"=32 мксекунд и для вывода ОС1B должны быть прямоугольные импульсы "1"=32 мксекунды "0"=448 мксекунд. | ||
На рисунке расмотрено поведение вывода ОС1A при присвоении значения $E0(240) регистру OCR1A и поведение вывода ОС1B при присвоении значения $10(240) регистру OCR1B | На рисунке расмотрено поведение вывода ОС1A при присвоении значения $E0(240) регистру OCR1A и поведение вывода ОС1B при присвоении значения $10(240) регистру OCR1B | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
[[Изображение:avr_pwm_t_1.png]] | [[Изображение:avr_pwm_t_1.png]] | ||
Строка 437: | Строка 531: | ||
OCIE2=1 Разрешение прерывания по совпадению регистров TCNT2 и OCR2<br /> | OCIE2=1 Разрешение прерывания по совпадению регистров TCNT2 и OCR2<br /> | ||
TOIE2=1 Разрешение прерывания по переполнению Т2. | TOIE2=1 Разрешение прерывания по переполнению Т2. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 456: | Строка 554: | ||
'''ASSR''' - Регистр выбора источника тактового сигнала. Для Т2 в этом регистре используется разряд AS2 | '''ASSR''' - Регистр выбора источника тактового сигнала. Для Т2 в этом регистре используется разряд AS2 | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Назначение битов === | === Назначение битов === | ||
Строка 497: | Строка 599: | ||
'''clk''' - системный тактовый импульс | '''clk''' - системный тактовый импульс | ||
'''clkt''' - тактовый импульс от внешнего кварца (выводы TOSC) | '''clkt''' - тактовый импульс от внешнего кварца (выводы TOSC) | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим Normal === | === Режим Normal === | ||
Строка 505: | Строка 611: | ||
Кроме того по каждому такту происходит сравнение счетного регистра TCNT2 и и регистра сравнения OCR2, при совпадении устанавливается флаг прерывания OCF2=1 и если разряд OCIE2=1 регистра TIMSK генерируется прерывание. В тот же момент может быть изменено состояние вывода OC2 в зависимости от установок битов COM21 и COM20 | Кроме того по каждому такту происходит сравнение счетного регистра TCNT2 и и регистра сравнения OCR2, при совпадении устанавливается флаг прерывания OCF2=1 и если разряд OCIE2=1 регистра TIMSK генерируется прерывание. В тот же момент может быть изменено состояние вывода OC2 в зависимости от установок битов COM21 и COM20 | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 518: | Строка 628: | ||
|1 ||1 ||"Вывод устанавливается "1" | |1 ||1 ||"Вывод устанавливается "1" | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим СТС (сброс при совпадении) === | === Режим СТС (сброс при совпадении) === | ||
В этом режиме Т2 работает по такому же принципу как и в режиме Normal Отличие заключается в том, что максимально возможное значение счетного регистра TCNT2 ограничивается значением регистра сравнения OCR2. При достижении TCNT2 значения OCR2, значение TCNT2 обнуляется в TCNT2=$00 В этот же момент устанавливается флаг TOV2=1 в регистре TIFR, и может быть сгенерировано прерывание если установлен флаг TOIE2=1 в регистре TIMSK COM21:COM20 Опрелеляют поведение вывода ОС2 при совпадении | В этом режиме Т2 работает по такому же принципу как и в режиме Normal Отличие заключается в том, что максимально возможное значение счетного регистра TCNT2 ограничивается значением регистра сравнения OCR2. При достижении TCNT2 значения OCR2, значение TCNT2 обнуляется в TCNT2=$00 В этот же момент устанавливается флаг TOV2=1 в регистре TIFR, и может быть сгенерировано прерывание если установлен флаг TOIE2=1 в регистре TIMSK COM21:COM20 Опрелеляют поведение вывода ОС2 при совпадении | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 535: | Строка 653: | ||
|1 ||1 ||"Вывод устанавливается "1" | |1 ||1 ||"Вывод устанавливается "1" | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим Fast PWM (быстродействующий ШИМ) === | === Режим Fast PWM (быстродействующий ШИМ) === | ||
С помощью этого режима можно генерировать высокочастотный сигал ШИМ. Принцип и порядок работы не отличается от режима Normal, кроме наличия двойной буферизации регистра OCR2, благодаря которому исключается появление несиметричных импульсов сигнала, а также отличается поведением вывода ОС2 (смотрите таблицу). | С помощью этого режима можно генерировать высокочастотный сигал ШИМ. Принцип и порядок работы не отличается от режима Normal, кроме наличия двойной буферизации регистра OCR2, благодаря которому исключается появление несиметричных импульсов сигнала, а также отличается поведением вывода ОС2 (смотрите таблицу). | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 554: | Строка 680: | ||
сбрасывается "0" при обнулении TCNT2=$00 | сбрасывается "0" при обнулении TCNT2=$00 | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
=== Режим Phase Correct PWM (ШИМ с точной фазой) === | === Режим Phase Correct PWM (ШИМ с точной фазой) === | ||
Строка 559: | Строка 689: | ||
Отличие этого режима от предыдущих заключается в том,что счетный регистр работает как реверсивный счетчик. | Отличие этого режима от предыдущих заключается в том,что счетный регистр работает как реверсивный счетчик. | ||
Так как этот режим рекомендуется Атмел как наиболее подходящий для регулировки двигателей, мы его рассмотрим наиболее подробно. При достижении счетным регистром TCNT2 масимального значения ($FF) происходит изменение направления счета. При достижении счетным регистром TCNT2 минимального значения ($00) также происходит изменение направления счета и в тот же момент устанавливается флаг прерывания TOV2 регистра TIFR. Так же при равенстве содержимого счетного регистра TCNT2 и регистра сравнения OCR2, устанавливается флаг OCF2 регистра TIFR и изменяется состояние вывода OC2, согласно таблице. | Так как этот режим рекомендуется Атмел как наиболее подходящий для регулировки двигателей, мы его рассмотрим наиболее подробно. При достижении счетным регистром TCNT2 масимального значения ($FF) происходит изменение направления счета. При достижении счетным регистром TCNT2 минимального значения ($00) также происходит изменение направления счета и в тот же момент устанавливается флаг прерывания TOV2 регистра TIFR. Так же при равенстве содержимого счетного регистра TCNT2 и регистра сравнения OCR2, устанавливается флаг OCF2 регистра TIFR и изменяется состояние вывода OC2, согласно таблице. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 574: | Строка 708: | ||
сбрасывается "0" при обратном,когда TCNT2=OCR2 | сбрасывается "0" при обратном,когда TCNT2=OCR2 | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
Во избежание несимметричных выбросов во время записи значения в регистр OCR2, в этом режиме реализована двоиная буферизация записи. Благодаря этому действительное изменение значения регистра изменяется в момент достижения счетным регистром TCNT2 значения $FF. Поэтому в самом начале, при инициализации таймер/счетчика вывод ОС2 не изменит свое состояние при совпадении до тех пор, пока регистр не достигнет значения $FF. | Во избежание несимметричных выбросов во время записи значения в регистр OCR2, в этом режиме реализована двоиная буферизация записи. Благодаря этому действительное изменение значения регистра изменяется в момент достижения счетным регистром TCNT2 значения $FF. Поэтому в самом начале, при инициализации таймер/счетчика вывод ОС2 не изменит свое состояние при совпадении до тех пор, пока регистр не достигнет значения $FF. | ||
Если в регистр OCR2 записать значения $00 или $FF, то при совпадении вывод OC2 в устойчивое состояние согласно таблице | Если в регистр OCR2 записать значения $00 или $FF, то при совпадении вывод OC2 в устойчивое состояние согласно таблице | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
{| class="standard" | {| class="standard" | ||
Строка 591: | Строка 733: | ||
|1 ||1 ||$FF ||0 | |1 ||1 ||$FF ||0 | ||
|} | |} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
== Пример реализации ШИМ (T2) на графическом асемблере AlgorithmBuilder (для Atmega8) == | == Пример реализации ШИМ (T2) на графическом асемблере AlgorithmBuilder (для Atmega8) == | ||
Строка 609: | Строка 755: | ||
5. Делаем пустой цикл по кругу. | 5. Делаем пустой цикл по кругу. | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
== Пример реализации ШИМ на классическом асемблере AVRstudio (для Atmega8) == | == Пример реализации ШИМ на классическом асемблере AVRstudio (для Atmega8) == | ||
Строка 652: | Строка 802: | ||
На рисунке расмотрено поведение вывода ОС2 при присвоении значения $10(16) регистру OCR2 | На рисунке расмотрено поведение вывода ОС2 при присвоении значения $10(16) регистру OCR2 | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] | ||
+ | |||
[[Изображение:avr_pwm_t_2.png]] | [[Изображение:avr_pwm_t_2.png]] | ||
Строка 661: | Строка 815: | ||
|ext_profile=http://electronix.ru/forum/index.php?showuser=9984|ext_name=электрониксе | |ext_profile=http://electronix.ru/forum/index.php?showuser=9984|ext_name=электрониксе | ||
}} | }} | ||
+ | |||
+ | |||
+ | '''Source(s):''' [http://www.downloadranking.com AVR:ШИМ] |
Текущая версия на 10:06, 26 марта 2013
Source(s): AVR:ШИМ
Содержание
- 1 Введение
- 2 Описание флагов прерываний
- 3 Описание работы тайтер/счетчика Т1 в контроллере ATmega8/16
- 4 Пример реализации ШИМ (T1) на графическом асемблере AlgorithmBuilder (для Atmega8)
- 5 Пример реализации ШИМ (T1) на классическом асемблере AVRstudio (для Atmega8)
- 6 Описание работы тайтер/счетчика Т2 в контроллере ATmega8/16
- 7 Пример реализации ШИМ (T2) на графическом асемблере AlgorithmBuilder (для Atmega8)
- 8 Пример реализации ШИМ на классическом асемблере AVRstudio (для Atmega8)
Введение
В данной статье детально рассматривается назначение регистров и битов таймеров/счетчиков Т1 и Т2 и реализация аппаратного ШИМ для контроллеров ATmega8 и ATmega16.
Аппаратная реализация ШИМ дает безусловные преимущества перед программной,так как разгружает процессор как лишним и громоздким кодом, так и временем на его обслуживание, а также дает больше возможностей использования работы с ШИМ. Достаточно провести инициализацию таймер/счетчика (занести необходимые значения в регистры используемые таймер/счетчиком) как таймер/счетчик может работать независимо от процессора, соответственно процессор может заниматься другими задачами,только иногда обращаясь в необходимый момент для корректировки или изменения режима или получения результатов от таймер/счетчика.
Также в статье приводятся в качестве примера простые исходники по реализации аппаратного ШИМ.
Source(s): AVR:ШИМ
Описание флагов прерываний
T1 может генерировать прерывание при наступлении:
- переполнения счетного регистра TCNT1;
- при равенстве счетного регистра TCNT1 и регистра сравнения OCR1A и OCR1B (по отдельности для каждого регистра);
- при сохранении счетного регистра в регистре захвата ICR1.
T2 может генерировать прерывание при наступлении:
- переполнения счетного регистра TCNT2;
- при равенстве счетного регистра TCNT2 и регистра сравнения OCR2.
Флаги всех прерываний находится в регистре TIFR,а разрешение/запрещение прерываний в регистре TIMSK.
Source(s): AVR:ШИМ
Регистр | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
TIMSK | OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | OCIE0* | TOIE0 |
Source(s): AVR:ШИМ
- 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"
Source(s): AVR:ШИМ
Регистр | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
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
Source(s): AVR:ШИМ
Описание работы тайтер/счетчика Т1 в контроллере ATmega8/16
Шеснадцатиразрядный таймер/счетчик Т1 может использоватся для формирования временных интервалов, подсчета количества внешних сигналов, и для генерации сигналов с ШИМ разной скважности и длительности на выводах OC1A и OC1B. Кроме того по внешнему сигналу с вывода ICP1 или от аналогового компаратора, Т1 может сохранять свое текущее состояние в отдельном регистре захвата ICR1.
Source(s): AVR:ШИМ
Регистр | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
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 |
Source(s): AVR:ШИМ
Каждый 16-разрядный регистр физически размещается в двух 8-разрядных регистрах поэтому при чтении записи в них нужно выполнить две операции.
При записи первым загружается старший байт потом младший,при чтении наоборот сначала младший прочитывается потом старший.
TCCR1A:TCCR1B - 8-разрядные регистры управления таймером/счетчиком Т1
TCNT1 - 16-разрядный счетный регистр таймера/счетчика Т1. Взависимости от режима работы содержимое этого регистра обнуляется,инкрементируется(увеличивается значение на 1) или декрементируется(уменьшается значение на 1) по каждому импульсу тактового сигнала таймера/счетчика.
OCR1A:OCR1B - 16-разрядные регистры сравнения
ICR1 - 16-разрядный регистр захвата,сохраняет значение TCNT1 при подаче активного фронта сигнала на вывод ICP1 или по сигналу от компаратора.
Source(s): AVR:ШИМ
Назначение битов
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.
Source(s): AVR:ШИМ
WGM23 | WGM22 | WGM21 | WGM20 | Режим работы | Модуль счета (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 |
Source(s): AVR:ШИМ
CS12 | CS11 | CS10 | Источник тактового сигнала |
---|---|---|---|
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 контроллера
Счет осуществляется по нарастающему фронту импульсов |
Source(s): AVR:ШИМ
Режим 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.
Source(s): AVR:ШИМ
COM1A1 | COM1A0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1A |
0 | 1 | Состояние вывода меняется на противоположное
(только в режимах Normal и CTC) |
1 | 0 | "Вывод сбрасывается "0" |
1 | 1 | "Вывод устанавливается "1" |
COM1B1 | COM1B0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1B |
0 | 1 | Состояние вывода меняется на противоположное
(только в режимах Normal и CTC) |
1 | 0 | "Вывод сбрасывается "0" |
1 | 1 | "Вывод устанавливается "1" |
Source(s): AVR:ШИМ
Режим СТС (сброс при совпадении)
В этом режиме Т1 работает по такому же принципу как и в режиме Normal. Отличие заключается в том, что максимально возможное значение счетного регистра TCNT1 ограничивается значением регистра сравнения OCR1A или ICR1 (смотрите таблицу выбора режима таймер/счетчика). При достижении TCNT1 значения OCR1A или ICR1, значение TCNT1 обнуляется в TCNT1=$0000 В этот же момент устанавливается флаг TOV1=1 COM1A1:COM1A0:COM1B1:COM1B0 Опрелеляют поведение вывода ОС1A:OC1B при совпадении.
Source(s): AVR:ШИМ
COM1A1 | COM1A0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1A |
0 | 1 | Состояние вывода меняется на противоположное
(только в режимах Normal и CTC) |
1 | 0 | "Вывод сбрасывается "0" |
1 | 1 | "Вывод устанавливается "1" |
COM1B1 | COM1B0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1B |
0 | 1 | Состояние вывода меняется на противоположное
(только в режимах Normal и CTC) |
1 | 0 | "Вывод сбрасывается "0" |
1 | 1 | "Вывод устанавливается "1" |
Source(s): AVR:ШИМ
Режим Fast PWM (быстродействующий ШИМ)
С помощью этого режима можно генерировать высокочастотный сигал ШИМ. Принцип и порядок работы не отличается от режима Normal, кроме наличия двойной буферизации регистра OCR1A:OCR1B, благодаря которому исключается появление несиметричных импульсов сигнала, а также отличается поведением выводов ОС1A:OC1B (смотрите таблицу).
Source(s): AVR:ШИМ
COM1A1 | COM1A0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1A |
0 | 1 | Зарезервировано |
1 | 0 | Сбрасывается в "0" при прямом счете ,когда TCNT1=OCR1A,
устанавливается "1" при обнулении TCNT1=$0000 |
1 | 1 | Устанавливается в "1" при прямом счете ,когда TCNT1=OCR1A,
сбрасывается "0" при обнулении TCNT1=$0000 |
COM1B1 | COM1B0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1B |
0 | 1 | Зарезервировано |
1 | 0 | Сбрасывается в "0" при прямом счете ,когда TCNT1=OCR1B,
устанавливается "1" при обнулении TCNT1=$0000 |
1 | 1 | Устанавливается в "1" при прямом счете ,когда TCNT1=OCR1B,
сбрасывается "0" при обнулении TCNT1=$0000 |
Source(s): AVR:ШИМ
Режим Phase Correct PWM (ШИМ с точной фазой)
Отличие этого режима от предыдущих заключается в том, что счетный регистр работает как реверсивный счетчик. Так как этот режим рекомендуется Атмел как наиболее подходящий для регулировки двигателей, мы его рассмотрим наиболее подробно. При достижении счетным регистром TCNT1 значения модуля счета (ТОР) (или значения регистра ICR1 или значения регистра OCR1A, смотрите таблицу выбора режима таймер/счетчика), происходит изменение направления счета. При достижении счетным регистром TCNT1 минимального значения ($0000) также происходит изменение направления счета и в тот же момент устанавливается флаг прерывания TOV1 регистра TIFR. Так же при равенстве содержимого счетного регистра TCNT1 и регистра сравнения OCR1A:OCR1B ,устанавливается флаг OCF1A:OCF1B регистра TIFR и изменяется состояние вывода OC1A:OC1B,согласно таблице.
Source(s): AVR:ШИМ
COM1A1 | COM1A0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1A |
0 | 1 | Зарезервировано |
1 | 0 | Сбрасывается в "0" при прямом счете, когда TCNT1=OCR1A
устанавливается "1" при обратном,когда TCNT1=OCR1A |
1 | 1 | Устанавливается в "1" при прямом счете, когда TCNT1=OCR1A,
сбрасывается "0" при обратном,когда TCNT1=OCR1A |
COM1B1 | COM1B0 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС1B |
0 | 1 | Зарезервировано |
1 | 0 | Сбрасывается в "0" при прямом счете, когда TCNT1=OCR1B
устанавливается "1" при обратном, когда TCNT1=OCR1AB |
1 | 1 | Устанавливается в "1" при прямом счете, когда TCNT1=OCR1B,
сбрасывается "0" при обратном, когда TCNT1=OCR1B |
Source(s): AVR:ШИМ
Во избежание несимметричных выбросов во время записи значения в регистр OCR1A:OCR1B, в этом режиме реализована двоиная буферизация записи.
Благодаря этому действительное изменение значения регистра изменяется в момент достижения счетным регистром TCNT1 значения модуля счета (ТОР) (или значения регистра ICR1 или значения регистра OCR1A смотрите таблицу выбора режима таймер/счетчика).
Поэтому в самом начале, при инициализации таймер/счетчика вывод ОС1A:OC1B не изменит свое состояние при совпадении до тех пор,
пока регистр не достигнет значения (ТОР).
Source(s): AVR:ШИМ
Пример реализации ШИМ (T1) на графическом асемблере AlgorithmBuilder (для Atmega8)
1. Создаем новый проект в среде AlgorithmBuilder
2. Входим в настройки и инициализируем стек(выбираем закладку SP и нажимаем кнопку ОК)
3. Присваеваем значение $E0 регистру OCR1A и значение $10 регистру OCR1B (операции как макрокоманды ,нажать кнопку F2)
4. Входим в настройки и выбираем закладку Timer1, и делаем настройку таймер/счетчика как на рисунках(выбираем тактовую частоту Т2 равную частоте процессора СК, режим Phase correct PWM (8 bit, равно периоду ШИМ 256Х2 в тактах Т1) и сброс вывода ОС2 в "0" при прямом счете и установку в "1" при обратном, а также подключаем порты к таймер/счетчику 1->DDRB.1 и 1->DDRB.2).
5. Делаем пустой цикл по кругу.
Source(s): AVR:ШИМ
Пример реализации ШИМ (T1) на классическом асемблере AVRstudio (для Atmega8)
<source lang="asm">
- PWM
- bodja
- telepribor.narod.ru
- bodja74@mail.ru
.include "m8def.inc"
- Variable Declarations
.def tempH = r16 ; присваиваем регистру R16 имя tempH .def tempL = r17 ; присваиваем регистру R17 имя tempL
.dseg ; сегмент ОЗУ
.eseg ; сегмент ЕЕПРОМ
.cseg ; сегмент программы
.org 0
PROG: ldi r16,$04 ; Инициализируем стек
out SPH,r16 ldi r16,$5F out SPL,r16
ldi tempH,$00 ; Заносим значение $00E0 в регистр OCR1A out OCR1AH,tempH ldi tempL,$E0 ; out OCR1AL,tempL
ldi tempH,$00 ; Заносим значение $0010 в регистр OCR1A out OCR1BH,tempH ldi tempL,$10 ; out OCR1BL,tempL
ldi tempL,$A1 ; инициализация таймер/счетчика Т1 out TCCR1A,tempL ldi tempL,$01 out TCCR1B,tempL
sbi DDRB,1 ; подключаем вывод PB1 к таймер/счетчику Т1 sbi DDRB,2 ; подключаем вывод PB2 к таймер/счетчику Т1
end: rjmp end ; пустой цикл </source>
Source(s): AVR:ШИМ
После программирования контроллера на выводе ОС1A должны быть прямоугольные импульсы "1"=448 мксекунды "0"=32 мксекунд и для вывода ОС1B должны быть прямоугольные импульсы "1"=32 мксекунды "0"=448 мксекунд.
На рисунке расмотрено поведение вывода ОС1A при присвоении значения $E0(240) регистру OCR1A и поведение вывода ОС1B при присвоении значения $10(240) регистру OCR1B
Source(s): AVR:ШИМ
Описание работы тайтер/счетчика Т2 в контроллере ATmega8/16
Т2 может использоваться для отсчета временных интервалов, как счетчик внешних событий и для генерации сигналов широтно - импульсной модуляции(ШИМ) фиксированной разрядности с выводом сигнала на вывод ОС2 контроллера. Кроме того есть возможность работы в асинхронном режиме используя внешний кварц на выводах TOSC.
Т2 может генерировать прерывание,для этого используется два бита регистра TIMSK,OCIE2 и TOIE2.
OCIE2=1 Разрешение прерывания по совпадению регистров TCNT2 и OCR2
TOIE2=1 Разрешение прерывания по переполнению Т2.
Source(s): AVR:ШИМ
Регистр | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
TCCR2 | FOC2 | WGM20 | COM21 | COM20 | WGM21 | CS22 | CS21 | CS20 |
TCNT2 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
OCR2 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
TCCR2 - Регистр управления таймером счетчиком
TCNT2 - Счетный регистр.В зависимости от режима работы инкрементируется, декрементируется или сбрасывается по каждому импульсу от источника тактового сигнала для Т2.
OCR2 - Регистр сравнения.При работе Т2 производится постоянное сравнение регистра OCR2 и TCNT2 в каждом машинном цикле. При равенстве этих регистров устанавливается флаг OCF2 в регистре TIFR и генерируется прерывание если предварительно оно было разрешено. Также при совпадении может изменятся состояние вывода OC2 в зависимости от значении битов COM21 и COM20 регистра TCCR2. Вывод ОС2 должен быть сконфигурирован на выход DDRB.3=1
ASSR - Регистр выбора источника тактового сигнала. Для Т2 в этом регистре используется разряд AS2
Source(s): AVR:ШИМ
Назначение битов
FOC2 Принудительное изменение состояния вывода OC2 (только в режимах Normal и CTC)
WGM21 | WGM20 | Режим работы |
---|---|---|
0 | 0 | Normal |
0 | 1 | Phase correct PWM (ШИМ с точной фазой) |
1 | 0 | CTC (сброс при совпадении регистров OCR2 и TCNT2) |
1 | 1 | Fast PWM (быстродействующий ШИМ) |
CS22 | CS21 | CS20 | AS2=0 | AS2=1 |
---|---|---|---|---|
0 | 0 | 0 | стоп | стоп |
0 | 0 | 1 | clk | clkt |
0 | 1 | 0 | clk/8 | clkt/8 |
0 | 1 | 1 | clk/32 | clkt/32 |
1 | 0 | 0 | clk/64 | clkt/64 |
1 | 0 | 1 | clk/128 | clkt/128 |
1 | 1 | 0 | clk/256 | clkt/256 |
1 | 1 | 1 | clk/1024 | clkt/1024 |
clk - системный тактовый импульс clkt - тактовый импульс от внешнего кварца (выводы TOSC)
Source(s): AVR:ШИМ
Режим Normal
Самый простой режим работы Т2. По каждому импульсу тактового сигнала происходит инкремент счетного регистра TCNT2 (увеличение значения на 1). При переходе через значение $FF возникает переполнение и вследующем такте начинается счет со значения $00, в этот же момент устанавливается флаг TOV2=1 в регистре TIFR, и может быть сгенерировано прерывание если установлен флаг TOIE2=1 в регистре TIMSK
Кроме того по каждому такту происходит сравнение счетного регистра TCNT2 и и регистра сравнения OCR2, при совпадении устанавливается флаг прерывания OCF2=1 и если разряд OCIE2=1 регистра TIMSK генерируется прерывание. В тот же момент может быть изменено состояние вывода OC2 в зависимости от установок битов COM21 и COM20
Source(s): AVR:ШИМ
COM21 | COM20 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС2 |
0 | 1 | Состояние вывода меняется на противоположное(только в режимах Normal и CTC) |
1 | 0 | "Вывод сбрасывается "0" |
1 | 1 | "Вывод устанавливается "1" |
Source(s): AVR:ШИМ
Режим СТС (сброс при совпадении)
В этом режиме Т2 работает по такому же принципу как и в режиме Normal Отличие заключается в том, что максимально возможное значение счетного регистра TCNT2 ограничивается значением регистра сравнения OCR2. При достижении TCNT2 значения OCR2, значение TCNT2 обнуляется в TCNT2=$00 В этот же момент устанавливается флаг TOV2=1 в регистре TIFR, и может быть сгенерировано прерывание если установлен флаг TOIE2=1 в регистре TIMSK COM21:COM20 Опрелеляют поведение вывода ОС2 при совпадении
Source(s): AVR:ШИМ
COM21 | COM20 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС2 |
0 | 1 | Состояние вывода меняется на противоположное(только в режимах Normal и CTC) |
1 | 0 | "Вывод сбрасывается "0" |
1 | 1 | "Вывод устанавливается "1" |
Source(s): AVR:ШИМ
Режим Fast PWM (быстродействующий ШИМ)
С помощью этого режима можно генерировать высокочастотный сигал ШИМ. Принцип и порядок работы не отличается от режима Normal, кроме наличия двойной буферизации регистра OCR2, благодаря которому исключается появление несиметричных импульсов сигнала, а также отличается поведением вывода ОС2 (смотрите таблицу).
Source(s): AVR:ШИМ
COM21 | COM20 | Поведение вывода ОС2 |
---|---|---|
0 | 0 | Таймер/счетчик Т2 отключен от вывода ОС2 |
0 | 1 | Зарезервировано |
1 | 0 | Сбрасывается в "0" при прямом счете ,когда TCNT2=OCR2,
устанавливается "1" при обнулении TCNT2=$00 |
1 | 1 | Устанавливается в "1" при прямом счете ,когда TCNT2=OCR2,
сбрасывается "0" при обнулении TCNT2=$00 |
Source(s): AVR:ШИМ
Режим Phase Correct PWM (ШИМ с точной фазой)
Отличие этого режима от предыдущих заключается в том,что счетный регистр работает как реверсивный счетчик. Так как этот режим рекомендуется Атмел как наиболее подходящий для регулировки двигателей, мы его рассмотрим наиболее подробно. При достижении счетным регистром TCNT2 масимального значения ($FF) происходит изменение направления счета. При достижении счетным регистром TCNT2 минимального значения ($00) также происходит изменение направления счета и в тот же момент устанавливается флаг прерывания TOV2 регистра TIFR. Так же при равенстве содержимого счетного регистра TCNT2 и регистра сравнения OCR2, устанавливается флаг OCF2 регистра TIFR и изменяется состояние вывода OC2, согласно таблице.
Source(s): AVR:ШИМ
COM21 | COM20 | Поведение вывода ОС2 |
---|---|---|
0 | 0 | Таймер/счетчик Т2 отключен от вывода ОС2 |
0 | 1 | Зарезервировано |
1 | 0 | Сбрасывается в "0" при прямом счете,когда TCNT2=OCR2,
устанавливается "0" при обратном,когда TCNT2=OCR2 |
1 | 1 | Устанавливается в "1" при прямом счете,когда TCNT2=OCR2,
сбрасывается "0" при обратном,когда TCNT2=OCR2 |
Source(s): AVR:ШИМ
Во избежание несимметричных выбросов во время записи значения в регистр OCR2, в этом режиме реализована двоиная буферизация записи. Благодаря этому действительное изменение значения регистра изменяется в момент достижения счетным регистром TCNT2 значения $FF. Поэтому в самом начале, при инициализации таймер/счетчика вывод ОС2 не изменит свое состояние при совпадении до тех пор, пока регистр не достигнет значения $FF.
Если в регистр OCR2 записать значения $00 или $FF, то при совпадении вывод OC2 в устойчивое состояние согласно таблице
Source(s): AVR:ШИМ
COM21 | COM20 | OCR2 | Состояние вывода ОС2 |
---|---|---|---|
1 | 0 | $00 | 0 |
1 | 0 | $FF | 1 |
1 | 1 | $00 | 1 |
1 | 1 | $FF | 0 |
Source(s): AVR:ШИМ
Пример реализации ШИМ (T2) на графическом асемблере AlgorithmBuilder (для Atmega8)
1. Создаем новый проект в среде AlgorithmBuilder
2. Входим в настройки и инициализируем стек(выбираем закладку SP и нажимаем кнопку ОК)
3.Присваеваем значение $10 регистру OCR2 (операция как макрокоманда, нажать кнопку F2)
4. Входим в настройки и выбираем закладку Timer2 и делаем настройку таймер/счетчика как на рисунках(выбираем тактовую частоту Т2 равную частоте процессора СК, режим Phase correct PWM (8 bit, равно периоду ШИМ 256 тактов Т2) и сброс вывода ОС2 в "0" при прямом счете и установку в "1" при обратном, а также подключаем порт к таймер/счетчику 1->DDRB.3 ).
5. Делаем пустой цикл по кругу.
Source(s): AVR:ШИМ
Пример реализации ШИМ на классическом асемблере AVRstudio (для Atmega8)
<source lang="asm">
- PWM
- bodja
- telepribor.narod.ru
- bodja74@mail.ru
.include "m8def.inc"
- Variable Declarations
.def tempH = r16 ; присваиваем регистру R16 имя tempH .def tempL = r17 ; присваиваем регистру R17 имя tempL
.dseg ; сегмент ОЗУ
.eseg ; сегмент ЕЕПРОМ
.cseg ; сегмент программы
.org 0
PROG: ldi r16,$04 ; Инициализируем стек
out SPH,r16 ldi r16,$5F out SPL,r16
ldi tempL,$10 ;Заносим значение $10 в регистр OCR2 out OCR2,tempL
ldi tempL,$61 ; инициализация таймер/счетчика Т2 out TCCR2,tempL
sbi DDRB,3 ; подключаем вывод PB3 к таймер/счетчику Т2
end: rjmp end ; пустой цикл </source>
После программирования контроллера на выводе ОС2 должны быть прямоугольные импульсы "1"=32 мксекунды "0"=448 мксекунд
На рисунке расмотрено поведение вывода ОС2 при присвоении значения $10(16) регистру OCR2
Source(s): AVR:ШИМ
Автор: bodja
E-Mail: bodja74@mail.ru
WWW: http://telepribor.narod.ru/
Профиль на электрониксе: bodja74
Source(s): AVR:ШИМ