Избор на Avr режим и изчисляване на честотата на ШИМ. Широчинно-импулсна модулация (PWM)

Един от подходите, използван за значително намаляване на топлинните загуби на силови компоненти на радиовериги, е използването на превключващи режими на работа на инсталациите. При такива системи електрическият захранващ компонент е или отворен - в този момент има почти нулев спад на напрежението върху него, или отворен - в този момент към него се подава нулев ток. Разсейването на мощността може да се изчисли чрез умножаване на тока и напрежението. В този режим е възможно да се постигне коеф полезно действиеоколо 75-80% или повече.

Какво е ШИМ?

За да получите сигнал с необходимата форма на изхода, превключвателят на захранването трябва да бъде отворен само определено време, пропорционално на изчисленото изходно напрежение. Това е принципът широчинно импулсна модулация(ШИМ, ШИМ). След това сигнал с тази форма, състоящ се от импулси с различна ширина, влиза във филтърната зона, базирана на индуктор и кондензатор. След преобразуването изходът ще бъде почти идеален сигнал с необходимата форма.

Обхватът на ШИМ не е ограничен стабилизатори на импулсаи преобразуватели на напрежение. Използване този принциппри проектиране мощен усилвател аудио честотадава възможност за значително намаляване на консумацията на енергия на устройството, води до миниатюризация на веригата и оптимизира системата за пренос на топлина. Недостатъците включват посредственото качество на изходния сигнал.

Формиране на ШИМ сигнали

Създаване на PWM сигнали желаната формадостатъчно трудно. Въпреки това индустрията днес може да зарадва с прекрасни специални чипове, известни като PWM контролери. Те са евтини и напълно решават проблема с генерирането на сигнал с ширина на импулса. Запознаването с техния типичен дизайн ще ви помогне да се ориентирате в структурата на такива контролери и тяхното използване.

Стандартната верига на PWM контролера приема следните изходи:

  • Общ изход (GND). Изпълнява се под формата на крак, който е свързан към общия проводник на захранващата верига на устройството.
  • Захранващ щифт (VC). Отговаря за захранването на веригата. Важно е да не го бъркате със съседа си с подобно име - VCC щифт.
  • Щифт за управление на мощността (VCC). Като правило чипът на PWM контролера поема управлението на силовите транзистори (биполярни или полеви). Ако изходното напрежение намалее, транзисторите ще се отворят само частично, а не напълно. Бързо нагряване, те скоро ще се провалят, не могат да се справят с товара. За да се изключи тази възможност, е необходимо да се следи захранващото напрежение на входа на микросхемата и да не се допуска превишаване на проектната марка. Ако напрежението на този щифт падне под напрежението, зададено специално за този контролер, контролно устройствосе изключва. Обикновено този щифт е свързан директно към щифта VC.

Изходно управляващо напрежение (OUT)

Броят на щифтовете на микросхемата се определя от нейния дизайн и принцип на работа. Не винаги е възможно веднага да разберете сложните термини, но нека се опитаме да подчертаем същността. Има микросхеми на 2 щифта, които управляват каскади с натискане и издърпване (двойно рамо) (примери: мост, полумост, 2-тактов обратен преобразувател). Има и аналози на PWM контролери за управление на каскади с един край (едно рамо) (примери: напред/назад, усилване/понижаване, обръщане).

В допълнение, изходният етап може да бъде едно- или двуциклен по структура. Push-pull се използва главно за задвижване на зависим от напрежението FET. За бързо затваряне трябва да постигнете бързо разреждане"gate-source" и "gate-drain" капацитети. За тази цел се използва двутактното изходно стъпало на контролера, чиято задача е да осигури късо свързване на изхода към общ кабел, ако е необходимо затваряне на полевия транзистор.

ШИМ контролери за захранвания голяма мощможе също така да има изходни клавишни контроли (драйвери). Препоръчва се използването на IGBT транзистори като изходни ключове.

Основните проблеми на PWM преобразувателите

При работа на всяко устройство е невъзможно напълно да се елиминира възможността за повреда и това важи и за преобразувателите. Сложността на дизайна няма значение; дори добре познатият контролер TL494 PWM може да причини оперативни проблеми. Повредите имат различно естество - някои от тях се откриват на око, докато за откриване на други е необходима специална измервателна апаратура.

За да използвате PWM контролер, трябва да се запознаете със списъка на основните неизправности на устройството и едва по-късно - с опциите за тяхното отстраняване.

Отстраняване на неизправности

Един от най-честите проблеми е повредата на ключови транзистори. Резултатите могат да се видят не само когато се опитате да стартирате устройството, но и когато го изследвате с мултиметър.

Освен това има и други неизправности, които са малко по-трудни за откриване. Преди да проверите директно PWM контролера, можете да разгледате най-честите случаи на повреда. например:

  • Контролерът спира след стартиране - прекъсване на цикъла на ОС, спад на тока, проблеми с кондензатора на изхода на филтъра (ако има такъв) или драйвера; Може би управлението на PWM контролера се е объркало. Необходимо е да се провери устройството за чипове и деформации, да се измерят индикаторите за натоварване и да се сравнят със стандартните.
  • PWM контролерът не стартира - едно от входните напрежения липсва или устройството е повредено. Проверката и измерването на изходното напрежение може да помогне или, в краен случай, замяната му с известен работещ аналог.
  • Изходното напрежение се различава от номиналното - има проблем с OOS контура или с контролера.
  • След стартиране, PWM на захранването преминава в защита при липса на късо съединение на ключовете - неправилна работа PWM или драйвери.
  • Нестабилна работа на платката, наличност странни звуци- прекъсване на OOS контура или RC веригата, влошаване на капацитета на филтъра.

Накрая

Универсалните и многофункционални PWM контролери вече могат да бъдат намерени почти навсякъде. Те служат не само като неразделна част от захранванията на повечето модерни устройства - типични компютрии други ежедневни устройства. На базата на контролери се разработват нови технологии, които могат значително да намалят потреблението на ресурси в много индустрии. човешка дейност. Собствениците на частни къщи ще се възползват от контролери за зареждане на батерии от фотоволтаични батерии, базирани на принципа на модулация на ширината на импулса на зарядния ток.

Високата ефективност прави разработването на нови устройства, базирани на принципа на ШИМ, много обещаващо. Вторичните източници на енергия не са единствената област на дейност.

Отличителни черти:

Въведение

Тези "Препоръки..." са насоки за използване на високочестотен модулатор на ширината на импулса (PWM), който се намира в някои AVR микроконтролери. Ръководството включва примерен асемблиращ код, който демонстрира как да използвате високочестотния PWM микроконтролер ATtiny26. Високочестотен PWM таймер също е наличен в ATtiny15.

За генериране на импулси се използва бърз ШИМ режим с променливо запълване на импулса на изхода на OC1A (PB1). За да се получи синусоида от цифров ШИМ сигнал, на изхода трябва да се осигури аналогов филтър.

Предимства на High Speed ​​​​PWM - Разширяване честотен диапазонаналогов изходен сигнал и възможността за използване на по-компактни и евтини компоненти във филтъра поради повече висока честота.

1. Принцип на действие

PWM в комбинация с аналогов филтър може да се използва за генериране на аналогови изходни сигнали, т.е. като цифрово-аналогов преобразувател(DAC). Основата е поредица от правоъгълни импулси с постоянен период на повторение (фиксирана честота на преобразуване). За генериране на различни аналогови нива, коефициентът на запълване на импулсите се регулира и по този начин се променя продължителността на импулсите. Ако е необходимо да се генерира високо аналогово ниво, тогава продължителността на импулса се увеличава и обратно.

Осредняването на аналогов сигнал за един период (с помощта на аналогов филтър) генерира аналогов сигнал. При 50% импулсно запълване аналоговият сигнал е равен на половината от захранващото напрежение, а при 75% импулсно запълване аналоговият сигнал е равен на 75% от захранващото напрежение. Примери за филтриране на изхода са показани в края на този документ.

Например, аналогов нискочестотен филтър може да бъде постигнат с помощта на прост пасивен RC филтър. Филтърът премахва високочестотния PWM носител и по този начин произвежда аналогов сигнал. Честотата на настройка на филтъра трябва да бъде избрана достатъчно висока, за да не се изкривява аналоговата форма на вълната. В същото време честотата на настройка трябва да е достатъчно ниска, за да минимизира пулсациите от носещата честота на ШИМ.

Фигура 1. Нискочестотен RC филтър

Ако аналогов сигнал се подава към вход с нисък импеданс, трябва да се свърже буферен усилвател между изхода на филтъра и товара. Това предотвратява натоварването на кондензатора и причиняването на пулсации на напрежението.

Фигура 2 показва реална осцилограма на ШИМ сигнал с променливо запълване на импулса.


Фигура 2. ШИМ сигнал с променливо запълване на импулса

AVR микроконтролерите използват таймер-броячи за генериране на PWM сигнали. За да промените носещата честота на ШИМ, времевата честота на таймера и брояча се променят. Увеличаването на тактовата честота и/или намаляването на горната част на броенето води до увеличаване на честотата на препълване на таймера и в резултат на това честотата на ШИМ се увеличава. Максималната разделителна способност (преброяване на първите 255) съответства на максимална честотаШИМ 250 kHz. По-нататъшно увеличаване на честотата на ШИМ е възможно чрез намаляване на разделителната способност, но в този случай броят на стъпките при настройка на запълването на импулса от 0 до 100% се намалява.

Промяната на съдържанието на регистъра за сравнение (OCR) влияе върху запълването на импулса. Увеличаването на стойността на OCR увеличава запълването на импулса. Докато броячът достигне стойността от OCR регистъра, изходът на PWM е във високо състояние, след което пада на ниско, докато се достигне горната част на брояча, след което броячът преминава в нулево състояние и цикълът се повтаря. Този метод на генериране в микроконтролерите AVR се нарича бърза ШИМ.


Фигура 3. Стойности на брояча и изход на ШИМ

Когато се използва високочестотна ШИМ за генериране на аналогови сигнали, ширината на аналоговите нива зависи от резолюцията на ШИМ. Колкото по-висока е носещата честота, толкова по-лесно е да се потисне и по този начин да се минимизира нивото на пулсациите. Следователно е необходимо да се оптимизира съотношението на разделителната способност и носещата честота.

2. Алтернативни приложения

Високоскоростен таймер може също да се използва за генериране на високочестотни цифрови сигнали, които от своя страна се използват за синхронизиране на други цифрови сцени. Като настроите брояча много ниско, могат да се генерират сигнали с много висока честота.

Максимум тактова честотаТаймерът на микроконтролера ATtiny26 е 64 MHz (без предварително разделяне). При честота на ШИМ от 16 MHz (горен брой 3), OCR регистърът може да бъде записан на 0, 1 (25% запълване), 2 (50% запълване, Фигура 4а) или 3 (100% запълване). Това показва, че чрез намаляване на върха на броенето, носещата честота на ШИМ се увеличава.

За да постигнете максимална изходна честота от таймера, той трябва да бъде превключен в режим без ШИМ. Горната част на брояча и съдържанието на OCR трябва да са равни на 0. Тогава броячът остава на 0. Настройването на действието за съпоставяне на "превключване на изхода" води до инвертиране (превключване) на изхода при всяко тиктакане на таймера. В резултат на това се постига честота от 32 MHz (Фигура 4b).


Фигура 4: Високочестотен цифров изход

3. Пример за приложение

Фигура 4 илюстрира как да генерирате синусоида от високочестотен ШИМ сигнал.

Програмният код се състои от 3 части: инициализация, рутинна процедура за прекъсване при препълване на таймер 1 и цикъл на заспиване. IN в този примерПредполага се, че микроконтролерът работи на тактова честота от 8 MHz.


Фигура 5. Блокова схема на главния цикъл на програмата за генериране на синусоидален сигнал

3.1. Инициализация

Изходът на Timer Comparator 1 (OC1A) трябва да бъде конфигуриран като изход.

След това се настройва таймер 1: подготвя се часовниковият източник на таймера - стартира се PLL веригата, която трябва да влезе в синхронизация (захващане) с системна честотасинхронизация PLL изисква около 100 ms за улавяне на системния часовник и следователно трябва да изчака, докато флагът за улавяне на PLL бъде зададен, преди да продължи по-нататък. След като PLL бъде уловен, той трябва да бъде избран като източник на часовник на таймера.

