Vyber tlmivky 10uH pre odrusenie AD prevodnika

Dobry den,

chcem sa poradit ohladne spravbneho vyberu tlmivky (Power Inductor) pre napajanie pinu AVCC pre npr. ATMEGA328. Pozeral som ich na aliexpress, ale su rozne velkosti a neviem ktora velkost je lepsia:

Power Inductor 8x10mm: s.click.aliexpress.com/e/c0f6Dkv6
Power Inductor 9x12mm: s.click.aliexpress.com/e/ltfNbkc

Cielom mojho vyuzitia je sledovanie napatia baretii Li-ion. Aktualne mam pin AVCC napojeny priamo na 5V napajanie (kedze nemam tlmivku) a dost “skace” zmerane napatie cez AD prevodnik. Este som sa docital o sleep mode - ADC Noise Reduction, tak vyskusam aj to, len urcite potrebujem aj tlmivku - jasne zapojenie z datasheetu.

Budem Vam velmi vdacny za radu. Dakujem.

AD převodník u procesorů AVR má odběr minimální, takže není nutné dávat nějaké tlumivky na relativně velký proud. Je tedy možné použít i tlumivky v pouzdru SMD 1206 (odzkoušeno). Jinak používám i tlumivky o velikosti klasického odporu. Pokud měříš napětí na Li-Ion baterii a procesor napájíš 5V, pak tipuju, že v zapojení máš step-up měnič. Řekl bych, že tady bude asi největší problém. Záleží samozřejmě na tom, jestli těch nutně 5V potřebuješ nebo ne. Procesoru umí běžet už od 1,8V (když se omezíš s kmitočtem do 4 MHz). Pokud potřebuješ víc, pak Ti do 10 MHz stačí napětí 2,7V. Na Aref si můžeš přivést externí referenční napětí nebo přepneš referenci na interní 1,1V. Pak Ti na Aref stačí 100n kondenzátor. Měřené napětí na vstup pak přivedeš přes dělič třeba 3:1 (použil bych 4 shodné odpory mezi + baterky a GND). Měření je pak nezávislé na napájecím napětí a máš k dispozici plný rozsah převodníku :

1023 = 1,1V => 4,4V na baterce.

Rozlišení je 1,1/1024*4 = 0,004296875V / bit => 4,296875mV / bit.

To je samozřejmě teorie. V reálu si po zapojení nastavíš na vstupu napětí tak, abys dostal na AD převodníku třeba 1000, a pak máš do přepočtu hodnoty následující :

PřivedenéNapětí/1000 = NapětíPro1Bit

Napětí pak získáš tak, že

HodnotaAD * NapětíPro1Bit = NapětíBaterie.

Řešil jsem zrovna nedávno podobný problém - deska napájena 12V, na procesor použitý DC-DC převodník na 5V. Při zkoušení programu v kontaktním poli skákala měřená hodnota z AD převodníku v rámci 1 bitu - napájené to bylo laboratorním zdrojem +5V (bez DC-DC). Vyrobili jsme DPS, osadili a pustili se do zkoušení. Deska byla napájena z téhož zdroje, ale 12V, protože na desce jsou i relátka na 12V. Jenže ouha, hodnota AD převodníku lítala o 6 bitů. Na vině byl právě onen DC-DC převodník. Použili jsme místo něj 7805-ku a rozptyl se vrátil do úrovně 1 bitu.

Pokud tedy jsi schopný celé zařízení napájet z té baterky, kterou by externí zdroj udržoval nabitou pomocí nějakého lineárního stabilizátoru, měl bys být schopný dostat z AD převodníku dostatečně stabilní hodnoty, aby bylo možné přesné měření.

Dakujem velmi pekne za tak rozsiahlu odpoved. Kupim teda tie 8x10mm, aj ked teraz rozmyslam, ze do kontaktneho pola mi budu asi lepsie tie v tvare odporu (s.click.aliexpress.com/e/bXtRbmTI), kedze piny, ktore treba prepojit, nie su z rovnakej strany CPU.

Skusim teda rozpisat, co mam v plane robit:

Mam uz hotove ovládanie LED pasu s LED RGBW ovladane cez komunikaciu (WS2812b) zatial 1m so 60 LED. Urceny je na osvetlenie kuchynskej linky. Funguje asi takto:

  1. tlacidlo - zapina LED pas a rozsieti 60 LED v teplej bielej farbe. Po dalsom stlaceni rozsvieti 60 so vsetkymi RGBW farbami (najsilnejsi jas - sieti do biela). Po dalsom stlaceni sa LED pas vypne.
  2. tlacidlo - znizuje jas LED (20%, 40%, 60%, 80%, 100%)
  3. tlacidlo - zmensuje pocet LED (/2, /4, /8, /1)
  4. tlacidlo - vynuluje nastavenia tlacidiel 2. a 3.
  5. tlacidlo - aktikuje nocny rezim, t.j. zapina len 3 LED (8., 30., 51.) vo farbe zltej (G + R) s reakciou na pohybovy senzor. T.j. pri aktivacii pohybového senzora zapne 3 LED, po jeho deaktivacii a odpocitani 7 sekund vypne 8. a 51. LED a po dalsich 7s vypne aj 30. LED.

Tlacidla: s.click.aliexpress.com/e/bHufnGKk
Pohybovy senzor: s.click.aliexpress.com/e/bFhghWcu

Pri rozsieteni vsetkych LED je este nastaveny usporny rezim, ktory reaguje na pohybovy senzor. T.j. pri neaktivnom senzore po 3 mnutach zacne postupne (kazde 3 minuty) vypinat LED a znizovat jas LED, az zhasnu vsetky LED (po 18 minutach).

1 metrovy LED pas mam aktualne napajany 5V, 3A zdrojom (adapter). LED pas je na 5V, takze preto som volil aj napajanie ATMEGA na 5V. Teraz vypiname adapter zo zasuvky, ked LED pas nepotrebujeme. Preto som zacal vymyslat s napajanim cez baterie 18650 Li-ion 3,7V. Nocny rezim a cely cas pri vypnutom LED pase by bol napajany cez baterie a pri zapnuti LED pasu sa najprv zapne zdroj a potom CPU rozsieti LED pas.

LED pas: s.click.aliexpress.com/e/cPlKTeIk
Zdroj 5V, 3A (adapter): s.click.aliexpress.com/e/blzhINMU

Riesenie mam zatial take neuplne. Pouzijem 4ks 18650 baterie (kupene menej kvalitne z aliexpressu, preto treba pouzit 4ks, dnes som ich testoval).

18650 bateie: s.click.aliexpress.com/e/b4NnZImM
Drziak na baterie: s.click.aliexpress.com/e/cP42n3le

Na nabijanie baterii chcem pouzit 5V 1A 18650 Lithium Battery Charging Board: s.click.aliexpress.com/e/rCA332g
Na zmenu napatia DC-DC USB Output charger step up Power Boost Module 0.9V ~ 5V to 5V 600mA: s.click.aliexpress.com/e/bxfpbS9K
Konektor pre menic napatia: s.click.aliexpress.com/e/sQhVkEM
Chcel som pouzit iny menic napatia - bez konektoru, ale ten mi nefungoval, tak som otvaral spor.

