Stránka 1 z 1

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

Napsal: 18 črc 2019, 14:48
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?

Napsal: 18 črc 2019, 15:15
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

Napsal: 18 črc 2019, 15:19
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í.

Napsal: 18 črc 2019, 15:30
od Cowley
A co dole řídit Mosfetem znak a nahoře u ULN řídit Mosfetem PWM?

Napsal: 18 črc 2019, 15:30
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?

Napsal: 18 črc 2019, 15:46
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. :)

Napsal: 18 črc 2019, 15:58
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.

Napsal: 18 črc 2019, 16:06
od lesana87
Ano, přesně tak. :)

Napsal: 19 črc 2019, 13:51
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

Napsal: 19 črc 2019, 14:00
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);

Napsal: 19 črc 2019, 15:29
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

Napsal: 19 črc 2019, 15:36
od lesana87
Není zač. :)