След това се избира ШИМ режимът с инверсия на изхода OC1A по съвпадение и горната граница на отброяването е настроена на 0xFF. Стойността на броячния връх определя разделителната способност и носещата честота на ШИМ - колкото по-висока е стойността на върха, толкова по-висока е разделителната способност и толкова по-ниска е носещата честота.

Таймерът вече е готов за стартиране: настройката на предварителния скалер стартира таймера. И накрая, прекъсването при препълване на таймера е разрешено.


Фигура 6. Процедура за инициализация (инициализира пин и таймер 1 за бърза работа с ШИМ)

3.2. Прекъсване на рутина

Когато таймер 1 достигне стойността от OCR1C (0xFF), се извиква процедурата за прекъсване при препълване на таймера. Тъй като стойността на OCR1C е константа, тогава това събитиевъзниква с постоянна честота. Този период определя носещата честота на изходния ШИМ сигнал.

Програмата за обработка на прекъсвания реализира таблица за генериране на синусоидален сигнал. Всеки път, когато се въведе процедурата, указателят за достъп до таблицата се увеличава, така че всеки път да се зареждат нови стойности. Прочетената от таблицата стойност се записва в регистъра OCR1A. По този начин генерираната импулсна поредица може да се преобразува в синусоидален сигнал. Имайте предвид, че регистърът OCR1A е буфериран и че пренаписване от буферния регистър към действителния регистър OCR1A възниква, когато таймерът препълни.

Необходими са 13 тактови цикъла, за да се завърши процедурата за прекъсване. Извикването на процедура и връщането от нея също отнема време – необходими са общо 21 цикъла. Тъй като таймер 1 е 8-битов, прекъсването се случва на всеки 256/(PWM_Frequency/System_Frequency) тактови цикъла. Този пример предполага тактоване от вътрешен RC осцилатор с честота 8 MHz. Ако се използва максималната PWM тактова честота от 64 MHz, тогава на всеки 32 системни такта се появява препълване на таймера.

Въпреки че може да бъде тактован на максимална честота от 64 MHz, в този пример се приема, че тактовата честота на таймера е 4...16 MHz, за да се демонстрира допълнително работа с прескалер.


Фигура 7. Блокова диаграма на процедурата за обработка на прекъсване при препълване на таймера

3.3. на празен ход

Докато чака прекъсване, микроконтролерът се поставя в икономичен режим на заспиване „Idle“. Когато обработката на прекъсването приключи, микроконтролерът се връща в режим на заспиване.

4. Осцилограми

Следващите фигури показват осцилограми на генерирането на синусоидални сигнали с помощта на микроконтролера ATtiny26. Вълновите форми показват два сигнала: цифров сигнал от изхода OC1A и обработен/филтриран PWM сигнал. За генериране на аналогов синусоидален сигнал е използван обикновен RC филтър с параметри R = 10 kOhm и C = 100 nF, които съответстват на честота на настройка на филтъра от 1 kHz. По този начин се пропуска синусоида и високочестотната носеща честота се потиска.


Фигура 8. OC1A Филтриран и нефилтриран изход


Фигура 9. OC1A Филтриран и нефилтриран изход (голям мащаб)

Резултат 1 Резултат 2 Резултат 3 Резултат 4 Резултат 5

Фиг. 1

T = T0+T1. Период на пулса

T = 1/F

S = T/T1

Работен цикъл

Коефициент на запълване D=1/Sили нещо такова D = T1/T*100%

Цифровите устройства, например, микроконтролерът може да работи само с две нива на сигнала, т.е. нула и едно или изключено и включено. По този начин можете лесно да го използвате за наблюдение на състоянието на натоварване, като например включване или изключване на светодиод. Можете също да го използвате, за да контролирате всеки електрически уред, използвайки подходящите драйвери (транзистор, триак, реле и др.) Но понякога се нуждаете от нещо повече от просто „включване“ и „изключване“ на устройството. Така че, ако искате да контролирате яркостта на светодиод (или лампа) или скоростта на мотор постоянен ток, Че цифрови сигналиПросто не мога да го направя. Тази ситуация се среща много често в цифрова технологияи се нарича Широчинно-импулсна модулация (PWM).

Почти всички съвременни микроконтролери имат специализиран хардуер за генериране на ШИМ сигнал. В този урок ще научим основите на PWM техниката и по-късно ще видим как да внедрим PWM с помощта на AVR микроконтролери.

Цифрови устройства като микроконтролер могат да генерират само две нива на изходните линии, високо = 5V и ниско = 0V. Но какво, ако искаме да получим 2,5 или 3,1 или всяко напрежение между 0-5V? За да направите това, вместо да създавате DC напрежение DC изходът ще генерира правоъгълна вълна, която има високи = 5V и ниски = 0V нива (вижте Фигура 1).

Фиг. 1

Фигурата показва, че сигналът остава последователно на ниски и високи нива за известно време. T0 - ниско ниво, T1 - високо ниво. Периодът на сигнала ще бъде равен на T = T0+T1. Период на пулса- това е интервалът от време между две характерни точки на два съседни импулса. Обикновено периодът се измерва между две покачвания или два спада на съседни импулси и се отбелязва с главна буква латиница T.

Периодът на повторение на импулса е пряко свързан с честотата на импулсната последователност и може да се изчисли по формулата: T = 1/F

Ако дължината на импулса T1 е точно равна на половината от периода T, тогава такъв сигнал често се нарича "квадратна вълна".

Работният цикъл на импулсите е съотношението на периода на повторение на импулса към тяхната продължителност и се обозначава с буквата S: S = T/T1

Коефициентът на запълване е безразмерна величина и няма мерни единици, но може да се изрази като процент. Терминът често се среща в английски текстове Работен цикъл, това е така нареченият работен цикъл или стойността на работен цикъл на ШИМ. Работният цикъл D е реципрочната стойност на работния цикъл.

Коефициент на запълванеобикновено се изразява като процент и се изчислява по формулата: D=1/Sили нещо такова D = T1/T*100%

На фигурата по-горе (фиг. 1) можете да видите, че T1 = T0, това е равно на половината от периода от време. Така работният цикъл на ШИМ е 50%. Ако честотата на такива импулси е достатъчно висока (да речем 5000 Hz), тогава получаваме половината от 5V, т.е. 2,5 V. По този начин, ако изходът на контролера е свързан към двигателя (с помощта на подходящи драйвери), той ще работи на 50% от пълната си скорост. Техниката PWM използва този факт, за да създаде напрежение между две нива (например между 0-12V). Номерът е, че когато променяме стойността на работния цикъл между 0-100%, получаваме същия процент входен волтажна изхода. По-долу са някои примери за PWM сигнали с различни работни цикли.

Ако инсталирате R/C филтър на изхода, можете да получите чисто ниво на DC сигнал, а не квадратни вълни. Но това не е задължително за колекторни двигателиили за контролиране на яркостта на светодиодите. За да направите това, можете да приложите PWM сигнал директно към драйвера (напр. биполярен транзистор, MOSFET и др.).

Под 16-битов режим на работа. Таймерът се разбира като неговия алгоритъм за отчитане и поведението на асоциирания с него изход на формовчика на импулси, което се определя от комбинация от битове, които определят режима на работа на таймера (WGMn3-0) и режима на генериране на изходен сигнал (COMnx1:0) . В този случай битовете за настройка на режима на генериране на изходния сигнал не влияят на алгоритъма за броене, т.к. Алгоритъмът на броене зависи само от състоянието на битовете за настройка на режима на работа на таймера. В режимите на PWM, битовете COMnx1:0 ви позволяват да активирате/деактивирате инверсията на генерирания PWM изход (т.е. изберете PWM с инверсия или PWM без инверсия). За не-PWM режими битовете COMnx1:0 определят какво действие да се предприеме, когато възникне съвпадение: нулиране, настройка или инвертиране на изхода (вижте също „Блок за кондициониране на изходен сигнал“ и „16-битови времеви диаграми на таймер-брояч“) .

Нормална операция

Повечето прост режимработата е нормален режим (WGMn3-0 = 0b0000). IN този режимБроячът работи като сумиращ (увеличаващ) брояч и броячът не се нулира. Броячът препълва при преминаване през максималните 16 бита. стойност (0xFFFF) до долната граница на броя (0x0000). По време на нормална работа, флагът за препълване на таймер-брояч TOVn ще бъде зададен на същия тактов цикъл, когато TCNTn достигне нула.

Всъщност флагът за препълване на TOVn е 17-ият бит на таймера-брояч, с изключение на това, че той е само зададен, а не изчистен. Въпреки това, това свойство може да се използва програмно за увеличаване на разделителната способност на таймера чрез прекъсване на препълване на таймера, при което флагът TOVn автоматично се нулира. Няма специални ситуации за нормална работа, така че ново състояние на измервателния уред може да бъде записано по всяко време.

В нормален режим можете да използвате блока за улавяне. Трябва обаче да се гарантира, че максималният интервал от време между появата на външни събития не надвишава периода на препълване на брояча. Ако това условие не е изпълнено, е необходимо да се използва прекъсване при препълване на таймер-брояч или предскалер.

Блокът за сравнение може да се използва за генериране на прекъсвания. Не се препоръчва използването на изхода OCnx за генериране на сигнали при нормална работа, т.к в този случай ще бъде изразходвана значителна част от времето на процесора.

Режим на нулиране на таймера за съвпадение (CTC)

В режим CTC (WGM01, WGM00 =0b10), регистърът OCR0 се използва за задаване на резолюцията на брояча. Ако режимът CTC е зададен и стойността на брояча (TCNT0) съвпада със стойността на регистъра OCR0, броячът се нулира на нула (TCNT0=0). По този начин OCR0 определя най-високия брой на брояча и, следователно, неговата разделителна способност. Този режим осигурява по-широк диапазон на регулиране на честотата на генерираните правоъгълни импулси. Той също така опростява работата на външния брояч на събития.

В режим на нулиране на таймера при съвпадение (WGMn3-0 = 0b0100 или 0b1100), разделителната способност на таймера се задава от регистрите OCRnA или ICRn. В режим CTC броячът (TCNTn) се нулира, ако стойността му съвпада със стойността на регистъра OCRnA (WGMn3-0 = 0b0100) или ICRn (WGMn3-0 = 0b1100). Стойността на регистъра OCRnA или ICRn определя горната граница на броя и следователно разделителната способност на таймера. Този режим осигурява по-широк диапазон на регулиране на честотата на генерираните правоъгълни импулси. Той също така опростява работата на външния брояч на събития. Времевата диаграма на работата на таймера в режим CTC е показана на Фигура 1. Броячът (TCNTn) увеличава състоянието си, докато се появи съвпадение със стойността на OCRnA или ICRn, след което броячът (TCNTn) се нулира.

Фигура 1 – Времева диаграма за STS режим

Когато се достигне горната граница на броя, може да се генерира прекъсване с помощта на флаговете OCFnA или ICFn, съответстващи на регистрите, използвани за задаване на горната граница на броя. Ако прекъсването е разрешено, тогава рутината за прекъсване може да се използва за актуализиране на горната граница на броя. Въпреки това, настройването на горната стойност на броенето близо до долната гранична стойност на броенето, когато броячът работи без предварителна скала или с малка стойност на предварителна скала, трябва да се извършва с изключителна предпазливост, т.к. В режим CTC няма двойно буфериране. Ако стойността, записана в OCRnA или ICRn, е по-малка от текущата стойност на TCNTn, тогава нулирането на брояча ще се извърши, когато достигне максимална стойност(0xFFFF), след което отива на първоначалното състояние 0x0000 и достига новата стойност на OCRnA или ICRn. В много случаи тази ситуация не е желателна. Алтернатива е бързият PWM режим, където регистърът OCRnA определя горната граница на броя (WGMn3-0 = 0b1111), т.к. в този случай OCRnA е двойно буфериран.

За генериране на сигнал в режим CTC, изходът OCnA може да се използва за промяна на логическото ниво при всяко съвпадение чрез задаване на режим на превключване (COMnA1, COMnA0 = 0b01). Стойността OCnA ще присъства на щифта на порта само ако това заключениедадено изходна посока. Максималната честота на генерирания сигнал е fOC0 = fclk_I/O/2, ако OCRnA = 0x0000. За други стойности на OCRn честотата на генерирания сигнал може да се определи по формулата:

