RG(B) LED Hodiny problém - "stínování číslic"

Dotazy na technické problémy, vlastní řešení technických problémů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Darthy
Příspěvky: 187
Registrován: 15 led 2008, 01:00
Bydliště: Olomouc

RG(B) LED Hodiny problém - "stínování číslic"

#1 Příspěvek od Darthy »

Zdravím, nějakou dobu pracuji na projektu RGB Led hodin, které mají od určitého času svítit červeně a pozvolna přecházet do zelené. Hodiny jsou vytvořeny z RGB Led pásků, každý jednotlivý segment číslice je jeden segment pásku (tzn. 3 RGB LED diody). Udělal jsem si návrh schématu, odzkoušel jednotlivé "moduly", napsal program a návrh funguje až na jeden problém a to je, že se mi jednotlivé číslice mírně zobrazují na sousedních číslicích. Nazývám to stínování číslic, nevím jestli pro to je jiný pojem. Nemůžu přijít na to jestli se jedná o problém programu (arduina), nebo návrhu elektroniky. Přikládám schámata a kód programu.
Kód arduina:

Kód: Vybrat vše

int tempo = 4;

void changeColor() {
  int sec = dt.second;
  analogWrite(green, map(sec, 0, 59, 0, 255));
  analogWrite(red, map(sec, 0, 59, 255, 0));
}

TimedAction color = TimedAction(1, changeColor);

void loop() {
  
  color.check();
  dt = clock.getDateTime();
  
  hour1 = dt.hour / 10;
  hour2 = dt.hour % 10;
  minute1 = dt.minute / 10;
  minute2 = dt.minute % 10;
  
  digit(1);
  segments(hour1);
  delay(tempo);

  digit(2);
  segments(hour2);
  delay(tempo);


  digit(3);
  segments(minute1);
  delay(tempo);

  digit(4);
  segments(minute2);
  delay(tempo);


}

void digit(int digit) {
  switch (digit) {
    case 0:
      PORTB = B00000000;
      break;
    case 1:
      PORTB = B00001000;
      break;
    case 2:
      PORTB = B00000100;
      break;
    case 3:
      PORTB = B00000010;
      break;
    case 4:
      PORTB = B00000001;
      break;
  }
}

void segments(int number) {
  switch (number) {
    case 0:
      PORTL = B01111110;
      break;
    case 1:
      PORTL = B00110000;
      break;
    case 2:
      PORTL = B01101101;
      break;
    case 3:
      PORTL = B01111001;
      break;
    case 4:
      PORTL = B00110011;
      break;
    case 5:
      PORTL = B01011011;
      break;
    case 6:
      PORTL = B01011111;
      break;
    case 7:
      PORTL = B01110000;
      break;
    case 8:
      PORTL = B01111111;
      break;
    case 9:
      PORTL = B01111011;
      break;
  }

}
Vynechal jsem deklaraci proměnných a definování jednotlivých pinů. Nezáleží na tom jaké tempo (delay) nastavím, jestli 400ms nebo 5ms, číslice se stále zobrazují kde nemají.
Obrázky jsou při napájení UDN cca 9,6V, pokud snížím na 8V tak se to tolik neprojevuje. Kde může být problém v programu, nebo v elektronice, je možné že je chyba v UDN2981?
Přílohy
4) Zobrazuji číslice s delay 400ms, nuly jsou vidět na každé číslici.
4) Zobrazuji číslice s delay 400ms, nuly jsou vidět na každé číslici.
3) Zobrazuji cely čas, číslice přepínám s delay  na 5ms.
3) Zobrazuji cely čas, číslice přepínám s delay na 5ms.
RG Led driver_board.jpg
2) Návrh realizovaný na desku. Reálně jsou dvě tyto desky vytvořeny a osazeny. Každá ovládá jednu dvojici čísel.
(250.69 KiB) Staženo 64 x
1) Původní návrh, všech 4 číslic ovládaný jedním UDN2981
1) Původní návrh, všech 4 číslic ovládaný jedním UDN2981

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#2 Příspěvek od Cowley »

Neutíká to někde kolem dolního Mosfetu?
Zkus to změřit.

Podobný displej (ale jen jednobarevný) jsem dělal staticky s 74HC595 a ULN2803

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#3 Příspěvek od lesana87 »

V programu bys měl mít nejdřív zhasnutí číslice, pak nastavení nové hodnoty a teprve pak číslici rozsvítit.

digit(0);
segments(hour1);
digit(1);
delay(tempo);

Tak jak to máš, se na nově rozsvícené číslici zobrazí nejdřív to, co bylo na předchozí a pak se to změní na to, co tam má být.
Ale to se týká jen prosvětlování do sousední číslice, ne přes všechny, jak to dělá tobě. To bych viděla spíš na problém těch sériových MOSFETů, to zapojení se mi vůbec nelíbí. Předpokládám, že signály R a G jsou PWM výstupy a jsou tam pořád, i na číslicích, co nemají svítit. A přes ty kilový odpory mezi S a G horních tranzistorů (a možná i nějaký parazitní kapacity) se ty neaktivní číslice prosvětlují. Čistější by bylo dát tam jen jeden MOSFET a před něj AND hradlo.

Edit: Zkus ty 1k odpory horních tranzistorů přepojit na zem, ne na S (mimochodem 1k je zbytečná zátěž, stačí 10k). A případně ještě dát na drainy toho spodního dvojitého tranzistoru pull-upy na + (třeba taky 10k). To by mělo ty horní tranzistory spolehlivě zavřít, když bude zavřený ten spodní.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#4 Příspěvek od Cowley »

