Řízení jasu LED pomocí PWM

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.

No zkus mrknout na
tme.eu/cz/katalog/artykuly.p … %3DSAA1064
nebo
soselectronic.cz/?str=371&artnum=22688
:slight_smile:

Skuste www.TME.cz

Ja ako registrovany odberatel mam ceny lepsie, ale Tebe by to mohlo vyjst
podla:

tme.eu/cz/katalog/artykuly.p … %3Dsaa1064

neprihlasil som sa a SAA1064-PHI stoji 41,90CZK a od 10ks 35,4CZK

to by nemalo byt az take nedostupne. Ako neregistrovany nemas pristup k info, kolko ich aktualne maju skladom, ale ja vidim ze ich tam maju 21ks. Moja aktualna cena za 1ks je 1.17EUR. Je to o nieco lepsie ako pre Teba, ale myslim, ze to ani v Tvojom pripade nebude neprekonatelne. :slight_smile:
Na rozdiel od nas, vy uz mate zastupenie TME priamo. My si este budeme musiet chvilu pockat. Momentalne nam vozia tovar z Polska. Postovne je 4.5EUR a ked v noci objednam tovar, na druhy pracovny den ho uz mam cez UPS na stole. Skratka parada. Ziadne statie v radoch a dozvedanie sa ze “nemame, skuste niekedy buduci tyzden”. Dopravne sa moze niekomu zdat vela, ale ak sa nakopi par veci, tak sa to prepravne v pohode rozpusti a prave naopak velmi vela usetrim na dobrej cene.
Porovnajte napr. ceny ATmega v TME a inde. No co k tomu dodat. :slight_smile:

ATmega32 v TME 58CZK, GES 116-129KC, GME - 180Kc, SOS - 2.91EUR bez DPH

Ten GES a GME asi budu s DPH, ale myslim, ze to je jedno :slight_smile:

Ja bych použil 4094, mají omezení proudu na 20mA, takže ušetříš ty odpory.

Na zaklade coho si myslis, ze 4094 maju obmedzenie prudu?
Nic take som v datasheetoch nevidel. Okrem toho, ze pracovny vystupny prud je v porovnani s HC/HCT maly. Alw mozno som nieco prehliadol.

Jen dodam, ze osobne misto R2 pouzivam 2 diody. Proudovy vystup je o neco stabilnejsi, hlavne pak v zapojenich s vetsim zvlnenim napajeni. To by sice u mcu nemelo hrozit, ale ledky nemuseji byt napajene stejnym zdrojem. Dale pak staci mensi proud pres R3. Nevyhoda je, ze tam lepis 2 soucastky misto 1. Diody nezajisti uplne zavreni tranzistoru coz neni problem pokud neni takovyto “proudovy zdroj” spinan. To se da vyresit velkym paralelnim odporem k diodam, ale to uz je pro potreby ledek nepatrne prehnane. :slight_smile:
Co se tyka cen nejen avr u gme, tak naprosto souhlasim, tady neni o cem :unamused:

Martine, super …

TME jsou navíc z Ostravy, kousek od nás, dá se tam zajet s děvčaty na nákupy a přitom si odskočit pro integráček :slight_smile:

Díky!

Vl.

Řešit to lze a existují na to IO. Dokonce jeden z někalika způsobů nevyžaduje řízení PWM. Princip spočívá v tom, že LED segmentovky jsou bez odporů přímo zapojeny na řízený zdroj napětí, jehož velikost se reguluje v závislosti na proudu LED. Nutnou podmínkou jsou malé výrobní odchylky v napětí LED, musí být alespoň z jedné šarže, jinak je nebezpečí, že některé segmenty budou svítit výrazně víc. Jedna LED trvale svítí a má stejné podmínky jako ostatní a slouží k odměřování proudu. Změníli se proud od požadované hodnoty, upraví regulátor velikost zdroje napětí tak, aby se odchylka vyrovnala. Zdrojem může být třeba switching, maxim jich dělá hodně. Toto řešení je i energeticky úsporné, protže se energie neztrácí v odporech.
Stabilizace proudu pomocí PWM má tu nevýhodu, že při vysokém proudu LED může dojít překročení mezních hodnot pinů. U MCU nestačí kontrolovat jen proud jedním pinem, ale omezující je i součet všech pinů. U AVR je to tuším 200mA. Takvé PWM je i zdrojem rušení.