където променливата N указва коефициента на разделяне на предскалера (1, 8, 32, 64, 128, 256 или 1024).

Както при нормална работа, флагът TOV0 се задава на същия таймер, когато стойността му се промени от 0xFFFF на 0x0000.

Бърз ШИМ режим

Режимът на бърза широчинно-импулсна модулация (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) е проектиран да генерира PWM импулси с повишена честота. За разлика от други режими на работа, този използва работа с еднопосочен брояч. Броенето се извършва в посока от долната към горната граница на броене.

Ако е зададен неинвертиращ изходен режим, тогава, когато TCNTn и OCRnx съвпадат, сигналът OCnx се настройва и нулира на горната граница на броене. Ако е указан режим на инвертиране, изходът на OCnx се нулира при съвпадение и се настройва на лимита за висок брой. Благодарение на еднопосочното броене, работната честота за този режим е два пъти по-висока в сравнение с режима PWM с фазова корекция, където се използва двупосочно броене. Възможността за генериране на високочестотни PWM сигнали прави използването на този режим полезно при задачи за стабилизиране на мощността, коригиране и цифрово-аналогово преобразуване. Високата честота, в същото време, позволява използването външни елементифизически малки по размер (индуктори, кондензатори), като по този начин намаляват крайна ценасистеми.

Разделителната способност на ШИМ може да бъде фиксирана 8, 9 или 10 бита или зададена от регистъра ICRn или OCRnA, но не по-малко от 2 бита (ICRn или OCRnA = 0x0003) и не повече от 16 бита (ICRn или OCRnA = 0xFFFF). Разделителната способност на ШИМ при дадена горна гранична стойност (UL) се изчислява, както следва:

В бърз PWM режим броячът се увеличава, докато стойността му съвпадне с една от фиксираните стойности 0x00FF, 0x01FF или 0x03FF (ако WGMn3:0 = съответно 0b0101, 0b0110 или 0b0111), стойността в ICRn (ако WGMn3:0 = 0b1110) или стойността в OCRnA (ако WGMn3:0 = 0b1111) и след това нулирайте до следващото отметка на часовника на таймера. Времевата диаграма за бърз PWM режим е показана на Фигура 2. Фигурата показва бърз PWM режим, когато регистърът OCRnA или ICRn се използва за задаване на горната граница. Стойността на TCNTn във времевата диаграма е показана като функционална графика, за да илюстрира еднопосочното броене. Диаграмата показва както инвертирани, така и неинвертирани ШИМ изходи. Къса хоризонтална линия показва точки на графиката TCNTn, където стойностите на OCRnx и TCNTnx съвпадат. Флагът за прекъсване на OCnx се задава, когато възникне съвпадение.

Фигура 2 – Времева диаграма за бърз ШИМ режим

Флагът за препълване на таймер-брояч (TOVn) се задава всеки път, когато броячът достигне горната си граница. Освен това, същият тактов импулс, заедно с флага TOVn, може да зададе флаговете OCnA или ICFn, ако регистърът OCRnA или ICRn се използва съответно за задаване на горната граница. Ако едно от тези прекъсвания е разрешено, тогава програмата за прекъсване може да актуализира горната граница на броя и праговете за сравнение.

Ако стойността на горната граница на броя се промени, тогава трябва да бъде изпълнено условието, че записаната нова горна гранична стойност е по-голяма или равна на стойностите във всички регистри на праговите стойности за сравнение. В противен случай съвпадение между TCNTn и OCRnx никога няма да възникне. Обърнете внимание, че когато използвате фиксирани горни гранични стойности, неизползваните битове се маскират до 0 при запис в регистрите OCRnx.

Механизмът за модификация на регистъра ICRn се различава от OCRnA, когато се използва за задаване на горната граница. Регистърът ICRn не е двойно буфериран. Това означава, че ако в ICRn се запише малка стойност, докато броячът работи с малко или никакво предварително мащабиране, съществува риск от записване на стойност в ICRn регистъра, която е по-малка от текущата стойност на TCNTn. В резултат на това в тази ситуация срещата в горната част на броя ще бъде пропусната. В този случай броячът ще достигне максималната си стойност (0xFFFF), ще се рестартира при 0x0000 и едва тогава ще генерира съвпадение. Регистърът OCRnA съдържа двойна буферна схема, така че може да бъде модифициран по всяко време.

class="eliadunit">

Ако се направи запис за адрес на OCRnA, стойността всъщност се поставя в OCRnA буферния регистър. Ако възникне съвпадение между TCNTn и горната част на брояча, тогава следващият тактов цикъл на таймера е копирането на буферния регистър в регистъра на прага за сравнение OCRnA. Регистърът се актуализира в същия часовников цикъл, когато TCNTn се нулира и флагът TOVn се задава.

Препоръчително е да използвате регистъра ICRn за задаване на горната граница, ако горната граница на броя е константа. В този случай регистърът OCRnA също се освобождава, за да генерира PWM сигнал на изхода OCnA. Въпреки това, ако честотата на ШИМ се променя динамично (поради промяна на горната граница), тогава в този случай е по-изгодно да използвате регистъра OCRnA, за да зададете горната граница, т.к. поддържа двойно буфериране.

В режим на бърза ШИМ сравнителните единици ви позволяват да генерирате ШИМ сигнали на щифтовете OCnx. Ако COMnx1:0 = 0b10, тогава ШИМ е зададен без инверсия на изхода, а ако COMnx1:0 = 0b11, тогава е зададен режим на ШИМ с инверсия на изхода (вижте Таблица 59). Действителната OCnx стойност може да се наблюдава на щифта на порта, ако е настроена на изходна посока (DDR_OCnx). Сигналът PWM се генерира чрез настройка (нулиране) на регистъра OCnx, когато възникне съвпадение между OCRnx и TCNTn, и чрез нулиране (настройка) на регистъра OCnx заедно с нулиране на брояча (промяна от висока граница към ниска граница).

ШИМ изходна честота за зададена стойностгорната граница (UL) се определя от израза:

където N е променлива, която определя стойността на коефициента на предразпределение (1, 8, 32, 64, 128, 256 или 1024).

Записването на гранични стойности в регистъра OCRnx е свързано със специални случаи при генерирането на PWM импулси. Ако OCRnx е настроен равен на долната граница (0x0000), тогава на изхода ще се появи кратък импулс на всеки (VP+1)-ти тактов цикъл на таймера. Записването на стойност, равна на горната граница в OCRnx, ще доведе до задаване на постоянно ниво на журнал. 1 или 0 на изхода (в зависимост от полярността на изходния сигнал, избран с помощта на бита COMnx1:0).

Ако се изисква генериране на меандър ( квадратни импулсис работен цикъл от 2 или 50% запълване) с висока честота, тогава е необходимо да се използва бързият ШИМ режим с зададени битове COMnA1:0 = 0b01, което води до превключване (инвертиране) на логическото ниво на изхода OCnA всеки мач. Това е приложимо само ако OCRnA се използва за задаване на горната граница (WGMn3-0 =0b1111). Максималната генерирана честота на квадратна вълна в този случай е fOCnA = fclk_I/O/2, ако OCRnA = 0x0000. Тази функцияподобно на превключването на OCnA в режим CTC с изключение на двойното буфериране, което присъства в режим на бърза ШИМ.

Режим на модулация на ширината на импулса с фазова корекция (Phase Correct)

Режимът на фазово коригирана импулсна модулация (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 или 0b1011) е проектиран да генерира фазово коригиран PWM сигнал с висока резолюция. Режимът PWM FC се основава на двупосочната работа на таймер-брояч. Броячът преминава от ниска граница (0x0000) до висока граница и след това обратно от висока граница към ниска граница. Ако изходният режим на формовчика на импулси е настроен на неинвертиращ, изходът OCnx се нулира/настройва, когато стойностите на TCNTn и OCRnx съвпадат по време на броене нагоре/надолу. Ако режимът на инвертиране на изхода е зададен, тогава, напротив, по време на директно броене се извършва настройката, а по време на обратното броене изходът OCnx се нулира. При двупосочна работа максималната честота на PWM сигнала е по-малка, отколкото при еднопосочна работа, но поради такива характеристики като симетрия в режимите на PWM с двупосочна работа, тези режими се предпочитат да се използват при решаване на проблеми с управлението на задвижването.

Разделителната способност на ШИМ в този режим може да бъде или фиксирана (8, 9 или 10 бита) или зададена с помощта на регистъра ICRn или OCRnA. Минималната разделителна способност е 2 бита (ICRn или OCRnA = 0x0003), а максималната е 16 бита (ICRn или OCRnA = 0xFFFF). Ако е зададена горна граница, тогава ШИМ резолюцията в този режим се определя, както следва:

В режим PWM FC броячът се увеличава, докато достигне една от фиксираните стойности 0x00FF, 0x01FF или 0x03FF (съответно за WGMn3-0 = 0b0001, 0b0010 или 0b0011), както и стойност, равна на ICRn (ако WGMn3- 0 = 0b1010) или OCRnA (ако WGMn3 :0 = 0b1011). Освен това, когато се достигне горната граница, броячът променя посоката на броене. Стойността на TCNTn остава на горната граница за един тактов цикъл на таймера. Времевата диаграма за PWM PC режим е показана на Фигура 3. Фигурата показва PWM PC режим с използване на OCRnA или ICRn регистъра за задаване на горната граница. Състоянието на TCNTn е представено като функционална графика, за да илюстрира двупосочно броене. Фигурата показва както неинвертиран, така и инвертиран ШИМ изход. Къс хоризонтални линиипосочете точки на графиката на промяната на TCNTn, където има съвпадение със стойността на OCRnx. Флагът за прекъсване на OCnx се задава, когато възникне съвпадение.

Фигура 3 – Времева диаграма за режим PWM FC

Флагът за препълване на таймер-брояч (TOVn) се задава всеки път, когато броячът достигне долната си граница. Ако регистърът OCRnA или ICRn се използва за задаване на горната граница, тогава флагът OCnA или ICFn се задава съответно със същия тактов импулс, при който регистърът OCRnx е актуализиран от буферния регистър (в горната част на брояча). Флаговете за прекъсване могат да се използват за генериране на прекъсване, когато брояч достигне ниска или висока граница.

Когато променяте стойността на горната граница на броя, трябва да се уверите, че тя е по-голяма или равна на стойностите във всички регистри за сравнение. В противен случай съвпадение между TCNTn и OCRnx никога няма да възникне. Обърнете внимание, че когато използвате фиксирани стойности на горния брой, неизползваните битове се изчистват до нула при запис в регистрите OCRnx. Третият период на фигура 53 илюстрира случая, когато динамична промянагорната граница на броене води до генериране на асиметричен импулс. Тази функция се основава на времето за актуализиране на OCRnx регистъра. Тъй като актуализацията на OCRnx се извършва в горната част на броя, периодът на ШИМ започва и завършва в горната част на броя. Това означава, че продължителността на обратното броене се определя от предишната горна гранична стойност, а продължителността на броенето напред се определя от новата горна гранична стойност. Ако тези две стойности са различни, тогава продължителността на броенето напред и назад също ще бъде различна. Разликата в продължителността води до асиметрия на изходните импулси.

Ако задачата е да промените горната граница, докато броячът работи, тогава вместо този режим се препоръчва да използвате режим PWM PFC (корекция на фазата и честотата). Ако се използва статична горна гранична стойност, тогава практически няма разлики между тези режими.

В режим PWM FC сравнителните модули ви позволяват да генерирате PWM сигнали на щифтовете OCnx. Ако зададете COMnx1:0 = 0b10, тогава ШИМ изходът ще бъде без инверсия, а ако COMnx1:0=0b11, тогава с инверсия. Действителната стойност на OCnx може да се наблюдава на щифта на порта, ако регистърът за посока на данните за този щифт на порта е настроен на изходна посока (DDR_OCnx). Сигналът PWM се генерира чрез настройване (нулиране) на регистъра OCnx, когато стойностите на OCRnx и TCNTn съвпадат по време на преброяване, и чрез нулиране (настройване) на регистъра OCnx, когато има съвпадение между OCRnx и TCNTn по време на броене надолу. Получената честота на PWM сигнала в режим PWM FC при дадена горна граница (UL) може да се изчисли с помощта на следния израз:

Записването на гранични стойности в регистъра OCRnx е свързано със специални случаи при генерирането на PWM сигнали в режим PWM FC. Ако зададете ШИМ режим без инверсия и зададете OCRnx равен на долната граница, тогава изходът ще бъде непрекъснато настроен на log. 0 и ако е равно на горната граница, тогава на изхода винаги присъства дневник. 1. За ШИМ с инверсия, посочените нива трябва да се заменят с противоположните.

Ако укажете да използвате OCnA като горна граница (WGMn3:0 = 0b1011) и зададете COMnA1:0 =0b01, на изхода на OCnA ще се генерира квадратна вълна.

Режим на модулация на ширината на импулса с корекция на фазата и честотата (Phase and Frequency Correct)

Режимът на широчинно-импулсна модулация с фазова и честотна корекция (PWM PFC) (WGMn3-0 = 0b1000 или 0b1001) е проектиран да генерира PWM импулси с висока разделителна способност с фазова и честотна корекция. Точно като режима PWM FC, режимът PWM FC се основава на двупосочната работа на брояча. Броячът преминава от ниска граница (0x0000) до висока граница и след това обратно от висока граница към ниска граница. Ако е зададен неинвертиращ ШИМ режим, изходът OCnx се изчиства, ако възникне съвпадение между TCNTn и OCRnx по време на преброяване нагоре, и се задава, ако настъпи съвпадение по време на преброяване надолу. В режим на обръщане операцията е обратна. Двупосочната работа в сравнение с еднопосочната е свързана с генерирането на повече ниски честоти. Въпреки това, поради симетрията в режимите на ШИМ с двупосочно броене, тяхното използване е за предпочитане при задачи за управление на задвижване.

Основната разлика между режимите PWM FC и PWM FC е моментът, в който OCRnx регистърът се актуализира от OCRnx буферния регистър (вижте Фигура 3 и Фигура 4).

Разделителната способност на ШИМ в този режим може да се настрои с помощта на регистъра ICRn или OCRnA. Минималната разделителна способност е 2 бита (ICRn или OCRnA = 0x0003), а максималната разделителна способност е 16 бита (ICRn или OCRnA = 0xFFFF). Разделителната способност на ШИМ в битове може да се изчисли с помощта на следния израз:

В режим FCC PWM броячът се увеличава, докато съвпадне със стойността в ICRn (WGMn3:0 = 0b1000) или в OCRnA (WGMn3:0 = 0b1001). Това означава достигане на върха на броенето, след което посоката на броенето се променя. Стойността на TCNTn остава в горната част на броя за един тактов цикъл на таймера. Времевата диаграма за режима PWM FCC е показана на Фигура 54. Фигурата показва режима PWM FCC, когато горната граница на броене е зададена от регистъра OCRnA или ICRn. Стойността на TCNTn е показана като функционална графика, за да илюстрира двупосочното броене. Диаграмата показва както неинвертиращи, така и инвертиращи ШИМ изходи. Късите хоризонтални линии показват точки на графиката на TCNTn, където се получава съвпадение между OCRnx и TCNTn. Флагът за прекъсване OCnx се задава след възникване на съвпадение.

Фигура 4 – Времева диаграма на ШИМ режим с фазова и честотна корекция

Флагът за препълване на таймер-брояч (TOVn) се задава на същия тактов цикъл, когато регистрите се актуализират със стойността от буферния регистър (на долната граница на броене). Ако регистърът OCRnA или ICRn се използва за задаване на горната граница, тогава, когато броячът достигне горната граница, флагът OCnA или ICFn се задава съответно. Флаговете за прекъсване могат да се използват за генериране на прекъсване, когато брояч достигне висока или ниска граница.

Когато променяте горната граница, трябва да се уверите, че новата стойност е по-голяма или равна на стойностите във всички регистри на праговите стойности за сравнение. В противен случай, ако горната граница е зададена на стойност, по-малка от която и да е от стойностите в регистрите на праговите стойности за сравнение, съвпадение между TCNTn и OCRnx никога няма да възникне.

Фигура 4 показва, че за разлика от режима PWM FC, генерираният изходен сигнал е симетричен във всички периоди. Тъй като регистрите OCRnx се актуализират при долната граница на броене, продължителността на броенето напред и назад винаги е еднаква. В резултат на това изходните импулси имат симетрична форма и следователно коригирана честота.

Използването на регистъра ICRn за задаване на горната граница се препоръчва, ако стойността на горната граница е константа. В този случай регистърът OCRnA също се освобождава за широчинно-импулсна модулация на импулсите на щифта OCnA. Въпреки това, ако трябва динамично да промените честотата на ШИМ чрез промяна на горната граница, тогава се препоръчва да използвате регистъра OCRnA, за да зададете горната граница поради двойното му буфериране.

В режим PWM сравнителните единици ви позволяват да генерирате PWM импулси на щифта OCnx. Ако COMnx1:0 = 0b10, тогава е зададен неинвертиращ PWM изход, а ако COMnx1:0=0b11, тогава инвертиращ (виж таблица 60). Стойността OCnx ще присъства само на съответния щифт на порта, ако е настроен на изходна посока. Сигналът PWM се генерира чрез настройване (нулиране) на регистъра OCnx при съвпадение между OCRnx и TCNTn по време на нарастващо броене и нулиране (настройване) на регистъра OCnx при съвпадение между OCRnx и TCNTn по време на броене надолу. Честотата на ШИМ в този режим с дадена горна граница (UP) на броене се определя, както следва:

където N е коефициентът на разделяне на предскалера (1, 8, 32, 64, 128, 256 или 1024).

Записването на гранични стойности в регистъра OCRnx е свързано със специални случаи при генерирането на PWM сигнали в този режим. Ако зададете OCRnx равно на долната граница (0x0000), тогава в неинвертиращ режим изходът постоянно ще има ниско логическо ниво, а когато записвате стойност, равна на горната граница, изходът ще има високо логическо ниво за дълго време. В режим на обръщане дадените нива ще бъдат противоположни.

Ако OCRnA се използва за задаване на горната граница (WGMn3:0 = 0b1001) и COMnA1:0 = 0b01, тогава на изхода на OCnA ще се генерира квадратна вълна.

Хардуерното внедряване на PWM осигурява несъмнени предимства пред софтуера, тъй като освобождава процесора от ненужен и тромав код и време за неговата поддръжка, а също така предоставя повече възможности за използване на работа с PWM. Достатъчно е да инициализирате таймера/брояча (въведете необходимите стойности в регистрите, използвани от таймера/брояча) и таймерът/броячът може да работи независимо от процесора; съответно процесорът може да се справя с други задачи, само от време на време контактуване необходим моментза регулиране или промяна на режима или получаване на резултати от таймера/брояча.

Описание на флаговете за прекъсване

T1 може да генерира прекъсване, когато:

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

T2 може да генерира прекъсване, когато:

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

Флаговете на всички прекъсвания са в регистъра TIFR, а разрешаването/деактивирането на прекъсванията е в регистъра TIMSK.

TIMSK регистър битове
Регистрирам7 6 5 4 3 2 1 0
ТИМСК OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Флаг за разрешаване на прекъсване за събитието „съвпадение“ на таймера/брояча T2
  • TOIE2- Флаг за разрешаване на прекъсване на таймер/брояч при препълване на T2
  • TICIE1- Флаг за разрешаване на прекъсване за събитието "захващане" на таймера/брояча T1
  • OCIE1A- Флаг за разрешаване на прекъсване за събитието „съвпадение А” на таймера/брояча T1
  • OCIE1B- Флаг за разрешаване на прекъсване за събитието „съвпадение B” на таймера/брояча T1
  • TOIE1- Флаг за разрешаване на прекъсване на таймер/брояч при препълване на T1
  • OCIE0*- Флаг за разрешаване на прекъсване за събитието "съвпадение" на таймера/брояча T0 (* - липсва в ATmega8)
  • TOIE0- Флаг за активиране на прекъсване на таймер/брояч при препълване
  • OCF2- Флаг за прекъсване на събитието “съвпадение” на таймера/брояча Т2
  • TOV2- Флаг за прекъсване при препълване на таймера/брояча T2
  • ICF1- Флаг за прекъсване на събитието “capture” на таймера/брояча T1
  • OCF1A- Флаг за прекъсване за събитие "съвпадение А" на таймер/брояч Т1
  • OCF1B- Флаг за прекъсване за събитие "съвпадение B" на таймер/брояч Т1
  • TOV1- Флаг за прекъсване на таймера/брояча при препълване на T1
  • OCF0- Флаг за прекъсване на събитието “съвпадение” на таймера/брояча T0
  • TOV0- Флаг за прекъсване при препълване на таймера/брояча T0

Описание на работата на таймера/брояча T1 в контролера ATmega8/16

Шестнадесет-битовият таймер/брояч T1 може да се използва за генериране на времеви интервали, преброяване на външните сигнали и генериране на PWM сигнали с различни работни цикли и продължителност на щифтове OC1A и OC1B. Освен това, според външен сигналот щифта ICP1 или от аналогов компаратор, T1 може да го запази Сегашно състояниев отделен регистър за улавяне ICR1.

Регистър битове TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Регистрирам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

Всеки 16-битов регистър е физически разположен в два 8-битови регистъра, така че при четене на запис в тях трябва да се извършат две операции. При запис първо се зарежда старшият байт, а след това малкият; при четене, напротив, първо се чете ниският байт, а след това високият.

TCCR1A:TCCR1B- 8-битови контролни регистри за таймер/брояч T1

