본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] AVR(ATmega128A)«수업-9» : 디지털 데이터 입력(풀업 저항 & 풀다운 저항 / PIN 레지스터 / 채터링 현상 & 디바운스)

by 나는영하 2022. 2. 10.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

디지털 데이터 입력

풀업 저항 & 풀다운 저항

PIN 레지스터

채터링 현상 & 디바운스


풀업 저항과 풀다운 저항의 개념을 이해하고 PIN 레지스터를 활용해서 푸시 버튼을 이용한 LED 제어 실습을 진행해 보았습니다. 

1. 풀업 저항 & 풀다운 저항

1-1. 풀업 저항과 풀다운 저항 개념

풀업 및 풀다운 저항에 대한 개념은 저번 아두이노를 사용한 LED 제어 실습때 배웠었습니다.

고로 자세한 내용 및 설명은 아래의 링크를 참고하시면 될 것 같습니다! 

 

↓    ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓     ↓ 

 

2022.01.24 - [IoT 디바이스 개발] - [IoT 디바이스 개발] 아두이노«수업-1» : PUSH BUTTON을 활용한 LED 제어 (풀업 저항, 풀 다운 저항)

 

[IoT 디바이스 개발] 아두이노«수업-1» : PUSH BUTTON을 활용한 LED 제어 (풀업 저항, 풀 다운 저항)

※ 주의사항 ※ 본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다. 본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다! 감사합니다😁 안녕하세요!!

920416.tistory.com

 

1-2. 내부 풀업 저항

하드웨어 적으로 VCC 전원부에 저항을 부착해서 풀업 저항의 형태로 플로팅 현상을 제거했다면

내부 풀업 저항은 소프트웨어적으로 별도의 저항 부착 없이 플로팅 현상을 제거하는 것이다. 

 

아래 Digital I/O 핀의 회로도에서 빨간색 네모부분이 내부 풀업 저항에 해당되는 부분이다.

조금더 심화된 내용으로는 내부 풀업 저항을 활성화 하기 위한 조건으로는 

(1)SFIOR 레지스터의 PUD 핀의 값이 0이고, (2) DDR 레지스터의 값이 0(INPUT) 이며 (3) PORT 레지스터의 값이 1이여야 한다.

Digital I/O 핀의 회로도

 

SFIOR 레지스터에서 2번 비트인 PUD의 값이 1이 되면 ATmega의 모든 Digital I/O 핀의 내부 풀업 저항을 비활성화 한다. 초기값은 0으로써 별도로 프로그래밍 코드를 짜지 않는다면 초기값대로 내부 풀업 저항을 활성화 하게 된다.

내부 풀업 저항 사용 코드

 

그리고 위의 코드의 예시처럼 58 Line에서 DDR 레지스터의 0~2번 핀을 INPUT으로 설정하고

60 Line에서 PORT 레지스터의 1번 핀에 1을 출력함으로써 내부 풀업 저항을 사용하는 코드를 추가하였다.

따라서 PINF 레지스터의 0번 비트에 연결되어 있는 스위치는 내부 풀업 저항이 적용되어 있게된다.


 

2. 디지털 데이터 입력을 위한 레지스터

2-1. PIN 레지스터

PIN(Port INput) 레지스터는 GPIO 핀으로의 입력을 받아 저장하는 레지스터로, 버튼의 상태 역시 PIN 레지스터에 저장된다.  

 

PIN 레지스터도 PORT레지스터, DDR 레지스터 처럼 A~F포트는 8비트로 구성되어있고 G포트는 5개의 비트로 구성되어 있다.

PINA 레지스터 구조
PING 레지스터 구조

 


 

3. 디지털 데이터 입력(버튼으로 LED 제어)

3-1. PIN 레지스터를 사용해서 버튼 입력 받기

3개 푸시버튼을 활용한 LED 점등

1) 동작 설명

- F 포트의 0번 비트 버튼은 내부 풀업 저항을 사용, 1번 비트 버튼은 외부 풀업 저항 사용, 2번 비트 버튼은 외부 풀다운 저항 사용을 해서 연결한다. 