Ano, přesně o tom jsem taky uvažoval. Jednu LED jsem chtěl dát jako referenci, uvažoval jsem, že by šel možná použít optočlen. Odradilo mne od toho mimo jiné i to, že jsem navíc potřeboval řídit dvě různé barvy LED a to je už úplně vedle. Nedokázal jsem taky vymyslet ten řízený zdroj :slight_smile:.

Vl.

Radsi si tam nejdriv zavolej, ma takovy dojem, ze tme nema kamennej obchod…

Výstupní proud je omezen na 15mA, ale měřením jsem kdysi dávno zjistil, že je to 20mA.

Zaujimave tvrdenie. Kde sa to pise, ze je to vlastnost toho integraca?
Daj prosim vediet.
Bolo by to potom velmi zaujimave.

V datashetu to asi nebude, ale kdysi jsem to kdesi četl, že to tak je. Sám mám udělanou konstrukci, kde mám 4x 7 segmentovku a 4x 4094 a mám je bez odporů. Funguje to už asi 6 let a zatím neshořel ani jeden.

No, možná je to blbost, ale kdysi dávno jsem kupoval nf zesilovač (cca 300W), který byl osazen výkonovými MOS-FET tranzistory. Člověk, který jej vyráběl mi ukazoval, že je zkratuvzdorný a to bez jakýchkoliv dalších ochran na výstupu. Viděl jsem na vlastní oči, jak vytáhl kabel z reprobeden a za plného vybuzení jej natvrdo zkratoval. Takto to nechal několik vteřin, pak kabely rozpojil, pripojil zpět do reprobenden a zesilovač jel, jako by se nic nedělo. Ten konstruktér to vysvětloval vlastností MOS-FET tranzistorů, které při zvětšení teploty na čipu nad určitou mez zvýší svůj vnitřní odpor a omezí tak procházející proud.

Nevím, zda to platí jen pro určité typy MOS-FETů. Každopádně 4094 má třístavový výstup řešen dvojicí komplementárních polem řízených tranzistorů.

I kdyby to však byla pravda a fungovalo to na tomto principu, asi by se to nedalo doporučit, protože ty obvody by pak vlastně pracovaly trvale v přetížení.

A navíc - jak řídit v takovém zapojení jas? 25mA (údaj z datashetu) je docela dost a malý displej musí tedy svítit jako o život :slight_smile:.

Vl.

Jas řídím v té konstrukci signálem EO. Původní dotaz byl, jak vynechat odpory a myslím si, že takhle to jde vyřešit.

Pro Martina:
Ahoj, tak jsem si včera přečetl datasheet k SAA1064 a není mi jasných pár věcí:

  1. Bit “A” (předpokládám, že se jedná o ACK dle I2C specifikace) by měl sloužt k potvrzení přijetí adresy příjemcem (pokud adresa souhlasí). Předpokládám tedy, že ve chvíli, kdy “je na řadě” tento bit, musí se MASTER přepnout do režimu IN, načíst jej a podle jeho stavu se rozhodnout, zda ve vysílání pokračovat nebo celé slovo vyslat znovu.
    Protože bit ACK je v každém bytu, předpokládám, že totéž se děje i v případě vyslání datových bytů.
    Jenže displej je “pasivní zařízení”, které toto potvrzení neumí vyslat. Co se pak děje s tímto bitem? Předpokládám, že MASTER jej ignoruje a vysílá dále bez kontroly správnosti: Je to tak?

  2. V datasheetu, v odstavci “Subaddressing” je napsáno:
    The bits SC, SB and SA form a pointer and determine to which register the data byte following the instruction byte will be written. All other bytes will then be stored in the registers with consecutive subaddresses.

