18.3.2019 V minulosti jsem rozebral už pěknou řadu LASERových tiskáren a v každé z nich se nacházela zajímavá optika s rotujícím zrcadlovým hranolem na motůrku a soustavou čoček. Jeden kompletní optický modul jsem si schoval na později, abych ho teď oprášil, zkusil ho rozchodit a zjistil, co se s ním dá dělat. Už dříve jsem viděl jedno inspirativní video, kde byl podobný modul použit k přímému osvitu fotocitlivého kuprexitu na výrobu plošných spojů. Nebo po přidání druhé kolmé vychylovací soustavy by z toho šel udělat 2D LASERový projektor atd.
Můj optický modul od firmy Shinano Kenshi je osazen integrovanými obvody, ke kterým bylo snadné nalézt datasheety. O pohon 3-fázového brushless motoru zapojeného do trojúhelníka se stará motor driver LB11870 pracující na principu PLL (fázového závěsu). Podle vstupního hodinového signálu generuje PLL a driver posunuté signály pro buzení 3 fází koncového stupně typu polomost z bipolárních NPN tranzistorů integrovaných včetně zpětných diod. Poloha rotoru se snímá trojicí Hallových sond. Z jedné Hallovky (vstup 1) se odebírá signál pro fázový komparátor, který ho porovnává se vstupním hodinovým signálem a podle toho upravuje budicí signál tak, aby měl stejnou frekvenci a konstantní fázový posun, viz oscilogram. Dosažení tohoto stavu je indikováno sepnutím výstupu LD (Lock Detect). Tím je zajištěna vysoká stabilita otáček i při změnách mechanického odporu rotoru. Obvod také sám zajišťuje řízení proudu vinutími motoru pomocí PWM, protože jinak by s rostoucí budicí frekvencí (otáčkami) díky zvyšující se induktivní reaktanci klesal proud a tím i točivý moment. Nechybí ani nadproudová a tepelná ochrana. SS odpor vinutí motoru jsem změřil 2,2 Ω. Propísknutím zapojení obvodu na plošňáku jsem rychle zjistil zapojení konektoru:
pin signál popis 1 CLK řídicí vstup hodin (0,1 - 10 kHz) 2 PLL_LOCK stavový výstup zavěšení PLL, otevřený kolektor (sepnuto při locku) 3 START#/STOP řídicí vstup běhu motoru (0 = start, 1 = stop) 4 GND společná zem 5 VCC napájení 9,5 - 28 V, cca 100 mA @ 1 kHz, 24 V
Napájení jsem připojil na zdroj 24 V, na výstup PLL_LOCK jsem dobastlil LEDku s odporem na +5 V z interního regulátoru (výstup VREG), na vstup CLK jsem připojil frekvenční generátor, vstup START#/STOP jsem uzemnil a motor se rozběhl. Je schopen dosáhnout docela vysokých otáček, což prozrazuje i svištivý vysokofrekvenční zvuk motoru při běhu. Protočením rotoru v klidu jsem zjistil, že motor má více pólů a snímací Hallovka dává 6 pulsů na otáčku (měřeno na výstupu obvodu FGFIL), tzn. vstupním hodinám 1 kHz odpovídá 10000 RPM. Maximum, kdy jsem při napájení 24 V ještě dosáhl zavěšení PLL, bylo 4,7 kHz (47000 RPM) při odběru 0,66 A.
optický modul CLK vs FGFIL FGFIL pulsy na otáčku
Druhou částí optického modulu je destička s LASERovou diodou, spojnou čočkou a integrovaným obvodem driveru/modulátoru Mitsubishi M66515FP. Ten zajišťuje konstantní výkon LASERového paprsku pomocí zpětnovazební regulace proudu, kde se snímá optický výkon fotodiodou integrovanou v pouzdru LASERové diody. LASERovou diodou prochází trvalý klidový proud cca 30 mA, ke kterému se superponuje modulační proud až 120 mA, který je přímo ovládaný vstupem DATA#, jehož bitová rychlost může být až 40 Mbps. Dále je na destičce druhá fotodioda s tvarovačem, která snímá odražený paprsek od zrcátka na začátku promítaného řádku a slouží pro synchronizaci modulačních dat řádku. Zrcadlo má 6 stran, takže paprsek je vychylován v úhlu 60° zprava doleva při pohledu proti velké výstupní čočce.
Ve starších LASERových tiskárnách se typicky používaly IR LD s vlnovou délkou např. 780 nm. S tím se ale moc parády dělat nedá a tak jsem se rozhodl LD vyměnit za červenou z DVD vypalovačky s vlnovou délkou 650 nm. Nastal však problém s tíž, že LD z tiskárny má opačnou polaritu (anodu na pouzdru, fig. 1) než běžné LD z CD/DVD (katoda na pouzdru). Navíc LD z DVD typicky nemá integrovanou fotodiodu pro zpětnou vazbu (3. pin se tváří nezapojený). Elektroniku chci zatím zachovat kvůli pasující optice a snadnému použití vysokorychlostního modulátoru. Časem bych použil výkonnější LD, ale modulace proudu až několika ampér třeba na 10 MHz nebude úplně prdel. Stávající chlazení LD je také nepříliš dostatečné, LD je zasazena do plíšku 26 x 16 x 1 mm a během provozu se znatelně zahřívá (takové malé tiskárnové kurvítko). Abych LD z DVD připojil se správnou polaritou, musel jsem přeškrábnout několik vodivých cest (včetně odpojení plošky pod šroubkem spojeným s plechem a pouzdrem LD) a přidat pár drátových propojek. Chybějící zpětnou vazbu jsem zatím vyřešil uzemněním pinu PD (pin 15 sousedí s GND vedle na pinu 16) a taktéž i vstupu SAMPLE#/HOLD. Zapojení konektoru je zde:
pin signál popis 1 GND společná zem 2 DATA# datový modulační vstup (0 = LD svítí, 1 = LD nesvítí, až 40 Mbps) 3 ENABLE# řídicí vstup (0 = zapnuté proudové zdroje, 1 = vypnuté proudové zdroje) 4 GND společná zem 5 VCC napájení 5 V, cca 170 mA 6 SAMPLE#/HOLD řídicí vstup pro nastavení klidového proudu LD 7 GND společná zem 8 PD_SYNC_OUT# výstup z fotodiody pro synchronizaci začátku řádku
Napájení jsem připojil na zdroj 5 V, přizemnil vstupy DATA# a ENABLE# a LD se rozsvítila. Proud LD jsem naměřil cca 120 mA a při otáčení odporovým trimrem u konektoru se nijak neměnil. Roztočil jsem motor a získal pěknou rovnou červenou čáru. Další problém byl, že jsem nedostával žádný synchronizační signál z fotodiody (pin 8 byl trvale na log. 1). Zjistil jsem, fotodioda má tmavé pouzdro téměř nepropustné pro viditelné světlo, takže jsem ji vyměnil za jinou fotodiodu v čirém 3mm pouzdře a narafičil ji do cesty promítaného paprsku. Pak jsem začal dostávat synchronizační pulsy (log. 0) při každém najetí paprsku na začátek řádku.
destička s LD budič LD M66515FP
Následně jsem připojil optický modul k ST NUCLEO-G071RB boardu s MCU STM32G071RB, který jsem dostal na letošním veletrhu Embedded World na stánku ST, abych si zas trochu procvičil programování ARMů. Podpora G-čkové řady MCU byla přidána do nové verze OpenOCD 0.10.0 z 10.3.2020. Na Nucleo board jsem si dopájel externí krystal X3 a potřebné kondíky C25, C26 s propojkami R33, R34 pro HSE oscilátor, abych měl stabilní hodiny. Pro generování hodinového signálu pro motor jsem naprogramoval časovač TIM2 a jeho output compare výstup PC.5 (AF2) na kanálu 2 tak, aby mi dával požadovanou frekvenci s 50% střídou. Výstup synchronizačních pulsů z fotodiody jsem připojil na PC.4, který generuje signál přerušení EXTI4_15_IRQn (sdružený pro EXTI kanály 4 - 15), obsluhovaný rutinou EXTI4_15_IRQHandler řídící modulaci LD. V klidovém stavu musí být LD rozsvícená, aby mohl synchronizační puls přijít. Pro modulaci LD jsem se rozhodl využít periferii SPI v režimu master, jenž se mi postará o kontinuální serializaci dat řádku (8 pixelů v 1 Byte) a umožňuje autonomně běžet v režimu DMA (kopírovat data z framebufferu). Zatím data krmím ručně v obsluze přerušení. Přitom jsem přišel na jednu zradu v SPI periferii: pokud není signál SCK namapovaný na žádný pin, tak se po odeslání Bytu nikdy nenahodí flag RXNE v SPI status registru. Musel jsem to obejít hlídáním BSY flagu, který se sám nastavuje a nuluje. Další problém mám s SPI signálem MOSI, který nejsem schopen deterministicky nastavit do výchozího stavu. Očekával jsem, že MOSI zůstane na úrovni posledního vyslaného bitu, ale není tomu tak. Experimentálně jsem zjistil, že pokud pošlu za sebou alespoň 4 byte FFh, zůstane MOSI v log. 1, zatím co když pošlu 3 nebo méně FFh Bytů, tak zůstane MOSI v log. 0. Takže mi nezbývá, než daný pin dynamicky přepínat mezi režimem SPI (AF2) a GPIO, kde ho můžu plně ovládat. Zatím jsem nezkoumal, jestli je tato debilní vlastnost novinkou na STM32Gxxx nebo už byla i na STM32Lxxx.
optický modul a Nucleo CLK vs SYNC