USB opravdu nedám. Dělám výhradně low-level aplikace (časování, regulace, sběr dat a pod.). Nějaké tutoriály na timery mám v betaverzi zde: http://www.pd-nb.cz/avr.html
Ďakujem za výborne spracovené tutoriály!
Zaujalo ma hlavne riadenie servo motorčeka pomocou PWM módu 1, keďže potrebujem podobné pulzy v blízkej dobe spraviť. Navnadili ste ma na STM32, no potreboval by som synchronizovane riadiť 6-8 kanálov. Rozmýšľal som použiť TIMery dva (trebárs TIM2 a TIM3), čím by som mohol riadiť 8 kanálov/pinov, ale problém ktorý pravdepodobne nastane, že nedokážem oba časovače spustiť naraz.
Alternatívne som rozmýšľal o použití časovača len na generovanie prerušení a GPIO output piny by som nastavoval ručne v obsluhe prerušenia. Keďže ale potrebujem mikrokontroler externe ovládať či už cez USB CDC alebo USART, bojím sa že MCU môže začať obsluhovať prerušenia týchto periférí, čo mi vnesie nepresnosť do dĺžky mojich pulzov. Ako začiatočník s MCU (hlavne Arduino), ocením akékoľvek tipy.
Timery na STM32 lze snadno hardwarově synchronizovat. Jeden timer nakonfigurujete jako master a na interní TRGO výstup mu vyvedete událost "enable". Další timery nastavíte jako slave s tím že na příchod interního TRGI signálu má reagovat spuštěním ("trigger"). Jen je potřeba z tabulek "Internal trigger connection" vybrat slave timerům správný TRGI signál... přirozeně master timer pak musíte spustit až po konfiguraci všech slave timerů. Časem to asi k tutoriálům ( www.pd-nb.cz/avr.html ) přidám.
Ďakujem, naozaj to funguje!
Našiel som doma povaľovať STM32F103 (takzvaný "blue _p.i.l.l_") a podarilo sa mi to vyklikať v CubeMX. Síce mi zopár hodín trvalo kým sa mi to podarilo rozchodiť ale výsledok je presne taký ako ste hovorili. Timery sú krásne zosynchronizované. Takto môžem generovať synchronizované pulzy presnej dĺžky na niekoľkých kanáloch, bez toho aby som sa musel báť že mi časovanie nabúrajú prerušenia napr. vyvolané komunikáciou na perifériách.
Moje predchádzajúce riešenie, ktoré bolo postavené na arduine, som ovládal cez prerušenia vyvolané časovačom. Pre dosiahnutie presnosti som musel, vypnúť všetky ostatné prerušenia a kvôli tomu som musel obetovať riadenie cez sériový port. Toto riešenie je o dosť lepšie.
jj, je to otázka tří funkcí. Na master timeru (např TIM2) vybrat událost:
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Enable); // povolení/spuštění timeru vyvést na TRGO
na slave timeru (např TIM5) vybrat zdroj signálu (dle tabulek z datasheetu) a událost jak s ním naložit:
TIM_SelectInputTrigger(TIM5,TIM_TS_ITR0); // využít input ITR0 (TRGO z TIM2)
TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_Trigger); // s příchodem ITR spustit/povolit timer
pak už jen stačí spustit TIM2 a je synchronizováno (za předpokladu že strop timerů je stejný nebo alespoň soudělný). Možná vás podceňuji, ale pokud generujete PWM nezapomeňte si zapnout "preload":
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); // preload na TIM2_CH1
Jinak se vystavujete riziku zmršené waveformy při změně PWM hodnoty.