Перейти к содержанию
    

Опрос клавиатуры на С

Что за блажь использовать низкоомную подтяжку для механических контактов.

В чем проблема?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что за блажь использовать низкоомную подтяжку для механических контактов.

Кто этот миф распускает, интересно?

Т.е. интересует первоисточник.

 

 

Например.http://omronfs.omron.com/en_US/ecb/products/pdf/en-b3sn.pdf. Советские ТУ на кнопочные переключатели.

 

Есть такое понятие как минимальный ток срабатывания. У нормальных(грамотных) производителей на любое контактное соединение оно приводится.

Контакты у реле, кнопок и контакторов не идеальные, образуется оксидная пленка, которая при малом токе не разрушается и контакта полноценного не образуется.

Вот для нормального функционирования кнопок с незолотыми и палладиевыми контактамии нужен увеличенный ток через контактную группу. Да и для золотых и палладиевых есть проблемы при токах меньше 1-10 мка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такое понятие как минимальный ток срабатывания. У нормальных(грамотных) производителей на любое контактное соединение оно приводится.

Контакты у реле, кнопок и контакторов не идеальные, образуется оксидная пленка, которая при малом токе не разрушается и контакта полноценного не образуется.

Вот для нормального функционирования кнопок с незолотыми и палладиевыми контактамии нужен увеличенный ток через контактную группу. Да и для золотых и палладиевых есть проблемы при токах меньше 1-10 мка.

*

Вообще-то оксидная пленка пробивается не током , а НАПРЯЖЕНИЕМ, минимальное значение которого и указывают для коммутационных устройств. Писанина про "минимальный ток" - бессмысленное словоблудие.

Единственный физический эффект, который может создать сверхмалый ток -это дробовой шум, вызванный неравномерностью потока электронов и дискретностью их заряда. Но этот шум никак не влияет на наличие контакта.

Изменено пользователем =L.A.=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Писанина про "минимальный ток" - бессмысленное словоблудие.

И тем не менее в документе на кнопку есть

Minimum applicable load (reference value) 10 μA at 1 VDC (resistive load)

Видимо ток играет роль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имхо, физика процесса тут не очень однозначная: разрушение тонкой пленки может происходить как от пробоя так и от ее выгорания (или и то и то).

 

Разрушения этой пленки можно добиться лишь подняв до максимума напряжения на контакта нажатой кнопки с такими контактами.

По сути в таком виде кнопка в нажатом состоянии имеет некое сопротивление, скажем, несколько кОм.

Если резистор подтяжки будет сравним с сопротивлением нажатой кнопки с такими "окисленными" контактами, то схема попросту не "увидит" состояние кнопки.

Чтобы уменьшить сопротивление такой нажатой кнопки, нужно "пробить/сжечь" эту пленку.

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

Тогда на ней будет напряжение, близкое к напряжению питания.

Вижу два варианта исхода:

1) кратковременный локальный разогрев этого паразитного сопротивления нажатой кнопки и оксидный слой выгорит от перегрева.

2) слой будет разрушен от пробоя более высоким напряжением.

 

Я считаю, что в реальных схемах с относительно невысоким напряжением питания 1й вариант более вероятен.

 

В любом случае образование тонких высокоомных слоев на поверхности контактов мощных реле неизбежно и требует учета при разработке и эксплуатации реле.

 

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

При увеличении толщины слоя (например, при работе негерметичного реле на открытом воздухе) растет его сопротивление.

Для создания надежного контакта непроводящий слой при срабатывании реле должен быть разрушен.

В правильно спроектированных реле разрушение слоя происходит механическим путем (контакты ударяются и трутся друг о друга) и термоэлектрическим способом при протекании тока большой величины через контакты.

Взято тут: https://www.atof.ru/pea/relay/rl_010.shtml

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например.http://omronfs.omron.com/en_US/ecb/products/pdf/en-b3sn.pdf. Советские ТУ на кнопочные переключатели.

А подумать?

"Minimum applicable load" в 10 мкА означает что при меньшем токе вы будете ловить токи утечки кнопки, поскольку у нее довольно маленькое сопротивление утечки, всего 100Мом.

Т.е. при 250 В вы получите 2.5 мкА утечки. Вот ребята вас и предупреждают.

 

Токи величиной в микроамперы гуляют по воздуху туда сюда просто из-за атмосферного электричества и электромагнитных полей.

 

Я же под низкоомной нагрузкой полагал сопротивление максимум в пару десятков Ом.

Вот где такие рекомендации?

 

А загрязнение контактов реле отдельная тема.

Если посмотреть на эти контакты под микроскопом, то видно что основная проблема у них - это эрозия и выгорание от коммутации больших токов.

Грязь там появляется вследствии горения.

 

Поэтому совет противоположный - никогда не коммутировать при низкоомной нагрузке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поэтому совет противоположный - никогда не коммутировать при низкоомной нагрузке.

Видать, вы еще не сталкивались с подобными проблемами коммутации контактов относительно мощных концевиков/переключателей.

 

