Недостаточная яркость светодиодов

BatykovV

✩✩✩✩✩✩✩
6 Июн 2022
4
0
Всем привет! Делаю свой проект часов на ESP32S2 от Espressif (досталась задарма, не кидайтесь камнями).
В общем проблема в том, что светодиоды горят тускловато (что, скорее всего, обусловлено хардвером).

Hardweare часть.
Управление светодиодами происходит за счет регистров 74hc595 и транзисторов 2n5551.

У меня 4 сегмента по 13 светодиодов для вывода чисел.
photo_2022-06-06_23-05-10.jpg
На 2 регистра поступает закодированная последовательность битов и светодиоды загораются в нужном порядке, но, поскольку, я использую только 2 регистра на 4 сегмента приходится ко всему прочему заюзать транзисторы. Транзисторы по сути своей работают в ключевом режиме, то есть в нужный момент открываются и замыкают цепь.
Более понятное объяснение: espшка послала биты -> регистр принял и послал на светодиоды нужную последовательность -> транзистор замкнул цепь -> следующий сегмент (повторить до полной готовности) и так все повторяется по кругу в бесконечном void loop().

Software часть.
Я управляю всем этим добром с помощью вот этой простой ф-ии.
C++:
void send_info_to_led(int pin,const byte *number)
{
    digitalWrite(latchPin, LOW);                        // устанавливаем синхронизацию "защелки" на LOW
    shiftOut(dataPin, clockPin, LSBFIRST, number[0]);
    shiftOut(dataPin, clockPin, LSBFIRST, number[1]);   // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH);
    digitalWrite(pin,HIGH);
    delay(1);
    digitalWrite(pin,LOW);
}
Где
latchPin - пин так называемой "защелки" регистра.
dataPin - пин через который уходит последовательность битов.
clockPin - пин нужный для работы регистра (используется для синхронизации).
pin - пин на котором сидит база транзистора для конкретного сегмента.
number - закодированная последовательность битов.


В самом loopé это выглядит условно так.
C++:
void loop()
{
  send_info_to_led(40,numbers[0]);
  send_info_to_led(39,numbers[1]);
  send_info_to_led(38,numbers[2]);
  send_info_to_led(21,numbers[3]);
}
Вот я и подошел к сути проблемы. Она состоит в задержке, в пресловутом delay(). Светодиодам нужно "успевать" загореться перед тем как погаснуть. Звучит странно, но вот в чем суть, транзистор открыт очень недолгое время и из-за этого режется ток протекающий через светодиоды ( КАК Я ЭТО ПОНИМАЮ ). Если убрать задержку совсем, то светодиоды практически погаснут. Есть ли способ как то это исправить программно? Может стоит вообще пересмотреть концепцию кода. Жду ваших ответов, спасибо!
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Светодиоды можно объединить в сегменты и управлять как 7 сегментным индикатором (через драйвер или по сдвиговому регистру на цифру)
 

BatykovV

✩✩✩✩✩✩✩
6 Июн 2022
4
0
Я сейчас заметил одну забавную вещь, ток потребления от одного сегмента и от 4 одинаковый.

@IamNikolay, не получится, рушится вся задумка (
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Я сейчас заметил одну забавную вещь, ток потребления от одного сегмента и от 4 одинаковый.
Ну, используется же динамическая индикация, поэтому в один момент времени горит только один сегмент.
А чтобы яркость была полная нужно каждым светодиодом управлять индивидуально, но это усложняет схему.
 

BatykovV

✩✩✩✩✩✩✩
6 Июн 2022
4
0
@Геннадий П, только есть момент в том, что когда один сегмент горит, он горит ярко, когда все 4, заметно тускнеет свет. В данной ситуации это нормально?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@BatykovV, Почитайте что такое динамическая индикация, как работает и т.п.
Если кратко, то да, при динамической индикации яркость снижается пропорционально используемому кол-ву сегментов.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@BatykovV, задумка - часы, а динамическая индикация на 2 сдвиговых регистрах это неправильное техническое решение.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Как вариант выкинуть транзисторы и использовать микросхему с rs триггерами, например К561ТР2, прошлись по первому сегменту, при переходе на второй, в первом все светодиоды будут включены, и так до последнего сегмента, однако перед отрисовкой сегмента, надо будет производить сброс триггеров.... Есть одна прелесть, рисовать можно будет 1 раз в минуту, и да, могу поспорить, будет ярко и на камеру мерцать не будет. Однако в одной микросхеме всего 4 триггера, надо будет 7 микросхем, зато не надо транзисторы...
 

rGlory

★✩✩✩✩✩✩
11 Май 2021
200
20
Сделайте сетку 13x5 - 18 пинов и 18 транзисторов, и не нужны сдвиговые регистры.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@BatykovV, какой ток сейчас на светодиодах выставлен? С каким битрейтом серийный порт работает?
Вы управляете регистром с помощью LATCH и ENABLE. Сейчас, несмотря на кажущуюся простоту кода между периодами горения в 1мс (это, кстати, совсем невысокая частота, чтобы заботиться о её оптимизации) происходит сдвиг 16 бит в регистрах (допустим, на битрейте 9600 это будет уже 1,6мс, т.е., Вы ориентировались на то, что у разряд будет гореть 1/4 времени, а у Вас окажется 1/10).
Для начала я бы поменял местами управление:
C++:
void send_info_to_led(int pin_prev, int pin, const byte *number)
{
    digitalWrite(latchPin, LOW);                        // устанавливаем синхронизацию "защелки" на LOW
    shiftOut(dataPin, clockPin, LSBFIRST, number[0]);
    shiftOut(dataPin, clockPin, LSBFIRST, number[1]);   // передаем последовательно на dataPin
    digitalWrite(pin_prev,LOW);
    digitalWrite(latchPin, HIGH);
    digitalWrite(pin,HIGH);
    delay(1);
}
pin_prev - это предыдущий обработанный пин.
Потом поднял бы битрейт.