Moja predstava je asi takato:
Napajanie zdroja 230VAC bude CPU spinat cez rele KA1 s 5V cievkou. Vystup zdroja bude priamo napojeny na battery charging a cez spinaci kontakt rele KA2 na LED pas. Rozpinaci kontakt rele KA2 bude napojeny na vystup step up modulu, pre napajanie LED pasu, ked bude LED pas vypnuty, alebo zapnuty nocny rezim. Kvoli kratkemu vypadku napajania LED pasu (pri prepinani rele KA2) chcem pouzit kondenzator C1 2200uF (snad bude stacit). CPU bude prepinat rele pri vypnutych vsetkych LED - vtedy LED maju maly odber (uz nepamatam presne kolko). Nechcem, aby boli uplne bez napajania, lebo po privedeni napajania slabunko bliknu a ktovie, co by to s nimi robilo, ak by to bolo casto. Z + polu baterii bude do CPU na AD0 vstup privedene napatie baterii, ktore chcem, aby CPU sledoval. Pri poklese pod 3.2V na baterii by CPU bez ohladu na to, ci treba rozsietit LED pas, zapol zdroj na napajanie a zacal si nabijat baterie. Tu mi vznika dalsi “problem” ako bude vediet CPU, ze baterie su nabite. Po dnesnom testovani som zistit, ze pri nabijani je na baterii stale 4.1V (nabijacie napatie z battery charging) a znizuje sa nabijaci prud. Battery charging ma ochranny obvod, ktory ukonci nabijanie pri plnom nabiti, ale CPU o tom nevie. Preto asi by som mal sledovat v CPU aj nabijaci prud - to este musim nastudovat, ze ako - zatial netusim.
CPU sa po vypnuti LED pasu uspi do Power-down Mode a cez den dokonca vypina aj napajanie pre pohybovy senzor. Po stlaceni 1. tlacidla, popripade pri aktivovanom nocnom rezime, po aktivacii pohyboveho snimaca sa “zobudi”. Tento rezim budem musiet zmenit na Power-save Mode, aby fungoval casovac Timer2, ktory bude sluzit na kontrolu napatia v baterii (cca by mohlo stacit kazdych 30 min). Len neviem uplne ako sa sprava Timer2 v uspornom mode. Sice mu nastavim preddelicku na 1024 a TCNT2 vzdy na 16, ale na jednu sekundu aj tak treba 60 preruseni a na 30 minut ich treba 108000. Bude vobec spat? Neviem :confused:
A tu mi vznikla dalsia myslienka: Uz ked sa CPU zobudi a kontroluje cez AD prevodnim napatie na baterii, mohol by cez fototranzistor kontrolovat aj jas v miestnosti a pri slabom jase aktivovat nocny rezim sam :open_mouth: :slight_smile: a zase rano by ho vedel sam aj deaktivovat :slight_smile:
CPU bude mat este jednu novu ulohu, ak sa mi to podari. Mame v kuchyni pouzity aj bezdotykovy davkovac mydla, ktory funguje tak trosku divne - dlho davkuje mydlo. Preto by som ho chcel skusit prerobit cez tento isty CPU. Odpadne tak aj nabijanie baterii v mydle. Kedze ale IN0 a IN1 na zobudenie CPU su uz obsadene, budem musiet asi cez diody zlucit vstup od mydla a pohyboveho snimaca na IN1 a pouzit dalsi vstup, aby CPU vedel, co aktivovalo IN1 vstup.

Pre toto vsetko som riesil napajanie na 5V a aj riesenie cez step up modul.

Tak to je zatial asi vsetka moja predstava, snad som to napisal zrozumitelne. Prikladam aj v rychlosti rukou nacrtnutu schemu napajania. Budem Vam teda vdacny za Vase napady, popripade za nejake to usmernenie lepsim smerom, nakolko sa stale len a len ucim. Dakujem :slight_smile:

Vcera som uz nestihal zareagovat ohladne toho AD prevodnika. Mne sa aktualne pohybuju hodnoty napatia baterie v rozmedzi ADC = 717 az 801, co je cca 3,5V az 3,911V. Spravna hodnota podla voltmetra by mala byt 3,606V. ALE, momentalne nesplnam ani zapojenie podla datasheetu. Aktualne mam pin VCC, AVCC, AREF pripojene na 5V a kazdy pin je odruseny 100nF kondenzátorom a bez pouzitia “set_sleep_mode(SLEEP_MODE_ADC)”. Objednavam tlmivky a uvidim potom co to urobi, ked to bude spravne zapojene.

Zapojení AREF - Pokud chceš měřit napětí s referencí na VCC (AVCC), tak na AREF těch +5V NIKDY nepřipojuj. Koukni se do datasheetu. Na AREF patří referenční napětí POUZE v případě, že používáš externí zdroj referenčního napětí. Ve všech ostatních případech na AREF připojuješ jenom kondenzátor 100n.

Použití VCC jako referenčního napětí není vhodné pro nějaké přesné měření AD převodníkem, pokud nemá stabilitu a přesnost regulérního referenčního zdroje - a to pulzní měnič už z principu mít nemůže. Obecně jakýkoliv zdroj (i lineární), pokud má proměnnou zátěž (ve Tvém případě rozsvícené/zhasnuté LED, relátko) není vhodný jako zdroj referenčního napětí. Na přesné měření použij buď externí zdroj referenčního napětí (například MCP1541 = 4,096V s přesností 1%) nebo použij interní referenci procesoru - v tomhle případě 1,1V. Pokud použiješ pulzní stabilizátor k napájení, musíš mít napětí velmi dobře vyhlazené, stabilizované a především odrušené, abys dostal z AD převodníku použitelné výsledky. Možná by pomohlo, kdybys měl napájení řešené tak, že na výstupu měniče budeš mít nastavených třeba 6V a za tím budeš mít pro mcu 7805-ku.

Výhody/nevýhody jednotlivých referencí :

  1. Externí reference :
  • plus baterky připojíš přímo na pin AD převodníku, nepotřebuješ odporový dělič
  • jednodušší přepočet - hodnota 1000 z AD převodníku = 4,000V
  • malinko dražší řešení (17 Kč referenční zdroj)
  • napájecí napětí nesmí poklesnout pod 4,3V
  1. Interní reference 1,1V :
  • je již v cené procesoru
  • napájecí napětí může klesnout až k úrovni, kdy přestává pracovat procesor
  • o něco levnější řešení (2 odpory stojí méně, než 1 reference)
  • plus baterky musíš připojit přes odporový dělič
  • konstantu pro přepočet si musíš nejdřív zjistit

Co se SLEEP_MODE_ADC týká, tak ten jsem ještě nikdy nepoužil. Používám prakticky jen IDLE. Je to z toho důvodu, že pomocí přerušení generuju refreshe displejů, jas LED displejů, snímám okolní osvětlení (kvůli řízení jasu) - zkrátka procesor nespí dlouhodobě, ale vlastně jenom mezi jednotlivými cykly programu. Jen u elektronické kostky jsem použit i POWER_DOWN, ale to bylo opravdu jenom na vypnutí a čekání na zapnutí tlačítkem.

Buzení procesoru pomocí IN0 a IN1 (předpokládám, že máš na mysli INT0 a INT1) - pokud potřebuješ víc externích “budíků”, tak máš ve všech sleep modech k dispozici i Pin Change interrupt = 23 možností externího přerušení/probuzení procesoru.

Buzení pomocí timerů - pokud jsem správně pochopil datasheet, tak v POWER_SAVE modu jsou aktivní všechny timery. Pokud bys tedy použil 16-btový Timer1, tak máš k dispozici periodu až 67,1 sekundy při 1 MHz (8,38 sek. při 8 MHz). V případě, že bys tedy použit Timer1 místo Timer2, máš interní buzení vyřešené.

Ještě jedna poznánka k tomuto :

Pokud potřebuješ nějaké přesné časování (třeba přesně 1 vteřinu), pak je mnohem výhodnější nastavit timer do režimu CTC. Nemusíš za běhu nic přenastavovat. Timer pak počítá do OCRx a znova od nuly. Jen přerušení v tomhle případě musíš používat TIMERx_COMPy a ne TIMERx_OVF.

Ještě se zaměřím na celkové řešení napájení :

Připadá mi, že to řešíš zbytečně komplikovaně a draze.

  1. Zjistil bych si, jaká je vlastní spotřeba toho napaječe bez odběru. Pulzní zdroje na tom bývají dost dobře a pokud by byl odběr do 0,5W, asi bych vůbec neřešil vypínání zdroje ze zásuvky a nechal bych to připojené do sítě stále. TV taky nevypínáš nebo nevytahuješ ze zásuvky, ale jenom jí vypneš pomocí DO. PC taky jenom vypneš a nevytahuješ ho ze zásuvky. PIR čidla světel atd.

  2. Pokud by byl odběr vyšší, pak bych zachoval zapínání pomocí relátka (nebo optotriak, případně optotriak+triak) v případě potřeby rozsvítit LEDky, ale MCU bych připojil pomocí kondenzátorového zdroje k síti. Ani v tomhle případě bych asi baterku vůbec neřešil.

Opat dakujem velmi pekne za rozsiahlu odpoved.

Dakujem za upozornenie ohladne napajania. Takto som napajal zatial vsetky CPU, nakolko ma tak naucil jeden chalan, ktory ma ucil s týmito CPU pracovat. Nikdy mi nenapadlo kontrolovat zapojenie napajania. Teraz uz viem, ako je to spravne :slight_smile:

Vyskusam teda variantu 2) interne referencne napajanie 1,1V, aj ked asi bude pracnejsie, ale dostupne hned, nakolko nejake tie odpory mam doma. Skusil by som 4 x 10MOhm odpory, ak nie su prislis velke? Len dnes to uz asi nestihnem vyskusat. Takze AD prevodnik nastavim:

ADMUX |= (1 << REFS0) | (1 << REFS1); //referencia 1V // zapnutie AD prevodnika, 1 prevod // preddelicka 128 pri frek. hodin 14,7456MHz // ADEN - Povolenie ADC prevodníka; ADSC - Štart prevodu; ADATE - Opakovací režim; ADIE - Povolenie prerušenia od ADC prevodníka; ADPS2 ÷ ADPS0 - Nastavenie preddeličky ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADIE) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);
Este taka otazka pre zaujimavost: Ako sa bude spravat AD prevodnik, ak by mu prisla vacsia hodnota akio 1,1V? Je to tak, ze pri hodnote >=1,1V bude vzdy hodnota ADC = 1024?