Předpokládám že to funguje takto:
Dejme tomu, že si připravím nějaká data a jako první naadresuji Control register (sub-adresa 00). Pak už jen přivedu správný počet hodinových impulsů (tedy 8x9 = 72) a obvod mi postupně naadresuje všechny ostatní registry (01, 02 … až 07 - tedy včetně těch posledních nevyužitých a uloží do nich data,). Může být?

Dobře, a co když to udělám takto (je to hlouopost, ale jen pro pochopení -:):
Jako první naadresuji třeba digit 3 (adresa 03), nachystám si dva byty dat a pošlu do obvodu jen 18 impulsů. Předpokládám, že se první byte dat umístí do digit3 a druhý byte do digit4?

  1. V datasheetu na str. 10 je popsáno, jak ovlivňují bity C4, C5 a C6 výstupní proud. Nikde tam však není údaj o tom, jaký proud teče do výstupu v případě, kdy C4, C5 a C6 = 0?
    Uvádí se tam však, že jednotlivé “příspěvky” těchto bitů jsou:
    C4 = 3mA, C5 = 6mA, C6 =12mA.
    Když to sečtu, dostávám 21mA, což by mohl být max. dosažitelný proud výstupu.
    Mohlo by to tedy znamenat, že pokud C4, C5 a C6 = 0, teče výstupem nulový proud?
    A jaký proudy pak potečou výstupem, pokud budu stavy těchto bitů různě kombinovat?

Martine, vím, že tyto věci si mohu vyzkoušet. Ale ještě ty obvody nemám a rád bych dopředu věděl, co mne čeká :slight_smile:. Pokud by jsi si z toho ještě něco pamatoval, byl bych moc rád.

Díky za ochotu!

Vl.

Jasně, já to nezpochybňuji. Jen jsem reagoval na příspěvek Martina a napadlo mne to možné vysvětlení.

Vl.

Presne tak

Preco by to nevedelo? Samozrejme ze vie. To je vec toho cipu, ma to tam tak vyleptane v kremiku.

To, co sa deje s tym bitom zavisi od programatora. Ja osobne ho ignorujem a posielam data stale do kolecka. I pri ignorovani hodnoty ACK vsak SDA nema v tomto case vnucovat na zbernicu nejaky tvrdy stav. Pri hw I2C-ckach sa to deje automaticky, pri sw I2C, napriklad pri AVR treba na SDA nastavit log.0, alebo prepnut na vstup. x51 moze mat nastavenu na vystupe log.1, lebo tato je “makka”. Ako je to s PICkami si uz nepamatam :slight_smile:.

Ja to robim takto. Pravda je, ze som to programoval uz dost davno. V inom zapise ako v C Ti to vsak poskytnut nemozem, dufam, ze nevadi :smiley: :smiley: :smiley: :smiley:


// program zapisuje do SAA1064 obsah i. I sa postupne inkrementuje z 0 do 9999. 

/*

spotreba SAA1064 + 4x 7segment 38mm, vsetko svieti, napajanie komplet 5V

jas 0x17  39mA 4x7segmenty MUX 
jas 0x27  71mA 4x7segmenty MUX 
jas 0x47 121mA 4x7segmenty MUX 
jas 0x77 146mA 4x7segmenty MUX R bc327 = 220R, R bc817 = 1k1

jas 0x10  60mA 2x7segmenty bez MUX
jas 0x20 110mA 2x7segmenty bez MUX 
jas 0x40 210mA 2x7segmenty bez MUX 
jas 0x70 353mA 2x7segmenty bez MUX 


Rychlost MUXovania: 3ms dva segmenty a dalsie 3ms dalsie dva segmenty

funkcia twi0_send_dat odvysiela bajt do SA1064 a spravne zareaguje na ACK
cinnosti funkci twi0_start() a twi0_stop() je zrejma
*/

