No, abych nezustal pri sve puvodni strohe odpovedi.
mhi: "Problem je, ze frekvence lita mezi 11.4 a 13.3 MHz ! Prijde mi to uplne desive, jako kdyby to resili pres nejaky interrupt, ktery ma silenou latenci. Neverim tomu, ze interni PLL jim takhle lita, to by prece ta wifi nemohla vubec fungovat ?! Tusite co je shnileho ve state cinskem?"
PWM generator na ESP32 se chova naprosto spravne.
Jitter vystupniho signalu je zpusoben tim, ze ackoliv je v periferii TIMER, jakozto zdroji hodinovych impulzu pro PWM periferii, pouzita frakcni synteza (10bitovy N registr a 8bitovy F registr), tak tato neni schopna generovat impulzy mimo rastr zdrojoveho hodinoveho signalu TIMERu (to umi az sofistikovane digitalni systemy zalozene na DLL apod., coz u periferie na ESP32 cekat nelze). Pri pozadavku na generovani 12MHz signalu z PWM periferie musi byt tato taktovana impulzy s opakovacim kmitoctem 24 MHz a strida vystupniho signalu nastavena na 1:1 (kazdy taktovaci impulz od timeru potom preklapi vystup PWM periferie mezi log. 0 a 1). Frakcni synteza TIMERu beziciho na 80 MHz je toho schopna docilit pouze tak, ze generuje nasledujici sekvenci taktovacich impulzu (v rastru 80MHz hodin):
...0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0..., tj. repetice pulzu se meni mezi 3 a 4 periodami 80MHz hodin, ale v prumeru je to 3,333.. periody, tj. 80 MHz/3.333... = 24 MHz.
Vystupem PWM periferie je potom tato posloupnost (opet v rastru 80MHz hodin):
...0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1...
Dostavame tedy signal, ktery ma nektere periody kratsi (6 taktu 80MHz hodin, tj. 75 ns -> 13.33... MHz) a nektere delsi (7 taktu 80MHz hodin, tj. 87,5 ns -> 11,428... MHz), a jelikoz pomer zastoupeni kratsi a delsi periody v generovanem signalu je 1 : 2, tak vysledna prumerna peroda je (1* 75 + 2 * 87,5) / 3 = 83,333... ns -> prumerny kmitocet 12 MHz.
Pokud byste chtel dosahnout stabilniho vystupu 12 MHz bez jitteru zpusobeneho frakcni syntezou, musite ji vyradit, tj. zajistit podminku, kterou jsem uvedl v predchozim prispevku:
zdrojovy hodinovy kmitocet TIMERU [MHz] / 12 = cele cislo.
Napr. pri pomeru 7 (zdrojovy kmitocet TIMERu = 84 MHz), bude TIMER generovat sekvenci pulzu:
...0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0...
a PWM signal pri stride 1:1 bude vypadat napr. takto
...0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1...
=> signal bude mit fixni periodu 7 hodinovych cyklu 84 MHz (tj. kmitocet 12 MHz), ale se stridou 3:4 (nebo 4:3).
Pri pozadavku na stridu 1:1 se podminka zprisnuje na
zdrojovy hodinovy kmitocet TIMERU [MHz] / (2*12) = cele cislo,
takze by to chtelo hodiny napr. 72 MHz.