Ja som doteraz pri LED pase pouzival POWER_DOWN, a fungoval, s tym, ze tiez cakal na reakciu bud 1. tlacidla (INT0), alebo na aktivaciu pohybového senzora (INT1).

Ospravedlnujem sa za chybne uvedenie IN0 a IN1, spravne su ako ste napisal INT0 a INT1. Pin Change interrupt to som si nikdy neuvedomil, vsimol som si teraz, ze su aj prerusenia pre PCINT1 az PCINT23. Ak to dobre chapem, konkretne Pin Change Interrupt Request 0 pre PCINT0 az PCINT7 a nastavuje sa to v registry PCMSK0? Cize, ktore PCINTx dam do logickej urovne, tak tie mi aktivuju prerusenie Pin Change Interrupt Request 0, ktore nastavim PCICR? Ale musia byt nastavene ako vstupy.

Tu Vam asi skusim trosku protirecit, ak su moje merania spravne. Robil som dnes merania oderov prudu na LED pase, ktory mam v prevadzke este po starom, t.j. aktivovany POWER_DOWN, aktivovany Timer1, deaktivovany AD prrevodnik a komparator. Po vypnuti LED pasu a uspati do POWER_DOWN ma CPU spotrebu 55,4uA, pri zobudeni ma spotrebu 13,222mA. CPU je ATMEGA88PA-PU.
Na testovacom CPU ATMEGA328P-PU je uz aktivovany POWER_SAVE, aktivovany Timer1, uz aj Timer2, AD prevodnik a CPU sa mi neuspal - odber ma stale 13,03mA. Tak mi to pride tak, ze len Timer2 ho dokaze zobudit? A neviem, ci sa da nejakym spôsobom docielit, aby CPU dokazal spat a len raz za pol hodinu sa zobudil, vyhodnotil stav baterii a stav jasu v miestnosti a zase sa uspal.

Za toto Vam velmi dakujem, porovnavanie OCRx som uz par krat pouzil, ale pri tomto mi to vobec nenapadlo. A dost mi to pomoze, lebo OCR1A mozem nastavit, aby mi prerusenie pre 1 sekundu naslato len 4 krat a OCR1B castejsie. Dovod je ten, ze LED pas rozsvedcujem a zhasam postupne, nie skokovito. Efekt trva 2 sekundy a CPU ma na to 450 preruseni, a tak je efekt pekne plynuly. No niektore premenne (ako casovanie vypinanie LED, alebo nocny rezim) staci menit menej casto a tam vyuzijem OCR1A. Tesim sa a dakujem :slight_smile:

Este som nespomenul a nereagoval na Vas prvy príspevok, aku frekvenciu pouzivam. Aktualne je to 14,7456MHz, nakolko tieto krystaly mam nakupene doma a aj preto, ze je tam dost vypoctov na ten prechodovy efekt 4 x 60 LED a to 450x za dve sekundy.

Co sa tyka celkového napajania, dnes som si uvedomil, ze som to v sobotu chybne popisal, resp napisal zle riesenie z hlavy. Lebo rieseni som mal viac. Ono zabudol som, ze ja chcem a musim vypinal LED pas od napajania, lebo 1m LED pasu odobera trvalo prud 54,98mA aj ked nie su rozsvietene LED diody. T.j. 0,275W a za rok je to cca 2,4kW, co je celkom dost. A treba ratat s tym, ze casom to bude viac ako 1m. Ak by to bolo napríklad 4m uz je to 9,6kW rocne a to je len LED pas vypnuty.
Pri zapnuti vsetkych LED vo vsetkych farbach odobera 1m LED pasu 2,51A. Pri 4m je to 10A. Tu by som musel rele KA2 pouzit vykonejsie 16A, alebo pouzit 2 rele 6A (aj tak bude musiet ist viac kablov zo zdroja k LED pasu). Preto mi napadla myslienka, vypinat samotny zdroj od 230V, kde by stacilo aj jedno 6A rele. A tu vznikla myslienka, napajat CPU cez baterky. Len neviem, ci by som mohol upravit schemu zapojenia takto (foto v prilohe): Rele KA1 by ostalo, ale zmenilo by sa zapojenie rele KA2 a napojenie LED pasu zo zdroja a baterii. Doplnil by som diodu (cervena 1N4007) za rele KA2, aby sa nedostalo zo zdroja 5V k CPU, ale islo len cez step-up. Lenze, mal by som doplnit aj tu modru diodu, aby sa nedostavalo 5V zo step-up do zdroja :confused: A tu je ten problem, musi byt dost vykonna, pri 4m LED pase musi zniest 10A. Neviem, co by sa stalo, kebyze ju vynecham… Skor by asi bolo mozne vynechat cervenu diodu, kedze je tam rele.
Alebo doplnit este jedno rele KA3 namiesto modrej diody. Co by asi bol celkom dobry napad. A to by sa mohlo spinat priamo z napajania zdroja (adaptera). Lebo, ked bude zopnute rele KA1 a tym KA3, bude na LED pas privedených 5V zo zdroja (rele KA2 rozpojene). Ked budem chciet prepnut LED pas na baterky bez krátkodobého vypnutia LED pasu, zopnem najprv rele KA2, na LED pas pride aj napajanie 3,9V (5V - ubytok napatia na diode 1N4007), ale prud by mal ist zo zdroja, nakolko zdroj ma 5V. Potom by uz len stacilo vypnut rele KA1, tym padom sa vypne KA2 a napajanie pojde z baterii. Moze byt? LED pas by mal udajne fungovat od 3,5V, ale musim vyskusat. Viete poradit diodu, ktora ma mensi ubytok napatia?
No a funkcnost by bola asi zrejma. LED pas pri zapnutom stave by bol napajany zo zdroja, pri jeho vypnuti, alebo nocnom rezime by CPU vypoj KA1 a zapinal by rele KA2 len vtedy, ked by potreboval rozsvietit nocny rezim (3 LED farby G a R). Poprípade by som nastavil, aby rele bolo zapnute cca 20-30 minut od posledného pouzitia nocneho rezimu, aby sa zase casto nevypinali od napajania LED - neviem ci im to skodi alebo nie.

K tomu vypinaniu TV, PC a pod. Asi sa chytite za hlavu, ale akosi som od malicka bol aj k tomu vedeny… TV vzdy po vypnuti vypiname vypinacom na predlzovacke, cize v obyvacke je vsetko vypnute. PC mam detto, vratane monitora, reproduktorov. Dokonca aj router a opticky konvektor vypiname, ked nie sme na nete. Nabijacky mobilu tiez. Cize jedine trvalo zapnute je chladnicka s mraznickou, mikrovlnka a sporak :slight_smile: No a este jedno radio v kuchyni, aby som bol presny :slight_smile: A druha vec, chcel som spravit co najuspornejsii LED pas, aj ked beriem, ze coto asi zozeru baterky…

No a este dnesne merania:

Samotny LED pas - 1m 60 LED RGBW:

  • vypnuty: 54,98 mA
  • zapnuty - 60 LED len biela farba: 1,11 A
  • zapnuty - 60 LED vsetky farby RGBW: 2,51 A
  • zapnuty - 3 LED zlta farba R + G: 87,1 mA
  • zapnuty - 1 LED zlta farba R + G: 65,85 mA

CPU bez LED pasu:

  • usporny rezim POWER_DOWN: 55,4 uA
  • normalny rezim: 13,222 mA
  • normalny rezim + napajany pohybovy senzor: 13,79 mA
  • normalny rezim + napajany pohybovy senzor + rozsietene 3 zlte LED: 996,63 mA

Adapter primar 230VAC:

  • bez zataze: 12,259 mA
  • usporny rezim POWER_DOWN a LED pas pod napatim: 15,2 mA
  • zapnuty - 60 LED len biela farba: 64 mA
  • zapnuty - 60 LED vsetky farby RGBW: 122 mA
  • zapnuty - 3 LED zlta farba R + G: 18 mA

Este raz dakujem za Vas cas.

Vezmeme to postupně :

Je skvělé mít po ruce někoho, kdo poradí a pomůže přímo na místě. To ale neznamená, že by sis neměl projít datasheet. Věci společné pro celou rodinu procesorů stačí projít jednou, dvakrát na začátku a mělo by se Ti to zažít, že už to pak budeš dělat automaticky i u dalších procesorů.