TCNT1- 16-битов таймер/брояч регистър T1. В зависимост от работния режим, съдържанието на този регистър се нулира, увеличава (увеличава с 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- Тези битове определят режима на работа на таймера/брояча T1

CS22:CS21:C20- Битове, които определят източника на сигнала на T1 таймера/брояча.

Избор на режим на работа на таймер/брояч Т1
WGM13WGM12WGM11WGM10Режим на работаМодул за акаунт (ТОП)
0 0 0 0 нормално $FFFF
0 0 0 1 Правилна фаза ШИМ

8-битов

$00FF
0 0 1 0 Правилна фаза ШИМ

9-битов

$01FF
0 0 1 1 Правилна фаза ШИМ

10-битов

$03FF
0 1 0 0 CTC (нулиране при мач) OCR1A
0 1 0 1 Бърз ШИМ

8-битов

$00FF
0 1 1 0 Бърз ШИМ

9-битов

$01FF
0 1 1 1 Бърз ШИМ

10-битов

$03FF
1 0 0 0 ICR1
1 0 0 1 Корекция на фазата и честотата на ШИМ OCR1A
1 0 1 0 Правилна фаза ШИМ ICR1
1 0 1 1 Правилна фаза ШИМ OCR1A
1 1 0 0 CTC (нулиране при мач) ICR1
1 1 0 1 Запазено *
1 1 1 0 Бърз ШИМ ICR1
1 1 1 1 Бърз ШИМ OCR1A

Избор на източник на часовник

Нормален режим

Най-простият режим на работа е Т1. За всеки импулс на тактовия сигнал броячният регистър TCNT1 се увеличава (стойността се увеличава с 1). При преминаване през стойността $FFFF на модула за броене (TOP), възниква препълване и следващият часовник започва да брои от стойността $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.

CTC режим (нулиране при мач)

В този режим T1 работи на същия принцип като в нормален режим. Разликата е, че максималната възможна стойност на регистъра за броене TCNT1 е ограничена от стойността на регистъра за сравнение OCR1A или ICR1 (вижте таблицата за избор на режим на таймер/брояч). Когато TCNT1 достигне стойността на OCR1A или ICR1, стойността на TCNT1 се нулира на TCNT1=$0000 В същото време флагът TOV1=1 се задава COM1A1:COM1A0:COM1B1:COM1B0 Определя поведението на щифта OC1A:OC1B, когато. има съвпадение.

Режим Fast PWM (бърз PWM)

Използвайки този режим, можете да генерирате високочестотен PWM сигнал. Принципът и процедурата на работа не се различават от нормалния режим, с изключение на наличието на двойно буфериране на регистъра OCR1A: OCR1B, което елиминира появата на асиметрични сигнални импулси, а също така се различава в поведението на щифтовете OC1A: OC1B ( виж таблицата).


Phase Correct PWM режим

Разликата между този режим и предишните е, че броячът работи като обратен брояч. Тъй като този режим се препоръчва от Atmel като най-подходящ за настройка на двигатели, ще го разгледаме по-подробно. Когато регистърът за броене TCNT1 достигне стойността на модула за броене (TOP) (или стойността на регистъра ICR1 или стойността на регистъра OCR1A, вижте таблицата за избор на режим на таймер/брояч), посоката на броене се променя. Когато регистърът за броене TCNT1 достигне минималната стойност ($0000), посоката на броене също се променя и в същото време се задава флагът за прекъсване TOV1 на регистъра TIFR. Също така, ако съдържанието на регистъра за броене TCNT1 и регистъра за сравнение OCR1A:OCR1B са равни, флагът OCF1A:OCF1B на регистъра TIFR се задава и състоянието на изхода OC1A:OC1B се променя според таблицата.

За да се избегнат асиметрични емисии при запис на стойност в регистъра OCR1A:OCR1B, в този режим се прилага двойно буфериране на запис. Благодарение на това действителната промяна в стойността на регистъра се променя в момента, в който регистърът на брояча TCNT1 достигне стойността на модула за броене (TOP) (или стойността на регистъра ICR1 или стойността на регистъра OCR1A, вижте избора на режим на таймер/брояч маса). Следователно, в самото начало, когато таймерът/броячът се инициализира, щифтът OC1A:OC1B няма да промени състоянието си при съвпадение, докато регистърът не достигне стойността (TOP).

Задача:Нека разработим програма за управление на яркостта на 12-волтова лампа с нажежаема жичка с помощта на ШИМ. Когато натиснете бутона „Още“, яркостта на лампата се увеличава, а когато щракнете върху бутона „По-малко“, яркостта намалява. Диаграмата на нашето бъдещо устройство е показана на фигурата. Както обикновено, използваме микроконтролера Atmega8, който ще бъде тактован от вътрешен осцилатор с честота 4 MHz. Всъщност ще получим димер; тези устройства са предназначени да регулират яркостта на осветителните тела. В наши дни LED димерите са най-разпространени.

За простота можете също да свържете светодиод към нашата верига, но ще бъде по-ясно с електрическа крушка. Бутоните са свързани с щифтове PD0, PD1. Свързваме товара към изхода PB1(OC1A)чрез резистор и поле MOSFET транзистор, който ще ни работи като ключ (в ключов режим). Полевият транзистор е за предпочитане, защото неговият гейт е изолиран от захранващата верига и се управлява от електрическо поле, а управляващият ток достига микроампера. Това позволява, използвайки един или два транзистора, да управлява товар с огромна мощност (до десетки ампери и десетки или стотици волта), без да натоварва микроконтролера. Имайки предвид и факта, че полеви транзисторимогат да бъдат свързани паралелно (за разлика от биполярните), е възможно да се получи още по-мощна каскада от стотици ампери.

Сега нека да разберем как микроконтролерът прилага PWM и да напишем програма. Както споменахме по-рано, нашият MK има 3 таймера и всички те могат да работят в режим PWM. Ще работим с шестнадесет-битов таймер/брояч. битове WGM13-10нека конфигурираме нашия таймер да работи с FastPWM с горна граница на броя ICR1. Принципът на програмата е следният: нашият таймер брои от 0 до 65535(0xFFFF), в регистъра ICR1Нека въведем числото 255, това ще бъде горната граница на броя на таймера (TOP), честотата на PWM сигнала ще бъде постоянна. Освен това нашият таймер е конфигуриран така, че ако регистърът за броене и регистърът за сравнение съвпадат (TCNT1 = OCR1A), изходът на контролера ще се превключи OC1A. Работният цикъл на PWM може да се промени чрез запис в регистъра за сравнение OCR1Aопределено число от 0 до 255, колкото по-голямо е това число, толкова по-голям е коефициентът на запълване, толкова по-ярко ще свети лампата. В зависимост от това кой бутон е натиснат, променливата се променя аз, и след това се записва в регистъра OCR1A.

Пълният текст на програмата е представен по-долу. Коментарите описват по-подробно работата на програмата.

/***Урок No8. Генериране на PWM сигнали***/ #include #включи int main(void) (unsigned int i=0; //дефиниране на променлива i /***Конфигуриране на I/O портове***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Коефициентът на запълване на PWM се променя от 255 на 0 ( i--; // намалява i с едно (можете също да напишете това) OCR1A = i; // запис на променлива в регистъра за сравнение _delay_ms(30); // забавяне 30ms ) ) ) )

внимание!Първо захранваме микроконтролера, след което трябва да се уверите, че транзисторът е свързан към MK щифта и едва след това подаваме захранване към веригата с лампата и полевия транзистор. В противен случай може да изгорите транзистора. Факт е, че когато са изключени, „краката“ на MK „висят във въздуха“ - те не са свързани с нищо и върху тях възникват смущения. Тези слаби смущения са достатъчни, за да отворят частично много чувствителен транзистор с полеви ефекти. Тогава неговото съпротивление между дрейн и източник ще спадне от няколко MOhm до няколко ома или части от ома и през него ще тече голям ток към лампата. Но транзисторът няма да се отвори напълно, защото за това трябва да приложите не 1-3 V смущения към портата, а стабилни 5 V и съпротивлението му ще бъде много по-голямо от минималното. Това ще доведе до отделяне на голямо количество топлина върху него и той ще пуши и евентуално ще изгори.

ШИМ (PWM) - модулация на ширината на импулса. Няма нужда да се плашите от този термин. Това е просто начин за регулиране на напрежението. Да кажем, че подсветката на монитора е твърде ярка, променяте яркостта. Но какво всъщност се случва в този момент?

Нека си представим, че подсветката на монитора е няколко светодиода. Цялото нещо се захранва от постоянно напрежение. Но трябваше да намалим яркостта на монитора. Логично е да се отговори, че това може да стане с променлив резистор. При ниски токове е възможно. Но при по-големите, резисторът ще стане много горещ. Размерите, загубите и консумацията на енергия ще се увеличат значително.

Затова хората излязоха с транзисторна схема, която превръща постоянно напрежение в пулсиращо. Оказва се, че пулсиращото напрежение, в зависимост от запълването на периода, ще бъде еквивалентно на постоянно напрежение. Тези. Ако по време на период напрежението е било включено 50% от времето и изключено 50%, тогава еквивалентното постоянно напрежение ще бъде равно на 50% от номиналното напрежение.

В числа е просто - имаше 5V DC напрежение, прекарахме го през PWM - получихме 2,5V. Ако импулсният работен цикъл е 75%, тогава еквивалентното постоянно напрежение ще бъде 3,75 V. Мисля, че идеята е ясна.

Сега да преминем към практическото изпълнение. Ще използваме микроконтролер, за да променим пълнежа от 0 до 100%, след това от 100% до нула. Крайният резултат трябва да изглежда така:

За да стане по-ясно, нека свържем светодиод. В резултат на това светодиодът ще се включва и изключва плавно.

Нека стартираме нашия любим CodeVision. Създаваме проект с помощта на съветника. В секцията Таймери изберете Таймер 2 и задайте настройките, както е на фигурата.

Ако се опитате да генерирате проект, програмата може да се закълне. Съгласни сме, защото имаме крак 3 на порт B, който трябва да бъде конфигуриран като изход.

Пренасяме кода в следната форма:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #включи void main(void) (PORTB= 0x00; DDRB= 0x08; // Инициализация на таймер/брояч 2 ASSR= 0x00; TCCR2= 0x6C; TCNT2= 0x00; OCR2= 0x00; TIMSK= 0x00; докато (1) (); )

#включи void main(void) ( PORTB=0x00; DDRB=0x08; // Инициализация на таймер/брояч 2 ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; докато (1) ( ); )

Нека обърнем внимание на реда OCR2=0x00; Тази променлива е точно отговорна за степента на запълване на пулса. Тази стойност се променя от 0 до 255(0xFF), т.е. 255 съответства на 100% запълване (постоянен ток). Следователно, ако имате нужда от 30% пълнеж (255/100)*30=77. След това преобразувайте 77 в шестнадесетична система OCR2=0x4D;

TCCR2=0x6C; Чрез промяна на тази стойност можем да регулираме честотата на ШИМ. Работната честота на ШИМ е кратна на честотата, на която работи микроконтролерът. Проектът използва честота на микроконтролера от 8 MHz, използва се PWM честота от 125 kHz, следователно делителят е 8/125 = 64
0x6C в двоичната бройна система 1101100, отворете листа с данни на Atmega8 и вижте описанието на регистъра TCCR2, така че тук е 1101 100 последните цифри са 100 и отговарят за избора на работна честота на ШИМ

Да преминем направо към програмата:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #включи #включи void main(void) ( PORTB= 0x00; DDRB= 0x08; ASSR= 0x00; TCCR2= 0x6C; TCNT2= 0x00; OCR2= 0x00; TIMSK= 0x00; while (1) ( while (OCR2)< 0xff ) { OCR2= OCR2+ 0x01 ; delay_ms(5 ) ; } while (OCR2>0x00 ) ( OCR2= OCR2- 0x01 ; delay_ms(5 ) ; ) ) ; )

#включи #включи void main(void) ( PORTB=0x00; DDRB=0x08; ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) ( while(OCR2)<0xff) { OCR2=OCR2+0x01; delay_ms(5); } while(OCR2>0x00) (OCR2=OCR2-0x01; delay_ms(5); )); )

Кодът е невероятно прост: първо, в цикъл, увеличаваме пълнежа от 0 до 255(ff), след което го намаляваме от 255 до 0.
И накрая, видео как трябва да работи всичко. Успех в обучението)

Резултат 1 Резултат 2 Резултат 3 Резултат 4 Резултат 5

Цифровите устройства, например, микроконтролерът може да работи само с две нива на сигнала, т.е. нула и едно или изключено и включено. По този начин можете лесно да го използвате за наблюдение на състоянието на натоварване, като например включване или изключване на светодиод. Можете също така да го използвате, за да управлявате всяко електрическо устройство, като използвате подходящите драйвери (транзистор, триак, реле и т.н.), но понякога се нуждаете от нещо повече от „включване“ и „изключване“ на устройството. Така че, ако искате да контролирате яркостта на LED (или лампа) или скоростта на DC мотор, цифровите сигнали просто не могат да го направят. Тази ситуация е много често срещана в цифровите технологии и се нарича Широчинно-импулсна модулация (PWM).

Почти всички съвременни микроконтролери имат специализиран хардуер за генериране на ШИМ сигнал. В този урок ще научим основите на PWM техниката и по-късно ще видим как да внедрим PWM с помощта на AVR микроконтролери.

Цифрови устройства като микроконтролер могат да генерират само две нива на изходните линии, високо = 5V и ниско = 0V. Но какво, ако искаме да получим 2,5 или 3,1 или всяко напрежение между 0-5V? За да направим това, вместо да генерираме постоянно постоянно напрежение на изхода, ще генерираме правоъгълна вълна, която има високи = 5V и ниски = 0V нива (вижте Фигура 1).

Фиг. 1

Фигурата показва, че сигналът остава последователно на ниски и високи нива за известно време. T0 - ниско ниво, T1 - високо ниво. Периодът на сигнала ще бъде равен на T = T0+T1. Период на пулса- това е интервалът от време между две характерни точки на два съседни импулса. Обикновено периодът се измерва между две повишения или спадове на съседни импулси и се обозначава с главна буква T.

Периодът на повторение на импулса е пряко свързан с честотата на импулсната последователност и може да се изчисли по формулата: T = 1/F

Ако дължината на импулса T1 е точно равна на половината от периода T, тогава такъв сигнал често се нарича "квадратна вълна".

Работният цикъл на импулсите е съотношението на периода на повторение на импулса към тяхната продължителност и се обозначава с буквата S: S = T/T1

Коефициентът на запълване е безразмерна величина и няма мерни единици, но може да се изрази като процент. Терминът често се среща в английски текстове Работен цикъл, това е така нареченият работен цикъл или стойността на работен цикъл на ШИМ. Работният цикъл D е реципрочната стойност на работния цикъл.

Коефициент на запълванеобикновено се изразява като процент и се изчислява по формулата: D=1/Sили нещо такова D = T1/T*100%

