Řízení jasu LED pomocí PWM

Dobrý den, potřeboval bych malou radu:

Potřebuji řídit jas LED diody z výstupu procesoru (PIC) PWM signálem.

Procesor na výstupu generuje PWM signál s měnitelnou střídou cca 5 - 95 %. Frekvence je pevná, okolo 6 kHz. Tento signál potřebuji převést na svit LED diody a to samozřejmě tak, aby intenzita jasu byla úměrná střídě PWM signálu (při PWM → 100% bude jas maximální a při PWM → 0 bude minimální).

K výstupu uC je přes rezistor 10k připojena G-elektroda IRF540, S-elektroda uzemněna, D-elektrodě LED přes R=1k na +12V.

Původně jsem měl místo LED diody zapojenou autožárovku 12V/6W. S touto žárovkou to chodilo bezvadně, jenže já plánuji mít těchto “svítidel” více (zatím zřejmě 8 ks) a pak pro nějakou rozumnou svítivost vychází pro více žárovek takový proud, že bych to asi musel napájet z autobaterie :slight_smile:.

Takže jsem tam místo žárovky zapojil LED diodu přes rezistor 1k a výsledek je takový, že LED se rozsvěcí už při malé střídě PWM a při větší už příliš nereaguje.

Vzhledem k tomu, že svítivost LED diody je závislá na proudu, který jí protéká (i když ani tato závislost zřejmě není lineární, jestli se nemýlím), viděl bych to na zdroj proudu, řízení napětím. Toto řídící napětí se dá z PWM snadno získat integračním členem. Jenže nevím, jak zapojit zdroj proudu pro LED diodu.

Poradíte někdo, prosím?

Děkuji

Vlasťa
obrazek_PWM.png

Reaguje, reaguje, ale oku sa to nezda. :slight_smile: :slight_smile: :slight_smile:

Ak sa vlakno ziarovky viac zohreje - vacsia strieda PWM - oko vnima aj zmenu teploty farby ziarenia. Preto moze byt pri ziarovke opticky pocit reakcie na PWM “vacsi”. Niekde mame v hlave zakodovane, ze cim belsie, tym svetlejsie.

Co sa striedy tyka, aby ziarovka svietila, musi sa rozohriat. Strieda 1:254 uz na rozohriatie nemusi stacit a preto to vyzera, ze ziarovka reaguje na PWM “lepsie”.
LEDka vsak za kazdych (realnych, co sa frekvencie PWM tyka) okolnosti bude svietit presne podla striedy. A preto pri streide 1:254 ju bude vidno svietit. Zvysok je uz iba na zotrvacnosti toho ktoreho oka.

LEDka (realne) zmenou striedy farbu svetla prilis nemeni. Pocit osvetlenia je preto linearny. Lenze neviem o takom zmyslovom organe, ktory by vnimal podnet z okolia linearne. Su to skor rozne logaritmicke, pripadne zlozitejsie zavislosti. U svetla zo ziarovky este doplnene o farebnu sirku vnimaneho ziarenia. Cim je vlakno teplejse, tym v sirsom spektre vyzaruje.
LEDka je oproti ziarovke spektralne omnoho uzsia. Preto ten pocit, ze ziarovka reaguje na PWM lepsie ako LEDka. Je to vsak len subjektivna zalezitost.

Zdrojom prudu principialne vela neporiesite. Tak ako je nakreslena schema, tak je to dobre. Skor sa mozete pohrat kvoli subjektivnym pocitom s prevodom linearnej zmeny PWM na logaritmicku, kvadraticku, alebo nejaku taku podobnu zmenu PWM. To je plne sw zalezitost a myslim, ze prave toto bude riesit Vas problem. Pre zaciatok svietivosti na co najnizsej urovni Vam doporucujem PWM aspon 10b, lepsie by vsak bolo 12b. LED nema potrebu zohrievat vlakno a tak svieti hned ako sa na nu pripoji napatie. I ked na kratku chvilu napriklad 10us.
Pre 12b PWM, aby oko nemalo pocit blikania (100Hz), je potrebne vybrat zakladnu frekvenciu prerusenia cca 410kHz. V ramci tohto prerusenia (na jednu periodu venujte 4096 casovych dielikov) riadte svit LEDky. Podla mojich skusenosti, frekvencie okolo 60Hz uz oko vnima ako blikanie, hlavne pri striede okolo 50:50 pri pohlade trochu bokom od zdroja svetla. Tento pocit je frekvencne individualny a zanika (podla subjektivnych skusenosti) okolo 80Hz. Preto doporucujem frekvenciu 100Hz.
Ziarovka je v tomto omnoho lepsia, lebo rozzeravene vlakno ma znacnu zotrvacnost a preto perioda opakovania nemusi byt taka vysoka.