Поэтому я пришел к выводу, что понятия большой и малый ток, нагрузка и т. п. весьма относительны.

В любом случае источником информации является документация на тот или иной коммутационный элемент.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. . . .Как написать компактный и "красивый" код? . . . Дайте pls примеры . . . .
Вот пример моего кода (из первых версий), без претензий на красивость и компактность. Скорее наоборот. Претензии - на функциональность. (обработка в "событийном" режиме, очередь, скан-коды, обработка удержания).

Без комментариев :) Обрабатывать напильником до требуемой формы.

// MSP430, S_M_V
// -------- keyb ---------
#define S_PORT_KEYB_IN  P6IN
#define S_PORT_KEYB_OUT P6OUT
// P6.0 . . . P6.3 - входные  линии матрицы, подтянуты через 100к на GND
// P6.4 . . . P6.7 - выходные линии матрицы (опрос линии установкой в 1)

static char key_wr = 0, key_rd = 0, keyCodeScan_old = 0;
char keyCodeScan = 0, KeyCode = 0;
char KeyCodeRep = 0;	// запомнить код удерживаемой клавиши
char f_repeat = 0;	// флаг удержания нажатия

t16_sint time_repeat;	// таймаут удержания клавиши, после которого работает автоповтор

// процедура сканирования клавиатуры (аппаратный опрос линий)
// void OS::system_timer_user_hook()
// Периодически вызывается в тиках OS или в обработчике таймера
void KEY_Scan_R(void)
{
 static char F_Press_now = 0, F_Press_old = 0, KKeyCode = 0;
// ================== KEY ===================================
 SOUND_OFF;

 keyCodeScan_old = keyCodeScan; // проверка изменения коорд. нажатия
 F_Press_old = F_Press_now;	 // контроль событий нажатия-отжатия

 key_rd = S_PORT_KEYB_IN & 0x0F;	//  Read keyLines 0...3 (InData) from  PORT
 keyCodeScan = (key_wr << 4) & 0xF0;	// номер скан-линии 0 1 2 3 (row)
 keyCodeScan |= key_rd & 0x0F;		// считанные столбцы  (col)

 if( keyCodeScan  & 0x0F ) // нажата как минимум 1 клавиша
 { // нажата ли любая кнопка ? 0F маска - читаем из порта только "приемные" линии
F_Press_now = 1;
if( keyCodeScan != keyCodeScan_old ) // изменен скан-код ?
{	 // первый вход по нажатию клавиши
time_repeat = 0;	// сбросить таймаут
f_repeat = 0;

}
 else // повторные входы по нажатой клавише
{	
if( f_repeat == 0 )	// пока нет события "удержание", ++ таймера
{	
	if( time_repeat > 62  ) //4	  // 62 цикла по 16 мс - около 1с
	{
		time_repeat = 0;	// сбросить таймаут
		f_repeat = 1;
	}
	else
		time_repeat++;

	}
}

 }
 else // клавиша не нажата
 {
F_Press_now = 0;  // холостой проход - без нажатий
 }

// ---------- выдать скан-линию для следующего цикла --------
 if( !F_Press_now )	// продолжаем сканировать линии - тк нет нажатия
 {					 //  далее только если не нажата кнопка
if( key_wr == 3 )
key_wr = 0;
 else
key_wr++;			  // счетчик скан-линий ++
// ----------------------
if( key_wr == 3 ) S_PORT_KEYB_OUT = 0x80; // A B C D выбор столбца D0 D1 D2 D3
if( key_wr == 2 ) S_PORT_KEYB_OUT = 0x40; // 3 6 9 #
if( key_wr == 1 ) S_PORT_KEYB_OUT = 0x20; // 2 5 8 0
if( key_wr == 0 ) S_PORT_KEYB_OUT = 0x10; // 1 4 7 *
 }

 // заменить switch на перекодировку по ассоц.массиву
 // ------- скан для матрицы 4x4 ---------------------
 // перекодировка в KKeyCode - для PCB F5438A с подключением на мембр. кл-ру 4x4
 // кабелем 9-w и HDR'10 на PCB
 switch( keyCodeScan )
 {
  // key_wr == 0	1 4 7 *
  case (0x00 | 0x01):  KKeyCode = 0x31; break; // 1
  case (0x00 | 0x02):  KKeyCode = 0x34; break; // 4
  case (0x00 | 0x04):  KKeyCode = 0x37; break; // 7
  case (0x00 | 0x08):  KKeyCode = 0x2E; break; // * ekeyPoint
// ----------------
  // key_wr == 1	2 5 8 0
  case (0x10 | 0x01):  KKeyCode = 0x32; break; // 2
  case (0x10 | 0x02):  KKeyCode = 0x35; break; // 5
  case (0x10 | 0x04):  KKeyCode = 0x38; break; // 8
  case (0x10 | 0x08):  KKeyCode = 0x30; break; // 0
// ----------------
  // key_wr == 2	3 6 9 #
  case (0x20 | 0x01):  KKeyCode = 0x33; break; // 3
  case (0x20 | 0x02):  KKeyCode = 0x36; break; // 6
  case (0x20 | 0x04):  KKeyCode = 0x39; break; // 9
  case (0x20 | 0x08):  KKeyCode = 0x04; break; // # ekeyEnter
// ----------------
  // key_wr == 3	A B C D
  case (0x30 | 0x01):  KKeyCode = 0x01; break; // A	F1
  case (0x30 | 0x02):  KKeyCode = 0x02; break; // B	F2	
  case (0x30 | 0x04):  KKeyCode = 0x03; break; // C	F3
  case (0x30 | 0x08):  KKeyCode = 0x05; break; // D	F4

default:	  KKeyCode = 0x00; break;  // ekeyNO
 }

 KeyCode = KKeyCode;
// ================= /KEY ===================================

 if( F_Press_old  && !F_Press_now )  // KEY_OFF
 {	// обработка отжатия
	time_repeat = 0;

if ( f_repeat == 2 )	// если был режим "отпуск-удержания" (2)
  	{
	KEY_push( (t16_sint) (KeyCodeRep | 0x4000) ); // (стоп удержания)  маска 0x40
	//KEY_pushBf( (t16_sint) ( 0x99 | 0x4000) );

	f_repeat = 0;	

}
 }

 if( !F_Press_old  && F_Press_now )  // KEY_ON
 {	// обработка нажатия

	SOUND_ON;

	KEY_push( (t16_sint) KKeyCode ); // тк буфер 16-битный

 }

if( F_Press_old  && F_Press_now )  // KEY_ON_ON_ON
 {	// обработка удержания

	if( f_repeat == 1  )
{
		f_repeat = 2;	// положить в буфер код "удержания", переключиться в след. цикле на
			// ожидание "отпуск-удержания" (режим 2)

	KEY_push( (t16_sint) (KKeyCode | 0x8000) ); // (старт удержания) маска 0x80

	// --------- системный ресет --------------------
	  if(  KKeyCode == 0x31 ) // Reset на удержание клавиши <1>		
	{
		SLEEP(100);		
		WDTCTL = WDTPW | WDTHOLD;
		asm ("push &0xfffe");
		asm ("ret");		
	}
	// -------- /системный ресет --------------------		

	KeyCodeRep = KeyCode;	// сохранить для выдачи кода отжатия
}
 }

}// KEY_Scan(void)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В последних проектах юзаем ADP5589. Изначально я был против. Теперь - категорически рекомендую.Опрос клавиатуры на С получается красивый и лаконичный.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В последних проектах юзаем ADP5589. Изначально я был против. Теперь - категорически рекомендую.Опрос клавиатуры на С получается красивый и лаконичный.

