Всем добрый дзен!
Поделюсь с сообществом информацией, может быть кому-то поможет сэкономить время и нервы.
Лет 15 назад сделал часики из того, что было. Все взлетело на ура. Ничего хитрого, 12 больших синих индикаторов с общим катодом (5 Вольт им конечно было мало), катодные ключи на советском аналоге ULN2003 через сдвиговые регистры 561ИР9, а 8 анодов кормились через простейший драйвер - преобразователь уровней на дискретных элементах.
На днях сделал еще одни друзьям. Программа и схема почти та же, только регистры уже 74HC595. Гляжу, в сети народ юзает набор ключей UDN2981 для подобной индикации. По диагонали глянул даташит, вроде все подходит. Для подачи 12 вольт на аноды самое то, решил я. Вместо почти полусотни дискретных элементов один чип, красота!
Сделал, короче.
Получил развлечение на несколько вечеров. Паразитная засветка сегментов. Если вывести восьмерку, она же будет ощутимо светиться в следующем по порядку разряде. Нужно отметить, что у моих индикаторов очень хорошая отдача, когда вызванивал цоколевку, сегменты чуток светились прямо через меня.
И началось
Включал / выключал / изменял режимы диммирования, заливал всякие тесты, вешал ёмкости, резисторы. До красноглазия вглядывался в код. Прерывание только одно, по таймеру, там примерно всё как в десятках моих старых проектов.
Код:
interrupt [TIM0_COMPA] void timer0_compa_isr(void) {
if ( conv_ms > 0 ) conv_ms--;
ANODES = 0; // выключаем индикатор ваще
if (idx==0) {
DS_DATA=1;
STROBE=1;
STROBE=0;
DS_DATA=0;
}
STROBE=1;
STROBE=0;
ANODES = att[idx];
idx++;
if (idx>11) idx = 0;
}
Короче, развлекался как мог, пока не обратил внимание на то, что паразитная засветка радикально увеличивается с ростом частоты динамической индикации. И тут меня начали мучать мутные сомнения
Одна добавленная строка в прерывание решила проблему. Короче, найдите одно отличие:
Код:
interrupt [TIM0_COMPA] void timer0_compa_isr(void) {
if ( conv_ms > 0 ) conv_ms--;
ANODES = 0; // выключаем индикатор ваще
delay_us(10);
if (idx==0) {
DS_DATA=1;
STROBE=1;
STROBE=0;
DS_DATA=0;
}
STROBE=1;
STROBE=0;
ANODES = att[idx];
idx++;
if (idx>11) idx = 0;
}
Да, да, знаю-знаю

Кровь из глаз, и прочий быдлокодинг, делеи в прерываниях. Но задержка крошечная по сравнению с частотой прерывания (1кГц). Да и что-то не нашлось хорошей идеи, как красиво реализовать задержку.
Этот сволочной чип просто не успевал выключаться, никогда бы не подумал.
Но глянув еще раз даташит (лучше поздно, чем никогда, ага...), я узрел там такой нотес:
Цитата:
NOTES: Turn-off delay is influenced by load conditions. Systems applications well below the specified output loading may require timing considerations for some designs, i.e., multiplexed displays or when used in combination with sink drivers in a totem pole configuration.
Короче, он только для реле по-ходу
Дополнительные материалы
Старая схема с мосфетами:

Новая схема с UDN2981:

Что вышло:

Даташит UDN2981:
Вложение:
UDN2981.pdf [135.73 KiB]
Скачиваний: 34