Нещодавно у мене були певні причини почати експериментувати з ШІМ, і я виявив, що (як вказував один із коментарів) частота, здається, змінюється в залежності від робочого циклу - Bizzare, правда? Виявляється, Broadcom реалізував "врівноважену" ШІМ, щоб зробити включені та вимкнені ШІМ імпульси максимально рівномірно розподіленими. Вони дають опис алгоритму та ще кілька обговорень на стор. 139 своєї таблиці даних:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Тож, що ви дійсно хочете, це перевести ШІМ у режим пробілу знаків, що дасть вам традиційну (і легко передбачувану) ШІМ, яку ви шукаєте:
pwmSetMode(PWM_MODE_MS);
Решта відповіді передбачає, що ми перебуваємо в режимі пробілу розмітки.
Я також кілька експериментував із допустимим діапазоном значень для pwmSetClock()
та pwmSetRange()
. Як зазначається в одній з інших відповідей, дійсний діапазон для, pwmSetClock()
здається, переходить від 2 до 4095, тоді як допустимий діапазон для pwmSetRange()
до 4096 (я не намагався знайти нижню межу).
Діапазон і тактова частота (краще ім’я, мабуть, дільник) впливають на частоту. Діапазон також впливає на роздільну здатність, тому, хоча можливо використовувати дуже низькі значення, є практичне обмеження, наскільки низьким ви, ймовірно, захочете піти. Наприклад, якщо ви використовували діапазон 4, ви могли б досягти більш високих частот, але ви зможете встановити лише робочий цикл на 0/4, 1/4, 2/4, 3/4 або 4/4.
Тактова частота PWM Raspberry Pi має базову частоту 19,2 МГц. Ця частота, поділена на аргумент до pwmSetClock()
, є частотою, з якою збільшується лічильник ШІМ. Коли лічильник досягає значення, рівного вказаному діапазону, він скидається до нуля. Хоча лічильник менший за заданий робочий цикл, вихід високий, інакше вихід низький.
Це означає, що якщо ви хочете встановити ШІМ на певну частоту, ви можете використовувати таке співвідношення:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Якщо ви використовуєте гранично допустимі значення для pwmSetClock()
і pwmSetRange()
, ви отримаєте мінімально досяжну частоту апаратних ШІМ ~ 1,14 Гц. Це, безумовно, призведе до видимого мерехтіння (справді більше спалаху). Я підтвердив вищевказане рівняння за допомогою осцилографа, і, здається, це має місце. На верхню межу частоти впливатиме потрібна роздільна здатність, як описано вище.
pwmWrite()
. Не те, що я б очікував, що трапиться