스위치 종류
- 로터리 스위치, 푸시 스위치, 반도체 스위치, 동축 스위치, 다방향 스위치
- 딥 스위치 : 스위치가 배열형태로 됨
- 전기전자 회로에서 전류 흐름을 제어
- 사용자와 상호 작용 또는 제어를 필요로하는 회로의 중요한 요소
스위치 역활
- OFF 상태와 ON 상태로 있음
- OFF 상태 : 회로가 열린 상태로 전류 흐름 막음
- ON 상태 : 회로가 닫힘 상태로 전류는 방해받지 않고 흐름
SPST Single Pole Sing Throw
- 1A 접점
- 온오프 스위치로 가장 일반적인 형태
- 두 개의 단자 필요
SPDT Singlee Pole Double Throw
- 1C 접점 1A1B
- 슬라이드 스위치
- 세개 단자 필요
DPDT Double Pole Double Throw
- 2C접점 (2A 2B)
- 두개의 SPDT 스위치
- 여섯개 단자 필요
4PDT Four Pole Double Throw
- 네 개의 별도 회로로 구성
- 회로당 두 위치 제어 가능
PINx 레지스터는 스위치에서 입력 처리
-> 핀으로 들어오는 신호값을 저장
-> 저장된 값을 호출해서 사용하면 됨
내부 풀업 사용 시
- 내부에 내부 풀업 회로가 있음
- DDRxn =0, PORTxn=1, PUD=0 시 내부의 풀업을 사용하게 됨
풀업 저항
- 저항이 전원에 연결
- 스위치 off 시 1이 입력, on일시 0이 입력
풀다운 저항
- 저항이 접지에 연결
- 스위치 off시 0이 입력, 스위치 on시 1이 입력
풀업/다운 저항이 없는경우
- 스위치 off 시 플로팅 현상 발생 -> 0,1인지 구분못함 -> 이를 해결하기위해 풀업/다운 저항 사용
ex) 손 가까이 대서 정전기 발생시 스위치가 off여도 1로 판단
- 하이 임피던스 상태
스위치 회로
- 저항이 전원측에 연결됨 -> 풀업
- PD0 측 스위치 on -> PIND 레지스터 0번 비트에 0이 들어감
채터링 현상
- 한번의 기계적 개폐동작에 전기적으로 여러번 개폐동작이 발생
-> 한번 눌렀는데 여러번 눌린걸로 판단할수있음
- 디바운싱(debouncing) 채터링 문제를 방지하는것으로 하드웨어적인 방법(콘덴서 사용->비용발생), 소프트웨어 적인 방법이 있음
소프트웨어 디바운싱
while(1)
{
//pind에는 풀업 저항을 취하여 기본으로 1값이 됨
// pind == 1111 1111
// ~pind == 0000 0000
// 0x01 == 0000 0001
// 키조작 발생
// pind == 1111 1110
// ~pind ==0000 0001
// 0x01 == 0000 0001
// ~pind&0x01 == 0000 00001
// !(~pind & 0x01)은 0x00이므로 루프 탈출 x
// pind에 조작이 있으면 !(~pind &0x01)은 1이되어 탈출
while (!(~PIND & 0x01)); //Falling edge
_delay_ms(10); //디바운싱 지연: 키조작 발생시 -> 10ms 지연 -> 10ms간 채터링 현상 무시
if(++i == 8) i=0;
PORTC=led[i];
while(~PIND &0x01);
_delay_ms(10);
}
제어 예제1
#include <avr/io.h>
int main(void)
{
DDRC = 0xFF;
DDRD = 0xF0;
PORTC = 0xFF; //LED 끈 상태에서 시작
PORTD = 0xF0;
// c언어에서 한줄만 반복시 for (;;)사용 가능
for (;;)
PORTC = PIND;
}
제어 예제2
#include <avr/io.h>
int main(void)
{
DDRC = 0xFF;
PORTC = 0xFF; //LED 끈 상태에서 시작
DDRD = 0xF0;
unsigned char key;
while (1)
{
key = PIND & 0x0F;
switch (key)
{
case 0x0E:
PORTC = ~_BV(0); //PC0번 비트 킴
break;
case 0x0D:
PORTC = ~_BV(1);//PC1번 비트 킴
break;
case 0x0B:
PORTC = ~_BV(2);
break;
case 0x07:
PORTC = ~_BV(3);
break;
}
}
}
=> 예제 2를 정리하면 닫은 스위치의 LED만 켜고 끄는 예제
제어 예제 3
- PIND 0번 비트 스위치를 누르면 전체 LED가 켜지는 예제
#include <avr\io.h>
#include <util/delay.h>
int main(void)
{
DDRC = 0xFF;
PORTC = 0xFF;
DDRD = 0x00;
PORTD = 0xFF;
unsigned char key;
while (1)
{
key = PIND & 0xFE;
if (key == PIND)
{
PORTC=0xFF;
_delay_ms(200);
PORTC =0x00;
_delay_ms(200);
}
else
PORTC = 0xFF;
}
}
회로도 설정
- 기존 VCC- LED- PORTC 레지스터 연결
- 전압 측정을 위한 프로브
- PIND 0번 레지스터와 전원 사이에 K0 연결
D1 VDD n1 ;LED D1이 VDD와 n1 node사이에 연결
R1 n1 PC0 330 ; 저항 R1을 n1 node와 PC0 사이에 연결
D2 VDD n2
R2 n2 PC1 330
D3 VDD n3
R3 n3 PC2 330
D4 VDD n4
R4 n4 PC3 330
D5 VDD n5
R5 n5 PC4 330
D6 VDD n6
R6 n6 PC5 330
D7 VDD n7
R7 n7 PC6 330
D8 VDD n8
R8 n8 PC7 330
;프로브 설정 (PC0~pC7, PD0?포트에 전압 프로브 연결)
.PLOT V(PC0) V(PC1) V(PC2) V(PC3) V(PC4) V(PC5) V(PC6) V(PC7)
.PLOT V(PD0)
;스위치 설정
K0 PD0 VSS ;K0 스위치를 PD0와 VSS 사이에 연결
;WMLAB에서 LED는 Dx를 가리키지만 스위치는 Kx로 사용가능
-PC0에 풀업 저항으로 1이 들어오다 스위치를 누르면 0이 들어오면서
펌웨어 로직에 따라 전체 LED가 켜기게 된다
'로봇 > 전기전자&메카' 카테고리의 다른 글
마이크로프로세서 메카트로닉스 제어 - 8 LCD 제어 1 (0) | 2020.05.13 |
---|---|
마이크로프로세서 메카트로닉스 제어 - 7 FND (0) | 2020.05.13 |
마이크로프로세서 메카트로닉스 제어 - 5 릴레이 제어 이론과 실습 (0) | 2020.05.12 |
마이크로프로세서 메카트로닉스 제어 - 4 LED 제어 (0) | 2020.05.12 |
마이크로프로세서 메카트로닉스 제어 - 3 VMLAB 시뮬레이터 (0) | 2020.05.12 |