UDN2981 и динамическая индикация

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

UDN2981 и динамическая индикация

Сообщение metan »

Всем добрый дзен!
Поделюсь с сообществом информацией, может быть кому-то поможет сэкономить время и нервы.
Лет 15 назад сделал часики из того, что было. Все взлетело на ура. Ничего хитрого, 12 больших синих индикаторов с общим катодом (5 Вольт им конечно было мало), катодные ключи на советском аналоге ULN2003 через сдвиговые регистры 561ИР9, а 8 анодов кормились через простейший драйвер - преобразователь уровней на дискретных элементах.
На днях сделал еще одни друзьям. Программа и схема почти та же, только регистры уже 74HC595. Гляжу, в сети народ юзает набор ключей UDN2981 для подобной индикации. По диагонали глянул даташит, вроде все подходит. Для подачи 12 вольт на аноды самое то, решил я. Вместо почти полусотни дискретных элементов один чип, красота!
Сделал, короче.
Получил развлечение на несколько вечеров. Паразитная засветка сегментов. Если вывести восьмерку, она же будет ощутимо светиться в следующем по порядку разряде. Нужно отметить, что у моих индикаторов очень хорошая отдача, когда вызванивал цоколевку, сегменты чуток светились прямо через меня.
И началось :facepalm:
Включал / выключал / изменял режимы диммирования, заливал всякие тесты, вешал ёмкости, резисторы. До красноглазия вглядывался в код. Прерывание только одно, по таймеру, там примерно всё как в десятках моих старых проектов.

Код: Выделить всё

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.
Короче, он только для реле по-ходу :dont_know:


Дополнительные материалы

Старая схема с мосфетами:
Изображение

Новая схема с UDN2981:
Изображение

Что вышло:
Изображение

Даташит UDN2981:
UDN2981.pdf
(135.73 КБ) 140 скачиваний
Аватара пользователя
vlasovzloy
Друг Кота
Сообщения: 20068
Зарегистрирован: Чт янв 26, 2012 16:44:29
Откуда: Таксимо

Re: UDN2981 и динамическая индикация

Сообщение vlasovzloy »

Если еще не бросил попробуй на входы udn резисторы потенциометр покрутить до уверенного несрабатывания и потом чучуть убавить. Возможно насыщается сильно первый каскад, а может и не первый каскад. Или на общий провод резисторы, может утечка и не дает нормально закрыться, на выход резисторы на общий провод. Желательно с осциллографом все это посмотреть. Uln примерно такая же схема, но как то же работает нормально. Да и по типу udn в стиралках самсунгах и лж встречал на индикацию, там все нормально работает

Добавлено after 55 seconds:
Ну и частота индикации может и правда большая быть
Мои поставщики запчастей с отличной репутацией
texnomag.ru
radioremont.com
pl-1.org
4ip.info
elitan.ru
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Re: UDN2981 и динамическая индикация

Сообщение metan »

vlasovzloy писал(а):Или на общий провод резисторы
Пробовал одним из первых, ставил 1 кОм, может мало конечно, но совсем не повлияло. Осциллографом смотрел, к сожалению не заскринил. В ноль перепад явно очень сильно затянут, как будто ёмкости там стоят. Но может, конечно, ёмкости печатных проводников так влияют, они довольно длинные и рядышком. Но в схеме с полевиками такого безобразия даже близко не было, хотя печатных плат вообще было две (на одной только индикаторы, разведенные как и на новой плате), и соединялись плоским кабелем в 20 проводников.

Вот монтаж
Изображение
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: UDN2981 и динамическая индикация

Сообщение jcxz »

[uquote="metan",url="/forum/viewtopic.php?p=4711109#p4711109"]Да и что-то не нашлось хорошей идеи, как красиво реализовать задержку.[/uquote]Просто два прерывания. С интервалами между ними: 10 мкс, 990 мкс.
Ответить

Вернуться в «Периферия»