- F 포트 0~2번 핀의 스위치는 A포트 0~2번 핀의 LED를 1:1로 제어한다.

- 0번, 1번 스위치는 풀업 저항을 사용해서 누르면 소등되고 안누르면 점등되며 2번 스위치는 풀 다운 저항을 사용해서 누르면 점등되고 안누르면 소등되는 동작을 한다.

 

1) 코드 설명

- Line 56 : A포트의 0~2번 비트를 1(OUTPUT)로 설정한다.

- Line 58 : F포트의 0~2번 비트를 0(INPUT)으로 설정한다.

- Line 60 : F포트의 0번 비트를 1로 출력한다.(내부 풀업 저항 활성화)

- Line 63 : F포트의 0~2번 핀에 연결되어 있는 스위치의 값을 받아서 PORTA의 0~2번 핀에 출력한다.

(LED 점등, 소등 동작)

 

3-2. 버튼으로 LED 시프트 하기

기본적으로 F포트의 2번핀에 연결되어있는 스위치를 누르면 총 8개의 LED가 왼쪽으로 1개씩 순차적으로 점등되는 동작이다. 

 

왼쪽 코드는 if문의 버튼과 연결된 핀으로 1의 값이 입력될 때 비트 이동 연산을 하면서 LED 점등 동작을 수행하고 있다.

오른쪽 코드는 이전 버튼 상태와 현재 버튼 상태의 값을 저장하는 변수를 생성하고 비교해서 버튼의 상태가 바뀌는 순간에만 LED가 점등 하는 동작을 수행하는 코드이다.

 


4. 채터링 현상 & 디바운스

4-1. 채터링 현상과 디바운스

3-2와 같은 프로그래밍을 하였을때 LED 동작에 문제점이 발생한다.

ATmega128A는 16Mhz로 동작하므로 버튼을 누르고 있으면 1초에 수십만번 버튼의 상태를 검사하게 된다. 그럴때마다 인간이 느끼기에는 스위치를 누르고만 있었다해도 스위치 내부의 스프링은 진동에 의해 수만번 연결되고 떨어지고를 반복한다. 이로 인해 버튼을 한번 눌렀음에도 여러 번 누른 효과를 보이는 현상이 채터링 현상이라고 한다.

채터링 현상

채터링 현상을 없애는 것을 '디바운스'라고 하는데 소프트웨어적인 방법과 하드웨어적인 방법으로 나뉜다.

 

※ 소프트웨어적인 2가지 방법

(1) 시간 딜레이를 추가해서 1의 값이 입력되는 시점에서 일정 시간 동안의 입력을 무시하도록 하는 방법

(2) 버튼 상태를 두번 검사하는 방법

 

※ 하드웨어적인 방법

(1) 커패시터를 부착한다. (슈미트 트리거 부착)

※ 슈미트 트리거란?

슈미트트리거 동작그래프(좌) / 회로구성(우)
- 슈미트 트리거는 1에서 0으로 또는 0에서 1로 신호가 변할때, 잡음에 의해서 1인지 0인지를 판별할 수 없을때를 대비하여 추가하는 회로이다.
즉, 변하는 시점이 1~0 사이에 2개가 존재한다. 만약 5V 회로가 있다면, 0 ~ 0.8V는 0으로 인식하고 2.5V ~ 5V는 1로 인식을 한다. 따라서 중간에 남는 부분(0.8V ~ 2.5V)은 두개의 Threshold 값이 존재하게 된다.
1에서 0으로 변할때는 0.8V에서 0으로 인식하고 0에서 1로 변할때는 2.5V에서 부터 1로 인식하게 된다. 

 

4-2. 디바운스를 적용한 LED 제어

시간 딜레이를 사용한 디바운스 적용

디바운스 방법중 소프트웨어적인 방법인 시간 딜레이를 추가해서 일정 시간동안 스위치를 통해 입력되는것을 무시하도록 코딩을 하였다.

3-2의 코드와 동일한 코드인데 Line 125만 추가되었다.

즉 버튼이 눌리기 시작하는 시점에서 딜레이 함수를 추가해서 채터링 현상을 감소시켰다.

 

댓글