2026년 7월 13일 월요일

[소스코드 해설] 미니 오실로스코프

[소스코드 해설] 미니 오실로스코프

"내 칩"을 만들기 전에 "남의 칩"을 익혀보자. "남의 칩"을 응용에 활용하려면 그들이 제공하는 기술 문서(Data Sheet)를 읽을 수 있어야 한다. 아울러 "내 칩"의 기술 문서를 작성하는 본보기로 삼아본다.

"미니 오실로스코프"는 Atmel 사의 마이크로 컨트롤러 ATmega328P를 채택하여 를 제작한다. 이 칩을 선택한 이유는 개발도구와 응용 라이브러리가 매우 풍부하고 응용 목적에 맞는 기능을 모두 갖추고 있다는 점도 있지만 저렴하다는 것이 큰 이유다. 요즘 출시된 어지간한 마이크로 컨트롤러들은 이보다 훨씬 우수한 성능을 가지고 있다.

ATmega328P은 중앙처리장치(CPU, Central Processing)와 데이터(SRAM)와 코드(Flash) 메모리(Memory) 그리고 다양한 주변장치(Peripherals)를 한 패키지에 내장하고있다. 이 칩의 내부 구성은 아래와 같다.


상용 칩들은 널리 판매되기 위해 법용 을 감안하여 설계되고 제작된다. 칩 하나로 우리가 원하는 응용에 필요한 회로는 칩 하나로 끝나지 않는다. 이 칩을 구동 하려면 전원 공급회로가 더해져야 한다. 아울러 개발과정에서 코드의 동작을 확인할 용도로 깜빡이 하나 정도는 있으면 좋다. 칩 내에서 도데체 무슨일이 벌어지는지 알고 싶다. 이 깜빡이는 나중에 개발이 완료되어도 제품 장식에도 도움이 된다. 전원과 기타 보조 회로를 모아 개발하기 편리하도록 범용으로 만들어 판매되는 보드로 아듀이노 우노(Arduino Uno)라는 제품이 있다. 공개 하드웨어(Open-Source Hardware)로써 수없이 많은 아류 제품들이 판매된다. 아듀이노(Arduino)는 ATmega 계열의 칩을 활용한 보드 제품으로 시작했으나 지금은 ARM, ESP32등 다양한 마이크로 컨트롤러의 개발 환경이 되었다. 각 프로세서 칩과 다양한 개발 보드들 아듀이노 환경에 맞춰 설계되 제작되어 판매되고 있다. 자유 소프트웨어 재단(Free Software Foundation)의 GNU C++의 뛰어난 이식성 덕분에 거의 모든 프로세서들의 응용 프로그램 개발 언어가 되었다.

"미니 오실로스코프"는 아듀이노 우노를 작은 크기로 축소한 "아듀이노 프로 미니(Arduino Pro Mini)"를 목표보드(target board)로 한다. 회로도는 다음과 같다.
https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf

ATmega328P는 USB 인터페이스 기능을 내장하고 있지 않으므로 외부에 CH340 칩을 추가하여 작은 크기(26x21.5mm)로 출시한 보드가 "나노 슈퍼 미니(Arduino NANO V3 Super Mini)"다. 아듀이노 개발환경에서 이 보드는 아듀이노 프로 또는 프로 미니(Arduino Pro or Pro Mini)"로 인식된다.


미니 오실로스코프 회로도


오실로스코프

오실로스코프는 등간격으로 피 측정 회로의 전압 변화를 측정(샘플)하여 가로 128, 세로 64 화소의 OLED 장치에 시현한다. 피 측정 회로의 전압 변화를 디지털 값으로 변환하기 위해 ADC(Analog-to-Digital Converter), "등간격" 으로 샘플 하기위해 타이머-카운터(TC, Timer-Counter) 그리고 사용자 인터페이스용 버튼 입력을 입출력 포트(IO Port)를 활용한다. ADC, TC 그리고 PORT는 ATmega328P 에 내장되어있다.

미니 오실로스코프

"미니 오실로스코프"의 소스 코드를 읽기 전에 이 장치가 어떤 기능을 갖는지 살펴보자. 시현되는 내용은 샘플한 파형 외에 수직 해상도(전압범위), 수평 해상도(샘플 간격), 트리거 엣지(상승 또는 하강)를 선택 할 수 있다. 측정한 파형을 분석하여 주파수(frequency)와 듀티 비(duty ratio)를 보여준다.
.....
<사진>

이제 "미니 오실로스코프"의 응용 프로그램을 읽어보자. 파일명은 Mini_Oscilloscope.ino 다. "내 칩 디자인 킷"의 응용 예제로 포함되어있다. 총 830줄에 이르는 소스코드를 중요 부분으로 나눠 설명한다.


"미니 오실로스코프"는 공개된 소스코드를 일부 수정하였다. 원본 출처를 밝혀둔다.


이미 만들어 놓은 다양한 라이브러리들을 활용하기로 한다. 각 라이브러리에 속한 함수(API, Application Programing Interface)들을 헤더 파일(header file)로 제공하므로 이를 들여온다.


- Wire.h: I2C 장치와 통신에 필요한 라이브러리다.

- Adafruits_GFX.h: Adafruit 사에서 개발하여 공개하는 범용 그래픽 라이브러리다. 점찍기, 줄긋기, 사각형 그리기, 원 그리기, 비트맵 문자 표시 등 다양한 함수들을 제공한다.  깃허브 저장소 링크는 다음과 같다.


API 문서는 아래링크에서 받을 수 있다.


- DIYables_OLED_SSD1309.h: 특정 OLED 칩의 드라이버 라이브러리다. 수많은 개발자들에 의해 드라이버가 개발되어 공개됐다. 이 드라이버는 SSD1309(2.4"), SSD1315(0.96"), SSD1306(0.96") 등과 호환된다.

- EEPROM.h: ATmega328P 에 내장된 플래시 메모리는 프로그램 코드를 저장하는 공간이다. 이 영역을 고정 데이터로 사용하기 위한 라이브러리다.

버튼 입력과 인터럽트


버튼 입력을 받아들일 포트를 정의하였다. 외부의 입력을 받아들이는 방식은 폴링(polling)과 인터럽트(interrupt)다. 여기에서는 인터럽트 방식으로 버튼 입력을 처리한다.



AVR 계열 CPU는 2개의 인터럽트 채널을 가지고 있다. D2는 IRQ0, D3 핀은 IRQ1 이다. "미니"보드에 D3 핀이 노출되어 있다. D3 핀을 인터럽트로 사용하기 위한 초기화는 다음과 같다.


초기화 setup() 함수내에 D3 핀을 입력 풀-업으로 설정한 후 인터럽트를 처리할 함수(interrupt handler)를 지정한다. Btn_IRQ를 IRQ1에 연결한다. 인터럽트로 인지하는 조건은 해당 핀에 하강 엣지 사건(FALLING)으로 정의하였다.


인터럽트 처리할 함수 Btn_IRQ()는 다음과 같다. 버튼의 디지털 값을 모두 읽은 후 값이 모두 1(high) 이면 잘못 호출된 것으로 간주 한다. 버튼은 기계 스위치다. 접점에 발생하는 스파크로 인해 인터럽트 오동작이 있을 수 있다.


눌려진 버튼에 따라 해당하는 기능을 수행한다. 오실로스코프의 동작을 잠시 멈추는 HOLD 버튼의 기능은 다음과 같다.


아날로그 입력

















댓글 없음:

댓글 쓰기