На фигурата по-горе (фиг. 1) можете да видите, че T1 = T0, това е равно на половината от периода от време. Така работният цикъл на ШИМ е 50%. Ако честотата на такива импулси е достатъчно висока (да речем 5000 Hz), тогава получаваме половината от 5V, т.е. 2,5 V. По този начин, ако изходът на контролера е свързан към двигателя (с помощта на подходящи драйвери), той ще работи на 50% от пълната си скорост. Техниката PWM използва този факт, за да създаде напрежение между две нива (например между 0-12V). Номерът е, че когато стойността на работния цикъл се промени между 0-100%, получаваме същия процент от входното напрежение на изхода. По-долу са някои примери за PWM сигнали с различни работни цикли.

Ако инсталирате R/C филтър на изхода, можете да получите чисто ниво на DC сигнал, а не квадратни вълни. Но това не е необходимо за мотори с четка или за контролиране на яркостта на светодиодите. За да направите това, можете да приложите PWM сигнал директно към драйвера (например биполярен транзистор, MOSFET и др.).


Под 16-битов режим на работа. Таймерът се разбира като неговия алгоритъм за отчитане и поведението на асоциирания с него изход на формовчика на импулси, което се определя от комбинация от битове, които определят режима на работа на таймера (WGMn3-0) и режима на генериране на изходен сигнал (COMnx1:0) . В този случай битовете за настройка на режима на генериране на изходния сигнал не влияят на алгоритъма за броене, т.к. Алгоритъмът на броене зависи само от състоянието на битовете за настройка на режима на работа на таймера. В режимите на PWM, битовете COMnx1:0 ви позволяват да активирате/деактивирате инверсията на генерирания PWM изход (т.е. изберете PWM с инверсия или PWM без инверсия). За не-PWM режими битовете COMnx1:0 определят какво действие да се предприеме, когато възникне съвпадение: нулиране, настройка или инвертиране на изхода (вижте също „Блок за кондициониране на изходен сигнал“ и „16-битови времеви диаграми на таймер-брояч“) .

Нормална операция

Най-простият режим на работа е нормален режим (WGMn3-0 = 0b0000). В този режим броячът работи като сумиращ (увеличаващ) брояч и броячът не се нулира. Броячът препълва при преминаване през максималните 16 бита. стойност (0xFFFF) до долната граница на броя (0x0000). По време на нормална работа, флагът за препълване на таймер-брояч TOVn ще бъде зададен на същия тактов цикъл, когато TCNTn достигне нула.

Всъщност флагът за препълване на TOVn е 17-ият бит на таймера-брояч, с изключение на това, че той е само зададен, а не изчистен. Въпреки това, това свойство може да се използва програмно за увеличаване на разделителната способност на таймера чрез прекъсване на препълване на таймера, при което флагът TOVn автоматично се нулира. Няма специални ситуации за нормална работа, така че ново състояние на измервателния уред може да бъде записано по всяко време.

В нормален режим можете да използвате блока за улавяне. Трябва обаче да се гарантира, че максималният интервал от време между появата на външни събития не надвишава периода на препълване на брояча. Ако това условие не е изпълнено, е необходимо да се използва прекъсване при препълване на таймер-брояч или предскалер.

Блокът за сравнение може да се използва за генериране на прекъсвания. Не се препоръчва използването на изхода OCnx за генериране на сигнали при нормална работа, т.к в този случай ще бъде изразходвана значителна част от времето на процесора.

Режим на нулиране на таймера за съвпадение (CTC)

В режим CTC (WGM01, WGM00 =0b10), регистърът OCR0 се използва за задаване на резолюцията на брояча. Ако режимът CTC е зададен и стойността на брояча (TCNT0) съвпада със стойността на регистъра OCR0, броячът се нулира на нула (TCNT0=0). По този начин OCR0 определя най-високия брой на брояча и, следователно, неговата разделителна способност. Този режим осигурява по-широк диапазон на регулиране на честотата на генерираните правоъгълни импулси. Той също така опростява работата на външния брояч на събития.

В режим на нулиране на таймера при съвпадение (WGMn3-0 = 0b0100 или 0b1100), разделителната способност на таймера се задава от регистрите OCRnA или ICRn. В режим CTC броячът (TCNTn) се нулира, ако стойността му съвпада със стойността на регистъра OCRnA (WGMn3-0 = 0b0100) или ICRn (WGMn3-0 = 0b1100). Стойността на регистъра OCRnA или ICRn определя горната граница на броя и следователно разделителната способност на таймера. Този режим осигурява по-широк диапазон на регулиране на честотата на генерираните правоъгълни импулси. Той също така опростява работата на външния брояч на събития. Времевата диаграма на работата на таймера в режим CTC е показана на Фигура 1. Броячът (TCNTn) увеличава състоянието си, докато се появи съвпадение със стойността на OCRnA или ICRn, след което броячът (TCNTn) се нулира.

Фигура 1 – Времева диаграма за STS режим

Когато се достигне горната граница на броя, може да се генерира прекъсване с помощта на флаговете OCFnA или ICFn, съответстващи на регистрите, използвани за задаване на горната граница на броя. Ако прекъсването е разрешено, тогава рутината за прекъсване може да се използва за актуализиране на горната граница на броя. Въпреки това, настройването на горната стойност на броенето близо до долната гранична стойност на броенето, когато броячът работи без предварителна скала или с малка стойност на предварителна скала, трябва да се извършва с изключителна предпазливост, т.к. В режим CTC няма двойно буфериране. Ако стойността, записана в OCRnA или ICRn, е по-малка от текущата стойност на TCNTn, броячът ще се нулира, когато възникне условието за съвпадение, когато достигне максималната стойност (0xFFFF), след което се нулира на 0x0000 и достига новата стойност на OCRnA или ICRn. В много случаи тази ситуация не е желателна. Алтернатива е бързият PWM режим, където регистърът OCRnA определя горната граница на броя (WGMn3-0 = 0b1111), т.к. в този случай OCRnA е двойно буфериран.

За генериране на сигнал в режим CTC, изходът OCnA може да се използва за промяна на логическото ниво при всяко съвпадение чрез задаване на режим на превключване (COMnA1, COMnA0 = 0b01). Стойността OCnA ще присъства на щифт на порт само ако посоката на изхода е указана за този щифт. Максималната честота на генерирания сигнал е fOC0 = fclk_I/O/2, ако OCRnA = 0x0000. За други стойности на OCRn честотата на генерирания сигнал може да се определи по формулата:

където променливата N указва коефициента на разделяне на предскалера (1, 8, 32, 64, 128, 256 или 1024).

Както при нормална работа, флагът TOV0 се задава на същия таймер, когато стойността му се промени от 0xFFFF на 0x0000.

Бърз ШИМ режим

Режимът на бърза широчинно-импулсна модулация (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) е проектиран да генерира PWM импулси с повишена честота. За разлика от други режими на работа, този използва работа с еднопосочен брояч. Броенето се извършва в посока от долната към горната граница на броене.

Ако е зададен неинвертиращ изходен режим, тогава, когато TCNTn и OCRnx съвпадат, сигналът OCnx се настройва и нулира на горната граница на броене. Ако е указан режим на инвертиране, изходът на OCnx се нулира при съвпадение и се настройва на лимита за висок брой. Благодарение на еднопосочното броене, работната честота за този режим е два пъти по-висока в сравнение с режима PWM с фазова корекция, където се използва двупосочно броене. Възможността за генериране на високочестотни PWM сигнали прави използването на този режим полезно при задачи за стабилизиране на мощността, коригиране и цифрово-аналогово преобразуване. Високата честота в същото време позволява използването на външни елементи с физически малки размери (индуктори, кондензатори), като по този начин се намалява общата цена на системата.

Разделителната способност на ШИМ може да бъде фиксирана 8, 9 или 10 бита или зададена от регистъра ICRn или OCRnA, но не по-малко от 2 бита (ICRn или OCRnA = 0x0003) и не повече от 16 бита (ICRn или OCRnA = 0xFFFF). Разделителната способност на ШИМ при дадена горна гранична стойност (UL) се изчислява, както следва:

В бърз PWM режим броячът се увеличава, докато стойността му съвпадне с една от фиксираните стойности 0x00FF, 0x01FF или 0x03FF (ако WGMn3:0 = съответно 0b0101, 0b0110 или 0b0111), стойността в ICRn (ако WGMn3:0 = 0b1110) или стойността в OCRnA (ако WGMn3:0 = 0b1111) и след това нулирайте до следващото отметка на часовника на таймера. Времевата диаграма за бърз PWM режим е показана на Фигура 2. Фигурата показва бърз PWM режим, когато регистърът OCRnA или ICRn се използва за задаване на горната граница. Стойността на TCNTn във времевата диаграма е показана като функционална графика, за да илюстрира еднопосочното броене. Диаграмата показва както инвертирани, така и неинвертирани ШИМ изходи. Къса хоризонтална линия показва точки на графиката TCNTn, където стойностите на OCRnx и TCNTnx съвпадат. Флагът за прекъсване на OCnx се задава, когато възникне съвпадение.

Фигура 2 – Времева диаграма за бърз ШИМ режим

Флагът за препълване на таймер-брояч (TOVn) се задава всеки път, когато броячът достигне горната си граница. Освен това, същият тактов импулс, заедно с флага TOVn, може да зададе флаговете OCnA или ICFn, ако регистърът OCRnA или ICRn се използва съответно за задаване на горната граница. Ако едно от тези прекъсвания е разрешено, тогава програмата за прекъсване може да актуализира горната граница на броя и праговете за сравнение.

Ако стойността на горната граница на броя се промени, тогава трябва да бъде изпълнено условието, че записаната нова горна гранична стойност е по-голяма или равна на стойностите във всички регистри на праговите стойности за сравнение. В противен случай съвпадение между TCNTn и OCRnx никога няма да възникне. Обърнете внимание, че когато използвате фиксирани горни гранични стойности, неизползваните битове се маскират до 0 при запис в регистрите OCRnx.

Механизмът за модификация на регистъра ICRn се различава от OCRnA, когато се използва за задаване на горната граница. Регистърът ICRn не е двойно буфериран. Това означава, че ако в ICRn се запише малка стойност, докато броячът работи с малко или никакво предварително мащабиране, съществува риск от записване на стойност в ICRn регистъра, която е по-малка от текущата стойност на TCNTn. В резултат на това в тази ситуация срещата в горната част на броя ще бъде пропусната. В този случай броячът ще достигне максималната си стойност (0xFFFF), ще се рестартира при 0x0000 и едва тогава ще генерира съвпадение. Регистърът OCRnA съдържа двойна буферна схема, така че може да бъде модифициран по всяко време.

class="eliadunit">

Ако се направи запис за адрес на OCRnA, стойността всъщност се поставя в OCRnA буферния регистър. Ако възникне съвпадение между TCNTn и горната част на брояча, тогава следващият тактов цикъл на таймера е копирането на буферния регистър в регистъра на прага за сравнение OCRnA. Регистърът се актуализира в същия часовников цикъл, когато TCNTn се нулира и флагът TOVn се задава.

Препоръчително е да използвате регистъра ICRn за задаване на горната граница, ако горната граница на броя е константа. В този случай регистърът OCRnA също се освобождава, за да генерира PWM сигнал на изхода OCnA. Въпреки това, ако честотата на ШИМ се променя динамично (поради промяна на горната граница), тогава в този случай е по-изгодно да използвате регистъра OCRnA, за да зададете горната граница, т.к. поддържа двойно буфериране.

В режим на бърза ШИМ сравнителните единици ви позволяват да генерирате ШИМ сигнали на щифтовете OCnx. Ако COMnx1:0 = 0b10, тогава ШИМ е зададен без инверсия на изхода, а ако COMnx1:0 = 0b11, тогава е зададен режим на ШИМ с инверсия на изхода (вижте Таблица 59). Действителната OCnx стойност може да се наблюдава на щифта на порта, ако е настроена на изходна посока (DDR_OCnx). Сигналът PWM се генерира чрез настройка (нулиране) на регистъра OCnx, когато възникне съвпадение между OCRnx и TCNTn, и чрез нулиране (настройка) на регистъра OCnx заедно с нулиране на брояча (промяна от висока граница към ниска граница).

Честотата на ШИМ на изходния сигнал за дадена горна гранична стойност (UL) се определя от израза:

където N е променлива, която определя стойността на коефициента на предразпределение (1, 8, 32, 64, 128, 256 или 1024).