4x10mOhmů pro napěťový dělič by měl být v pohodě, obzvlášť pokud k pinu přidáš ještě kondík 10-100n. Měření napětí se Ti ještě trošku vyhadí přímo na vstupu do AD a mělo by být stabilnější. Je třeba ověřit časovou konstantu vzniklého RC článku, abys po odpojení aku neměl na vstupu ještě dalších 10 minut stejné napětí. Vstupní impedanci sis určite v datasheetu k procesoru našel, že ?

Jak se bude chovat převodník v případě, že na vstup přivedeš napětí >=1,1V (obecně >=Uref) je celkem jasné - vrátí Ti maximální možnou hodnotu (v tomto případě 1023).

Když se podíváš na POWER_DOWN a POWER_SAVE, tak zjistíš, že jsou téměř shodné. Jediný rozdíl je v tom, že v POWER_DOWN neběží čítače, tím pádem od čítačů nemůžeš MCU probouzet. Ani v jednom případě by ale neměly být v chodu ani hodiny AD převodníku, tím pádem by neměl běžet ani převod a nejsem si jistý, jestli při jiném sleep modu, než IDLE nebo ADC Noise Reduction bude AD převodník fungovat správně. A navíc

Pokud tedy chceš minimalizovat spotřebu, měl bys AD převodník před přechodem do sleep modu vypnout a po probuzení ho zase zapnout. Po celou dobu převodu bys pak měl použít jenom IDLE nebo ADC Noise Reduction.

PCINTx se používá trošičku jinak, než INTx. INTx lze nastavit na jednu hranu, obě hrany nebo low level. Pin Change (jak už sám název napovídá) reaguje pouze na změnu hodnoty na pinu. Reaguje na obě hrany a vyvolá PCINTx přerušení podle skupiny, do které patří. Pokud tedy potřebuješ sestupnou hranu určitého pinu, musíš po vyvolání přerušení zjistit, který pin přerušení vyvolal a jakou úrověň aktuálně má. Vynechat můžeš jenom zjištění, který pin přerušení vyvolal - a to v případě, že PCINT má v dané skupině aktivní jenom jeden. Kontrolu aktuální úrovně pinu zase můžeš vynechat, pokud reaguješ shodně na obě hrany. Další výhodou PCINT přerušení je i to, že není důležité, jestli je pin jako vstupní nebo jako výstupní, dokonce může být použitý v alternativní funkci. Já třeba PCINT používám při UART komunikaci - a to tak, že aktivuju PCINT na pinu, kde je RXD. Jakmile přijde sestupná hrana, tak se vyvolá PCINT (od RXD pinu), rozsvítím LEDku a PCINT zakážu. Po ukončení příjmu znaku se vyvolá USART Rx Complete, kde zhasnu LEDku a povolím daný PCINT. Také jsem PCINT použit pro inverzi TX signálu UARTu. Abych nemusel generovat UART softwarově nebo pin externě negovat, udělal jsem PCINT od TXD pinu a při změně na TXD pinu se vyvolalo přerušení a tam jsem přečetl TXD pin, invertoval hodnotu a poslal na jiný pin, který tím pádem fungoval jako invertovaný TXD.

Tady si nejsem příliš jistý, co by mohlo způsobit to, že procesor se prakticky neuspává. Musel bych vidět program, ale osobně bych hádal, že v tom může mít prsty free-running mód AD převodníku - i když podle datasheetu by se s přechodem do POWER_SAVE nebo POWER_DOWN měly zastavit i hodiny AD převodníku - neplést si to s jeho deaktivací - převodník je sice bez hodin, ale zapnutý. Ale tady opravdu jenom hádám.

Co se odběru LED pásu týká, tak tam je jeho odběr ve zhasnutým stavu celkem logický. Když se podíváš do datasheetu SK6812, tak zjistíš, že jeho klidový odběr je 1 mA. Na pásu máš 60 LED, tak se nemůžeš divit, že zhasnutý pás má odběr 55 mA. Musel bys použít pás s LEDkama bez kontroléru, rozdělit si ho na skupiny a jejich jas řídit procesorem sám. To by ovšem znamenalo, že pokud bys svítil, musel bys generovat tolik PWM signálů pro LEDky, kolik bys měl skupin.

Na závěr ještě odbočím k tomu vypínání TV, PC atd. ze zásuvky. Samozřejmě je to každého věc a nikomu nic nenutím. V TV nebo v různých článcích na Internetu dokonce fundovaně spočítali, kolik ročně ušetříš, když budeš všechno vypínat/vytahovat ze zásuvek. Dělám to také - avšak pouze, když odjíždíme na dovolenou apod. Prostě když jsme minimálně na týden mimo domov. Pulzní zdroje totiž všeobecně nemají rády časté zapojování do sítě. Při zapojení do sítě dochází k velkému proudovému nárazu (obzvláště u výkonnějších zdrojů), které se nelíbí hlavně vstupním kondenzátorům. Některé lepší zdroje mají proto na vstupu NTC termistor, který omezí proudový náraz při připojení do sítě. Jenže to je opět minimálně jedna součástka navíc (rozuměj prodražuje se výroba). A to nemluvím o tom, že opravdu slušné zdroje mají u termistoru ještě překlenovací relátko, které po rozběhu NTC termistor zkratuje, aby zbytečně nesnižoval napájecí napětí a zbytečně se nehřál. Měl jsem tady 500W zdroj do PC (při maximálním zatížení by tedy měl brát maximálně cca 2,3A), který při připojení do sítě vyhazoval 16A jistič. Nemusím připomínat, že pokud jsou schopni výrobci vynechat ochranné odpory (proti proudovému nárazu při zapnutí) v LED žárovce (jak jinak, než kvůli ceně - na DPS místo na jejich osazení je), kdy za oba jako koncový zákazník zaplatíš maximálně pár desítek haléřů a který jako velkoodběratelé musí mít v ceně necelých haléřů, tak určitě nebudou osazovat NTC termistor, který je cenově mnohem dražší. Opakovaným zapínáním pulzního zdroje do sítě tedy velice zkracuješ životnost daných kondenzátorů, potažmo celého pulzního zdroje. A to platí nejenom u Tvého zdroje napájení LEDek, ale i TV, PC a ostatních moderních spotřebičů, které jsou napájené právě kvůli úspoře a ceně pulzními zdroji.

Tady jsi myslím trošku nepochopil, jak funguje OCRxy. Nemůžeš použít OCR1A a OCR1B k tomu, abys měl u obou jinou periodu. Oba OCR registry se vztahují jenom k jednomu TCNT. Máš několik možností, jak je využít k přerušení.

  1. Normální režim timeru :

Čítač čítá 0x00 až 0xFF (0x0000 až 0xFFFF)
Přerušení může nastat při přetečení 0xFF->0x00 (0xFFFF->0x0000) a pak při TCNTx = OCRxA a TCNTx=OCRxB.

  1. CTC režim timeru :

V CTC režimu nemůže nastat přetečení TOV.

Pokud použiješ CTC režim s TOP pomocí OCR1A, pak může nastat pouze přerušení od OCR1A při resetu TCNT1 a pak při TCNT1 = OCR1B, ale pouze v případě, že OCR1B < OCR1A. Čítač čítá 0x0000 až OCR1A-1.

Pokud použiješ CTC režim s TOP pomocí ICR1, pak může nastat přerušení od ICR1 při resetu TCNT1 a pak při TCNT1 = OCR1A (pokud OCR1A < ICR1) a TCNT1 = OCR1B (pokud OCR1B < ICR1). Čítač čítá 0x0000 až ICR1-1.

Dakujem opat za Vase odpovede.

Áno, vstupny odpor analógového vstupu AD prevodnika je 100MOhm. Len ak by ste mi to vedeli trosku viac vysvetlit, co ste mysleli, budem vdacny. Ale predpokladam, ze cim vacsi je odpor, tym sa pomenej bude vybijat kondenzator. A kondenzator pripojit medzi PIN a GND.

Pri tom uspornom rezime POWER_DOWN a POWER_SAVE som to doplietol ohladne uspavania a citacov. V POWER_DOWN citace nejdu urcite ziadne. Niekedy skusim nahrat povodny kod na skusobny CPU, len zmenim POWER_DOWN na POWER_SAVE. Tam memam este aktivovany ani AD prevodnik, ani Timer2 a dal by som potom vediet, ci sa CPU uspi pri aktivovanom Timer1 alebo nie.

Pri prevode AD prevodnika planujem pouzit usporny rezim ADC Noise Reduction. A po prevode AD prevodnik chcem vypinat, ako aj komparator, a po 30 minutach pred dalsim prevodom zase pozapinat.

Dakujem za tipy pre vyuzitie Pin Change. To rozsvecovanie LED pri komunikacii UART sa mi paci, super napad. Este ak mozem zo zvedavosti, k comu ste vyuzili invetrovanie TX signalu UARTu?

