Periferie nazvaná "Beeper" není nic jiného než jednoduchý generátor obdélníkového průběhu. Ten lze také použít k buzení reproduktoru a odtud periferie nejspíš přišla ke svému jménu ("pípák", buzzer, beeper). Možnosti použití jsou ale mnohem širší, takže se nenechte zmást názvem a dívejte se na beeper jako na generátor obdélníku.
Beeper má svůj výstup na pinu PD4 (na STM8S103) a nejde ho nikam "přemapovat". Zdrojem clocku pro Beeper je ve výchozím nastavení vnitřní 128kHz oscilátor (LSI), který slouží k provozu watchdogu a AWU. Jeho frekvence není příliš přesná ani teplotně stabilní. Pomocí Option bytes je možné přepnout beeper (a spolu s ním AWU) na HSE oscilátor (který už může být odvozen od krystalu a tudíž přesný). To si ale předvádět nebudeme.
Konfigurace beeperu je velmi jednoduchá. Frekvenci si volíte podle následujícího vztahu:
f = fLSI / ( PRESC * ( DIV+2 ) )
kde fLSI je frekvence 128kHz oscilátoru (tedy přibližně 128kHz)
PRESC je předdělička a může mít hodnotu 2, 4, 8
DIV je dělička a může mít hodnotu 0 až 30
Prakticky je tedy možné nastavovat frekvenci dosti hrubým krokem od 500Hz až do 32kHz. Pozorný čtenář si jistě všimne, že to je "audiopásmo", tedy beeper pokrývá oblast frekvencí slyšitelných lidským uchem (konec konců je původně zamýšlen na buzení reproduktoru). Uvedu příklad konfigurace ne přibližně 16kHz.
Zvolím tedy PRESC = 2 a DIV = 2 a ověřím že:
f = 128kHz / (2*(2+2)) = 16kHz
Ovládání Beeperu zprostředkují funkce BEEP_Enable(), BEEP_Disable() a BEEP_Setup(), které najdete v knihovně spse_stm8.h. Původní funkce z oficiální knihovny stm8s_beep.h jsou podle mě nevhodně řešené a proto jsem připravil zmíněnou trojici nových. Význam BEEP_Enable() a BEEP_Disable() asi není třeba popisovat - jen beeper zapínají a vypínají. Funkce BEEP_Setup() slouží ka nastavení frekvence. Jejím prvním argumentem je makro BEEP_PRESC_2, BEEP_PRESC_4 nebo BEEP_PRESC_8, kterým se volí předdělička (PRESC). Druhým argumentem je číslo v rozsahu 0 až 30 a volí děličku (DIV). Toť vše.
// PD4 jako výstup pro beeper GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_SLOW); BEEP_Setup(BEEP_PRESC_2,2); // natavit beeper: f = 128kHz / (2*(2+2)) = 16kHz //BEEP_Setup(BEEP_PRESC_8,30); // natavit beeper: f = 128kHz / (8*(2+30)) = 500Hz BEEP_Enable(); // spustit beeper
Jako praktickou ukázku jsem si dovolil zapojit na výstup beeperu běžícího na 16kHz nábojovou pumpu jako generátor negativního napětí. Úkolem obvodu je generovat záporné napětí necelých 5V. Takový obvod se může hodit v různých situacích. Například když chcete z unipolárního zdroje (např 5V z USB) napájet operační zesilovač, který vyžaduj bipolární napájení. A nebo třeba jako zdroj pro předpětí LCD displejů. Takto sestavený zdroj má omezené schopnosti, je měkký a můžete ho provozovat pro zátěže nanejvýš tak v jednotkách mA, což ale běžně stačí. Něco málo o nábojové pumpě, v konfiguraci jako zdvojovač, již bylo zmíněno zde.
Činnost pumpy si můžete prohlédnou na následujících dvou oscilogramech. Na prvním z nich je situace ze schématu. Výstup pumpy je zatížen rezistorem RL=10k který odebírá přibližně I=4.46/10k=446uA. Výstup není zvlněný a má napětí přibližně -4.5V. Chybějících 0.5V je úbytek na diodách D1 a D2. V pravém horním rohu oscilogramu je změřená frekvence a má hodnotu 16.1044kHz. Odchylka od 16kHz je tedy necelých 0.7% a je způsobena nepřesností LSI oscilátoru. Ten má v mém případě frekvenci 128.8kHz (a se vzrůstající teplotou klesá).
Pro zajímavost je na druhém oscilogramu pumpa zatížena odporem RL=470 a proudem přibližně I=3.3/470=7mA. Zatížený výstup už má jen -3.3V. Na pinu PD4 je vidět, že už "nechodí" z 0V do 5V, ale jen od 0.4V do 4.2V což je dáno jeho nenulovým výstupním odporem (viz zde)
Home
| V1.00 10.9.2023 /
| By Michal Dudka (m.dudka@seznam.cz) /