// adresy SAA1064
#define ADR1 (0<<1)
#define ADR2 (1<<1)
#define ADR3 (2<<1)
#define ADR4 (3<<1)
#define ADR_SA1064 0x70

void fn_twi_sa1064(void)
uint8_t cislo[4], digit[4];
uint16_t i = 0;

   i++;
   if (i > 9999) i= 0;


// miesto premennej cislo, by bolo vhodnejsie pomenovanie cislica
   cislo[3] = i/1000;
   cislo[2] = (i - 1000 * cislo[3])/100;
   cislo[1] = (i - 1000 * cislo[3] - 100 * cislo[2])/10;
   cislo[0] = i - 1000 * cislo[3] - 100 * cislo[2] - 10 * cislo[1];

// tie nuly a jednicky zavisia podla toho,ako sa podari natahat plosak
   for(uint8_t pom_i = 0; pom_i < 4; pom_i++) {
      if (cislo[0 + pom_i] == 0) digit[pom_i] = 0b01011111;
      if (cislo[0 + pom_i] == 1) digit[pom_i] = 0b00001100;
      if (cislo[0 + pom_i] == 2) digit[pom_i] = 0b10011011;
      if (cislo[0 + pom_i] == 3) digit[pom_i] = 0b10011110;
      if (cislo[0 + pom_i] == 4) digit[pom_i] = 0b11001100;
      if (cislo[0 + pom_i] == 5) digit[pom_i] = 0b11010110;
      if (cislo[0 + pom_i] == 6) digit[pom_i] = 0b11010111;
      if (cislo[0 + pom_i] == 7) digit[pom_i] = 0b00011100;
      if (cislo[0 + pom_i] == 8) digit[pom_i] = 0b11011111;
      if (cislo[0 + pom_i] == 9) digit[pom_i] = 0b11011110;
      if (cislo[0 + pom_i] > 9) digit[pom_i] = 0xFF;
   }


   twi0_start();
   twi0_send_adr(ADR_SA1064 + ADR2);
   twi0_send_dat(0x00); // adresa prveho zapisu

#ifdef TWI0_SAA1064_MUX_REZIM
   twi0_send_dat(0x77); // status - jas 0x10 az 0x70, to ze su bity 1 a 2 nastavene ako blanc sa prejavi iba v MUX rezime
#else 
   twi0_send_dat(0x70); // musi byt skratovany MUX tranzistor
#endif
// v MUX rezime musia byt na log.1 takze napr 0x77 s max jasom
// data zapis v tomto poradi:
//[0] LSB, [3] MSB
#ifdef TWI0_SAA1064_MUX_REZIM
   twi0_send_dat(digit[2]); // LSB3
#endif
   twi0_send_dat(digit[0]); // LSB (1)
#ifdef TWI0_SAA1064_MUX_REZIM
   twi0_send_dat(digit[3]); // MSB (LSB4)
#endif
   twi0_send_dat(digit[1]); // LSB2

   twi0_stop();
}

Bezva, díky moc!!!

Právě jsem objednal obvod a kontaktoval kamaráda, který má prý nějakou móóc dobrou učebnici jazyka C :slight_smile:.

Takže předpokládám, že až mi vše přijde, už dokáži ty Tvé hieroglyfy rozluštit! :slight_smile: :slight_smile:.

Pravda je, že existuje spousta hotových kódů např. přímo ze stránek výrobce, které by se daly hned použít. Vše v C. :slight_smile:.

Vl.

Jo, jinak PIC má při výstupu v úrovni H výst. odpor asi 90 ohmů a v úrovni L asi 26 ohmů.

Jistější bude přepnout při ACK na IN.

Vl.