A co dole řídit Mosfetem znak a nahoře u ULN řídit Mosfetem PWM?

Uživatelský avatar
Darthy
Příspěvky: 187
Registrován: 15 led 2008, 01:00
Bydliště: Olomouc

#5 Příspěvek od Darthy »

lesana87 píše:a) V programu bys měl mít nejdřív zhasnutí číslice, pak nastavení nové hodnoty a teprve pak číslici rozsvítit.

b)...Předpokládám, že signály R a G jsou PWM výstupy a jsou tam pořád, i na číslicích, co nemají svítit. A přes ty kilový odpory mezi S a G horních tranzistorů a nějaký parazitní kapacity se ty neaktivní číslice prosvětlují. Čistější by bylo dát tam jen jeden MOSFET a před něj AND hradlo.
a) zkoušel jsem, nefunguje - žádná změna

b) PWM řídí všechny číslice stejnou barvou, takže jsou tam pořád, ale uzemňuji ty PWM mosfety pro jednotlivé číslice zvlášť, takže dvojici PWM mosfetů pro R a G uzemním tím jedním (otevřeným) mosfetem pokud chci aby svítila, naopak, když ne. Tzn. pokud chci aby mi svítila jen první číslice poslední (digit) mosfety ostatních číslic jsou prostě zavřené (měly by). Což mě přivádí k prvnímu příspěvku od Cowley.
Cowley píše:Neutíká to někde kolem dolního Mosfetu?
Zkus to změřit.
Mám stejný podezření ale dělám poprvé s mosfety a nevím jak to potvrdit... :oops: Jak to můžu změřit, resp co přesně mám změřit?

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#6 Příspěvek od lesana87 »

Darthy píše: Tzn. pokud chci aby mi svítila jen první číslice poslední (digit) mosfety ostatních číslic jsou prostě zavřené (měly by). Což mě přivádí k prvnímu příspěvku od Cowley.
No zavřené jsou ty spodní, ty jsou jasné, ale ty horní nemusí být. Když máš třeba na G +5V a na R 0V, tak ty Source horních transitorů jsou na napětí 2,5V (přes ty 1k odpory) a na Gate toho zeleného je +5V - je nejspíš otevřený a přes to 1k se ta číslice trochu prosvětlí. Zkus udělat tu úpravu, co jsem ti napsala v editu předchozího příspěvku. :)

Uživatelský avatar
Darthy
Příspěvky: 187
Registrován: 15 led 2008, 01:00
Bydliště: Olomouc

#7 Příspěvek od Darthy »

Cowley píše:A co dole řídit Mosfetem znak a nahoře u ULN řídit Mosfetem PWM?
To mi přijde komplikovanější, pokud "dole" myslíš na katodě LED, tak tam je dvojnásobek výstupů (jeden pro červenou druhý pro zelenou), anoda je společná pro LED pásek, tak mi přijde snadnější ovládat znak na anodách. A PWM jednotlivých barev na katodách.
lesana87 píše:Edit: Zkus ty 1k odpory horních tranzistorů přepojit na zem, ne na S (mimochodem 1k je zbytečná zátěž, stačí 10k). A případně ještě dát na drainy toho spodního dvojitého tranzistoru pull-upy na + (třeba taky 10k). To by mělo ty horní tranzistory spolehlivě zavřít, když bude zavřený ten spodní.
Myslíš to takhle? (příloha)

EDIT
lesana87 píše:No zavřené jsou ty spodní, ty jsou jasné, ale ty horní nemusí být. Když máš třeba na G +5V a na R 0V, tak ty Source horních transitorů jsou na napětí 2,5V (přes ty 1k odpory) a na Gate toho zeleného je +5V - je nejspíš otevřený a přes to 1k se ta číslice trochu prosvětlí. Zkus udělat tu úpravu, co jsem ti napsala v editu předchozího příspěvku.
Tohle dává smysl :) vyzkouším.
Přílohy
RG Led driver_board_f1.jpg
RG Led driver_f1.jpg

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#8 Příspěvek od lesana87 »

Ano, přesně tak. :)

Uživatelský avatar
Darthy
Příspěvky: 187
Registrován: 15 led 2008, 01:00
Bydliště: Olomouc

#9 Příspěvek od Darthy »

Tak jsem udělal dvě nové desky, a vypadá že to pomohlo, ačkoliv to stále mírně stínuje, tak při 12V zanedbatelně, na fotce to vypadá sice hůř, ale když před to dám mléčné sklo, nebo folii, tak to bude dobrý. Díky
Přílohy
dips.jpg

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#10 Příspěvek od lesana87 »

Teď ti to stínuje jen do sousední číslice, máš tam to zhasínání než přepneš anody, jak jsem ti psala na začátku?

Kód: Vybrat vše

  digit(0);
  segments(hour1);
  digit(1);
  delay(tempo);

  digit(0);
  segments(hour2);
  digit(2);
  delay(tempo);

  digit(0);
  segments(minute1);
  digit(3);
  delay(tempo);

  digit(0);
  segments(minute2);
  digit(4);
  delay(tempo);

Uživatelský avatar
Darthy
Příspěvky: 187
Registrován: 15 led 2008, 01:00
Bydliště: Olomouc

#11 Příspěvek od Darthy »

To jsem pro jistotu dopsal, ale to stejné jsem napsal pro segmenty, před každým cyklem je vynuluji, trochu se to zase zlepšilo. Akorát mi teď blbne jeden segment, prosvítá nějak moc... To už asi doladím. Díky za pomoc

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#12 Příspěvek od lesana87 »

Není zač. :)

Odpovědět

Zpět na „Poradna“