Chcel by som este zdoraznit, ze ak by ste budili LEDku trojuholnikovou striedou 0% az 100% a 100% az 0% a takto dokola, napriklad s periodou 10sekund, Od piatej sekundy mate striedu 50% a celych nasledujucich 5 sekund k 100% striede nema oko taky pocit zvysovania jasu ako od 0% do 50%. Dovody boli spomenute vyssie. Treba preto napisat prevodovu funkciu, ktora 50% striedu casovo pretransformuje niekde k 75-80% casu velkej periody. Potom bude pocit zvysovania jasu subjektivne prijemnejsi.

No tak tedy díky …
Asi pořádně posílím zdroj a vrátím se k žárovkám.

A mezitím budu uvažovat o logaritmických, popř. složitějších převodech :slight_smile:.

Dík, Martine, pouvažuju, pozkouším a uvidím.

Vl.

Tie prevody sa v mcu daju jednoducho spravit pomocou interpolacnej tabulky. Napr X/Y.

X je precento PWM 0-10,11-20, 21-30,…91-100
X Y
10 2
20 5
30 10
40 17
50 20
60 25
70 30
80 40
90 55
100 100

Hodnoty som si vymyslel.
Stlpec X je mozne z EEPROM uplne vynechat, lebo poradove cislo Y zaroven udava hodnotu X, kedze X je rovnomerne linearne rozlozene.
Potom iba staci naprogramovat funkciu:

uint8_t fn_krivka(int X)
{
uint8_t index;
uint8_t vysledok;
uint8_t pole_y[10] = {2,5,10,17,20,25,30,40,55,100};
   index = X/10;
   vysledok   = pole_y[index - 1] + (X- index* 10)/10 * (pole_y[index] - pole_y[index- 1]);
   return(vysledok);
}

Vo funkcii treba este samozrejme osetrit hranicne stavy a spravne normovat vyraz (X- 10*index)/10, lebo tento vzdy vyjde menej ako jedna. Ale to by uz nemal byt problem, napriklad prenasobenim *100.
Dufam, ze som sa niekde principialne nepomylil, pisal som to z hlavy.

Zkus si pomoct tak, ze budes gate toho tranzistoru vybijet (trochu teorie - je to tranzistor rizeny polem, tudiz ma velmi vysoky vstupni odpor, tudiz se budes potykat s parazitni kapacitou tranzistoru), proste gate zkusmo “prispendli” pres nejaky vhodny rezistor k zemi (delava se to teda spis tam, kde se spinaji velke vykony velkymi frekvencemi) a uvidis, treba to bude ono.

No, s tabulkou jsem počítal, problém spíše je, že nevím, co do ní vložit, protože netuším, jaký průběh by ta funkce měla mít.

A Martine - s C na mne nechoď, prosím, to je pro mne prozatím stále totéž, jako bys na mne mluvil arabsky :slight_smile:.

Ten rezistor v gate tam měl původně být už kvůli uzavření tranzistoru v klidovém stavu. Jednoduše jsem na něj zapomněl :slight_smile:.

Dík.

Vl.

Nejdem na Teba s C-ckom. Ale nepoznam hakibaky toho Tvojho procesora a myslim, ze pre vysvetlenie principu aproximacie z tabulky (nie len pre Teba) je zrozumitelnejsie napisat algoritmus v nejakom vseobecne zrozumitelnejsom zapise ako v ASM. Neviem si totizto predstavit predmetny zapis uviest v ASM. Nevraviac, ze by sa asi na jednu stranu nevosiel a citatelom by asi ani nebolo poriadne jasne, co tym chcel autor povedat.