Код в студию!

 

Имхо, за цену этой чудо-микросхемы можно купить довольно "толстый" МК, которого за глаза хватит для этой задачи. Код получает не менее лаконичный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имхо, за цену этой чудо-микросхемы можно купить довольно "толстый" МК, которого за глаза хватит для этой задачи.

Ну это зависит от цены проекта и стоимости часа разработчика :rolleyes:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну это зависит от цены проекта и стоимости часа разработчика :rolleyes:

Спорно. С этой чудо-микросхемой плата выйдет сложнее и само собой дороже.

Код - тоже спорно: с чудо-микросхемой нужно читать-писать соотв. регистры по I2C, т.е. писать по сути для нее драйвер.

Без нее - простой цикл опроса матричной клавиатуры (см. второй пост этой темы).

Короче, из пушки по воробьям B)

 

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

Но это решаемо и без нее: перед входом в сон "тянем" вниз все линии клавиатуры (скажем, строки), и ждем прерывания по любому из столбцов. Т.е. ждем нажатия любой кнопки.

После просыпания делает все по обычной схеме, определяя какая именно кнопка нажата.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В последних проектах юзаем ADP5589. Изначально я был против. Теперь - категорически рекомендую.Опрос клавиатуры на С получается красивый и лаконичный.

Я выбрал AS1115-BSST

Дополнительно поддерживает еще и семисегментный дисплей.

 

Тема неплохо экономит ресурсы.

Когда управляешь двигателями и кучкой SMPS-ов одновременно то реально не хватает ног да и лишние прерывания ни к чему.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тема ушла куда то "налево" :( А хотелось просто увидеть код хорошего простого решения по клавиатуре...

Встречал эти библиотеки:

http://chipenable.ru/index.php/programming...osa-knopok.html

https://github.com/Celeron/gcc-celeronkeyinputlib

Сам эти библиотеки не пробовал, но можно на их примере посмотреть, как другие делают.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код в студию! . . .
чип полезный в хозяйстве, но малодоставабельный, по крайней мере у нас. Разве что для фирмы брать партией.

Решение с таким чипом полезно, когда "морда" прибора имеет клавиатуру и дисплей на отдельной PCB. Если у обоих - I2C (например LCD TIC32) то получится очень неплохо.

Хотя сейчас пошли в работу емкостные матрицы как на спец. контроллерах, так и на базе обычных контроллеров или с узлом периферии touch-sense (см. Texas instr. MSP430 и тд)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...