Записването на гранични стойности в регистъра OCRnx е свързано със специални случаи при генерирането на PWM импулси. Ако OCRnx е настроен равен на долната граница (0x0000), тогава на изхода ще се появи кратък импулс на всеки (VP+1)-ти тактов цикъл на таймера. Записването на стойност, равна на горната граница в OCRnx, ще доведе до задаване на постоянно ниво на журнал. 1 или 0 на изхода (в зависимост от полярността на изходния сигнал, избран с помощта на бита COMnx1:0).

Ако се изисква високочестотно генериране на правоъгълни вълни (правоъгълни импулси с работен цикъл от 2 или 50% запълване), тогава е необходимо да се използва бърз ШИМ режим с битове COMnA1:0 = 0b01, което причинява логическото ниво при изхода OCnA за превключване (инвертиране) при всяко съвпадение. Това е приложимо само ако OCRnA се използва за задаване на горната граница (WGMn3-0 =0b1111). Максималната генерирана честота на квадратна вълна в този случай е fOCnA = fclk_I/O/2, ако OCRnA = 0x0000. Тази функция е подобна на превключването на OCnA в режим CTC, с изключение на двойното буфериране, което присъства в режим бърз PWM.

Режим на модулация на ширината на импулса с фазова корекция (Phase Correct)

Режимът на фазово коригирана импулсна модулация (PWM FC) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 или 0b1011) е проектиран да генерира фазово коригиран PWM сигнал с висока резолюция. Режимът PWM FC се основава на двупосочната работа на таймер-брояч. Броячът преминава от ниска граница (0x0000) до висока граница и след това обратно от висока граница към ниска граница. Ако изходният режим на формовчика на импулси е настроен на неинвертиращ, изходът OCnx се нулира/настройва, когато стойностите на TCNTn и OCRnx съвпадат по време на броене нагоре/надолу. Ако режимът на инвертиране на изхода е зададен, тогава, напротив, по време на директно броене се извършва настройката, а по време на обратното броене изходът OCnx се нулира. При двупосочна работа максималната честота на PWM сигнала е по-малка, отколкото при еднопосочна работа, но поради такива характеристики като симетрия в режимите на PWM с двупосочна работа, тези режими се предпочитат да се използват при решаване на проблеми с управлението на задвижването.

Разделителната способност на ШИМ в този режим може да бъде или фиксирана (8, 9 или 10 бита) или зададена с помощта на регистъра ICRn или OCRnA. Минималната разделителна способност е 2 бита (ICRn или OCRnA = 0x0003), а максималната е 16 бита (ICRn или OCRnA = 0xFFFF). Ако е зададена горна граница, тогава ШИМ резолюцията в този режим се определя, както следва:

В режим PWM FC броячът се увеличава, докато достигне една от фиксираните стойности 0x00FF, 0x01FF или 0x03FF (съответно за WGMn3-0 = 0b0001, 0b0010 или 0b0011), както и стойност, равна на ICRn (ако WGMn3- 0 = 0b1010) или OCRnA (ако WGMn3 :0 = 0b1011). Освен това, когато се достигне горната граница, броячът променя посоката на броене. Стойността на TCNTn остава на горната граница за един тактов цикъл на таймера. Времевата диаграма за PWM PC режим е показана на Фигура 3. Фигурата показва PWM PC режим с използване на OCRnA или ICRn регистъра за задаване на горната граница. Състоянието на TCNTn е представено като функционална графика, за да илюстрира двупосочно броене. Фигурата показва както неинвертиран, така и инвертиран ШИМ изход. Късите хоризонтални линии показват точки на графиката TCNTn, където има съвпадение със стойността на OCRnx. Флагът за прекъсване на OCnx се задава, когато възникне съвпадение.

Фигура 3 – Времева диаграма за режим PWM FC

Флагът за препълване на таймер-брояч (TOVn) се задава всеки път, когато броячът достигне долната си граница. Ако регистърът OCRnA или ICRn се използва за задаване на горната граница, тогава флагът OCnA или ICFn се задава съответно със същия тактов импулс, при който регистърът OCRnx е актуализиран от буферния регистър (в горната част на брояча). Флаговете за прекъсване могат да се използват за генериране на прекъсване, когато брояч достигне ниска или висока граница.

Когато променяте стойността на горната граница на броя, трябва да се уверите, че тя е по-голяма или равна на стойностите във всички регистри за сравнение. В противен случай съвпадение между TCNTn и OCRnx никога няма да възникне. Обърнете внимание, че когато използвате фиксирани стойности на горния брой, неизползваните битове се изчистват до нула при запис в регистрите OCRnx. Третият период на Фигура 53 илюстрира случая, когато динамична промяна в горната граница на броя води до генериране на асиметричен импулс. Тази функция се основава на времето за актуализиране на OCRnx регистъра. Тъй като актуализацията на OCRnx се извършва в горната част на броя, периодът на ШИМ започва и завършва в горната част на броя. Това означава, че продължителността на обратното броене се определя от предишната горна гранична стойност, а продължителността на броенето напред се определя от новата горна гранична стойност. Ако тези две стойности са различни, тогава продължителността на броенето напред и назад също ще бъде различна. Разликата в продължителността води до асиметрия на изходните импулси.

Ако задачата е да промените горната граница, докато броячът работи, тогава вместо този режим се препоръчва да използвате режим PWM PFC (корекция на фазата и честотата). Ако се използва статична горна гранична стойност, тогава практически няма разлики между тези режими.

В режим PWM FC сравнителните модули ви позволяват да генерирате PWM сигнали на щифтовете OCnx. Ако зададете COMnx1:0 = 0b10, тогава ШИМ изходът ще бъде без инверсия, а ако COMnx1:0=0b11, тогава с инверсия. Действителната стойност на OCnx може да се наблюдава на щифта на порта, ако регистърът за посока на данните за този щифт на порта е настроен на изходна посока (DDR_OCnx). Сигналът PWM се генерира чрез настройване (нулиране) на регистъра OCnx, когато стойностите на OCRnx и TCNTn съвпадат по време на преброяване, и чрез нулиране (настройване) на регистъра OCnx, когато има съвпадение между OCRnx и TCNTn по време на броене надолу. Получената честота на PWM сигнала в режим PWM FC при дадена горна граница (UL) може да се изчисли с помощта на следния израз:

Записването на гранични стойности в регистъра OCRnx е свързано със специални случаи при генерирането на PWM сигнали в режим PWM FC. Ако зададете ШИМ режим без инверсия и зададете OCRnx равен на долната граница, тогава изходът ще бъде непрекъснато настроен на log. 0 и ако е равно на горната граница, тогава на изхода винаги присъства дневник. 1. За ШИМ с инверсия, посочените нива трябва да се заменят с противоположните.

Ако укажете да използвате OCnA като горна граница (WGMn3:0 = 0b1011) и зададете COMnA1:0 =0b01, на изхода на OCnA ще се генерира квадратна вълна.

Режим на модулация на ширината на импулса с корекция на фазата и честотата (Phase and Frequency Correct)

Режимът на широчинно-импулсна модулация с фазова и честотна корекция (PWM PFC) (WGMn3-0 = 0b1000 или 0b1001) е проектиран да генерира PWM импулси с висока разделителна способност с фазова и честотна корекция. Точно като режима PWM FC, режимът PWM FC се основава на двупосочната работа на брояча. Броячът преминава от ниска граница (0x0000) до висока граница и след това обратно от висока граница към ниска граница. Ако е зададен неинвертиращ ШИМ режим, изходът OCnx се изчиства, ако възникне съвпадение между TCNTn и OCRnx по време на преброяване нагоре, и се задава, ако настъпи съвпадение по време на преброяване надолу. В режим на обръщане операцията е обратна. Двупосочната работа в сравнение с еднопосочната е свързана с генерирането на по-ниски честоти. Въпреки това, поради симетрията в режимите на ШИМ с двупосочно броене, тяхното използване е за предпочитане при задачи за управление на задвижване.

Основната разлика между режимите PWM FC и PWM FC е моментът, в който OCRnx регистърът се актуализира от OCRnx буферния регистър (вижте Фигура 3 и Фигура 4).

Разделителната способност на ШИМ в този режим може да се настрои с помощта на регистъра ICRn или OCRnA. Минималната разделителна способност е 2 бита (ICRn или OCRnA = 0x0003), а максималната разделителна способност е 16 бита (ICRn или OCRnA = 0xFFFF). Разделителната способност на ШИМ в битове може да се изчисли с помощта на следния израз:

В режим FCC PWM броячът се увеличава, докато съвпадне със стойността в ICRn (WGMn3:0 = 0b1000) или в OCRnA (WGMn3:0 = 0b1001). Това означава достигане на върха на броенето, след което посоката на броенето се променя. Стойността на TCNTn остава в горната част на броя за един тактов цикъл на таймера. Времевата диаграма за режима PWM FCC е показана на Фигура 54. Фигурата показва режима PWM FCC, когато горната граница на броене е зададена от регистъра OCRnA или ICRn. Стойността на TCNTn е показана като функционална графика, за да илюстрира двупосочното броене. Диаграмата показва както неинвертиращи, така и инвертиращи ШИМ изходи. Късите хоризонтални линии показват точки на графиката на TCNTn, където се получава съвпадение между OCRnx и TCNTn. Флагът за прекъсване OCnx се задава след възникване на съвпадение.

Фигура 4 – Времева диаграма на ШИМ режим с фазова и честотна корекция

Флагът за препълване на таймер-брояч (TOVn) се задава на същия тактов цикъл, когато регистрите се актуализират със стойността от буферния регистър (на долната граница на броене). Ако регистърът OCRnA или ICRn се използва за задаване на горната граница, тогава, когато броячът достигне горната граница, флагът OCnA или ICFn се задава съответно. Флаговете за прекъсване могат да се използват за генериране на прекъсване, когато брояч достигне висока или ниска граница.

Когато променяте горната граница, трябва да се уверите, че новата стойност е по-голяма или равна на стойностите във всички регистри на праговите стойности за сравнение. В противен случай, ако горната граница е зададена на стойност, по-малка от която и да е от стойностите в регистрите на праговите стойности за сравнение, съвпадение между TCNTn и OCRnx никога няма да възникне.

Фигура 4 показва, че за разлика от режима PWM FC, генерираният изходен сигнал е симетричен във всички периоди. Тъй като регистрите OCRnx се актуализират при долната граница на броене, продължителността на броенето напред и назад винаги е еднаква. В резултат на това изходните импулси имат симетрична форма и следователно коригирана честота.

Използването на регистъра ICRn за задаване на горната граница се препоръчва, ако стойността на горната граница е константа. В този случай регистърът OCRnA също се освобождава за широчинно-импулсна модулация на импулсите на щифта OCnA. Въпреки това, ако трябва динамично да промените честотата на ШИМ чрез промяна на горната граница, тогава се препоръчва да използвате регистъра OCRnA, за да зададете горната граница поради двойното му буфериране.

В режим PWM сравнителните единици ви позволяват да генерирате PWM импулси на щифта OCnx. Ако COMnx1:0 = 0b10, тогава е зададен неинвертиращ PWM изход, а ако COMnx1:0=0b11, тогава инвертиращ (виж таблица 60). Стойността OCnx ще присъства само на съответния щифт на порта, ако е настроен на изходна посока. Сигналът PWM се генерира чрез настройване (нулиране) на регистъра OCnx при съвпадение между OCRnx и TCNTn по време на нарастващо броене и нулиране (настройване) на регистъра OCnx при съвпадение между OCRnx и TCNTn по време на броене надолу. Честотата на ШИМ в този режим с дадена горна граница (UP) на броене се определя, както следва:

където N е коефициентът на разделяне на предскалера (1, 8, 32, 64, 128, 256 или 1024).

Записването на гранични стойности в регистъра OCRnx е свързано със специални случаи при генерирането на PWM сигнали в този режим. Ако зададете OCRnx равно на долната граница (0x0000), тогава в неинвертиращ режим изходът постоянно ще има ниско логическо ниво, а когато записвате стойност, равна на горната граница, изходът ще има високо логическо ниво за дълго време. В режим на обръщане дадените нива ще бъдат противоположни.

Ако OCRnA се използва за задаване на горната граница (WGMn3:0 = 0b1001) и COMnA1:0 = 0b01, тогава на изхода на OCnA ще се генерира квадратна вълна.


