Напряжение на контакте в INPUT режиме

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Добрый день!

У меня мега 2560. Делаю светодиодную матрицу по методу Чарли. Столкнулся с тем, что горят светодиоды, которые не должны гореть. Оказалось, что иногда на контактах, которые установлены в режим INPUT есть незначительное напряжение порядка 0,1В, из-за чего и загораются лишние светодиоды.

Кто-нибудь с таким сталкивался? Это нормально?

Как с этим бороться? С помощью триггера Шмитта (SN74AC14N)?

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Ares_ekb пишет:

Как с этим бороться? С помощью триггера Шмитта (SN74AC14N)?

Я предлагаю бороться с этим хирургическим путем. С помощью сдвиговых регистров 74HC595 нарастить количество выходов и пользоваться ими классическим способом безо всяких проблем.

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Так не интересно ) У меня сейчас 12 светодиодов работают от 4 контактов.

В итоге я заменю мегу на attiny85 и получится очень компактное устройство. А вы предлагаете добавить два 74HC595 (если я правильно понимаю), каждый из которых в два раза больше, чем attiny. + ещё количество резисторов увеличится в 3 раза.

Интересно в принципе с чем связано это напряжение на INPUT-контакте. Это 1) особенность arduino, 2) особенность микроконтроллера или 3) у меня что-то не так...

На сколько я понимаю, если контакт в режиме INPUT, то на нём не должно быть никаких напряжений

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ares_ekb пишет:

На сколько я понимаю, если контакт в режиме INPUT, то на нём не должно быть никаких напряжений

Никакого - не бывает. А Ваш пин куда притянут? К земле? К питанию? Или никуда? Сдаётся мне, что никуда. И что Вам нужно на пине - землю или 5В? Если землю, так поставьте резистор килоом на 10 между ним и землёй.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Ares_ekb пишет:

Так не интересно )

В стране Самоделии (DIY) это не наказуемо. :)) Я метод Чарли понимаю, но не люблю, обсуждать это сейчас не буду. Раз он Вам подходит под конкретную задачу - пусть так и будет. Светодиод зажигается током, а входное сопротивление цифрового входа (если нет программно включенной подтяжки входа) минимум десятки МОм. Там тока нет. ("Там рыбы нет." :)) ) Попробуйте пройти все состояния светодиодов по очереди в статике. Не зажигать последовательно, используя динамический программный драйвер, а чисто в статике. Если результат будет не очевиден, то придется выкладывать схему с точным описанием, что и как "не так" и разбираться детально. Светодиоды у Вас все по цвету и типу одинаковые? А то может быть, что прямое падение на двух в сумме меньше чем на одном другого цвета или близко к нему.

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Вот, панель на видео: https://www.youtube.com/watch?v=uiaE7snxT3U

Одновременно загараются светодиоды с общим катодом. Хотя там сложно понять где катод, где анод. Светящаяся штука почему-то на аноде, а не катоде. Ну короче одновременно загораются те, которые с общей землёй.

Например 1-ый и 9-ый:

Чтобы загорелся 1-ый светодиод, на 1-ом контакте должен быть HIGH, а на 4-ом - LOW.

Чтобы загорелся 9-ый светодиод, на 3-ем контакте должен быть HIGH, а на 4-ом - LOW.

9-ый загорается вместе с 1-ым, потому что на 3-ем контакте появляется небольшое напряжение, хотя его там быть не должно, потому что этот контакт в режиме INPUT.

Если подключать к напряжению и земле отдельно 1 и 4 контакты, или отдельно 3 и 4 контакты, то ничего лишнего не горит. Т.е. в схеме должно быть всё нормально. Немного позже выложу фотки.

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Если подключать по отдельности, то ничего лишнего не горит:

Немного ада:

Между 1 и 4 контактами есть напряжение, это нормально:

Между 3 и 4 тоже есть, хотя и меньше. Но его там вообще не должно быть, потому что 3-ий контакт в режиме INPUT:

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Вот, скетч:

#define D  300000L

#define LED_COUNT 12

int ledPins[LED_COUNT + 2] = {
  B0000, B0000,
  B1000, B0001,
  B1000, B0010,
  B1000, B0100,
  B0100, B0001,
  B0010, B0001,
  B0100, B0010 };

void setup() {
}

void loop() {
  show(B00000001, D);
/*  show(B00000010, D);
  show(B00000100, D);
  show(B00001000, D);
  show(B00010000, D);
  show(B00100000, D);
  show(B01000000, D);
  show(B10000000, D);
  show(B00000001 << 8, D);
  show(B00000010 << 8, D);
  show(B00000100 << 8, D);
  show(B00001000 << 8, D);*/
}

