Чому деякі штифти мають різну частоту ШІМ?


20

Згідно з посиланнямanalogWrite() на Arduino , частота ШІМ на більшості штифтів становить ~ 490 Гц. Однак це ~ 980 Гц для штифтів 5 і 6 на Uno, а для штифтів 3 і 11 на Леонардо.

Чому вони різні? Це цілеспрямована особливість дизайну чи це якось продиктовано обладнанням?

Відповіді:


23

Це не єдині частоти, доступні для ШІМ-сигналів. Однак, це частоти, визначені застосованим дошкільним приладом (який ви можете легко змінити, як описано нижче).

Кожна з 3-х пар ШІМ-штифтів прив’язана до одного таймера, кожен з яких має свою базову частоту таким чином:

  • Штифти 5 і 6 спарені на таймері0 з базовою частотою 62500 ГГц
  • Штифти 9 і 10 спарені на таймері1 з базовою частотою 31250 ГГц
  • Штифти 3 і 11 спарені на таймері2 з базовою частотою 31250 ГГц

Тоді кожен набір штифтів має таку кількість значень дозволення, які можна вибрати, які поділять базову частоту цієї пари штифтів. Доступні значення дозволів:

  • Штифти 5 і 6 мають значення попереднього дозволу 1, 8, 64, 256 та 1024
  • Штифти 9 і 10 мають значення попереднього дозволу 1, 8, 64, 256 та 1024
  • Штифти 3 та 11 мають значення попереднього дозволу 1, 8, 32, 64, 128, 256 та 1024

Різні комбінації дають різні частоти в заданому ШІМ-штифті. Зауважте, що таймер 2 (прив’язаний до штифтів 3 і 11) має більше доступних значень дошкільного приладу, що призводить до отримання більшої частоти.

Тепер, чому таймер 2 відрізняється, це окреме питання.

Редагувати: Ось список можливих частот ШІМ на контакт (з цієї статті ):

Для штифтів 6 і 5 (OC0A і OC0B):

  • Якщо TCCR0B = xxxxx001, частота - 64 кГц
  • Якщо TCCR0B = xxxxx010, частота становить 8 кГц
  • Якщо TCCR0B = xxxxx011, частота дорівнює 1 кГц (це за замовчуванням завантажувач Diecimila)
  • Якщо TCCR0B = xxxxx100, частота становить 250 ГГц
  • Якщо TCCR0B = xxxxx101, частота становить 62,5 Гц

Для штифтів 9, 10, 11 і 3 (OC1A, OC1B, OC2A, OC2B):

  • Якщо TCCRnB = xxxxx001, частота - 32 кГц
  • Якщо TCCRnB = xxxxx010, частота становить 4 кГц
  • Якщо TCCRnB = xxxxx011, частота становить 500 ГГц (це за замовчуванням у завантажувача Diecimila)
  • Якщо TCCRnB = xxxxx100, частота 125 ГГц
  • Якщо TCCRnB = xxxxx101, частота становить 31,25 Гц

TCCRnBце місце, де ви встановлюєте біти довіри для таймера n, замінюючи nна 0, 1 або 2, залежно від таймера, який ви хочете встановити. Якщо ви все ще не впевнені в бітових операціях, прочитайте цей навчальний посібник з математики .

Мої джерела:

Зауважте, що в цих джерелах, мабуть, є розбіжність щодо того, чи мають шпильки 9 і 10 таку поведінку, як 5 і 6 або 3 і 11, але ви все одно отримуєте думку. Я читаю таблицю даних, щоб спробувати визначити, що правильно, чи це різниця між платами.


1
На що ATmega стосується цієї відповіді? Я не перевіряв, але, думаю, він трохи відрізняється від контролера.
jippie

@jippie Добрий момент! Джерела посилаються на ATmega168 та 328.
Рікардо

@jippie Просто для уточнення, у моїй відповіді, номери штифтів посилаються на те, як вони призначаються на дошці Uno (наприклад, контакт 1 означає Digital Pin 1, або D1), а не IC (контактний код ATmega328 1 скидається).
Рікардо

1
Я вважаю, що ці деталі теж змінюються за допомогою дощок, Uno, Duemilanove, Mega, ...
jippie

@jippie Однозначно, так.
Рікардо

8

Мені невідомі міркування щодо дизайну, але якщо ви перевірте таблицю даних для мікроконтролера на своєму Arduino, ви помітите, що ШІМ-штифти згруповані разом і по групі, підключеній до таймера. Швидкість, з якою збільшується цей таймер, залежить від налаштованого дозволу. Якщо ви змінюєте дошкільний пристрій на певний таймер, ви змінюєте частоту ШІМ для відповідних ШІМ-штифтів. Я вважаю, що деякі таймери подвоюються для інших цілей, як millis();функція. Якщо ви зміните доскалер для цього таймера, значення, повернуті через, millis()будуть вимкнені тим же фактором.

Ви можете розрахувати налаштування для дошкільника таким чином:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ текст {MHz}} {256 × 490} \ приблизно 128 $$

prescaler = f [CPU] / (PWMresolution × f [PWM]) = 16000000 / (256 × 490) = приблизно 128.

Перевірте таблицю даних, і ви побачите, що 128 справді є одним із значень дошкільного приладу, який ви можете вибрати.


2
Хлопчик, ми сумуємо за MathJax чи що? Я сподіваюся, що ми отримаємо це активовано після бета-версії
Рікардо

1
@Ricardo У мене в браузері є кнопка MathJax; o) meta.arduino.stackexchange.com/questions/13/…
jippie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.