Хардуерното внедряване на PWM осигурява несъмнени предимства пред софтуера, тъй като освобождава процесора от ненужен и тромав код и време за неговата поддръжка, а също така предоставя повече възможности за използване на работа с PWM. Достатъчно е да инициализирате таймера/брояча (въведете необходимите стойности в регистрите, използвани от таймера/брояча) и таймерът/броячът може да работи независимо от процесора; съответно процесорът може да се справя с други задачи, само понякога контакт в необходимия момент за настройка или промяна на режима или получаване на резултати от таймера/брояча.

Описание на флаговете за прекъсване

T1 може да генерира прекъсване, когато:

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

T2 може да генерира прекъсване, когато:

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

Флаговете на всички прекъсвания са в регистъра TIFR, а разрешаването/деактивирането на прекъсванията е в регистъра TIMSK.

TIMSK регистър битове
Регистрирам7 6 5 4 3 2 1 0
ТИМСК OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0* TOIE0
  • OCIE2- Флаг за разрешаване на прекъсване за събитието „съвпадение“ на таймера/брояча T2
  • TOIE2- Флаг за разрешаване на прекъсване на таймер/брояч при препълване на T2
  • TICIE1- Флаг за разрешаване на прекъсване за събитието "захващане" на таймера/брояча T1
  • OCIE1A- Флаг за разрешаване на прекъсване за събитието „съвпадение А” на таймера/брояча T1
  • OCIE1B- Флаг за разрешаване на прекъсване за събитието „съвпадение B” на таймера/брояча T1
  • TOIE1- Флаг за разрешаване на прекъсване на таймер/брояч при препълване на T1
  • OCIE0*- Флаг за разрешаване на прекъсване за събитието "съвпадение" на таймера/брояча T0 (* - липсва в ATmega8)
  • TOIE0- Флаг за активиране на прекъсване на таймер/брояч при препълване
  • OCF2- Флаг за прекъсване на събитието “съвпадение” на таймера/брояча Т2
  • TOV2- Флаг за прекъсване при препълване на таймера/брояча T2
  • ICF1- Флаг за прекъсване на събитието “capture” на таймера/брояча T1
  • OCF1A- Флаг за прекъсване за събитие "съвпадение А" на таймер/брояч Т1
  • OCF1B- Флаг за прекъсване за събитие "съвпадение B" на таймер/брояч Т1
  • TOV1- Флаг за прекъсване на таймера/брояча при препълване на T1
  • OCF0- Флаг за прекъсване на събитието “съвпадение” на таймера/брояча T0
  • TOV0- Флаг за прекъсване при препълване на таймера/брояча T0

Описание на работата на таймера/брояча T1 в контролера ATmega8/16

Шестнадесет-битовият таймер/брояч T1 може да се използва за генериране на времеви интервали, преброяване на външните сигнали и генериране на PWM сигнали с различни работни цикли и продължителност на щифтове OC1A и OC1B. В допълнение, чрез външен сигнал от щифта ICP1 или от аналогов компаратор, T1 може да запази текущото си състояние в отделен регистър за улавяне ICR1.

Регистър битове TCCR1A:TCC1B:TCNT1:OCR1A:OCR1B:ICR1
Регистрирам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

Всеки 16-битов регистър е физически разположен в два 8-битови регистъра, така че при четене на запис в тях трябва да се извършат две операции. При запис първо се зарежда старшият байт, а след това малкият; при четене, напротив, първо се чете ниският байт, а след това високият.

TCCR1A:TCCR1B- 8-битови контролни регистри за таймер/брояч T1

TCNT1- 16-битов таймер/брояч регистър T1. В зависимост от работния режим, съдържанието на този регистър се нулира, увеличава (увеличава с 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- Тези битове определят режима на работа на таймера/брояча T1

CS22:CS21:C20- Битове, които определят източника на сигнала на T1 таймера/брояча.

Избор на режим на работа на таймер/брояч Т1
WGM13WGM12WGM11WGM10Режим на работаМодул за акаунт (ТОП)
0 0 0 0 нормално $FFFF
0 0 0 1 Правилна фаза ШИМ

8-битов

$00FF
0 0 1 0 Правилна фаза ШИМ

9-битов

$01FF
0 0 1 1 Правилна фаза ШИМ

10-битов

$03FF
0 1 0 0 CTC (нулиране при мач) OCR1A
0 1 0 1 Бърз ШИМ

8-битов

$00FF
0 1 1 0 Бърз ШИМ

9-битов

$01FF
0 1 1 1 Бърз ШИМ

10-битов

$03FF
1 0 0 0 ICR1
1 0 0 1 Корекция на фазата и честотата на ШИМ OCR1A
1 0 1 0 Правилна фаза ШИМ ICR1
1 0 1 1 Правилна фаза ШИМ OCR1A
1 1 0 0 CTC (нулиране при мач) ICR1
1 1 0 1 Запазено *
1 1 1 0 Бърз ШИМ ICR1
1 1 1 1 Бърз ШИМ OCR1A

Избор на източник на часовник

Нормален режим

Най-простият режим на работа е Т1. За всеки импулс на тактовия сигнал броячният регистър TCNT1 се увеличава (стойността се увеличава с 1). При преминаване през стойността $FFFF на модула за броене (TOP), възниква препълване и следващият часовник започва да брои от стойността $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.

CTC режим (нулиране при мач)

В този режим T1 работи на същия принцип като в нормален режим. Разликата е, че максималната възможна стойност на регистъра за броене TCNT1 е ограничена от стойността на регистъра за сравнение OCR1A или ICR1 (вижте таблицата за избор на режим на таймер/брояч). Когато TCNT1 достигне стойността на OCR1A или ICR1, стойността на TCNT1 се нулира на TCNT1=$0000 В същото време флагът TOV1=1 се задава COM1A1:COM1A0:COM1B1:COM1B0 Определя поведението на щифта OC1A:OC1B, когато. има съвпадение.

Режим Fast PWM (бърз PWM)

Използвайки този режим, можете да генерирате високочестотен PWM сигнал. Принципът и процедурата на работа не се различават от нормалния режим, с изключение на наличието на двойно буфериране на регистъра OCR1A: OCR1B, което елиминира появата на асиметрични сигнални импулси, а също така се различава в поведението на щифтовете OC1A: OC1B ( виж таблицата).


Phase Correct PWM режим

Разликата между този режим и предишните е, че броячът работи като обратен брояч. Тъй като този режим се препоръчва от Atmel като най-подходящ за настройка на двигатели, ще го разгледаме по-подробно. Когато регистърът за броене TCNT1 достигне стойността на модула за броене (TOP) (или стойността на регистъра ICR1 или стойността на регистъра OCR1A, вижте таблицата за избор на режим на таймер/брояч), посоката на броене се променя. Когато регистърът за броене TCNT1 достигне минималната стойност ($0000), посоката на броене също се променя и в същото време се задава флагът за прекъсване TOV1 на регистъра TIFR. Също така, ако съдържанието на регистъра за броене TCNT1 и регистъра за сравнение OCR1A:OCR1B са равни, флагът OCF1A:OCF1B на регистъра TIFR се задава и състоянието на изхода OC1A:OC1B се променя според таблицата.

За да се избегнат асиметрични емисии при запис на стойност в регистъра OCR1A:OCR1B, в този режим се прилага двойно буфериране на запис. Благодарение на това действителната промяна в стойността на регистъра се променя в момента, в който регистърът на брояча TCNT1 достигне стойността на модула за броене (TOP) (или стойността на регистъра ICR1 или стойността на регистъра OCR1A, вижте избора на режим на таймер/брояч маса). Следователно, в самото начало, когато таймерът/броячът се инициализира, щифтът OC1A:OC1B няма да промени състоянието си при съвпадение, докато регистърът не достигне стойността (TOP).


Задача:Нека разработим програма за управление на яркостта на 12-волтова лампа с нажежаема жичка с помощта на ШИМ. Когато натиснете бутона „Още“, яркостта на лампата се увеличава, а когато щракнете върху бутона „По-малко“, яркостта намалява. Диаграмата на нашето бъдещо устройство е показана на фигурата. Както обикновено, използваме микроконтролера Atmega8, който ще бъде тактован от вътрешен осцилатор с честота 4 MHz. Всъщност ще получим димер; тези устройства са предназначени да регулират яркостта на осветителните тела. В наши дни LED димерите са най-разпространени.

За простота можете също да свържете светодиод към нашата верига, но ще бъде по-ясно с електрическа крушка. Бутоните са свързани с щифтове PD0, PD1. Свързваме товара към изхода PB1(OC1A)чрез резистор и MOSFET полеви транзистор, който ще ни работи като ключ (в режим на превключване). Полевият транзистор е за предпочитане, защото неговият гейт е изолиран от захранващата верига и се управлява от електрическо поле, а управляващият ток достига микроампера. Това позволява, използвайки един или два транзистора, да управлява товар с огромна мощност (до десетки ампери и десетки или стотици волта), без да натоварва микроконтролера. Като се вземе предвид и фактът, че транзисторите с полеви ефекти могат да бъдат свързани паралелно (за разлика от биполярните), е възможно да се получи още по-мощна каскада от стотици ампери.

Сега нека да разберем как микроконтролерът прилага PWM и да напишем програма. Както споменахме по-рано, нашият MK има 3 таймера и всички те могат да работят в режим PWM. Ще работим с шестнадесет-битов таймер/брояч. битове WGM13-10нека конфигурираме нашия таймер да работи с FastPWM с горна граница на броя ICR1. Принципът на програмата е следният: нашият таймер брои от 0 до 65535(0xFFFF), в регистъра ICR1Нека въведем числото 255, това ще бъде горната граница на броя на таймера (TOP), честотата на PWM сигнала ще бъде постоянна. Освен това нашият таймер е конфигуриран така, че ако регистърът за броене и регистърът за сравнение съвпадат (TCNT1 = OCR1A), изходът на контролера ще се превключи OC1A. Работният цикъл на PWM може да се промени чрез запис в регистъра за сравнение OCR1Aопределено число от 0 до 255, колкото по-голямо е това число, толкова по-голям е коефициентът на запълване, толкова по-ярко ще свети лампата. В зависимост от това кой бутон е натиснат, променливата се променя аз, и след това се записва в регистъра OCR1A.

Пълният текст на програмата е представен по-долу. Коментарите описват по-подробно работата на програмата.

/***Урок No8. Генериране на PWM сигнали***/ #include #включи int main(void) (unsigned int i=0; //дефиниране на променлива i /***Конфигуриране на I/O портове***/ PORTB = 0x00; DDRB |= (1<< PB1); PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы DDRD = 0x00; /***Настройка таймера***/ TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1 |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя TCNT1 = 0x00; // начальная установка счетчика ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255, // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz OCR1A = 0x00; // начальный коэффициент заполнения ШИМ /***Основной цикл программы***/ while(1) { if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата { if (i < 254) { // коэффициент заполнения ШИМ изменяется от 0 до 255 i=i+1; // увеличиваем i на единицу OCR1A = i; // записываем переменную в регистр сравнения _delay_ms(30); // задержка 30ms } } if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата { if (i >0) // Коефициентът на запълване на PWM се променя от 255 на 0 ( i--; // намалява i с едно (можете също да напишете това) OCR1A = i; // запис на променлива в регистъра за сравнение _delay_ms(30); // забавяне 30ms ) ) ) )

внимание!Първо захранваме микроконтролера, след което трябва да се уверите, че транзисторът е свързан към MK щифта и едва след това подаваме захранване към веригата с лампата и полевия транзистор. В противен случай може да изгорите транзистора. Факт е, че когато са изключени, „краката“ на MK „висят във въздуха“ - те не са свързани с нищо и върху тях възникват смущения. Тези слаби смущения са достатъчни, за да отворят частично много чувствителен транзистор с полеви ефекти. Тогава неговото съпротивление между дрейн и източник ще спадне от няколко MOhm до няколко ома или части от ома и през него ще тече голям ток към лампата. Но транзисторът няма да се отвори напълно, защото за това трябва да приложите не 1-3 V смущения към портата, а стабилни 5 V и съпротивлението му ще бъде много по-голямо от минималното. Това ще доведе до отделяне на голямо количество топлина върху него и той ще пуши и евентуално ще изгори.