Здравейте,
преди няколко дни разлиствах пак документацията на Microchip относно ШИМ възможностите на техните контролери и ми направи отново впечатление как описват подкарването на ШИМ с определен duty cycle - човек остава с впечатлението, че честотата на ШИМ-а се избира предварително и се фиксира - после само се мени запълването, което дава N възможни стъпки на запълване (равномерни интервали). При това N обикновено е степен на двойката (примерно онзи PIC поддържа 10-битов ШИМ, duty cycle-а е дроб със знаменател 1024 и променлив числител).
Тук човек може да се запита, "абе защо да ми е фиксиран знаменателя?". И конкретен пример - ако целим запълване точно 1/3, то най-добре да променим дължината на цикъла (и честотата на ШИМа), така че цикълът да има 3 деления, и да е запълнено 1 от 3-те. Изобщо, може да се намеси цялата артилерия зад любимата ми гимназиална материя -
редиците на Фарей - и да се ползват произволни рационални дроби за определяне на duty cycle-a. Не само, че може да се намеси, ами се е утепало за нея - ето вижте за илюстрация -
възможните стъпки при 5-битов шим, N = 32:

ето и след като включим всички възможни несъкратими дроби със знаменател ≤ 32:

Редицата на Фарей е с неравномерна "дупка", но пък покритието в общия случай е много по-добро. По ирония на съдбата, големите дупки са точно около "простичките" дроби като 1/2, 1/3 и т.н.
Всъщност, дупките тук оставят човек с впечатлението, че подобрението не е чак толкова добро. Но при повече битове, подобрението е още по-фрапантно. Ето статистика за максималната дупка между две последователни дроби при 8-битов ШИМ и фиксиран знаменател:

Нищо учудващо тук - константно 1/256 навсякъде.
Ако се оценят само максималните дупки при редицата на Фарей с дроби до знаменател 256, то се получава следната красота:

Ако се разгледа само средната дупка, то нещата вече са доста по-гладки:

T.e., ако игнорираме няколкото лоши примера, в средния случай имаме разделителна способност над една десетохилядна - или еквивалентното на
13-14 битов ШИМ! И това без допълнителен хардуер, само с малко математика - и то не особено сложна такава. Ще дам едно примерче:
Нека се колебаем дали да ползваме запълване от 2/5 (0.40 като числена стойност) и 3/7 (~0.4286). Примерно, в моята задачка, ШИМ-а го мисля да се ползва за фино задаване на постоянното напрежение на гейта на един MOSFET (след RC група, разбира се), който да играе като настройваем товар. През обратната връзка съм определил, че при 2/5 запълване токът е прекалено малко, а при 3/7 - прекалено много. Междинната дроб може да се намери с конвенционална математика - привеждане под общ знаменател (14/35 и 15/35 респективно), и средата е 29/70 (~0.4142857). Обаче знаменателят тука скача много - вече не можем да го изпълним, ако сме на 5 битов ШИМ, както беше първата графика. Теорията на Фарей ни предлага алтернативно намиране на междинната стойност, като генерира следващата дроб с най-малък знаменател, която е между двете дадени. Операцията се нарича "намиране на медиан
та" и е супер шантаво нещо (и до днес му се дивя как работи

). Правим новата дроб, като за числител ползваме сбора от числителите на входните дроби, и за знаменател - пак сбора от знаменателите на входните дроби - тотално се абстрахираме от всичко, което сме учили в училището. Т.е. новата дроб между 2/5 и 3/7 е (2+3)/(5+7) = 5/12 или ~0.416667 - не точно по средата, но достатъчно близо.
Така всъщност може да се намери най-доброто рационално приближение на произволно реално число от 0 до 1, чрез "двоично търсене" - тръгваме от дробите 0/1 и 1/1, и с многократно намиране на медиантата и отхвърляне на едната "половина", стигаме до желаната дроб. За доста хора, този метод изглежда по-лесен от развиването на египетски дроби.
Та след тея примери, се чудя аз, защо тая магия не изглежда да се ползва много в практиката. Просто търсене в гугъл на PWM + Farey не ми извежда някакви смислени резултати. В дейташийтовете на Microchip, онези прилежно обясняват как да се зафиксира знаменателя, и се бият в гърдите, как числителят се задава през двойка регистри и е двойно-буфериран, и как, от реално 8-битов ШИМ вадят 10-битов с хакове - и пропускат тотално да споменат (дори в бележка под линия) за Фарей!?! Защо, по дяволите, "знаменателят" не е също двойно-буфериран? Не знам как е при другите производители (тук сте вие да кажете как е при тях), но се чудя защо е това пренебрежение към редицата на Фарей за ШИМ приложения и има ли някави технически прични извън "бе, изглежда ми сложно"?
Как мислите?