void show(unsigned long bits, unsigned long duration) {
  byte n = 0;
  byte bitNum[LED_COUNT];
  for (int i = 0; i < LED_COUNT; i++) {
    if (bits & 1L << i) {
      bitNum[n++] = i + 2;
    }
  }
  if (n == 0) {
    bitNum[n++] = 0;
  }
  byte i = 0;
  for (unsigned long t = 0; t < duration; t++, i++) {
    if (i >= n) {
      i = 0;
    }
    byte j = bitNum[i];
    DDRD = ledPins[j ^ 0] | ledPins[j ^ 1];
    PORTD = ledPins[j];
  }
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы не ответиле на мой пост №3. Куда притянуты INPUT пины? Судя по фото -  никуда. Ну, а если никуда, то чему удивляться?

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Кажется помогло! Спасибо! Пока проверил на одном светодиоде. Я вспомнил, это стягивающий резистор ) Только я думал, что он защищает входы ардуино от шумов, возникающих во внешней схеме. А оказывается, что он ещё защищает и внешнюю схему от шумов ардуино.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ares_ekb пишет:

А оказывается, что он ещё защищает и внешнюю схему от шумов ардуино.

Не совсем так. Он просто задаёт некое значение на ПИНе. Если ПИН никуда не присоединён - болтается в воздухе, он "работает антенной" и собирает все помехи, какие "видит" и значение на нём вообще непредсказуемо. 

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Интересно, что в xmega есть встроенные стягивающие резисторы: http://www.atmel.com/images/atmel-8331-8-and-16-bit-avr-microcontroller-xmega-au_manual.pdf (стр. 141). И ещё какие-то режимы (сохранение уровня, и, или).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ares_ekb пишет:

Интересно, что в xmega есть встроенные стягивающие резисторы

Они везде есть, просто Вы ими не пользуетесь. Скажите в pinMode вместо INPUT - INPUT_PULLUP и притянется к питанию.

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Не, это только pull-up. А pull-down только в xmega

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Я проанализировал видео, фото, описание неисправности и у меня возникло следующее предположение: паразитная засветка светодиодов происходит из-за того, что при работе программы выводы Ардуино переводятся не в состояние "вход", а в состояние "вход, подтянутый вверх". Поскольку на практике сейчас полностью проверить это предполжение мне затруднительно, то я предлагаю для анализа цепь следующих умозаключений.

При работе программы (видео) паразитная засветка видна явно, т.е. на нее идет вполне ощутимиая мощность. В статике светодиоды работают нормально, т.е. ошибки монтажа и перетекания тока по неотмытому флюсу можно исключить.

Паразитной засветке подвергаются светодиоды, на анод которых подается некоторое положительное напряжение со стороны выводов, находящихся в высокоимпедансном состоянии. Пичем через вывод должен протекать ток в сотни микроампер, иначе свечения не увидеть. Я на Меге проверил мультиметром токи утечки с нескольких входов на "общий" и на "+5 В". Никакого тока зафиксировать не удалось. Т.е.  "протечек" ключей в исправном состоянии "вход" нет.

Учитывая, что pull-up резисторы имеют сопротивления порядка 20 кОм и падение напряжения на открытом светодиоде, получаем ток засветки через светодиод порядка 200 мкА, что примерно соответствует уровню паразитной засветки на видео.

Если подключить к "подтянутому входу" стягивающий резистор в 10 кОм, то за счет образовавшегося делителя напряжение на светодиоде падает ниже уровня его открытия и засветка пропадает.

ИТОГО: проверить правильность установки режимов входов в программе. Предполагаю (тут я не силен), что это строки 49, 50 и/или данные для них.

Ares_ekb
Offline
Зарегистрирован: 09.01.2015

Я кажется начинаю подозревать в чём проблема. Взял отдельный светодиод (не в панели). И через резистор подключал его к разным контактам и земле.

Паразитные напряжения нашел только на 20-ом и 21-ом контактах! А это по совместительству SCA и SCL. Видимо на плате arduino всё так соединено, что на этих пинах возникает напряжение.

Пробовал переводить разные контакты в режим INPUT_PULLUP. На 20-ый это никак не влияет. А на других контактах появляется незначиетльное напряжение. Меньше чем на 20-ом, но достаточное, чтобы светодиод чуть-чуть горел. Что странно... По идее в pull-up режиме он должен гореть ярко.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Ares_ekb пишет:

Паразитные напряжения нашел только на 20-ом и 21-ом контактах! А это по совместительству SCA и SCL. Видимо на плате arduino всё так соединено, что на этих пинах возникает напряжение.

Пробовал переводить разные контакты в режим INPUT_PULLUP. На 20-ый это никак не влияет. А на других контактах появляется незначиетльное напряжение. Меньше чем на 20-ом, но достаточное, чтобы светодиод чуть-чуть горел. Что странно... По идее в pull-up режиме он должен гореть ярко.

Наличие схемы реального устройства могло бы существенно облегчить поиск неисправности.

От резистора pull-up старые светодиоды вообще бы видно не было, а современные, особенно красные, видно. На красном светодиоде падает пусть 1,7 В. На ключах (выходы и ключи подтяжки), пусть в сумме еще 0,3 В. Резистор подтяжки в Ардуино номиналом в 20 кОм. Тогда ток в цепи (5-1,7-0,3)/20=0,15 мА На вид для примененных светодиодов максимальный ток 20 мА. Т.е. идет ток примерно в 100 раз меньше максимального. С учетом люкс/амперной характеристики светодиода как раз и получаем слабое, но заметное свечение.