Mohol som to zapisat aj v Basicu, alebo Packale. To je jedno. Islo mi o popis algoritmu. To sa Ti asi so mnou stane v buducnosti castejsie, ze budem algoritmy popisovat vo vseobecne zrozumitelnejsej forme ako v ASM nejakeho konkretneho procesora. Najcastejsie to asi bude C-cko. To ale neznamena, ze Ti ho vnucujem. Iba neviem ako jednoduchsie algoritmus popisat.
:smiley: 8) :laughing:

Jasně, omlouvám se - bylo to tak trošku v legraci :slight_smile:.

Vl.

Ja jsem něco podobného řešil jako řízení jasu 7 seg displeje a nakonec jsem ten jas vyřešil pomocí tabulky. Až jsem měl konstrukci hotovou, tak jsem zjistil, že linearita tam žadná není, konečné hodnoty pro řízení jasu 0 - 100% po skocích po 10 jsem dolaďoval vyloženě zkusmo,neboli pokus omyl.
Řídím pomocí PWM iventilátor, tam to šlo docela dobře.

Martin problematiku popsal velmi dobře. Já jen doplním z vlastní praxe, že v případě LED považuji i 100Hz PWM za nedostatečné.

Ja viem :slight_smile: Povazujem to za uplne dolnu hranicu :slight_smile:. 100Hz uvadzam, aby vysledna frekvencia sw prerusenia pre PWM (ak sa inak neda a 8bitov je malo) pre riadenie LED neodstrasila pripadnych zaujemcov. :slight_smile:
Ale po naprogramovani to potom stoji za to.

Pánové, když jste tu vzpomněli i LED displej, měl bych ještě jeden dotaz.
Možná je to hloupost, ale nedal by se podobným způsobem řídit jas LED displeje (LED diod) tak, aby se mohly vynechat omezovací rezistory v katodách diod? Nedávno jsem řešil návrh DPS na něco podobného a nebyl jsem schopen na desku vměstnat součástky, protože mi neustále “přebývaly” právě ty nešťastné rezistory.
Vl.

Slo by to, ale musel bys pod tranzistory rozsvecujici cislice pridat malou tlumivku s antiparalelni diodou.
Velikost tlumivky se da zjistit treba nejakym simulacnim programem pokud se cloveku nechce pocitat.
Co je horsi, musel bys program trefit na poprvy spravne jinak menis minimalne procesor, s trochou stesti toho bude vic :slight_smile:
Pripojit to primo by asi moc nefungovalo, protoze zdroje pro napajeni procesoru nebyvaji zas tak tvrdy aby to neovlivnovalo dalsi obvody.
Ale myslim, ze nez zkouset nejakou takovouhle silenost, je jednodussi tam strcit smd rezistory, s nima by ses mel vejit :wink:

edit: Ted me jeste napada… myslim, ze bys nesmel s pwm prekrocit 50% aby se stacila civka vybit.
Dal jesli se nepletu, byla by zavislost proudu na době sepnuti kvadraticka, coz by mohlo zase pomoct s nelineritou svitu diody.

No, asi je to opravdu šílenost, jen jsem chtěl testnout, zda se to náhodou někomu nepovedlo …
Jinak se mi to tam nevejde ani s smd rezistory, mám to opravdu dost malé a navíc jsem omezen jednostrannou DPS.
Smd rezistory nejsou vždy výhrou. Mezi vývody obyčejného rezistoru protáhneš i několik spojů a navíc se dá využít k překlenutí dvou vzdálenějších míst. Mezi vývody smd rezistoru protáhnu max. jeden spoj a i to je někdy problém.

Vl.

Vynechat odpory by som rozhodne nedoporucil. Program sa Ti moze niekde zakusnut a problem je na svete.

Je pravda, ze si mozes pomoct nasledovnym. Napr.ak pouzivas segmenty so spolocnou anodou, na ich spinanie pouzivas PNP tranzistor. Spinaj ho tak, ze vhodnym odporom do bazy obmedzis maximalny prud, ktory moze cez tranzistor tiect napriklad na 80mA. Odpor vyberies podla zosilnovacieho cinitela tranzistora h21e, inak nazyvaneho i beta. Pre BC327-40 byva v rozmedzi 240-630. Beta zavisi samozrejme este aj od prudu, ktory tranzistorom tecie.

