728x90

스위치 종류

- 로터리 스위치, 푸시 스위치, 반도체 스위치, 동축 스위치, 다방향 스위치

- 딥 스위치 : 스위치가 배열형태로 됨

- 전기전자 회로에서 전류 흐름을 제어

- 사용자와 상호 작용 또는 제어를 필요로하는 회로의 중요한 요소

푸시 스위치

 

슬라이드 스위치
마이크로 스위치
딥 스위치

 

스위치 역활

- OFF 상태와 ON 상태로 있음

- OFF 상태 : 회로가 열린 상태로 전류 흐름 막음

- ON 상태 : 회로가 닫힘 상태로 전류는 방해받지 않고 흐름

 

 SPST Single Pole Sing Throw

- 1A 접점

- 온오프 스위치로 가장 일반적인 형태

- 두 개의 단자 필요

SPST 심볼 회로

 

온오프 스위치

 

SPDT Singlee Pole Double Throw

- 1C 접점 1A1B

- 슬라이드 스위치

- 세개 단자 필요

SPDT 심볼 회로
슬라이드 스위치

 

 

DPDT Double Pole Double Throw

- 2C접점 (2A 2B)

- 두개의 SPDT 스위치

- 여섯개 단자 필요

DPDT 심볼 회로
로커 스위치

 

4PDT Four Pole Double Throw

- 네 개의 별도 회로로 구성

- 회로당 두 위치 제어 가능

 

토글 스위치
4PDT 심볼 회로

 

 

 

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가 켜기게 된다

300x250

+ Recent posts