Ano, viem,ze je logicke, ze LED pas musi mat nejaku spotrebu aj pri vypnutych LED, ved je tam cip, ktory caka, ci mu pride signal od CPU. Len pri pouziti dlheho LED pasu uz je tato spotreba v celku dost velka…

Takto som sa na spinacie zdroje nepozeral. U vykonejsieho PC zdroja vyhadzovanie istica poznam, vyriesil som si to s rele spinanym v nule. To by bolo mozno riesenie aj pre spinanie mojho zdroja, ak by som teda ostal pri mojom rieseni, ze ho vypinat. Nasiel som obvod MOC3041 resp. MOC3061, ktory by mal vystup spinat v nule. Ak by sa Vam chcelo, pozreli by ste sa na to, ci by to slo? Vystup by mal mat 1A, ak by som potreboval vacsi vykon, tak by som pouzil SSR (polovodicove) rele. Rele s cievkou by asi nebolo dost rychle a nemuselo by zopnut kontakty v nule. Viem, ze je to mozno zbytocne komplikovane pre “blby” LED pas, ale ja to beriem aj z tej stranky, ze pri takomto rieseni sa naucim viac veci, ktore potom budem moct pouzit aj inde.

Ohladne tych citacov, ano, mate pravdu, uplne som to doplietol a zle pochopil. Tym mojim riesenim by som mohol dosiahnut len to, ze by som mal v jednom Timer pocitane dva casy s tym, ze jeden plny a druhy polovicny. Napr.: 1. 4 prerusenia za 1 sekundu a druhy 8 preruseni za 1 sekundu. V tom druhom by sa hodnota pocitala pri preruseni oboch OCR1A a OCR1B a pri tom prvom len pri OCR1A. Ale kedze mam Timer0 volny, tak ten popuzijem na realizaciu efektu prechodu a Timer1 na realizaciu odpocitavania casu.
Timer0 by bolo mozne po prechode vypnut a pred zacatim prechodu zapnut, aby zbytocne nevznikali prerusenia, ked netreba. Asi by to bolo aj vhodne.

Teraz som testoval rezim POWER_DOWN a POWER_SAVE a vypada to tak, ze v POWER_SAVE zobudi CPU z TimerX len Timer2. Ked bol v rezime POWER_SAVE aktivovany len Timer0 a Timer1, tak CPU som dokazal zobudit len cez INT0, INT1. Ked som aktivoval Timer2, tak sa uz CPU standartne neuspal. Musel som doplnit do nekonecnej slucky programu podmienku, aby sa vzdy uspal, kym neodpocita postupne cas na nulu, urobi prepocet ADC, nastavi zase cas na odpocitavanie pre Timer2 a uspi sa.

Konečne mi dorazili tlmivky a podarilo sa mi poskúšať AD prevodník. Tak ako ste písal, pri zapojení CPU cez step up DC-DC neviem dosiahnuť presné napätie. Lieta mi to daleko viac ako len pár bitov. Keď som dal napájanie pre CPU zvlášť zo stabilizovaného zdroja, dostal som sa na reálnejšie napätie a kolísalo to cca 1-2 bit - musím ešte presne určiť úroveň jedného bitu (xxxV / 1000 ADC). Takže musím zvlášť napájať CPU a zvlášť LED pás. A tu by som sa chcel s Vami poradiť, ak budete mať ešte čas.

LED pás bude napájaný z batérií cez step up DC-DC poprípade zo zdroja 5V.

Napájanie CPU:
Varianta 1. - Napájať ho priamo z batérií, čo neviem, či je úplne dobrý nápad, nakoľko napätie nebude stabilné cca v rozpätí 3,3 ÷ 4V. Pri 3,3V by som chcel začať batérie dobíjať. Ďalší problém by bola frekvencia, nakoľko mám kryštál 14,7456MHz a ak som to dobre prepočítal, minimálne napätie pre túto frekvenciu by malo byť 3,5V. Ďalší problém je, že LED pás podľa datasheet očakáva minimálne napätie log 1 na úrovni 0,7 násobku napájacieho napätie, t.j. 3,5V, čo asi nedosiahnem, keď bude napätie batérii pod 3,5V.

Varianta 2. - Pridať jeden malý CPU, ktorý bude mať na starosti len AD prevody napätia batérii a jasu v miestnosti. Napájaný by mohol byť na 1,8V cez napäťový regulátor priamo z batérii (vedeli by ste mi prosím poradiť nejaký vhodný aj do kontaktného poľa?). Tento CPU by riešil:

  • každú pol hodinu sa zobudí
  • vykoná prevod oboch vstupov
  • vyhodnotí, či treba nabíjať batérie. Ak áno, dá do log 1 výstup č. 1 ak nie, dá ho do log 0
  • vyhodnotí, či treba zapnúť nočný režim. Ak áno, dá do log 1 výstup č. 2 ak nie, dá ho do log 0
  • ak sa zmenila hodnota výstupu č. 1 alebo výstupu č. 2, nastaví výstup č. 3 na log 1 po dobu cca 1 sekundu?
  • nastaví výstup č. 3 na log 0
  • uspí sa

Výstupy č. 1 až 3 by boli pripojené na vstupy č. 1 až 3 hlavného CPU. Výstupom č. 3 by sa hlavný CPU zobudil, skontroloval by vstup č. 1 a 2 a na základe ich hodnôt by zapol/vypol adaptér, alebo zapol/vypol nočný režim.

Len teraz som si uvedomil, že zase bude problém s napájaním 1,8V malého CPU, kvôli vyhodnoteniu úrovni log 1 na hlavnom CPU. Ak by som malý CPU mohol napájať priamo z batérii, tak by bolo napätie minimálne 3,3V a to by hlavný CPU mal správne vyhodnotiť log 1.

Čo som pozeral CPU, tak stačil by mi ATtiny13A. Dúfam, že z programovacieho hľadiska je rovnaký ako ATtiny13, ktorý by mi mal podporovať programátor, aby som do neho nahral program.

Ďakujem za Vaše rady.

Ahoj.

  1. Frekvence - pokud nutně potřebuješ těch 14,7456MHz, tak bys měl mít napájení 4,5-5,5V. Na 3,3-4V to chodit může, ale nemusí. Jsi mimo napětí, uvedené v datasheetu a musel bys to vyzkoušet, jestli to pojede i na těch 3,3V. Některé hodnoty v datasheetu je možné za určitých okolností a pouze pro domácí použití za orientační, protože výrobce tam bude mít určitou rezervu. Uvaž jen, jestli opravdu potřebuješ ta vysoký kmitočet. Třeba by stačil 8,192MHz.

  2. Na co cpát do takhle jednoduchý úlohy další procesor ? Použij převodník logických úrovní. S úspěchem ho už celkem dlouho používám při komunikaci mezi AVR a RaspberryPi nebo AVR a 3V periferiema.

Dakujem velmi pekne za reakciu.

  1. Ohladne urcenia frekvencii. Pravdupovediac neviem, ako urcit, aka najmensia frekvencia by mi mohla stacit. Ak by ste mi vedeli poradit, tak hlavne vypocty su tieto:

if (LEDpas_zmena) { LEDpas_zmena = 0; // Zmena efektu switch (LEDpas_efekt) { case 12 : { for (i=0; i < pocet_LED; i++) { LED_new[0]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); LED_new[1]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); LED_new[2]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); LED_new[3]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); } break; } } //Uloženie pôvodných hodnôt for (i=0; i < pocet_LED; i++) { LED_old[0]* = LED[0]*; LED_old[1]* = LED[1]*; LED_old[2]* = LED[2]*; LED_old[3]* = LED[3]*; } time = 1; while (time < dlzka_prechodu) { if (time != time_old) { for (i=0; i < pocet_LED; i++) { LED[0]* = LED_old[0]* + ( (( LED_new[0]* - LED_old[0]* ) / dlzka_prechodu) * time); LED[1]* = LED_old[1]* + ( (( LED_new[1]* - LED_old[1]* ) / dlzka_prechodu) * time); LED[2]* = LED_old[2]* + ( (( LED_new[2]* - LED_old[2]* ) / dlzka_prechodu) * time); LED[3]* = LED_old[3]* + ( (( LED_new[3]* - LED_old[3]* ) / dlzka_prechodu) * time); } // 0,x - GREEN; 1,x - RED; 2,x - BLUE; 3,x - WHITE cli(); for (i=0; i < pocet_LED; i++) { WS2812BWriteByte(LED[0]*); //green WS2812BWriteByte(LED[1]*); //red WS2812BWriteByte(LED[2]*); //blue WS2812BWriteByte(LED[3]*); //white } WS2812BWriteBit(2); //reset sei(); time_old = time; } if ((LEDpas_zmena) && (pohybovy_senzor_noc_enable)) break; if ((LEDpas_zmena) && (pohybovy_senzor_max_enable)) break; } if (LEDpas_zmena == 0) { cli(); for (i=0; i < pocet_LED; i++) { WS2812BWriteByte(LED_new[0]*); //green WS2812BWriteByte(LED_new[1]*); //red WS2812BWriteByte(LED_new[2]*); //blue WS2812BWriteByte(LED_new[3]*); //white } WS2812BWriteBit(2); //reset sei(); } }

  1. Suhlasim, rusim tuto variantu.

  2. Este mi napadla tretia varianta a ta ma suvis s tym, co ste mi tiez radil. A to je, pouzit nastavitelny step up DC-DC prevodnik a 7805-ku. Na DC-DC by som dal asi 7V (minimalne napatie podla datasheet), popripade skusil by som 6V ako ste mi radili Vy a stabilizoval to 7805. Ak by to slo a stacilo by to na odrusenie AD prevodnika, tak by som bol mozno za tuto variantu, ak teda by som nemohol ist nizsie frekvenciou. LED pas a vsetko ostatne by som napajal az po 7805 z napatia 5V. Dva step up DC-DC prevodniky (jeden 5V pre LED pas a druhy 6-7V pre CPU) by bolo asi zbytocne pouzit.

//EDIT
Este taka uvaha. Ak by som isiel dolu s napajanim CPU a frekvenciou, tak by som docielil mensiu spotrebu. Len potom neviem, ci CPU napajat priamo z baterii, kde bude napatie medzi 3,3 az 4V alebo ho napojit za step up prevodnikom a zrazit napr. s LF33CV na 3,3V? Vadi CPU kolisanie napatia? A tiez, ci je nutne pouzit externy krystal, alebo pouzit internych 8MHz, ale interny asi nie je presny.************************************

Ahoj.

Nějak jsem “vypadnul z tempa”…

  1. Frekvence procesoru je důležitá pro procesy, které musí trvat nějakou přesně danou dobu. Vše ostatní je podružné. To znamená podle datasheetu zjistit, kolik máš času na posílání jednotlivých bitů, kolik máš k dispozici času mezi bity/byty a jaké jsou tolerance těchto časů. Jinými slovy - důležité je, jak efektivně máš napsané odesílání dat do LED pásu. A opravdu se mi nechce studovat, jak efektivně sis komunikaci napsal. Doba na ostatní výpočty efektu = přípravu dat pro odeslání není až tak kritická a lze ji přizpůsobit. A ani výpočty se mi nechce procházet, abych zjišťoval, co to vlastně má dělat.

  2. Psal jsem Ti sice o použití měniče + lineárního stabilizátoru, že by tak snad šlo odrušit měnič, ale nepsal jsem, že to mám vyzkoušené. Byl to jenom nápad. Dva step-upy jsou asi zbytečné. Mělo by fungovat to, že bys použil step-up na 6,5V nebo 7,2V a pro MCU pak 7805 a pro LED pás 2 nebo 3 diody v sérii. Jedna dioda má 0,7V úbytek. Problém je trochu v tom, že úbytek na diodách poměrně dost kolísá s proudem, který diodou protéká. Místo diod bys mohl použít i lineární stabilizátor s výkonovým tranzistorem, ale musíš počítat s tím, že bude potřeba poměrně dobré chlazení. Skoro 3A, cca 2V úbytku = s rezervou být schopen uchladit minimálně 10W. Totéž samozřejmě platí i o těch diodách, kde máš cca 2W na jedné diodě. Je potřeba použít diody, které alespoň ty 2W (raději více) zvládnou uchladit.

Dakujem za reakciu. Za ten cas som sa s LED pasom “hral” a…

  • ostal som na frekvencii 14,7456 MHz
  • procesor napajam priamo z baterii. CPU az pri napajani pod 3,0V zacne “blbnut” - teda displej napajany z 5V steep up prevodnika prekresloval spravne, ale LED pasu uz asi nestaci komunikacny signal uroven log 1. Ale kedze chcem zacat nabijat baterie pri poklese pod 3,3V, tak je to v pohode, pri nich funguje vsetko v poriadku.
  • AD prevodnik mam rieseny internem ref. napajanim 1V s tym, ze uroven napatia baterii riesim cez odporovy delic a uroven jasu riesim fototranzistorom zapojeny tak, aby pri zvysovani jasu bolo mensie napatie a tak mi staci reagovat na hodnoty pod 1,1V. Co sa tyka kolisania prevodu AD prevodnika, docital som sa, ze to sposobuje aj kontaktne pole, tak snad po dokonceni LED pasu a osadeni do plosaku to nebude az tak kolisat.

Uz mi to celkom dobre funguje, ale stale je tam cosi na opravu a co doplnat, ale tak pomalinky ked je cas, tak postupujem dalej. Kazdopadne dakujem velmi pekne za pomoc a ak narazim na problem, tak napisema aj budete mat este cas a chut tak sa potesim nejakej tej rade. Budem musiet riesit este spinanie 230VAC adaptera, mam polovodicove rele Finder 34.81.7.005.8240 ktory ma vstup 5VDC 12mA takze akurat pre CPU vystup a vystup ma 2A pre 230VAC a je spinany pri prechode napatia nulou. Ale zial, vystup je len 2A, takze ked budem mat vacsi zdroj, tak uz to nebude zvladat.

Držím palce, ať se Ti daří. Kontaktní pole není úplně ideální nejenom pro AD převodník, ale obecně pro vyšší frekvence. Pokud máš něco jen pospojovanýho, tak tam špatný kontakt relativně lehce odhalíš, jakmile tudy běží nějaká komunikace, hledá se problém hůře. Co se děliče napětí týká, to jsi postupoval správně, je třeba si jenom ohlídat, jestli máš dostatečně velké odpory, abys zbytečně proudově nezatěžoval baterku. Například místo 100+270 Ohmů je dobré použít 100k+270k (klidně třeba i 1M+2M7) - poměr zůstává zachovaný, ale proudově jsi na tom mnohem lépe. Když pak ještě přidáš třeba 10n kondík, tak máš vstup i relativně vyhlazený a zbavený nechtěných špiček.

Tak se drž a doufám, že se podělíš i s úspěchem.

Tak po dlhsom case sa opat ozyvam. Trvalo to, ale tak robil som to vo volnom case, obcas cakal na zasielky z aliexpressu. LED pas uz je v ostrej prevadzke cez 3 tyzdne a zatial funguje spolahlivo, bez potrebneho resetu CPU. Este som potreboval cas na skreslenie schemy zapojenia, ktoru prikladam. Chcem vas skusenejsich poprosit, ci by ste ju pozreli a popripade mi ju skusili vylepsit, ak najdete nieco, co by bolo lepsie zapojit.

Vsetko je aktualne zapojene na univerzalnej doske plosnych spojov. Hlavna cast (CPU, baterky, zdroj a pod.) je docastne umiestnene v pevnej krabici od topanok, ale to len kvoli prachu. Okrem teda zdroja, a rele. Tie su mimo DPS. Tlacidla su tiez na univerzalnej doske plosnych spojov. Pre ne som vytvaral krabicku z hlinikoveho plechu, ktora sa podarila na druhy pokus. Je tam sice otvor pre pohybovy senzor vacsi, ale tak usiel vrtak. V bytovych podmienkach, sa to tazko robilo, hlavne ohybanie plechu bola “radost” na malom zveraciku, ktory je otocny :smiley: Pohlad na vnutro krabicky s tlacidlami odfotene nemam, ale prikladam vykres z AutoCADu, pre nazornost.

Prepoj medzi tlacidlami a CPU je ethernetovym kablom 5e, nakolko ten bol po ruke. Potreboval som sice na prepoj 9 zil (5x tlacidlo, jas, pohybovy senzor, napajanie 5VDC pre pohyb. senzor a GND) a tak pre GND som pouzil vodic tienenia.

Jediny problem, ktory som si vsimol este pri testovani s LCD displejom bol, ze ked som zapol napr. svetlo, alebo nieco, tak nabehlo par preruseni pre INT0 a INT1 (tlacidlo 1 a pohyb. senzor). Neviem, ci dat pre kazde tlacidlo este 100nF kondik? Ako pre nanajanie CPU.

Druha vec, ktora sa mi nepodarila vyriesit: Chcel som, aby, ked LED pas robi zmenu – kazdy efekt trva 2 sekundy, dokazal reagovat na stlacenie nejakeho tlacidla. Programovo som to vedel urobit, ale problem bol ten, ze zvykol casto LED pas prebliknut. Proste aj male prerusenie komunikacie s LED pasom chybne vyhodnotil a nastal posun a kratke bliknutie inych farieb, vacsieho jasu a podobne. Jednoducho to rozhadzalo. Tak som to musel zrusit a tlacidla reaguje len vtedy, ked neprebieha komunikacia s LED pasom (ak sa dobre trafi, tak zareaguje aj cez tie 2 sekundy efektu). Neviem, ci sa tu da nieco vymysliet, hlavne, ak ma prerusenie vyhodnotit, ktore tlacidlo (2, 3, 4 a 5) sa stlacilo. Tlacidlo 1 je cez prerusenie INT0.

Nabijanie baterii funguje dobre. Signalizaciu o nabiti a nabijani baterii beriem kradnutim signalu z dosticky pre nabijanie z LED. Zapojene su cez tranzistory. Zistovanie aktualneho napatia na baretiach uz teraz funguje spolahlivo, pomohlo, ze je vsetko pevne zletovane. Este som si vsimol, ze to trosku ovplyvnuje priezer vodica, cez ktory ide aj napajanie LED pasu z baterii. Ked odoberal vacsi prud, tak vznikal ubytok na kabloch a preto CPU nameral mensie napatie. V scheme kvoli tomu uvazujem, ze odporovy delic pre zistenie napatia bude napojeny priamo z baterii vlastnym plosnym spojom. Baterie sa nabijaju hned, ako sa zapne zdroj 230VAC/5VDC. Ten sa zapina pri rozsvieteni celeho LED pasu (t.j. mino nocneho rezimu) a vypina sa 1,5 hod po prijati signalizacie nabitia baterii alebo 1,5 hod po vypnuti LED pasu. V pripade, ze by sa LED pas nepouzil dlhsie, tak CPU pri poklese napatia baterii pod 3,3V sam zapne zdroj pre nabitie baterii. Z tychto baterii som uz zapojil aj bezdotykove mydlo v kuchyni, takze sa nemusim starat o ich nabijanie. Kontrolu napatia a jasu v miestnosti kontroluje CPU kazdu minutu.

CPU zistuje uroven jasu v miestnosti cez fototranzistor umiestneny vedla tlacidla 1. Kontrola je ako som uz pisal kazdu minutu. Fototranzistor je zapojeny tak, aby pri znizovani jasu sa znizovalo napatie. Kvoli tomu nebolo potrebne pre uroven jasu riesit odporovy delic. Pri poklese jasu sa aktivuje nocny rezim a rozsvecuju sa 3 LED v zltej farbe (cervena a zelena farba LED). To uplne staci pre orientaciu sa v kuchyni. Po cca 14 sekundach (cca 7s na pohyb. senzore + 7s v CPU) bez pohybu sa vypnu 2 LED (krajne) a po dalsich 7 sekundach aj ta tretia LED. To je osetrenie, aby osoba vedela, ze ju senzor nezachytava, resp. sa nehybe a musi sa pohybat, aby neostala po tme. Hysterezia pre zapnutie a vypnutie nocneho rezimu z urovne jasu je 200 z ADC hodnoty, co uplne postacuje. Ak si niekto pocas aktivovaneho nocneho rezimu zapne riadne svetlo v kuchymi na strope, tak do minuty sa nocny rezim vypne (musi prebehnut ADC prevod urovne jasu).

Zmenu som urobil ohladne funkcii tlacidiel:

Tlacidlo 1 funguje ako povodne. 1. stlacenie zapne LED pas a len biele LED. 2. stlacenie zapne vsetky farby LED pre maximalny jas. 3. stlacenie vypne LED pas. V podstate toto tlacidlo pouzivame len na zapnutie LED pasu, popripade este to druhe stlacenie pre maximalny jas. LED pas vypiname vacsinou tlacidlom 5, nakolko vacsinou LED pas ide len na bielych farbach LED a tak stlacenim tlacidla 5 obideme rozsvietenie max. jasu. Zapne sa sice nocny rezim, ale ten uz vacsinou aj tak treba, kedze sa LED pas pouziva, ked je tma. A ak by bol dostatocny jas, tak CPU do minuty nocny rezim vypne.

Tlacidlo 2. Tu je zmena a toto tlacidlo je zlucenie povodne tlacidla 2 a 3. T.j. po stlacani tlacidla postupne znizuje jas o 20% a postupne znizuje pocet rozsvietenych LED. Casom som prisiel na to, ze nikomu sa nechce stukat s dvoma tlacidlami, aby znizil jas a aj pocet LED a vzdy sa pouzilo len jedno tlacidlo. Vyhodu to ma aj v tom, ze dalsia funkcia LED pasu je taka, ktora pri plnom rozsvieteni LED pasu a pri necinnosti pohyb. senzora kazde 3 minuty znizuje jas a vypina LED diody. Preto bolo dobre riesenie toto zlucit s tlacidlom 2. Urovne maju rovnake a ak napriklad bol jas LED pasu znizeny tlacidlom 2 a odideme z kuchyne, tak CPU bude postupne vypinat LED pas az od urovne nastavenej tlacidlom 2, kym ho postupne nevypne. A po prichode do kuchyne ho rozsvieti na uroven jasu nastavenu tlacidlom 2 a nie na maximum.
Urovne jasu a poctu LED (kazdy riadok znamena jedno stlacenie tlacidla 2, alebo ubehnutie 3 minut pri neaktívnom pohyb. senzore):

Tlacidlo 3. Kedze sa uvolnilo, nasiel som mu novu funkciu. LED pas uz mam pod celou linkou, je zbytocne, aby vzdy svietil cely. Preto som ho rozdelil na viacej cati, tak ako si mamina povedala. A postupne sa rozsvetcuju stlacenim tlacidla 3.

Tlacidlo 4 funguje teraz ako resetovanie nastaveni tlacidla 1, 2 a 3. Tlacidla 1 preto, ze rusi nastavenie maximalneho jasu na rozsvietenie len bielych LED. Po jeho stlaceni sa rozsvietia vsetky LEDky v bielej farby. Po doprogramovani tlacidla 3 bude nulovat aj jeho zmeny a rozsvieti len cast LED pasu ako na zaciatku.

Tlacidlo 5 je ako povodne. Zapina a vypina nocny rezim. No ale do toho mu uz teraz kecia aj snimac jasu, takze ak ho zapnem cez den, tak ho do minuty CPU vypne a naopak. Ak by som ho v noci vypol, tak si ho CPU do minuty zapne :slight_smile:

Ako CPU som nakoniec pouzil ATmega644PA-PU, nakolko som skusal funkcnost 4m LED pasu a zistil som, ze v ATmega328P-PU mi chyba pamat na premenne.

Tak hadam vsetko. Ak by ste chceli linky na ali vsetkych veci, ktore som k LED pasu objednavat (suciastky a pod.) tak napiste a mozem urobit zoznam. Coto je ale uz v prispevkoch vyssie. Neviem, ci chcete, aby som urobil aj video, ako funfuje LED pas, ale asi si to viete predstavit :slight_smile:

A este to najdolezitejsie :slight_smile: Velke podakovanie patri pre Balů, ktory mi v tejto teme dal vela cennych rad, takze DAKUJEM :wink: Uz len dufam, ze bude mat trpezlivost aj pri dalsich mojich “projektoch”.
LED pas_ovladac.pdf (18.7 KB)
LED pas_hlavna schema.pdf (34.2 KB)

Ahoj.

Pro začátek - stíněný ethernet kabel není 5e, ale 6. Kategorie 5e nemá stínění. Ale to je jenom detail.

Díval jsem se do schématu a externí pull-up odpory u tlačítek jsou zbytečné, pokud zapneš interní pull-up odpory v procesoru. Sice s nima nic nezkazíš, ale zbytečně si komplikuješ DPS. Psal jsi, že máš potíže s tím, že při zapnutí světla Ti proběhla nějaká přerušení INT0 a INT1. Dávat vstupní signály na přerušení (obzvlášť tlačítka) je klasická (v podstatě začátečnická) chyba. Ono je to hezký - stiskneš tlačítko a procesor o tom okamžitě ví. Jenže tlačítka (a nejenom ty) trpí zákmity kontaktů. Jedna varianta je ošetřit zákmity přímo v HW, druhá (a mnohem jednodušší) je řešit zákmity tlačítek pomocí SW. Všechny tlačítka obsluhuj v hlavním programu. Pokud něco z toho používáš k probuzení procesoru, pak tam to přerušení nech, ale použij ho jenom k proobuzení procesoru. V programové smyčce si přečti stav vstupu a pokud je stabilní dostatečně dlouho, považuj tlačítko za stisknuté (nebo obecně - považuj vstup za aktivní).

Druhým problémovým bodem máš komunikaci s LED páskem. Pokud máš předem dané časy ke komunikaci, pak nesmíš připustit jakékoliv zpoždění během procesu odesílání dat - říká se tomu “Time critical section”. Máš dvě možnosti :

  1. Na začátku sekvence zakázat přerušení a po odeslání dat ho zase povolit.
  2. Dát sekvenci odeslání dat do přerušení od časovače - prakticky tak zabiješ dvě mouchy jednou ranou.
  • během přerušení se další nezpracuje, až než se stávající dokončí.
  • Data do pásku odesíláš v přesně daných intervalech a přesně víš, jak často dochází ke změně dat v pásku. Lépe se pak časují veškeré efekty atd.

Pokud nastavíš časovač na 10ms a do hlavní smyčky dáš sleep (standby režim), pak 100x za sekundu odešleš data do pásku a 100x za vteřinu načteš vstupy. 10ms je pro procesor moře času - obzvlášť když používáš krystal 14MHz. Pokud je nějaký vstup aktivní, do proměnné pro něj přičteš 1, pokud není aktivní, danou proměnnou vynuluješ. Přesně tedy víš, že pokud je nějaké tlačítko aktivní 10x po sobě (napočítáš do 10), pak je stisknuto 100ms (= 0,1s) a jeho stav se dá prohlásit za aktivní (v prípadě tlačítka se dá prohlásit za stisknuté).

Tenhle princip používám ve všech svých programech. Na začátku nastavím časovač na nějakou hodnotu (obvykle 1 nebo 10ms, případně na kmitočet, který potřebuju pro refresh LED displeje apod.). V hlavní smyčce pak provedu vše potřebné a procesor uspím. Jakmile odčítá časovač, provede se opět jeden cyklus programu. Vše pak řídím příznaky na základě kterých se provádí činnosti, které se neprovádí každý cyklus. Program musí být napsaný tak, aby vždy vše stihnul provést mezi dvěma přerušeními. Delší činnosti je tak potřeba rozfázovat. Stejně tak na čekání. Na vteřinové čekání taky nedáš _delay_ms(1000), ale nastavíš nějaký odpočet a jakmile se odpočet dokončí, tak víš, že jsi čekal tak dlouho, jak jsi potřeboval. Obecně je nutné se funkci delay vyhybat jako čert kříži. a pokud už musíš dát někam delay, tak ho maximálně v rádu mikrosekund. A pokud by delay trval déle, než je doba mezi přerušeními, pak místo delaye činnost rozfázovat s využitím časovače.

Příklad programu s využitím timeru :
Mám 4-místný multiplexovaný 7-segmentový LED displej, tlačítko, LEDku.
Stiskem tlačítka rozsvítím LEDku a zapnu odpočet, po odpočítání času LEDku zhasnu. Při stisku tlačítka během odpočtu čas vynuluju a LEDku shasnu. Obojí musí reagovat pouze na stisk tlačítka, nikoliv na jeho držení. K tomu příklad nějakého dlouhého procesu, který by trval déle, než je čas mezi přerušeními.

Obsluha přerušení od časovače
{
// displej
  Vypnu napájení segmentovky, na datových pinech nastavím hodnotu další segmentovky a aktivuju ji.
// čas
 Pokud je nastavený příznak pro časování
  {
    Zjistím milisekundy
    milisekundy jsou 0 
    {
      zkontroluju čas
      čas je 0
      {
        zhasnu LED
        zruším příznak pro časování
      }
      čas není 0
      {
         odečtu čas a nastavím milisekundy na 1000.
      }
    }
  }
// dlouhý proces
  zkontrolovat odpočet
  pokud není 0
  {
    odečíst 1 
    pokud jsem dopočítal do 0 nastavit příznak pokračuj
  }
}

Program
{
  Nastavím IO piny procesoru
  Nastavím timer na 1ms (=1000Hz) s přerušením
  Načtu hodnoty vstupů a uložím si je jako aktuální i minulé.
  Vynuluju/nastavím časy a příznaky
  Povolím přerušení

  Hlavní smyčka
  {
    Uspím procesor do standby režimu (probudí se přerušením od časovače - tedy pravidelně každou 1 ms)
    Načtu vstupy
    ošetřím zákmity tlačítka
    zkontroluju aktuální stav tlačítka s minulým
    pokud je teď stisknuté a předtím ne
    {
      zkontroluju příznak časování
      časování aktvní
      {
        vymažu příznak časování
        vynuluju čas a milisekundy
        zhasnu LED
      }
      časování není aktivní
      {
        nastavím čas
        nastavím příznak časování
        rozsvítím LED
      }
    }
    uložím aktuální stav tlačítka jako minulý
    dlouhý proces
    {
      zkontroluj příznak pokračuj
      příznak je nastavený
      {
        vynulovat příznak pokračuj
        nastavit čas mezi kroky - pokud je čas mezi kroky vždy stejný, může být tady
        kroky
        {
          1: část 1
               zvýšit krok o 1
               nastavit čas mezi kroky - pokud jsou časy mezi kroky rozdílné
          2: část 2
               zvýšit krok o 1
               nastavit čas mezi kroky - pokud jsou časy mezi kroky rozdílné
          .
          .
          .
          .
          x: část x
               nastavit krok na 1 - konec procesu
               nastavit čas mezi kroky - pokud jsou časy mezi kroky rozdílné
        }
      }
  }
}

Smyslem tohohle je hlavně návod, jak vyhodit tlačítka z přerušení a dát do přerušení od časovače komunikaci s páskem. V klidu pak můžeš reagovat na tlačítka i během probíhajícího efektu.

Dakujem velmi pekne za dalsie rady…

No tie tlacidla cez externe odpory mi odporucil ten jeden chalan, co ma zaucal do tohto kedysi davno. Ale tak asi su fakt zvytocne…

Tie INT0 a INT1 riesim v podstate tak ako mi pises.

INT0 uplne, len na zobudenie CPU. (Tie premenne pocet som mal len aby som videl, kolko krat prebehne prerusenie)

ISR (INT0_vect) { pocet_int0++; }

A v INT1 (od pohyb. senzora, ktory nema kontakt, ale posiela napatie) som dal nastavenie na rozsvietenie LED pasu.

ISR (INT1_vect) { if (pohybovy_senzor_noc_enable == 1) { LEDpas_efekt = 9; LEDpas_zmena = 1; CPU_ON = 1; } pocet_int1++; }

Tie tlacitka riesim tiez casom, ale robim ich opacne. Ja nastavim cas (hodnota 225, co je 1 sekunda) do premennej pre dane tlacidloa v Timer0 preruseni tuto hodnotu znizujem. A tladidlo vyhodnotim len vtedy, ked je premenna rovna 0. Proste takto som si to sam vymyslel, ale ten tvoj sposob je rozhodne lepsi, lebo vies zistit aj dlzku stlacenia tlacidla, nad ktorou som uz rozmyslal, ako to vymysliet. Pokusim sa to riesit tvojim spôsobom, len to bude celkom zmena v programe.

// Tlačítko 1 - on/off if (tlacitko_1 == 0) { if (Tlacitko(1) == 0) { //zistuje, ci je stlacene tlacidlo tlacitko_1 = tlacitko_cas; //prikazy pre tlacidlo } }

Mne islo len o to, ze preco sa prerusenie vykona viac krat, aj ked sa nestlacilo tlacidlo ani nic. Ze ci netreba nejak hardverovo osetrit dane vstupy, alebo napajanie, alebo co…

No toto je tiez fajn napad, dať posielanie dát do LED pasu do Timeru, ze mi to nejak nenapadlo. Asi preto, ze som sa vzdy snazil prerusenie robit co najkratsie. Ja teraz obnovujem LED pas asi zbytocne vela krat (neviem ako stiha procesor, ale maximalne to moze byt 2 x 225 = 450-krat za dve sekundy. A asi je to uplna hovadina. Pred samotnym odoslanim dat som zakazal prerusenia od Timerov a hned po odoslani som ich opat povolil. Cize toto by som uz nemusel robit. Len musim oddelit pripravu dat od odosielania dat do LED pasu. Priprava musi bezat asi v programe a ked bude hotova, nastavimm premenu, ze su data pripravene a ked prebehne prerusenie Timeru tak ich odosle do LED pasu. Asi tak by to bolo fajn? A takto by som znizil pocet obnoveni na 200x za 2 sekundy, co by mohlo byt u v pohode :slight_smile:

Este pre predstavu, jedno odoslanie dat do LED pasu pre aktualne 138ks LED trva 165600 ns + 80ns reset bit, t.j. 0.16568 ms.

Balů, myslím, že to není pravda. Hádat se nebudu, je to jen detail, ale takto se to prodává i používá, např. tady:
intelek.cz/cat_tree.jsp?dpa … %9Bn%C3%A9
nebo zde na straně 9: kvelektro.cz/wp-content/upl … kabely.pdf
V práci je používáme také. Pravda je, že stínění je jen celkové a ne jednotlivé páry.

PS. Není to žádná výtka. Naopak, je super, že tady někdo pomáhá ostatním. Čtu to tady rád. Člověk se alespoň z programování něco dozví.