O teplote ani nehovorim, lebo s teplotou sa meni napatie BE a tym padom sa bude menit i prud do B.

Pre stabilizaciu max. prudu je dobre pouzit mosstikove zapojenie tranzistora (ak si dobre spomynam, tak sa to vola - je to uz davno).
Finta spociva v tom, ze medzi emitor a +5V vlozis odpor R1. Medzi bazu a +5V vlozis odpor R2. Treti odpor R3 vlozis medzi bazu a pin procesora.

Pri zopnuti tranzistora potecie cez R1 prud, ktory na nom vyvola ubytok napatia. Aby bol tranzistor otvoreny, potom na R2 musi byt napatie R1 + 0.6V(+/- v zavislosti od teploty atd, ale v zasade medzi 0.4-0.8V) na BE.
R2 a R3 tvoria napatovy delic. Nech cez tento delic pri odpojenom tranzistore tecie 10-20x vacsi prud ako je prud potrebny na bezpecne “tvrde” zopnutie tranzistora, aby nam jeho zmena prilis neovplyvnovala navrh.

Cim vacsi prud potecie cez R1, tym bude na nom vacsi ubytok a na R2 menej napatia ostane na prechod BE. Tym sa tranzistor privrie a prud cez CE sa stabilizuje a nepresiahne zvolenu hranicu.

Priklad:
Nech je beta 200.
Nech je Icemax = 50mA.
Nech ubytok na R1 = 2V.

Potom:
Ib = 50/200 = 0.25mA
I(R2,R3) = 20 * Ib = 5mA
UR2 = 2V(Ur1) + 0.6V(BE) = 2.6V
R2 = 2.6V/5mA = 520R, volim najblizsiu hodnotu z radu E12 560R
Prud cez R2 bude teda 2.6V/560R = 4.64mA.

R3 = (5V(Ucc)-2.6V)/(1.05 * 4.64mA) = 2.4V/4.87mA = 492R, volim 470R

R1 = 2V/50mA = 40R, volim 39R

Skutocne namerane hodnoty prudov sa mozu o malo lisit, ale zapojenie splni svoj ucel pre siroky rozsah teplot a zosilnovacieho cinitela tranzistora.
Cim mensie naparie na R1 zvolim, tym viac moze kolisat ImaxCE, lebo sa viac prejavi zmena napatia na BE tranzistora zavisla od teploty. Myslim, ze 2V je pre toto pouzitie celkom v pohode. Ak by nestacilo, kludne ho znizte na 1V (R1 = 22R, R2 = 330R, R3 = 680R).

Ak by sa Ti program niekde “zakusol” a mal by si nahodou zopnute vsetky segmenty, sucet prudu cez ne nepresiahne tych 50mA, lebo tranzistor nepusti. S tym sa uz pin procesora kratkodobo nejako popasuje. Mozno :slight_smile:

Treba vsak vediet, ze ak maju svietit iba dva segmenty, potecie cez kazdy z nich prud cca 25mA. Pri rozsvieteni vsetkych 8 segmentov prud cez segment klesne 4x, co sa vyrazne prejavi v jase. SW by preto este musel vediet zohladnit, kolko segmentov ma svietit.

Otazka je ako sa jednotlive prudy rozdelia medzi segmenty. V tomto smere maju individualne odpory nesmierne blahodarny ucinok na rovnomerny svit segmentov.

V kazdom pripade Ti tie odpory do serie s diodami vrele doporucujem.

To s tím omezením proudu na tranzistoru je dobrá finta - díky. Ale ta změna jasu by mi asi vadila. Navíc j á to dělám ještě trošku jinak (omlouvá se, že jsem to neřekl dříve, nedošlo mi, že to bude důležité). Já používám mezi procesorem a displejem sériovou komunikaci s posuvnými registry 74164. Nemusím se párat s multiplexem a ušetřím spoustu drátů. Tím pádem tam nemám ani tranzistory ve společných anodách (jsou přímo na Vcc).
Asi zůstanu u sériových rezistorů a zkusím přesvědčit DPS, aby se to tam přece jen nějak vešlo :slight_smile:.

Díky za informace, Martine. Perfektní, srozumitelný výklad!
VL.

Nejako mi uslo kolko ze segmentov to pouzivas. Ak by to bolo styri a menej, potom vrele doporucujem SAA1064. Odpory nepotrebujes, lebo on ma v sebe priamo prudove zdroje. Dokonca si cez I2C mozes regulovat aj jas. zapojenie je velmi jednoduche a mam s nim len dobre skusenosti.

Miesto 74164 by som skor doporucil 74595. Az nabeznou hranou /CS sa prenesu interne data na vystup. Je to na tieto ucely myslim omnoho lepsi svab.
Dobre sa s tym rozsiruje procesor o binarne vystupy, napriklad pre ovladanie rele. Na vystupoch 74164 sa pocas posunu menia data, respektive mozu byt nulove, co pre ovladanie rele nie je nic moc. A davat tam dalsi latch je uplne zbytocne. 74595 obsahuje vsetko potrebne. Pre riadenie jasu LED je mozne este vyuzit G, ktorym sa daju vystupy nastavit do tretieho stavu. Spojenim tohto pinu s PWM vystupom procesora je riadenie jasu vyriesene. :slight_smile:

Pre rozsirenie IO cez SPI pouzivam dvojicu 74595/74165. /CS pre 74595 treba pre 74165 negovat, potom sa do mcu dostanu tie najcerstvejsie data.

Neušlo, neřekl jsem to :slight_smile:.

Mám 4 segmentovky se společnou anodou.

Ten obvod je super a kupodivu je i u nás k dostání. Vloni jsem použil něco podobného - M5450. Ale byl to macek v DIL40 a navíc měl své mouchy.

Trošku problém bude možná v tom, že ten displej potřebuji napojit na stařičký PIC16F628A, který neumí I2C. Ale pokud se jedná jen o přenos dat jedním směrem mezi dvěmi obvody, tak by to mělo jít naprogramovat lehce i “ručně”. Jen jsem rychle prolítl datasheet, je tam naznačená nějaká komunikace - pokud to bude stačit, je to OK.

Ty jsi s tím obvodem dělal? Půjde to tak jednoduše, jak jsem naznačil?

Díky za tip!

Vl.

S SAA1064 som robil riadenie displaya 2x7segment a 4x7segment v muxovacom rezime.

I2C bola v ATmega naprogramovana sw, lebo pouzivam z roznych dovodov viac nezavislych I2C komunikacnych rozhrani a na tento display ostala ta softverova. Treba do obvodu preniest malo udajov a velmi zriedka, maximalne 5x za sekundu. Pri rychlejsich zmenach cisla na display nie je subjektivny pocit moc dobry. Samozrejme, ked je hodnota ustalena, tak je to jedno, zobrazuje sa stale to iste :slight_smile:

SAA1064 sa vyraba v SMD i v DIL. DIL je siroke. Je to tak kvoli chladeniu cipu ak by bola na internych prudovych zdrojoch velka vykonova strata. On totizto ide tusim do 12, alebo 15V, takze sa s nim daju bez problemov budit i velke segmetnovky, v ktorych je viac diod v serii za sebou.

Dlho som s jeho pouzitim otalal, lebo bol na moj vkus moc drahy (vtedy asi 100Sk) a rozmerovo nemotorny. Pozival som hlavne 74595 (vtedy asi 3Sk), ktore sa daju pekne strcit pod 14mm 7segment i so SMD odpormi - na obojstrannu dosticku a cela konstrukcia je tak velmi kompaktna.
Potom som mal nejaku aplikaciu na 38mm display a len dva volne piny procesora. Medzi tym isiel SAA1064 na nejakych 35Sk, tak som to skusil a som spokojny.

Sakra, já se fakt asi přestěhuji na Slovensko! :slight_smile:

SAA1064 stojí u nás u GME 110,- Kč (71,- Kč v SMD provedení)! Farnell ho nabízí za 2.82 Euro. A to nepočítám poštovné.

Vl.