[5호]왕초보 전자회로 강좌특집 5부 – 1
왕초보 전자회로 강좌특집 5부 – 1
글 |스네일앤 스네이크 ※ 상기 내용은 디바이스마트와 스네일앤 스네이크의 협의를 |
데이터 로거(data logger) 개념+ 저렴한 “나의 로거” 설계
▶ 회로도 (The circuit diagram) : 인터페이스란 물리세계와 컴퓨터 세계의 국경에 세워진 검문소
▶ 회로설명 (circuit description)
필자는 (누구나) 어떤 새로운 일을 배울 때면, (반드시) 목적이 있거나 또는 있어야 한다고 생각합니다. 예를 들면 새로운 게임을 습득하려고 할 때 화려한 그래픽, 현란한 사운드, 탄탄한 스토리, 친구들과의 협동 또는 경쟁, 승리의 기쁨 등을 마음속에 그리고 있다고 할 수 있습니다. 영화나 만화, 소설책에서는 새롭고 특이한 모험과 악의 응징, 지순하고 열렬한 사랑, 인간애 또는 무지막지한 공포와 반전을 기대합니다. 음악에서는 정열적이거나 차분하게 정리되는 마음을 월드컵 축구와 같은 운동경기에서는 (각본없는 드라마에서 느낄 수 있는) 예기치 않은 감동을 마음속에 두고 있습니다. 그렇다면 전자회로에서는 (이들과는 다른) 감동적이고 가슴 벅찬 새로운 어떤 것을 기대할 수 있을까요? 한 마디로 어떤 목적이 있기에(보통 사람들이) 전자회로를 공부할 만한 가치가 있는 것인가요?
답은 자연세계 안에서 여러분을 관객이 아닌 주인공으로 만들어 준다는 것입니다. 다시 설명하면 (우리가 살아가는) 물리세계의 변화나 기계의 동작을 관측하고 해석해서 그들을 (원하는 대로) 움직일 재주와 능력이 있는 주연(not 관객)이자 창작자의 반열로 여러분을 초대하는 것입니다.
즉 영화의 감독, 연극 무대나 드라마의 PD, 책의 작가, 만화가, 팝이나 가요, 교향곡의 작곡가, 그림의 화가, 게임의 제작자나 스토리 메이커와 같은 수준이라고 보시면 이해하기 쉽겠지요.
살아가는 인생이란 연극 가운데서 주인공의 역활을 맡고자 하는 마음은 누구에게나 공통적인 욕망입니다. 문제는 나의 재능(talent)에 적합한 어떤 역활의 주인공을 선택하느냐 하는 것이지요.
인생의 주인공은 인간세계와 자연세계의 크게 두 부류로 나누어 집니다. 물론 두 세계를 총괄하는 신(神)이라는 총 감독이 있기는 하지만 복잡하게 분화되어 있는 세상에서 나만의 (작은) 역활을 찾아내는 것이 그렇게 어렵지만은 않을 것입니다.
“전자회로를 이해”한다는 뜻은 (자연세계 안에서) 나를 주인공으로 하여 씌여진 대본을 읽을 수 있는, 아이템(기술) 중 하나를 찾았다는 점을 의미합니다. 또 하나의 아이템은 “컴퓨터 언어”이며 마지막 아이템은 “센서와 엑튜에이터”입니다.
※ PC 자체와 Basic, C, C++와 갈은 컴퓨터 언어는 이미 널리 보급되어 있습니다. (필요하다면 쉽게 배울 수 있는 책과 자료도 많이 있고요.) 센서는 처음부터 끝까지 (다 배우고 나서) 사용할 수 있는 것이 아닙니다.
내가 관심있는 분야가 나타나면, 그 때 집중적으로 탐구하는 형식으로 공부하는 방법이 유효합니다. (종류가 워낙 다양하기 때문이죠.) 모터와 솔레노이드로 대표되는 엑튜에이터는 몇몇만 이해하면 충분합니다. 그러므로 전자회로만 활용할 수 있으면, 여행준비의 50%는 완료되는 셈이지요.
우리의 자연세계 이해와 통제(제어)를 위한 여행에서 전자회로의 습득은 “인터페이스 영역”을 담당하는 회로를 제작하는데 목적이 있습니다. “인터페이스 영역”이란 컴퓨터”세계와 물리세계의 국경선에 세워진 검문소(초소)와 같은 것으로, 그림에서 ②, ③번을 합한 부분입니다. 이 부분을 거쳐서 컴퓨터 명령은 전압과 전류로 변환되어 물리세계로 전달되며, (센서에 의해 전압/전류로 바뀐) 물리세계의 신호는 컴퓨터의 언어가 이해할 수 있는 디지털 데이터로 전환되는 것입니다.
“인터페이스 영역”은 데이터 수집/제어 보드와 시그널 컨디셔너라는 고가의 장치로 판매되고 있습니다. 전용 소프트웨어도 마찬가지입니다. 이 이야기는 우리에게 들어가고 싶어도 (입장권이 비싸서) 문 앞에 서 있을 수 밖에 없는, 테마동산 앞의 어린이를 연상시킵니다. 이 어린이는 우리의 호기심을 의미합니다.
오늘날 보통 사람들까지도 PC를 보유하고 있습니다. 교육에 의해 컴퓨터 언어를 구사할 수 있는 사람도 많아졌습니다. 더구나 우리나라는 세계최고의 인터넷 환경을 자랑합니다. 인터넷의 발달로 (과거에는 꿈도 꿀 수 없었던) 자료의 공유와 고급정보의 습득이 용이해졌습니다. 기술의 발달로 전자부품과 각종 센서, 모터의 종류는 나날이 풍부해지고 가격은 이미 저렴합니다. 어떻게든 인터페이스라는 (최후의) 장벽을 부수고, 새로운 공기를 맛 보고 싶지 않으십니까? 필자는 이와같은 강한 욕구와 충동을 느낍니다.
위의 그림에서처럼, 지금까지 소개한 전자회로와 마이컴의 지식만으로 ②, ③번 “인터페이스 영역”의 기술적 내용을 충분히 이해할 수 있습니다.
필자의 전략을 말씀드리지요. ②번의 로거/콘트롤러는 (반복해서) 사용되며, 반드시 마이컴을 사용해서 개발해야 합니다. 마이컴은 초보자가 단시간에 습득하기 힘듭니다. (동작의 이해는 가능합니다) 그러므로 ②번은 전문가가 개발합니다. 단 사양 (즉 성능)을 크게 낮춰서 개발합니다. 걱정하지 마십시요. 성능을 낮춰도 80~90%의 대상에는 적용 가능합니다. 그렇게 되면 개발시간이 단축되고 개발비가 적게 들 뿐만 아니라, 만들어진 로거/컨트롤러의 가격도 함께 저렴해집니다.
※ ②번의 로거/콘트롤러부의 정식명칭은 A/D를 중시한 DAQ (Data Acqusition) 보드와 D/A, I/O, Counter/Timer 보드입니다. 대부분의 보드(board)는 PC 슬롯에 장착되는 구조를 채택하고 있습니다.
로거(Logger)란, 본래 PC와 분리되어 독자적으로 데이터를 수집/저장하는 장치를 일컫는 용어입니다.
③번 “시그날 컨디셔닝” 부분은 ④, ⑤번의 대상에 따라 달라집니다.
이 부분에 (지금까지 공부해 온) 전자회로로 직접 제작합니다. 브레드보드에 만들어도 좋고, 만능기판에 납땜해 만들어도 좋습니다. 어차피 ③번 부분은 전자회로로 구성되는 부분이니까요.
※ ④, ⑤번 (물리세계의) 대상 선정과 측정/제어방법은, 본 홈페이지의 프로젝트 테마로 꾸분히 개발되어 나갈 것입니다. (개발된 테마의 개선과 확장에는 많은 분들의 도움이 필요하게 되겠지요.)
①번 PC 부분은 프로그래밍만 남습니다. ②번을 (표준 포트를 사용하도록 설계하면) 따로 프로그램을 작성하지 않고, (응용 프로그램 만으로) 간단히 동작을 확인할 수 있습니다. 그러나 기본 동작의 확인만으로는 성에 차지 않게 될 것입니다. 내 생각대로 동작시켜 보려면, 프로그램을 확장해서 작성하면 됩니다. 표준 통신포트를 이용하므로, 현존하는 모든 프로그램 언어를 활용할 수 있습니다. 도전 하십시요.
▶ 회로도 (The circuit diagram) : : 나의 로거 설계전략 (MY Logger Design Strategy)
지금까지 제시한 데이터 인터페이싱의 핵심을 이루는 로거/콘트롤러 (Logger/Controller)의 설계전략을 설명 하겠습니다.
설계전략의 기본은,
1. 간단한 사용
2. A/D, D/A, I/O 통합기능
3. 샘플링 레이트로 수 회 samples/sec 정도를 목표 (1초에 2~3 회 자료수집과 명령수행이 가능)
4. 펌 웨어 업그레이드 기능
5. 저가형 설계 (안정화 전원회로를 내장한) 등으로 요약할 수 있습니다.
이 정도 성능이면 필요한 (초급 수준의) 신호처리 회로를 제작하고, PC에서 작성한 간단한 프로그램만으로 대다수의 (기초) 실험을 수행하면서 자료 수집과 해석 및 제어 실험을 만끽해 볼 수 있습니다.
1번 목표를 위해 PC의 표준 I/O 포트인 RS-232 통신방식으로 명령을 받고, (수집한) 자료와 (명령)수행 결과를 PC로 전송하도록 설계합니다.
명령과 데이터 형식은 ASCII 방식을 사용 (문자교환방식)
2번 목표를 위해 5 ch A/D 컨버터가 내장된 PIC16F873A 마이크로 콘트롤러를 채택하였습니다.
3번 목표를 위해 RS-232 통신/문자명령 처리등을 위한 임베디드 프로그램을, C 언어로 개발합니다.
4번 목표를 위해 부트로더(boot Loader) 프로그램을 내장합니다. PIC용 부트로더는 사용법과 자료가 인터넷에 공개되어 있습니다. 부트로더를 채택함으로써 언제라도 새로운 버젼의 펌웨어를 업그레이드 할 수 있게되어 로거/콘트롤러의 활용도가 높아지고 기능변경과 개선이 용이하게 됩니다.
5번 목표를 위해 다소 투박하더라도 표준형태의 부품을 사용합니다. 또 (자신에게 맞는 형태의) 로거/콘트롤러를 제작하고 싶은 사람들을 위해 부품만도 따로 공급합니다(PCB 형태의 완제품도 판매).
마이컴에 익숙한 사람이라면, 자신만의 로거/콘트롤러를 설계하고 만들 수 있으리라고 생각됩니다. 왜냐하면 로거/콘트롤러 프로그래밍에 특별히 어려운 부분은 없기 때문입니다(회로도는 다음 페이지에).
그러나 필자의 의견으로는 굳이 로거/콘트롤러를 따로 설계해서 제작하지 않기를 권합니다. 그 이유는 (앞으로 프로젝트를 진행하면서 점차 밝혀 지겠지만) 이제부터 진행하려는 프로젝트에서, 로거/콘트롤러는 일종의 (부분적인) 부품에 불과하다는 점을 이해하게 될 것이기 때문입니다.
정말 재미있고 흥미를 자아내는 주제는 실제 세상에서 데이터를 수집하고 해석해서 의미를 알아내고, 모터를 제어해서 원하는 동작을 만드는 등의 문제를 해결해 나가는 것입니다.
이 과정에서 로거/콘트롤러가 중요한 부품이기는 하지만, 한 편으로는 사용할 수 있으면 충분하다고 볼 수도 있는 것입니다. 왜냐하면 로거/콘트롤러 그 자체만으로는 어떤 문제가 해결되지 않으며, 반드시 다른 부분들과 조합되어 사용되어야 하기 때문입니다. 이런 이유로 대학과 연구소에서도 고가의 DAQ 보드를, (설계하지 않고) 구입해서 사용하는 것입니다. 결론적으로 로거/콘트롤러는 (최종)목적에 도달하기 위한 하나의 필요품일 뿐입니다.
제작한 “원격로거(remote logger) = MY 로거” 명칭 및 회로도
▶ 회로설명 (circuit description)
전 지금까지 제시한 (우리의) 목적과 사양에 맞는 원격로거를 설계/제작/테스트 하였으며, 이름은 “MY 로거”라고 붙였습니다.
※ 브레드보드에서 테스트한 “MY 로거”는 1.0 버젼, PCB에 제작하도록 설계한 타입은 2.0 버젼
설계/제작한 “MY 로거”의 사용법, 펌웨어 업그레이드, 통신 프로그램, 실험예 등등을 설명하기에 앞서 필요한 각부의 명칭과 회로도를 먼저 소개합니다.
▶ 회로도 (The circuit diagram) “MY 로거”각부의 명칭과 기능
“MY 로거”는 PC나 노트북 컴퓨터의 COM 포트와 연결되어 사용됩니다 (펌웨어 업그레이드도 동일).
“MY 로거”는 4개의 A/D 채널과 2개의 디지털 입력(DI), 2개의 디지털 출력(DO)을 제공합니다. 그러나 펌웨어를 교체하면 디지털 입/출력 단자의 수를 조정할 수 있어 편리합니다(최대 8 단자).
※ 2 단자의 PWM 출력을 제공합니다. (PWM 출력을 RC 필터링하여 간이 D/A로 사용할 수 있습니다. ) 단 “MY 로거” PCB내부에서 (외부로) 선을 연결해야 합니다. (납땜필요)
“MY 로거”는 4개의 LED로 동작상태를 쉽게 모니터할 수 있습니다. 또 항상 입력 전압을 감시하도록 설계되어 있으므로, 원격사용에 적합합니다.
“MY 로거”는 견고한 커넥터, 잭, 터미널을 사용하여, 다루기 편리하고 튼튼합니다.
“MY 로거”는 일반부품으로 설계하였으므로 부품조달이 용이하고 제작비가 저렴합니다.
※ “5V 출력 핀”에서 제공되는 전류는, 내부의 7805에서 공급되므로 100mA를 넘기지 않도록 주의해야 합니다. (7805 정전압 IC의 최고 정격은 1A 이지만, 방렬판이 없으므로 큰 전류의 공급은 무리)
▶ 회로도 (The circuit diagram) : : 원격 로거/콘트롤러 회로도 (Ver 2.0)
“MY 로거”회로는 평범한 마이컴회로 범주이므로 일반적인 설명은 생략합니다.
전원잭에서 공급되는 전원의 +/_ 방향에 영향을 받지 않도록, 브릿지 회로(D1~D4)를 이용하였습니다.
마이컴 단자에 직렬 연결된 330Ω 저항은, 실수로 출력단자가 GND에 연결되였을 때 마이컴 파손을 막기 위한 목적입니다.
회로도의 점퍼(Jumper)는 “MY 로거”의 A/D 4단자를 전부 DI 입력로 사용할 때, 마이컴 단자에 100k 풀업저항을 연결하기 위한 용도입니다. 이 때 (삽입되어 있지않은) R16~19, 100K저항도 추가로 연결하여야 합니다. (“MY 로거”를 “콘트롤러” 입력전용으로 사용할 때 변경하면 O.K)
※ R16~19 저항은 “MY 로거” 제작시에 조립되지 않으며, 따로 공급됨.
“MY 로거”의 외부전원을 전지나 배터리, 태양전지로 연결할 경우를 대비해서 (가급적 소비전력이 적도록) LED 전류제한 저항을 10k로 설계하였습니다. 그 결과 LED 밝기가 희미하나 고장은 아닙니다.
“MY 로거”의 간단한 사용법
▶ 회로설명 (circuit description)
이전 시간의 설명들에서 PC에 RS232 (통신)방식으로 연결해서 원격으로 조종할 수 있는, 원격 로거/콘트롤러의 필요과 사양등의 전체 윤곽을 이해하셨을 것입니다.
이번 시간에는 (설명한 개념으로 설계/제작된) “MY 로거”의 사용법을 설명합니다. 옛 속담에 “구슬이 서 말이라도 꿰어야 보배” 라는 말이 있습니다. 그러므로 만들어진 “MY 로거”가 진가를 발휘하려면 적절한 성능에 더해서, 쉽게 사용할 수 있으며 깔끔한 동작이 보증되어야 할 것입니다.
(설계/제작한) “MY 로거”는 RS232C 통신을 이용한 원격조정이 목적이므로, 가장 간단하면서도 보편적으로 널리 사용되는 애스키 코드(ASCII code) 형식을 명령과 데이터 전달에 사용합니다.
※ 애스키 코드(ASCII code) : ASCII는 American Standard Code for Information Interchange의 약자로 1963년에 미국에서 제정된 (정보교류용) 표준코드 입니다. 그 목적은 각 시스템간에 정보를 교류한다는 것이었지만, 이것이 자리잡는데에는 무려 15년이라는 시간이 소요 되었습니다. ASCII code는 컴퓨터 코드체계를 선점하여, 가장 큰 영향력을 발휘하였으며 현재까지도 호환성이 좋으며 나중에는 확장판(Latin-1, Extended ASCII)이 발표 되기도 하였습니다.
애스키 코드의 형식은 영문 알파벳을 컴퓨터가 인식하도록 하기 위해, (각 문자마다 정해진) 8비트 이진법 숫자 체계를 약속한 것으로, 현재 영문 텍스트포맷의 표준으로 되어 있습니다.
▶ 회로도 (The circuit diagram) : : “MY 로거”의 초 간단 사용법 (MY Logger Command)
“MY 로거”사용법은 간단합니다. 먼저 준비작업으로 PC COM 포트와 “MY 로거”를 (RS232C 통신) 케이블로 연결하고, “MY 로거”에 전원을 연결하면 O.K 입니다(케이블 길이는 10m 까지 허용).
준비가 끝나면 PC에서 정해진 문자열을 (케이블이 연결된) COM 포트로 보내면, “MY 로거”가 수신하고 명령을 해독해서 수행하고, 신속하게 결과를 보내 줍니다.
예로 “MY 로거”의 1번 디지털 입력핀의 상태를 알고 싶으면(“MY 로거”로) “i1” 문자열을 보냅니다. 그러면 “MY 로거”는 1번 디지털핀의 전압을 검사해서 High면 T, Low면 F 문자를 보내옵니다. 만일 1번 디지털 출력핀을 High 상태로 셋팅하고 싶으면, “o11” 문자열을 보내면 끝입니다. (간단하지 않나요?) “MY 로거” 명령어는 2개 또는 3개의 문자들로 이루어집니다. 첫 번째는 명령의 종류를, 두 번째는 포트번호를, 세 번째 문자는 데이터를 의미합니다. (그림참조)
※ 주1 : T는 입력단자가 High 상태 (약 5 V), F는 입력단자가 Low 상태 (약 0 V) 임을 의미합니다.
※ 주2 : “MY 로거”는 0~5V 입력전압을 10 bit A/D로 변환한 후상위, 하위의 두 문자로 나누어 보내줍니다. 측정된 전압값은 (보내진 상위, 하위) 두 문자를 애스키 (10진 값에 해당하는) 숫자로 변환하고 약간의 수정을 거치고, 계산하여 구합니다. (전압값 계산과정은 PC에서 이루어집니다)
※ 주3 : “a5”명령으로 “MY 로거”의 입력 잭에 공급되는 전압의 1/4 값을 측정합니다. 전압을 다운하여 측정하는 이유는 공급전압이 5V 보다 훨씬 높을 수 있기 때문입니다.
※ 주4 : 테이터로 0~127 값에 대응하는 ASCII 문자를 (“MY 로거”로) 보냅니다. “MY 로거”에서는 데이터 문자의 애스키 숫자에 비례하는 PWM 듀티비를 계산한 후, 지정된 포트에 펄스열을 출력합니다. 0~5V 범위의 아날로그 전압은 PWM 출력펄스를, 한 번 더 (RC 로우패스)필터를 거쳐 만들어집니다.
※ 명령은 아니지만 리셋버튼이 눌렸다 떼어지거나 전원이 새로 투입되면, “MY 로거”는 (정해진) “초기 문자열”을 보내옵니다. (Ex : Logger! Ver 2.0)
※ ‘rr’리셋 명령은 잘못된 명령을 보냈거나 또는 (노이즈와 같은) 이유로 “MY 로거”가 응답하지 않을 때 사용합니다. 리셋 명령은 “MY 로거”의 명령 해석루틴을 초기화시켜 새로 시작하도록 합니다.
※ 명령 문자열은 필요에 의해 추가/삭제될 수 있습니다. (임베디드 프로그램 변경이 필요함)
※ “MY 로거”RS232 통신사양 : 19200 bps (bit per second), 8 bit data, 1 stop bit, No parity
▶ 회로설명 (circuit description)
PC와 “MY 로거”의 통신에서 명령어와 데이터에 사용되는 애스키 코드(ASCII code)에 대해 설명하겠습니다.
아래에 위치한 그림의 표를 보면, (128개의) 애스키 코드는 키보드에서 표현여부에 따라 특수문자와 보통문자로 나누어집니다. 그리고 각 문자에는 0에서 127사이의 고유번호가 부여되어 있습니다.
PC나 마이컴은 모두 디지털 로직을 바탕으로 동작하므로, 모든 데이터는 High와 Low의 이진 데이터로 표현됩니다. 그러므로 0~127의 10진 숫자는, 7비트의 2진 숫자로 바뀌어 사용됩니다. (2^7=128)
※ 마이컴의 자료이동에 사용되는 최소 데이터 단위는 관례적으로 “8 비트”이므로, 부득이 여분의 최상위 비트는 표준 애스키 코드에 사용되지 않습니다.
애스키 코드(ASCII code)에 의하면 ‘A’라는 문자는 10진수 65로, ‘A’= 65라는 식이 성립됩니다. 즉 숫자가 문자로 대치되는 것이며, 반대로 문자도 숫자로 표현될 수 있습니다. 명백히 이런 변환이 필요한 이유는 인간(人間)은 문자로 표현해야 이해가 가능하지만, 컴퓨터는 (문자를 다룰 수 없으며) 오직 숫자로만 의사전달과 계산이 가능하기 때문입니다.
그러므로 컴퓨터와 인간, 서로간의 차이를 극복하기 위해서 문자와 숫자 사이의 관계를 약속한 문서가 필요해 집니다. 바로 애스키 코드(ASCII code)입니다.
애스키 코드(ASCII code)에 의해 “문자 = 숫자”가 되므로 혼란스러운 일이 많이 발생합니다. 예를들면 문자끼리 더하기를 할 수 있습니다.
‘A’ + ‘*’= 65 + 42 = 107 = ‘k’ 가 됩니다. 문자 ‘0’은 10진 숫자로 48 입니다. 따라서 ‘0’ + ‘1’ = 48 + 49 = 97 = ‘a’ 가 되고 맙니다. 원래 문자끼리 더할 수는 없는 것이므로, 내용을 모르는 사람에게는 이해할 수 없는 수수께끼로 되는 것입니다. 세상에는 이와 같은 일이 많습니다.
또 하나의 중요한 점은 이제 한 쪽에서 문자를 보내도, 받는 쪽에서 숫자로 사용할 수도 있다는 것입니다. 반대의 경우도 발생합니다. 이제 컴퓨터 (논리) 세계에서, 숫자와 문자는 같은 의미를 같는다는 점을 반드시 마음속에 새겨 두어야 혼란을 피할 수 있습니다.
※ 키보드로 표현되지 않는 특수문자는, 오로지 숫자로 표현하여야 합니다. “MY 로거”에서는 숫자 데이터를 전송하기 위해 애스키 문자를 이용하므로, 0~127 사이의 모든 문자를 사용하고 있습니다. 따라서 특수문자를 표현에는 (해당하는 애스키) 숫자를 기입합니다.
“MY 로거” 사용법을 설명하면서 간단하게 사용한다는 것과, 기술 의미를 설명한다는 것은 다르다는 것을 느꼈습니다. 성능이 약하다고는 하나, 고가의 DAQ 보드를 대체하려는 로거가 간단하기만 하다면, 이 또한 앞 뒤가 맞지 않습니다. 그러나 사용자의 입장에서 보면 (굳이 어려운 내부기술을 모르더라도) 재미있고 유용하게 사용할 수 있으면 충분하다고 생각합니다.
다만 설계자의 입장에서, 자세한 내부 구조를 설명해 두는 것이 여러모로 유용하리라고 믿고 있습니다. 특히 PC측 소프트웨어를 작성하려면 이 정도의 예비 지식은 반드시 필요하리라고 생각하므로, 초보자께서는 이해하여 주시기 부탁 드립니다.
▶ 회로도 (The circuit diagram) : 애스키 코드 (ASCII code)와 RS-232C 통신의 테이터 구
다음편에서 계속 됩니다.
[5호]위드로봇 무료강좌 기술자료 -1차
1차 릴레이 무료강좌 기술자료
MEMS 관성
센서 원리 및 활용법
부제 | 3축 가속도, 자이로 센서 응용
글 | 위드로봇(주) 김도윤대표
위드로봇 연구실 확장 이전 기념 릴레이 무료 강좌 1차 교육이 2010년 11월 27일 토요일에 성수동 위드로봇 본사에서 진행 되었습니다. MEMS 관성 센서 원리 및 활용법에 대한 주제로 진행된 이번 강좌의 강의 내용을 참석하지 못한 디바이스마트 매거진 구독자들을 위해 간단히 소개하고자 합니다. 2차, 3차, 4차로 진행된 강의 내용들도 순서대로 소개될 예정이니, 기대하셔도 좋을 듯 싶습니다.
디바이스마트 홈페이지에는 여러 종류의 센서들이 판매되고 있는데 가속도, 자이로 센서의 설명을 보면“MEMS 가속도 센서를 이용한 3축 가속도 센서 입니다”“MEMS 자이로 센서를 응용한 제품 입니다”라는 문구를 접할 수 있다.
MEMS 기술이 어떤 것인지, 어떤 장점을 가지고 있으며, 어떤 단점을 가지고 있는지 알고 있다면 이러한 센서를 보다 유의 적절하게 사용할 수 있을 것이다.
MEMS란?
MEMS는 Micro Electro Mechanical Systems의 머릿글자를 딴 약어이다. 단어를 그대로 풀어보면 소형 반도체 공법을 이용하여 기계 시스템을 만드는 것을 뜻한다.
전형적인 산업용 공작 기계를 이용하면 아무리 작게 가공하여도 수 mm 이하의 부품을 만들어 내는 것은 힘들다. 하지만 반도체 웨이퍼 상에서 반도체를 제조하는 식각 공정을 이용하면 그 가공법에 한계는 있지만 수 um 수준의 부품을 만들어 낼 수 있다.
이러한 MEMS 공법은 반도체 제조 공정과 동일하기에 한 번에 여러 부품을 만들어 낼 수 있으며, 품질 또한 균일하게 만들며, 크기가 작아지기에 값싸고 여러 분야에 응용할 수 있다는 장점이 있다.
그림1. 산업용 공작기계 공정과 MEMS 공정 비교 | 그림2. MEMS 기술의 시대별 주요 시장 |
이와 같은 장점에 80년대 후반부터 많은 연구가 진행이 되어 왔고, 90년대에 들어와 차량용 에어백 장착이 의무화되면서 MEMS 가속도 센서 시장의 확대로 1차 중흥기를 맞이한다. 이후 2000년대에 들어와 게임기, 휴대폰에 이러한 가속도 센서가 인터페이스 도구로 활용되기 시작하면서 2차 중흥기 및 본격적인 양산 시대에 돌입한다.
특히 2010년 하반기에 들어서 가속도 센서에 비해 상대적으로 수 배에서 수 십배까지 비쌌던 MEMS 자이로 센서가 iPhone4를 위시하여 WiiMote Plus, 각종 테블릿 PC에 기본 장착되기 시작하며 MEMS 가속도, 자이로 센서는 수$ 대의 저렴한 가격대로 시장에 선보이고 있다. MEMS 시장을 예측하는 사람들은 2010년 이후에는 MEMS 기술이 의료(Lab on a chip), 군사 쪽에 활발히 적용되어 3세대를 열어갈 것이라 예상하고 있다.
DLP 프로젝트
MEMS 기술을 손쉽게 만날 수 있는 곳은 프로젝터이다. 90년대만해도 LCD 프로젝터가 주종을 이뤘으나, 2000년대 들어와 TI사에서 DLP(Digital Lighting Processing) 기술을 양산에 성공하면서 저렴한 DLP 프로젝터가 시장의 주종을 이루고 있다. 이 DLP 내부에 DMD(Digital Micro mirror Device) 부분이 바로 MEMS 기술을 이용한 부분이다. 반도체 공법으로 초소형 거울을 만들고 이 거울이 미세하게 움직일 수 있도록 하여 광원에서 나온 빛을 컬러 휠을 통과 시킨 후 거울에 반사시켜 하나의 이미지를 만드는 방식으로 값비싼 LCD를 대치하고 있다.
그림3. DLP 내부 구조 |
가속도 센서
MEMS 기술을 소개하는데 가속도 센서를 빼놓을 수 없다. MEMS 기술을 이용한 제품 중에서 MEMS 가속도 센서만큼 성공한 제품이 아직까지 없기 때문이다. MEMS 가속도 센서의 동작 원리는 여러 가지 방법으로 설명할 수 있겠지만 보다 손쉽게 설명하는 방법은 버스 내부에 손잡이와 기둥을 생각하면 손쉽게 이해할 수 있다.
자, 우리가 버스 안에 타고 있다고 생각해 보자. 버스가 정차하고 있는 동안 손잡이는 가운데 늘어져 있을 것이다. 이 때 운전사가 가속 패달을 밟으면 자동차를 속도을 올리기 시작하며 출발할 것이고, 가속되는 순간 손잡이는 뒤쪽으로 밀릴 것이다. 어느 정도 속도를 내어 정속으로 달리기 시작하면 다시 손잡이는 가운데로 돌아올 것이고, 브레이크를 밟아 감속하기 시작하면 손잡이는 앞으로 움직인다.
자, 이 때 버스 안쪽의 기둥의 거동은 어떠한가?
기둥은 버스와 단단히 한 몸체를 이루고 있어 이러한 관성력과 상관없이 단단히 제자리에 서있다.
그림4. 버스 손잡이의 거동이 MEMS 센서 동작 원리와 같다. |
MEMS 기술로 만든 가속도 센서 내부도 버스의 기둥과 손잡이의 구조로 구성되어 있다. 아래 그림 5가 MEMS 가속도 센서 내부의 현미경 사진이다. 마치 빗처럼 생긴 부분을 확인할 수 있을 것이다. 이 빗처럼 생긴 부분이 바로, 센서 몸체에 단단히 붙어 있는 버스 기둥에 해당하는 부분과 버스 손잡이처럼 센서가 움직이면 자유롭게 같이 움직이는 추의 역할을 하는 부분이 중복되어 배치되어 있는 것이다. MEMS 센서는 이 양쪽에 전기를 가하여, 기둥과 손잡이의 간격이 줄어들었는지, 늘어났는지를 전기적 신호로 바꿔 외부로 출력하고 있는 것이다. 이 간극의 변화가 센서 움직임의 가속, 감속에 해당하는 것이기에 가속도 센서라 부른다.
그림5. MEMS 가속도 센서 내부 구조 |
그런데 이러한 MEMS 기반의 가속도 센서에는 재미있는 성질을 관측할 수 있다. 위와 같은 구조로 X축, Y축, Z축 3축으로 각각 손잡이와 기둥을 배치했다고 생각해 보자. 센서가 가만히 서 있는 경우 X축과 Y축에는 변화가 없겠지만 Z축 방향으로는 우리는 못 느끼지만 지구상에 있는 모든 물체에게 항상 작용하는 힘, 바로 중력 가속도가 작용하여 손잡이 부분이 축 늘어지게 될 것 이다.
이 이야기는 3축 가속도 센서가 멈춰있을 경우 중력 가속도가 측정이 된다는 뜻이며, 센서를 회전시키면 중력 가속도가 측정되는 축이 변경되기에 센서가 어떤 포즈로 위치하고 있는지를 알 수 있다는 뜻이 된다.
그림6. 가속도 센서 위치에 따른 중력 가속도 측정 축의 변화 |
이 기능은 MEMS 센서를 이용하는 사용자라면 누구든지 알고 있었으나 가장 멋지게 제품으로 포장해서 내놓은 제품이 바로 iPhone/iPod touch 이다.
장치를 회전하면 자동으로 알아서 화면을 가로 보기에서 세로 보기로 전환하는 기능은“팔리는 제품을 만들기 위해서는 기술을 어떻게 포장해야 하는가?”를 보여주는 단적인 예이기도 하다.
그림7. 가속도 센서를 써본 사람이라면 누구든 알고 있던 기능을 스티븐 잡스는 화려한 인터페이스와 함께 멋지게 녹여냈다. |
MEMS 자이로 센서
MEMS 가속도 센서와 함께 널리 알려진 센서로는 MEMS 자이로 센서가 있다. 자이로 센서는 회전 각속도를 측정하는 센서로 일반 개발자들에게 많은 오해를 불러 일으키는 센서이기도 하다. 대부분의 개발자들은 회전한 각도를 알고 싶어하는데 이 때 자이로 센서를 사용하면 손쉽게 이 문제를 해결할 수 있을 것으로 생각한다. 하지만 아쉽게도 자이로 센서는 각속도 센서이지, 각도 센서가 아니다.
즉 회전하면 회전하는 속도를 측정하여 알려주는 센서이기에 회전한 각도를 알고 싶으면 자이로 센서의 출력값을 적분해야 한다. 디지털 제어기에서는 적분이 매 샘플링마다 덧셈으로 바뀌기에 이 값을 계속 더해야 하는데, 아쉽게도 센서는 항상 참값(true value)만 내주지는 않는다. 센서 출력값에는 true value와 노이즈(noise)가 섞여있기 마련인데, 이 값을 계속 적분하고 있으면 시간이 흐를수록 노이즈가 누적되는 현상이 나타나며, 이를 센서 드리프트(sensor drift)라고 한다. 이를 보상하는 기법은 매우 다양하게 연구되고 있으며, 결론부터 말하면 아직까지 다른 센서 도움 없이 완벽하게 센서 드리프트를 없애는 방법은 없다. 따라서 자이로 센서만을 이용하여 각도를 측정하려는 경우는 드리프트를 가능한 작게 만드는 알고리즘을 개발하는데 만족해야 하며, 완전히 제거하려면 다른 센서의 도움이 필요하다.
그림8. 저가형 자이로 센서의 출력(녹색)과 알고리즘은 적용하여 각도를 추출한 경우(파란색) |
위드 로봇에서는 위 두 가지 방법을 모두 시도하여 꽤나 의미 있는 결과를 얻어냈다.
우선 단일 자이로 센서의 출력에서부터 각도를 의미 있게 추출하기 위해 폐루프 제어 시스템을 구성한 뒤 강화학습 알고리즘을 적용하여 자이로 센서의 노이즈를 제거하는 방법을 개발하였다(특허 3건, 논문 2편). 실험 결과 저가형 자이로 센서를 이용하여 알고리즘을 적용한 결과 한 시간당 5도 이내의 누적 오차를 보이는 고가형 자이로에서도 얻기 힘든 결과를 획득할 수 있었다. 특히 정지되어 있지 않고 움직일 경우는 더욱 오차가 줄어들기에 활용시에는 더욱 개선된 성능을 느끼게 될 것이다.
위드로봇에서는 2011년 상반기 중으로 이와 같은 알고리즘을 적용한 자이로 센서를 100원짜리 동전보다 작은 형태로 패키징하여 출시할 계획을 가지고 있다.
센서 융합
자이로 센서는 가속도 센서와 융합할 경우 더욱 큰 효과를 볼 수 있다. 3축 가속도 센서와 2축 자이로 센서를 융합하면 ARS(Attitude Reference System)을 구성할 수 있다. 전형적인 구조는 각 센서의 출력값을 적절한 상태 변수(states)를 가지는 칼만 필터(Kalman filter)를 구성하여 각도를 뽑아내는 것인데, 3축 가속도와 2축 자이로의 조합일 경우는 tilt와 pitch값을 드리프트 없이 찾아낼 수 있다.
위드로봇에서는 2010년 하반기에 이러한 ARS 장치를 초소형으로 제작하는데 착수하여 개발을 완료하였다. 2011년 1월 중으로 디바이스마트를 통해 판매 예정에 있다.
그림9. 개발 완료된 초소형 ARS(모델명 : myARS-USB) |
보기에는 작아 보이지만, 내부에 USB, i2c, UART 인터페이스를 가지고 있어 별도의 장치 없이 USB 케이블을 연결하면 바로 PC와 연결이 가능하다. 이 제품의 개발 과정은 위드로봇 개발자 블로그인 withrobot.tistory.com에 자세히 설명되어 있다.
그림 10. myARS-USB 테스트 모습 |
이 외에도 저잡음 MEMS 가속도 센서를 손쉽게 USB, UART로 연결 가능한 제품군과 3축 가속도, 3축 자이로 센서로 구성된 myIMU6-USB, 9축 IMU(3축 가속도, 자이로, 지자기 센서)도 개발 중이거나 개발이 완료되어 2011년 상반기에 출시 일정을 조율하고 있다. 이러한 제품들이 출시되면 디바이스마트 고객들은 보다 손쉽게 MEMS 기반 센서들을 다룰 수 있게 될 것이라 예상하고 있다.
같이 생각해 보고 싶은 결론
가속도 센서와 자이로 센서의 융합을 통해 각 센서의 단점을 없애고 보다 나은 결과를 도출해 내듯이 엔지니어들도 협동(Co-work)을 통해 시너지를 낼 수 있는 팀 플레이(Team play)에 보다 관심을 쏟을 때라 생각한다.
10년간 꽤 많은 국내외 학회에 참석하거나 연구소를 방문하여 국내, 국외 엔지니어들과 이야기해 보았지만 국내 엔지니어 개개인의 연구자질은 최상급이다. 문제는 이렇게 훌륭한 엔지니어들이 2명, 3명을 모아두면 1+1= 2 또는 3이 되어야 할 텐데 1.5, 1.2가 되거나 심지어는 0.8, 0.7이 된다는 점이 문제이다. 이는‘혼자 일하는 방법’만 배웠고,‘같이 일하는 방법’은 어느 누구도 가르쳐 주지 않았기 때문인 것 같다.
MEMS 센서 활용에서 배울 수 있듯이‘같이 일하는, 같이 행복해지는’방법을 다같이 고민해 봤으면 한다. 위드로봇(WITHROBOT)의 ‘WITH’접두사도 이러한 고민을 담은 사명이기도 하다.
이미지출처
그림3 : 출처-Texas Instruments 홈페이지
그림5 : 출처-Analog Device 홈페이지
그림7 : 출처-Apple 홈페이지
[5호]Advanced Virtual Risk 정복하기!
제1부
개요
AVR은 Atmel사에서 1997년에 개발한 8비트 제어용 마이크로프로세서로서, 프로그램 메모리와 데이터 메모리를 액세스하기 위한 버스를 독립적으로 사용하는 하버드 아키텍처와 파이프라인 처리 방식을 기반으로 하는 Risk기술을 적용하여 높은 성능을 발휘하는 것만 아니라 플래시 메모리를 생산하던 Atmel사의 장점을 살려 칩내에 플래시 메모리를 내장하고 여기에 사용자가 프로그램을 쉽게 다운로드 할 수 있는 ISP방식을 적용하였다.
우리는 AVR에서도 가장 규모가 크고 성능이 높은 응용분야에 사용되는 ATmega 패밀리 중에 ATmega 128을 사용하여 개발한 LK EMBEDDED사의 LK ATmega 128 교육용 KIT의 하드웨어를 기반으로 공부하게 될 것이다.
입출력 포트(I/O PORT)
마이크로프로세서(CPU)의 기능 중에서 가장 기본이 되는 기능은 주변장치와 서로 신호를 주고(Output) 받을(Input)수 있는 입출력(I/O)이다. 마이크로프로세서에서 입출력 (I/O)을 제어하기란 매우 쉽다.
먼저 신호를 출력(Output)할 것인지 입력(Input)할 것인지 제어할 신호의 방향부터 결정한 후 방향에 따라 신호를 출력하거나 입력 받으면 된다. 여러분의 이해를 돕기 위해 그림을 이용하여 이해해보자.
그림-1에서 빨간색으로 되어 있는 부분을 Tri-State Buffer라고 부른다. 이 버퍼에 보이는 1, 2, 3신호 선들로 구성되어 있고 동작은 버퍼 안에 어떤 신호가 입력되느냐에 따라 달라지게 된다.
그림-2을 보면 버퍼의 1 신호 선에 High = 1 이 흐르게 되면 버퍼가 연결되어 2 신호 값이 I/O핀을 통해 외부로 빠져나가게 되며 출력 장치 등을 제어할 수 있게 된다.
그림-3을 보면 반대로 3 신호 선에 Low = 0이 흐르게 되었을 경우 버퍼가 닫히게 되어 외부의 입력 장치로부터 신호의 입력을 받을 수 있게 되는 것이다.
그림-4의 박스 안에 들어 있는 이름들은 실제로 AVR에서 사용되는 레지스터들의 이름이다. 위의 설명에도 나와 있듯이 DDR 레지스터의 방향에 의해서 출력과 입력이 결정되는 것을 알 수 있었다. 이해를 돕기 위해 DDR 레지스터의 특징과 실제 예를 들어 설명해 보겠다.
※ 참고사항 ※
여기서 주의해야 할점은 Tri State Buffer 신호의 방향성이다. 만약 버퍼의 흐르는 신호에 방향성이 없다면 거꾸로 입출력 핀을 통해 역으로 신호가 들어갈 수도 있기 때문이다. 이를 막기 위해 버퍼에 흐르는 신호는 일정한 방향성이 있다. 쉽게 설명하면 도로에 그어진 일방통행 표시처럼 삼각형 꼭지점 방향으로 한 방향으로 신호가 흐르게 된다.
DDR 레지스터의 특징
1) 데이터의 입, 출력을 결정해주는 레지스터
2) 각 포트의 각각의 비트마다 제어 가능
3) 입력/출력 포트로 설정된 핀은 해당 포트로만 사용될 수 있음
4) 1 : 출력(Output), 0 : 입력(Input)
예) PORTB의 PB7~PB4는 출력으로 PB3~PB0는 입력으로 설정
DDRB=0XF0; // PB7 BIT ~ PB4 BIT (Output) PB3 BIT ~ PB0 BIT (Input)
우리는 위와 같이 입력과 출력을 설정 할 수 있는 I/O PORT에 대해 이해 할 수 있었다. 자 그럼 이제 실제 코드에 적용해 보자.
CodeVision AvR C컴파일러
LK ATmega 128 예제소스1 : DDR 레지스터를 활용한 LED 동작하기
//예제 소스 시작
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
void main(void)
{
DDRE=0XFF; //LED 출력 레지스터 설정
PORTE=0X00; //LED PORT 초기화
DDRG=0XFF; //BUZZER 출력 레지스터 설정
PORTG=0X01; //BUZZER PORT 초기화
while (1)
{
PORTE=0XFF; //LED ON
delay_ms(1000); //딜레이 1초
PORTE=0X00; //LED OFF
delay_ms(1000); //딜레이 1초
PORTG=0X00; //BUZZER ON
delay_ms(1000); //딜레이 1초
PORTG=0X01; //BUZZER OFF
delay_ms(1000); //딜레이 1초
};
}
//예제 소스 끝
1) MAIN 함수에서 DDR 레지스터와 PORT의 초기값을 결정해준다.
2) LED 점등
3) 1초 후에 LED 소등
4) 1초 후에 BUZZER 동작
5) 1초 후에 BUZZER 동작중지
6) 2~5번의 동작을 계속 반복한다.
※ 참고사항 ※
위의 그림은 LK ATmega 128 교육용 Kit의 회로도 이다.
LED에는 풀다운 저항이 설계되어 있고 BUZZER에는 반대로 풀업 저항이 설계 되어 있다. 우리 MCU에서 출력을 어떻게 해야 할까?
LED에는 MCU에서 HIGH를 출력으로 내보내야만 전위차에 의해서 LED가 작동되는 것을 알 수 있고 BUZZER에는 MCU에서 LOW를 출력으로 내보내야만 전위차가 발생되어 BUZZER가 동작 될 수 있는 것을 알 수 있다. 위의 소스를 이해하는데 참고하길 바란다.
1) Delay_ms(1000) 이 값의 의미는 ms 단위 시간에 1000이라는 데이터가 대입되는 것이다. 즉 1초라는 말이다. 순차적으로 시간을 제어 할 수 있다는 것은 프로그램 작성 하는데 있어서 없어서는 안될 중요한 요소다. 하지만 delay 함수를 사용할 때 주의할 점은 MCU가 정지되는 것에 있다. 가급적이면 사용하지 않는 것이 올바른 프로그램 작성이라고 할 수 있겠다. 그러면 우린 시간을 제어 할 수 없다는 말인가? 그렇지 않다. ATmega 128에서는 Timer interrupt라는 고성능에 타이머 제어 인터럽트 서비스가 존재 하기 때문이다.
Timer interrupt는 우리가 I/O 제어를 원활하게 하게 되었을 때 학습하게 될 것이다.
CodeVision AvR C컴파일러
LK ATmega 128 예제소스2 : BUTTON을 이용한 LED동작하기
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
void main(void)
{
DDRE=0XFF; //LED 출력 레지스터 설정
PORTE=0X00; //LED PORT 초기화
DDRD=0X00; //BUTTON 입력 레지스터 설정
while (1)
{
if(!PIND.3){ //SW1 ON
delay_ms(10);
if(PIND.3)
PORTE=0X0c; //LED 1,2ON
}
if(!PIND.4){ //SW2 ON
delay_ms(10);
if(PIND.4)
PORTE=0X30; //LED 3,4ON
}
if(!PIND.5){ //SW3 ON
delay_ms(10);
if(PIND.5)
PORTE=0Xc0; //LED 5,6ON
}
if(!PIND.6){ //SW4 ON
PORTE=0X00; //LED OFF
}
};
}
//예제소스 끝
1) DDRE을 출력으로 DDRD을 입력으로 레지스터 설정
2) 스위치 1을 눌렀을 경우 LED 1번과 2번이 점등
3) 스위치 2을 눌렀을 경우 LED 3번과 4번이 점등
4) 스위치 3을 눌렀을 경우 LED 5번과 6번이 점등
5) 스위치 4을 눌렀을 경우 LED 소등
위의 그림은 LK ATmega 128 교육용 Kit의 회로도 이다.
스위치 입력의 신호를 확실하게 규명 짓기 위하여 풀업 저항을 이용하여 평소에는 항상 HIGH의 신호를 입력하고 있으며 스위치 동작시에맊LOW의 신호를 입력 받을 수 있게 설계 되어 있다. 여기서 중요한 것은 위의 하드웨어 특성이다. 풀업저항, 풀다운저항을 사용하지 않고 스위치를 MCU에 연결했을 경우를 우리는 플로팅 상태라고 한다. 플로팅 상태란 간단하게 설명하면 MCU 입장에서 1도 아닌 0도 아닌 어중간한 상태를 뜻한다. 즉 스위치를 누르지도 않았는데 동작 할 수도 있다는 이야기이다. 그러므로 항상 플로팅 상태를 피하기 위해서 풀업저항 또는 풀다운저항이 설계되어야 한다.
제2부
개요
ATmega 128은 4개의 범용 타이머/카운터가 있다. 종류로는 Timer/Counter0 (8비트), Timer/Counter1(16비트), Timer/Counter2(8비트), Timer/Counter3(16비트)가 있다.
타이머/카운터의 제어에 필요한 레지스터는 타이머/카운터 제어 레지스터(TCCRn), 타이머/카운터 레지스터(TCNTn), 출력 비교 레지스터(OCRn)이 있으며 인터럽트 관련하여 인터럽트 플래그 레지스터(TIFR), 인터럽트 마스크 레지스터(TIMSK)가 있다.
사실 타이머/카운터 레지스터에는 인터럽트 및 PWM 출력 기능을 가지고 있다. 인터럽트는 카운터의 값이 오버플로우 되는 순간에 발생하는 오버플로우 인터럽트, 카운터 값이 출력비교 레지스터의 값과 같게 되는 순간에 발생하는 출력비교 인터럽트, 입력캡쳐 인터럽트등이 있는데 우리는 그 중에 오버플로우 인터럽트를 이용하여 타이머 기능을 구현 할 것이다. 그리고 이 강좌에서는 Timer/Counter0 (8비트)를 사용하여 것이며 CodeVision AvR 컴파일러로 관련 레지스터 설정하는 방법을 통해 강의를 진행할 것이다.
OVERFLOW INTERRUPT
AVR은 두 가지 모드의 타이머/카운터 인터럽트를 지원하는데 출력비교 인터럽트와 오버플로우 인터럽트가 그것이다.
그럼 이 인터럽트가 어떻게 동작되는지 해당 레지스터를 참조해보자.
BIT1의 OCF0는 TNCT와 OCR 레지스터의 값을 비교하여 이것이 같으면 이 비트가 1로 SET 되면서 출력비교 인터럽트가 요청된다.
이 인터럽트는 처리가 시작되면 자동으로 0으로 CLEAR 된다.
BIT0의 TOV0는 오버플로우가 발생되면 BIT1로 SET 되면서 오버플로우 인터럽트가 요청된다. 이 인터럽트도 인터럽트 처리가 시작되면 자동으로 0으로 CLEAR된다.
PRESCALER
프리스케일러란 타이머에 공급되는 입력 클럭의 속도를 제어하는 분주기이다. 분주기는 주기를 나눈다라는 의미가 있습니다.
즉 주기를 나눈다는 말은 클럭의 속도를 느리게 한다는 의미와 같다. 예를 들면 16Mhz를 4분주 한다면 4Mhz가 되는 것이다.
TIMER/COUNTER 설정
타이머를 사용하기 위해서는 타이머에서 사용하는 클럭에 대해서 설정을 해야 하는데 이는 프리스케일러(Prescaler) 값으로 조절할 수 있다. 프리스케일러 값은 각 타이머의 컨트롤 레지스터(TCCRn)에서 설정할 수가 있다.
타이머 인터럽트는 각 타이머 관련 컨트롤 레지스터에서 적절한 프리스케일러 값을 설정한 후, 각 타이머 레지스터(TCNTn)에 설정하고 싶은 시간에 대해 인터럽트를 발생시킬 것인지에 대해 관련된 값을 설정해 주면 된다. 그리고 인터럽트를 허용해야 하므로 관련 레지스터인 TIMSK 레지스터를 설정해 주어야 한다.
레지스터를 어떻게 설정해야 원하는 시간을 얻을 수 있을까? 관련 레지스터 설정에 대하여 수식과 왼쪽그림을 통하여 확인해 보자.
[그림-1], [그림-2], [그림-3]을 참조해 보면 CCR0 레지스터의 0~2번 BIT을 사용하여 Prescaler 설정 할 수 있으며 TCNT0 레지스터를 사용하여 시간을 설정할 수 있다. 그리고 TIMSK 레지스터의 TOIE0 BIT을 활성화 해야지만 TIMER0 레지스터의 인터럽트를 허용하겠다는 설정이므로 꼭 기억해야 한다.
위의 레지스터 값을 수식에 대입하여 이해해보자.
좀 더 자세히 수식을 표현해 보겠다.
위의 수식을 보면 TIME(원하는 시간)은 XTAL과 Prescaler 그리고 N값을 통해 구해진다. XTAL은 발진 소자의 발진 데이터를 말하며 프리스케일러 데이터는 위에서도 언급했지만 TCCR 레지스터의 의해서 구해진다. 그리고 N은 TNCT 레지스터의 의해서 설정되는 값이다. 이해가 안 되는 분들을 위해서 예를 들어 설명해 보겠다.
위의 수식처럼 1ms을 구하기 위하여 XTAL은 16Mhz 발진 소자를 사용하였고 TCCR= 0X04, TCNT=0X06로 레지스터를 설정한 결과이다. 우리는 위와 같이 타이머/카운터 레지스터에 대해 이해 할 수 있었다. 자 그럼 이제 실제 코드에 적용해 보자.
CodeVision AvR C컴파일러
LK ATmega 128 예제소스3 : TIMER/COUNTER 레지스터를 활용한 LED 동작하기
//예제소스 시작
#include <mega128.h>
#include <stdio.h>
int cnt; //카운터 변수 선얶
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //TIMER 0 인터럽트 서비스 루틴
{
TCCR0=0×04;
TCNT0=0×06;
cnt++; //1ms 마다 카운터 변수 증가
if(cnt > 7000){ //7초 후에 LED OFF
PORTE=0X00; //카운터 변수 초기화= 반복 동작
cnt=0;
}
else if(cnt > 6000) //6초 후에 LED6 ON
PORTE=0X80;
else if(cnt > 5000) //5초 후에 LED5 ON
PORTE=0X40;
else if(cnt > 4000) //4초 후에 LED4 ON
PORTE=0X20;
else if(cnt > 3000) //3초 후에 LED3 ON
PORTE=0X10;
else if(cnt > 2000) //2초 후에 LED2 ON
PORTE=0X08;
else if(cnt > 1000) //1초 후에 LED1 ON
PORTE=0X04;
}
void main(void)
{
DDRE=0XFF; //LED 출력 레지스터 설정
PORTE=0X00; //LED PORT 초기화
TCCR0=0×04; //Prescaler 64 설정
TCNT0=0×06; //N값 설정
TIMSK=0×01; //TIMER 0 오버 인터럽트 허용
#asm(“sei”)
while (1)
{
};
}
※ 프로그램 해석 ※
1) DDRE 레지스터를 이용하여 LED 출력 PORT로 변경
2) TCCR0과 TCNT0을 이용하여 시간을 설정
3) TIMSK 레지스터를 이용하여 타이머 0 오버 인터럽트를 허용
4) 카운터 변수 int cnt를 선언
5) 타이머 서비스루틴은 TCCR0과 TCNT0 값의 의해 1ms로 설정 되어 인터럽트가 발생 될 때 마다 호출된다.
6) cnt(카운터변수)를 증가 처리 했으므로 1ms마다 카운터는 1씩 증가
7) if문 조건에 따라 1초마다 LED가 순차적으로 점등 소등 된다.
8) 7초 후에 마지막 LED가 소등되며 카운터 변수는 리셋된다.
9) 4~8번 순서대로 동작을 반복한다.
★FLOWCHART
※참고사항 ※
1. 카운터 변수의 자료 형은 int형인데 그 이유는 무엇일까?
카운터 변수의 자료 형을 int형을 선택한 이유는 물론 정수형의 숫자를 사용하는 이유도 있지만 char형이라고 정수형의 데이터를 처리 못하는 것은 아니다. 그러나 char형의 크기는 1byte이고 int형은 2byte 이므로 사용할 수 있는 수의 범위가 틀리다.
1byte= 8bit이다. 즉, 10진수로 256의 데이터 수를 갖는다.
그럼 2byte는 16bit 이므로 256 X 256 즉, 65536의 데이터 수를 갖는 것이다.
Cnt 변수의 증가 범위를 보면 0~7000이다. char형을 사용했을 경우 조건이 성립 될 수가 없다.
2. 카운터 변수를 초기화 하지 않을 때 동작은?
int형은 최대 65536이란 데이터의 수를 갖고 있다고 말했다.
카운터 변수는 1ms 마다 증가하고 그 값을 초기화 하지 않는다고 가정했을 때 7초까지는 프로그램 작성자가 원하는 대로 동작을 한다. 그러나 그 이후에는 카운터 변수의 데이터는 0~65535까지 증가하고 난 후에야 처음으로 복귀하는 것이다.
항상 변수나 함수를 선택하고 정의하는 부분은 프로그램 작성자가 생각해야 할 부분이므로 의미 있게 체크해두자.
제3부
EXTERNAL INTERRUPT
REQUEST(외부 인터럽트)강좌
개요
인터럽트를 해석하면 “끼어든다”는 의미를 가지고 있다. 프로그램상으로 해석한다면 MCU가 동작을 중지하고 인터럽트를 수행한다고 생각하면 된다.
인터럽트는 크게 내부 인터럽트와 외부 인터럽트로 구분하며 다음과 같은 특징을 가지고 있다.
1) 내부 인터럽트의 예는 전 강의 주제인 타이머 인터럽트가 대표적이다. 전 강의에서 우리는 오버플로우을 이용하여 주기적으로 인터럽트를 발생 시켰고 그로 인해 시간을 제어 할 수 있었다.
2) 외부 인터럽트는 사용자의 의해서 들어오는 신호들을 이용하여 인터럽트를 발생 시키는 방식이다. 예를 들면 외부에서 스위치 및 센서 등을 이용하여 MCU로 신호를 발생 시켰을 때 인터럽트가 걸리는 방식이라고 생각하면 되겠다.
3) ATmega 128은 8개의 외부 핀 INT0~7을 통해 입력되는 신호에 의해서 인터럽트를 발생 시킬 수 있다.
4) 외부 인터럽트는 L의 논리레벨(low level), 하강 에지(falling edge), 상승 에지(rising edge)에 의해 트리거(trigger) 될 수 있는데 이러한 인터럽트 트리거 방법은 외부 인터럽트 제어 레지스터의 설정에 의하여 결정된다.
외부 인터럽트 레지스터 설정
외부 인터럽트를 사용하기 위해서는 ECIRA, ECIRB, EIMSK, EIFR 레지스터 설정에 의해서 사용 여부가 결정 된다.
그 내용들을 공부해 보자.
ECIRB, ECIRA 레지스터
ECIR 레지스터는 2개로 구분되는데 EICRA는 INT0~INT3핀을 제어하고 EICRB는 INT4~INT7을 제어한다. 위 2개의 레지스터의 의해서 트리거(trigger)방식을 결정하게 되는데 이해를 돕기 위해 그림을 통하여 학습해보자.
1) L 논리레벨(low level)트리거 방식 : 해당 핀의 L상태가 입력되는 동안 인터럽트가 발생되는 방식이다.
2) 하강 에지(falling edge)트리거 방식 : 클럭에 관계없이 비동기 적으로 신호가 검출 되며 말 그대로 논리 레벨이 HIGH에서 LOW로 하강하는 순서에 인터럽트가 발생하는 방식이다.
3) 상승 에지(rising edge)트리거 방식 : 클럭에 관계없이 비동기 적으로 신호가 검출되며 논리 레벨이 LOW에서 HIGH로 상승하는 순서에 인터럽트가 발생하는 방식이다.
4) 해당 핀을 설정하는 방법는 ISCn1, ISCn0 BIT를 [그림-3]의 방식으로 설정하면 되며 여기서 n은 해당 핀의 따라 달라지게 된다.
EIMSK 레지스터
EIMSK 레지스터는 INT0~7핀의 허용을 결정하는데 사용된다.
설정 방법으로는 해당 BIT를 1로 설정하면 인터럽트 허용, 0으로 설정하면 인터럽트 사용금지가 된다.
EIFR 레지스터
EIFR 레지스터는 INT0~INT7 핀의 입력이 발생되면 해당 인터럽트에 플래그가 발생 되었음을 표시하는데 사용되며 이 비트들은 인터럽트 발생시 1로 SET되고 인터럽트 서비스 루틴으로 진행하게 되면 0로 CLEAR된다.
우리는 위와 같이 외부 인터럽트 레지스터에 대해 이해 할 수 있었다. 자 그럼 이제 실제 코드에 적용해 보자.
CodeVision AvR C컴파일러
LK ATmega 128 예제소스4 : 외부 인터럽트 레지스터를 활용한 LED 동작하기
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
char cnt; //카운터 변수 선언
interrupt [EXT_INT2] void ext_int2_isr(void) //외부 인터럽트0 서비스 루틴
{
cnt++; //외부 인터럽트 발생시 카운터 증가
}
void main(void)
{
DDRE=0XFF; //LED 포트 출력 레지스터 설정
PORTE=0X00; //LED 초기 OFF
EICRA=0×20; //외부 인터럽트 2 FALLING EDGE 설정
EIMSK=0×04; //외부 인터럽트 2 허용
EIFR=0×04;
#asm(“sei”)
while (1)
{
if(cnt==1) //카운터 1일 때 LED1 ON
PORTE=0X04;
else if(cnt==2) //카운터 2일 때 LED2 ON
PORTE=0X08;
else if(cnt==3) //카운터 3일 때 LED3 ON
PORTE=0X10;
else if(cnt==4) //카운터 4일 때 LED4 ON
PORTE=0X20;
else if(cnt==5) //카운터 5일 때 LED5 ON
PORTE=0X40;
else if(cnt==6) //카운터 6일 때 LED6 ON
PORTE=0X80;
else if(cnt==7){ //카운터 7일 때 LED OFF
PORTE=0X00;
cnt=0; //카운터 초기화
}
};
}
//예제소스 끝
1) 외부 인터럽트 2번 사용설정 및 하강에지 인터럽트 레지스터 설정
2) 외부에서 인터럽트가 발생할 때 카운터는 1씩 증가
3) 카운터가 증가 될 때 마다 LED 순차적으로 점등
4) 카운터 데이터 7이 되면 카운터 변수 RESET 및 LED 소등 된다.
5) 2~4을 반복된다.
★ FLOWCHART
※ 참고사항 ※
ATmega 128에서는 RESET을 포함하여 총 35종류의 인터럽트를 가지고 있으며 인터럽트는 MCU의 의지에 따라 순차적으로 제어 되는 것이 아니라 비동기적으로 발생 되는 것이 일반적이므로 우연히 2개 이상의 인터럽트 요청이 중복 되는 경우가 있을 수 있다.
MCU는 인터럽트를 한꺼번에 처리할 수가 없으므로 한번에 1개의 인터럽트를 선택하여 처리하게 되는데 이를 인터럽트 우선 순위 제어라고 한다.
ATmega 128은 인터럽트의 중복을 막기 위하여 인터럽트의 어드레스 번지의 0×0000 ~ 0×0044까지 순차적으로 인터럽트를 처리하게 되어있다. 그리고 35종류의 인터럽트는 각각의 마스크 레지스터를 이용하여 개별적으로 허용여부를 결정할 수 있고 상태 레지스터인 SREG 글로벌 인터럽트를 이용하여 전체적인 허용 여부를 설정할 수 있다.
제4부
UART(Universal Asynchronous Receiver and Transmitter)강좌
개요
ATmega 128은 2개의 UART 직렬통신 포트를 가지고 있는데 비 동기 전송 모드에서 전이중 통신이 가능하고 멀티프로세서 통신 모드동작도 가능하다.
UART기능을 사용하기 위해서는 UDRn, UCSRnA, UCSRnB, UCSRnC 레지스터를 이용하여 설정하여야 한다. 하지만 UART 레지스터의 기능들을 초보자가 전부 소화하는 것은 쉽지 않으므로 필요한 부분만을 참조하여 설명하겠다.
1) UART 직렬 통신 포트에서는 송신완료, 송신데이터 준비완료, 수신완료 3가지의 인터럽트를 사용할 수 있으며 내부 구성으로는 클럭 발생부, 송신부, 수신부의 구성으로 나누어 있다.
2) 높은 정밀도의 보레이트 발생기를 내장하고 있다.
3) 비동기식 전송 모드에서는 항상 내부의 클럭에 의하여 보레이트가 결정된다.
※ 참고사항 ※
LK 개발보드에는 CP2012 IC가 내장되어 있어 TTL0레벨의 통신신호를 USB레벨의 통신신호로 변환 해주어 PC와 통신이 가능하게 해주고 있다. 이해를 돕기 위해 회로도를 첨부 하겠다.
★ 회로도
UDRn 레지스터
UDRn레지스터는 UART 포트의 송, 수신 데이터 버퍼의 기능을 가지고 있다.
[그림-1]을 참조하면 UDRn레지스터는 동일한 메모리 번지에 위치하지만 내부적으로는 서로 다른 레지스터로서, 송신데이터를 UDRn에 라이트하면 이는 송신 데이터 버퍼 TXBn에 저장되고, 수신된 데이터를 UDRn으로 읽으면 수신 데이터 버퍼 RXBn에 수신되어 값을 읽을 수 있게 된다.그리고 송신 버퍼는 UCSRnA 레지스터의 UDREn 플래그 비트가 1로 설정 되어야만 데이터를 라이트 할 수 있으며 UDREn 플래그 비트가 0으로 되어 있는 경우에는 UDRn에 데이터를 라이트 하더라도 무시 처리가 된다.
UCSRnA 레지스터
UCSRnA 레지스터는 UART 포트의 송수신 동작을 제어하거나 송수신 상태를 저장하는 기능을 가지고 있다.
1) RXCn : MCU가 수신 버퍼에 읽혀지지 않은 수신 문자가 들어 있으면 1로 SET되고 MCU가 수신 버퍼의 데이터를 다 읽은 상태이면 0으로 CLEAR되는 플래그 비트
2) TXCn : 송신 시프트 레지스터에 있는 송신 데이터가 모두 송신되고 UDRn의 송신 버퍼에 새로운 데이터가 라이트 되지 않은 상태이면 1로 SET되는 상태 플래그 비트
3) UDREn : UDRn의 송신 버퍼가 비어 있어 새로운 송신 데이터를 받을 준비가 되면 1로 SET되는 상태 플래그 비트
UCSRnB 레지스터
UCSRnB 레지스터는 UART 포트의 송수신 동작을 제어하거나 전송 데이터를 9비트로 설정한 경우에 9번째 비트 데이터를 저장하는 기능을 가지고 있다.
1) RXCIEn : 수신완료 인터럽트를 개별적으로 허용하는 비트.
2) TXCIEn : 송신완료 인터럽트를 개별적으로 허용하는 비트.
3) UDRIEn : 송신 데이터 준비완료 인터럽트를 개별적으로 허용하는 비트.
4) RXENn : USART 포트의 수신부가 동작하도록 허용하는 비트
이 비트는 RXDn 핀이 I/O포트가 아니라 직렬 통신 데이터 수신 단자로 동작 하도록 설정하며 에러 플래그 비트의 동작을 유효하게 한다.
5) TXENn : UART 포트의 송신부가 동작하도록 허용하는 비트.
6) UCSZn2 : 전송 문자의 데이터 비트 수를 설정하는데 사용.
7) RXB8n : 전송 문자가 9비트로 설정된 경우에 수신된 문자의 9번째 비트의 데이터를 저장한다.
8) TXB8n : 전송 문자가 9비트로 설정된 경우에 송신할 문자의 9번째 비트의 데이터를 저장.
UCSRnC 레지스터
UCSRnC 레지스터는 UART 포트의 송수신 동작을 제어하는 기능을 가지고 있다.
1) USBSn비트를 0으로 설정하면 USART 포트에서 데이터 포맷을 구성하는 스톱 비트를 1개 설정하고 이 비트가 1이면 스톱 비트를 2개를 설정한다.
2) UCSZn0~1비트는 [그림-6]과 같이 UCSRnB 레지스터의 UCSZn2비트와 함께 전송 문자의 데이터 비트 수를 설정하는데 사용된다.
UBRRnH/L 레지스터
UBRRnH/L레지스터는 UART 포트의 송수신 속도를 설정하는 기능을 가지고 있다.
보레이트를 설정하기 위해서는 UBRRnH/L 레지스터를 설정하여야 하는데 계산 수식은 아래와 같다.
우리는 위와 같이 UART 레지스터에 대해 이해 할 수 있었다.
자 그럼 이제 실제 코드에 적용해 보자.
CodeVision AvR C컴파일러
LK ATmega 128 예제소스6: UART레지스터을 이용한 DATA출력하기
//예제소스 시작
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RX_BUFFER_SIZE0 1 //수 버퍼 사이즈 1로 설정
char rx_buffer0[RX_BUFFER_SIZE0];
#if RX_BUFFER_SIZE0<256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif
bit rx_flag; //수싞플래그 비트 선언
void tx_out(unsigned char buff) //송싞데이터 출력 함수
{
while ( !( UCSR0A & (1<<UDRE)) ); //폴링 방식으로 송 준비 체크
UDR0 = buff; // 데이터 출력
}
interrupt [USART0_RXC] void usart0_rx_isr(void) //USART0 서비스 루틴
{
char status,data; //변수 선언
status=UCSR0A; //상태 체크 변수
data=UDR0; //데이터 변수
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) //통싞 에러 및 상태 이상 무
{
rx_buffer0[rx_wr_index0]=data; //수싞 버퍼에 데이터 저장
if (++rx_wr_index0 == RX_BUFFER_SIZE0) {
rx_wr_index0=0; rx_flag=1; //rx_flag 비트 활성화 및 초기화
}
};
}
void main(void)
{
DDRE=0XFF; //LED 출력 레지스터 설정
PORTE=0X00; //LED PORT 초기화
DDRG=0X01; //BUZZER 출력 레지스터 설정
PORTG=0X01; //BUZZER 초기화
UCSR0A=0×00;
UCSR0B=0×98; //송,수 허용
UCSR0C=0×06; //비 동기 통 모드, 데이터 사이즈 8bit
UBRR0H=0×00;
UBRR0L=0×67; //boud rate : 9600 pbs
#asm(“sei”)
while (1)
{
If(rx_flag){
rx_flag=0; //수 플래그 비트 초기화
if(rx_buffer0[0]==1){ //수싞버퍼 데이터가 1일 때
PORTE=0XFF; //LED ON
PORTG=0X01; //BUZZER OFF
tx_out(0×01); //송 데이터 0×01
}
else if(rx_buffer0[0]==2){ //수싞 버퍼 데이터가 2일 때
PORTG=0X00; //BUZZER ON
PORTE=0X00; //LED OFF
tx_out(0×02); //송 데이터 0×02
}
else {PORTE=0X00;PORTG=0X01; //수싞 버퍼 데이터 값이 1 또는 2가 아닐 경우
tx_out(0xff) //송싞데이터 0xff
} //LED OFF, BUZZER OFF
}
};
}
//예제소스 끝
※ 프로그램 해석 ※
1) USART 레지스터 설정
2) 수신 인터럽트 발생시 인터럽트 서비스 루틴 진입
3) 상태 레지스터 및 각종 에러 플래그 비트 체크
4) 수신된 데이터와 설정된 데이터 버퍼수가 같을 때 수신 플래그 비트 활성화
5) 수신 플래그 비트 활성화 시 if문으로 조건 체크
6) If문 조건에 따라서 LED ON 및 BUZZER ON 혹은 LED OFF 및 BUZZER OFF
7) If문 조건에 따라서 송신 데이터 출력
8) 2~7을 반복한다.
★ FLOWCHART
※ 참고사항 ※
통신분야에 있어서 통신속도에 관련되는 단위로 흔히 사용되는 것으로 Bps와 Baud가 있다. Bps는 비트 전송 속도를 나타내는 단위이며, 1초간에 전송되는 비트수를 나타낸다.
Baud은 변조 속도를 나타내는 단위이며, 초 단위로 나타낸 최단 변조 주기를 T라고 할 때 Baud=(1/T) [sec]로 정의 된다.
제5부
ADC CONVERSION (Analog to Digital Converter)강좌
개요
ATmega 128은 10비트의 분해능을 가진 8채널 A/D 컨버터를 가지고 있으며 이 8채널의 아날로그 입력 신호는 PORTF와 동일한 핀을 사용하고 있으며 ADMUX 레지스터에 의하여 사용 여부가 결정된다. ATmega 128의 ADC 기능들의 특징은 아래와 같다.
1) A/D컨버터에는 샘플/홀드 회로가 있어서 A/D 변환이 수행되고 있는 동안에는 아날로그 전압이 일정하게 유지되도록 하고 있다.
2) ADMUX레지스터는 8개의 단 극성 입력으로 사용될 수도 있고 1개의 지정된 핀을 기준으로 7개의 차동 입력으로 사용될 수도 있으며 2가지의 차동입력에 대해서는 MCU 내부에서 10배 또는 200배 증폭하여 A/D 변환을 할 수도 있다.
3) A/D변환시간을 사용자가 주파수 50Khz~200Khz까지 시간60~260us 범위에서 설정할 수 있다.
4) A/D는 2가지의 변환모드가 있는데 단일변환모드와 프리런닝모드가 있으며 사용자가 원하는 출력상태를 선택하여 결정하면 된다.
ADMUX레지스터
ADMUX레지스터는 AD컨버터의 기준전압을 선택하거나 변환 결과 레지스터의 데이터 저장형식을 지정하는 기능을 가지고 있으며 아날로그 입력채널을 선택하는 기능을 가지고 있다. 이해를 돕기 위해 아래의 그림을 참조해 설명하겠다.
1) REFS1~0 : 기준 전압을 결정할 때 사용되는 비트로서 외부의 VREF 전압을 사용할 것인지, 외부의 AVCC 전압을 사용할 것인지 내부 기준전압(2.56v)를 사용할 것인지를 결정하는 기능을 수행한다.
2) ADLAR : 변환 결과를 저장하는 형식을 결정하며 이 비트를 1로 지정하면 변환 결과가 상위 바이트를 시작으로 저장이 되며 0으로 설정하면 하위 바이트를 시작으로 데이터가 저장된다.
3) MUX4~0 : 아날로그 입력 채널을 결정할 때 사용되는데 아날로그 입력은 크게 단 극성 입력과 차동입력으로 나눈다.
단 극성은 8가지의 단 극성 입력을 선택 할 수 있고 차동입력은 단자사이의 차동입력 그리고 이득값을 20 또는 200으로 증폭해서 취득할 수도 있다.
ADCSRA 레지스터
ADCSRA 레지스터는 AD 컨버터의 동작을 설정하거나 동작상태를 표시하는 기능을 수행한다.
1) ADEN : AD컨버터를 ON 또는 OFF 하는 기능을 수행한다.
2) ASSC : 이 비트를 1로 설정하면 AD 컨버터의 변환이 시작되며 프리런닝모드에서는 처음 이후에는 자동으로 변환이 진행된다.
3) ADFR : AD 컨버터를 프리런닝 모드로 설정할 때 사용된다.
4) ADIF : AD 컨버터의 변환이 완료 되었을 때 1로 SET 되며 인터럽트가 발생하게 된다.
이 인터럽트가 처리되기 시작하면 다시 자동적으로 0으로 CLEAR 된다.
5) ADIE : 변환 완료 인터럽트를 개별적으로 허용할 때 사용된다.
6) ADPS2~0 : 위와 같이 AD 컨버터에 인가되는 클럭의 분주비를 선택하는 기능을 수행한다.
ADCH, ADCL 레지스터
ADCH 및 ADCL 레지스터는 AD 컨버터의 변환 결과를 저장하는 레지스터로서 단 극성 입력을 사용할 경우에는 0~1023의 데이터 범위를 가지지만 차동입력을 사용할 경우에는 -512~+511 의 데이터 범위를 가지게 된다. 그리고 ATmega 128은 10비트의 분해 능을 가지고 있으므로 1 byre로는 처리가 불가능하다.
그래서 ADCH(상위 바이트), ADCL(하위 바이트)로 데이터를 나눠서 저장하게 되며 ADMUX 레지스터의 ADLAR 비트의 설정에 따라 데이터가 우측 또는 좌측으로 정렬되어 저장하게 되는데 그 내용은 아래의 [그림 -6]과 같다.
A/D 변환 결과
AD 컨버터가 변환을 완료하면 ADCH와 ADCL에 데이터가 저장된다. 그러면 우리는 아날로그 입력이 디지털 값으로 변환이 되었을 때의 데이터를 알아볼 필요가 있다.
42페이지에 [그림-7]과 [그림-8]을 참고하여 계산하여 올바른 데이터 변환이 일어나고 있는지 확인 하면 된다.
1. 단 극성 입력 채널을 사용
2. 차동입력 채널 사용
우리는 위와 같이 ADC 레지스터에 대해 이해 할 수 있었다.
자 그럼 이제 실제 코드에 적용해 보자.
CodeVision AvR C컴파일러
LK ATmega 128 예제소스6: ADC레지스터와 UART 통신을 이용한 DATA출력하기
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
#define ADC_VREF_TYPE 0×40
int data; //AD 컨버팅 데이터 변수
unsigned int read_adc(unsigned char adc_input) //AD 컨버팅 함수
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0×40; //ADC 단일 컨버팅 모드 설정
while ((ADCSRA & 0×10)==0); //ADC 폴링상태로 대기
ADCSRA|=0×10; //인터럽트 발생 플래그 비트 초기화
return ADCW; //ADCL, ADCH 각각 8비트를 합산하여 16비트로 사용
}
void main(void)
{
ADMUX=ADC_VREF_TYPE & 0xff; //ADMUX = 0X40 (define선언 참조), AVCC 핀을 VREF로 설정
ADCSRA=0×84; //AD 컨버팅 허용, 16분주 비 사용
UCSR0A=0×00;
UCSR0B=0×98; //송싞, 수싞 허용
UCSR0C=0×06; //비 동기 통싞 모드, 데이터 사이즈 8bit
UBRR0H=0×00;
UBRR0L=0×67; //boud rate : 9600 BPS
#asm(“sei”)
while (1)
{
data=read_adc(0); //데이터 변수에 read_adc(0)채널의 데이터 삽입
printf(“%d\r\n”,data); //printf문을 이용하여 데이터 출력
};
}
//예제소스 끝
※ 프로그램 해석 ※
1) ADMUX 레지스터 기준전압 설정(데이터 시트 참조) 및 AD컨버팅 허용, 분주 비 설정, ADC 채널 설정
2) 데이터 값을 확인하기 위하여 USART 통신 레지스터 설정
3) read_adc 함수에서 ADC기준 전압을 통하여 ADC0 채널에 디지털 데이터 입력
4) printf 문을 사용하여 ADC0데이터 확인
5) 3~4번 동작을 반복한다.
FLOWCHART
※참고사항※
ATmega 128은 프리런닝 모드와 단일 변환 모드를 지원하고 있는데 사용자가 원하는 시점에서 변환을 하려면 단일 변환 모드를 사용해야 한다.
하지만 프로그램의 구성의 따라 이러한 단점을 극복 할 수가 있는데 그 방법으로는 타이머 인터럽트를 이용하여 변환 시간을 사용자가 선택할 수가 있기 때문이다.
예를 들면 타이머 인터럽트를 1ms로 설정하고 read_adc함수를 호출한다면 1ms마다 ADC 데이터를 정의 하게 되기 때문이다.
강의를 통해 얻는 예제 소스를 활용하여 AVR의 기능을 더 극대화 해보길 바란다.
[1호]벤쿠버 올림픽의 김연아, 자외서 센서의 (주) 제니컴
이번 벤쿠버 올림픽에서도 김연아 선수가 당당히 금메달을 목에 걸었다. 김연아 선수는 쇼트프로그램에서 자신만의 고난이도 기술로 가산점을 많이 받아서 세계신기록을 세움으로써 우승고지를 유리하게 선점하였던 것이다. 이와 같이 자외선센서 분야에서도 김연아 선수와 같이 고유의 강점으로 한국뿐만 아니라 세계적으로 알려져 있는 업체가 있다. 바로 자외선센서 업계의 작은 강자 ㈜제니컴(김복경 대표이사)이다. ㈜제니컴은 2000년에 설립이 되었지만 자외선 센서 사업은 2004년부터 시작이 되었다. 현재 CTO를 맡고 있는 손정환 이사가 2004년부터 합류하여 본격적으로 자외선센서 사업을 시작하게 되는데, 손정환 이사는 KAIST 전자과에서 화합물반도체를 전공하여 박사를 취득한 다음, 1999년부터 벤쳐회사에서 GaN기반의 소자 및 공정을 연구개발하다가 ㈜제니컴에 합류하였다.
㈜제니컴의 자외선센서는 현재 가시광 LED에 주로 사용이 되는 GaN물질을 기반으로 하는 것인데, 세계적으로 GaN 자외선센서를 공급하는 업체는 일본 2개사, 한국 1개사(제니컴), EU(1개사)등 5개 이내이다. 그만큼 기술적으로도 독창적이며, 아직 제한된 회사만이 공급을 하고 있는 상황인 것이다. ㈜제니컴은 자외선센서 관련하여 다수의 특허를 보유하고 있으며, 특히 AlGaN 기반의 기술은 세계적인 수준이다. 그렇기 때문에 EU지역의 경쟁사들도 ㈜제니컴의 자외선센서를 공급받아서 활용하고 있는 상황이다. 자외선센서 사업을 시작한지 2년도 안되어 Frost & Sullivan사의 “UV sensor market 2005″자료에 의하면 ㈜제니컴은 consumer시장의 main player로 소개되고 있다. 현재는 초기의 소자 및 부품위주의 사업에서 점차 응용시스템으로 사업을 확장하고 있는 상태이며, 특히 자외선 살균장치 응용에서는 수입대체가 활발히 이루어지고 있다.
▲1. MOCVD장비 | 2. 2009년 독일 SENSOR+TEST 전시회참가 사진 |
■ 증가하는 자외선 응용
자외선은 가시광보다 파장이 짧은 광으로써 파장이 200~400nm로 정의되며, UVA(320~400nm), UVB(280~320nm), UVC(200~280nm)로 나뉘어 진다. 자외선을 응용하는 분야가 점점 증가하고 있는데 자외선 광원을 기분으로 분류해 보면 자연광원(태양, 불꽃)과 인공광원(자외선램프, LED)으로 구분이 된다. 태양광에는 우리가 눈으로 인지하지 못하는 파장이 존재하는데 바로 적외선과 자외선인다. 이중 자외선은 파장이 짧을 경우 인체와 자연에 유해한 영향을 주기 때문에 최근의 환경파괴에 따른 자외선의 피해가 증가하면서 이러한 자외선을 감지하는 수요가 급격히 증가하고 있다. 유해한 자외선양을 표시하는 단위로 자외선지수(UV Index)가 표준으로 사용되고 있는데, 우리나라도 근래에 자외선의 영향이 강해지면서 기상청에서 자외선지수를 예보하고 있다. 자외선센서를 사용하여 자외선지수를 측정하고 표시할 수 있으며, 주로 휴대폰과 같은 휴대용기기나 옥외에 설치하는 기기에 응용이 된다.
태양 외에 자연광원으로는 불꽃이 있다. 불꽃도 태양과 마찬가지로 자외선부터 적외선까지 발생이 된다. 따라서 화재감지를 위해 최근에 정확하고 빠른 감지법으로 불꽃의 자외선을 감지하는 방식이 각광을 받고 있다. 정확하게는 원적외선과 자외선을 동시에 측정하여 화재를 감지하는 방식인데, 적외선은 반도체소자로 감지가 가능하지만 자외선은 아직 반도체소자로 감지하기에는 감도가 낮아서 GM tube형태의 자외선 센서가 주로 사용이 된다. 그러나 보일러와 같이 근거리에서 불꽃을 감지하는 응용에서는 반도체 소자로 충분히 가능하며, 특히 AlGaN기반의 UVC감지 센서를 사용하면 된다.
인공광원으로는 전통적으로 많이 사용되는 자외선램프가 대표적이며, 주로 자외선 살균과 자외선 경화 장치에 사용이 된다. 특히 근래에 환경과 관련하여 자외선 살균응용이 급격히 증가하고 있으며 이 경우에 자외선센서를 반드시 부착하여 램프의 동작여부와 이상유무를 판단하는 것이 중요하다. 최근까지는 이러한 응용에 사용되는 센서제품들이 주로 수입되었으나 ㈜제니컴에서 제품을 개발 공급함으로써 빠르게 대체되고 있는 상황이다. 자외선LED는 아직 360nm 이상의 파장에서 발광하는 제품이 많이 사용되며 단파장의 경우는 성능이나 가격적인 면에서 아직 수요시장이 형성되어 있지 못하다. 자외선 LED를 응용하는 분야는 고출력 자외선 경화기나 위폐감지기가 대표적이다.
■(주)제니컴의 GaN 자외선센서
자외선을 감지하는 반도체소자는 여러 가지 물질로 구성이 가능하며, 기존에 Si, GaAsP, SiC등으로 제작이 되었다. 그러나 이러한 물질들로 만든 센서는 자외선만 감지하는 것이 아니고 가시광도 감지가 되고, 또 단파장의 자외선영역만을 감지하기가 불가능하기 때문에 별도의 필터를 채택해야 한다. 이러한 제약으로 인해 신뢰성, 가격, 크기 등에서 제약이 있었다. 그러나 GaN 기반의 물질은 Al이나 In을 첨가하여 감지 영역을 변화시킬 수 있기 때문에 별도의 필터가 필요 없다. 따라서 기존의 센서보다 강점을 가질 수 있다. ㈜제니컴은 국내 유일의 자외선센서 전문업체로서 MOCVD(유기화학기상증착법) 기술로 GaN센서용 웨이퍼와 칩 제품을 2004년부터 확보하여 다양한 부품으로 공급하였다. 이는 당시 미국의 APA optics, SVTA외에 세계 세번째로 상용화에 성공한 것이다. 이러한 기술적 강점을 배경으로 AlGaN, InGaN기반의 자외선센서도 선도적으로 개발, 공급하고 있다. 또한 초소형부품화도 성공하여 세계에서 제일 작은 크기의 부품도 개발, 공급하고 있다. 이런 강점으로 인해 Agilent사에 센서칩을 공급하기도 하였으며, LG전자에 휴대폰용 부품으로 납품하기도 했고 현재도 휴대폰 응용으로 여러 회사와 진행 중이다.
㈜제니컴의 자외선센서는 부품, 모듈, 시스템으로 나뉘어진다. 부품은 SMD와 TO-CAN으로 주로 제작이 되는데, GaN기반의 칩외에도 자외선을 투과해야 하므로 window층 구성이 기술의 know-how이다. 모듈은 PCB보드에 센서와 증폭회로를 장착하여 사용하기에 편하도록 DC전압이나 전류출력을 한 것이며, Al이나 스텐레스로 케이스를 구성하여 현장에서 바로 사용할 수 있도록 한 제품은 특별히 UV probe라 한다. UV probe는 특히 자외선 살균장치와 자외선 경화 장치에 사용되며, 수처리용과 옥외용은 방수제품으로 되어 있다. 시스템은 센서부와 표시부로 구성이 된 자외선감지기로서 휴대용과 장착용이 있다. 최근에 개발을 끝낸 휴대용은 기본 제품과 달리 1ch과 4ch을 선택하여 사용할 수가 있는데 4ch의 경우는 UVA, UVB, UVC영역을 따로 동시에 측정할 수 있게 되어 있다. 장착용은 표시부에 알람 기능과 통신 기능 등이 추가되어 자외선광원을 모니터하고 조절하는데 편리하도록 구성되어 있다. “이러한 표준제품 외에도 고객의 다양한 응용환경과 사양에 맞게 전용제품의 개발도 많은 경험을 가지고 있어서 자외선감지에 대해서는 국내최고의 대응이 가능하다”고 손정환 이사는 자신 있게 언급한다.
■ (주)제니컴의 비전
“We walk the path together!” ㈜제니컴의 slogan이다. 각 단어마다 뜻이 깊고 음미해 볼만 하지만 간단히 요약하면 “상생과 나눔”이다. 회사와 협력사와 고객이 모두 성공하는 모델을 추구하고 있다. 세상이 도움이 되는 기술과 제품, 서비스로 우리가 사는 세상을 이롭게 하고 아름다운 회사를 만들고자 하는 것이 김복경 대표의 비전이다. “이제 센서사업을 시작한지 만 6년이 되어 갑니다. 그 동안 회사의 기술 및 제품이 많이 알려져서 큰 고객들로부터의 전용제품 개발의뢰도 수시로 받고 있는 상황이라, 설립 10주년이 되는 올해에 자외선센서 사업이 확고하게 발돋움하는 시간이 되도록 열심히 뛰고자 합니다”라는 김복경 대표이사의 말대로 올해 ㈜제니컴이 세계적으로 자외선센서의 강자로 우뚝 서는 한 해가 되기를 기대해 본다.
[자외선센서 기술 및 제품에 대한 문의처] http://www.geni-uv.com
손정환 이사 : 042-472-7465 uvsensor@geni-uv.com
[4호]Sensorless BLDC모터를 구동해보자!!
안녕하세요! 필자는 엔지니어로써 막 발을 들여놓은지 얼마 되지않아, 많은 것을 배우고 있는 ‘왕초보’입니다!!
이번에 처음으로 Sensorless BLDC 모터 구동에 대한 글을 쓰게 되었습니다. 아주 간단하게 Sensorless BLDC모터를 구동하는 방법에 대해 글을 써볼까 합니다. 부족한 점이 많겠지만, 같이 열심히 배워보도록 합시다.
처음 Sensorless BLDC 모터를 손에 쥐고. 구동하려 하니 막막할 따름입니다. 이녀석을 어떻게 구동시켜야 할까? 과연 구동시킬 수 있을까…? 하는 걱정도 들었습니다.
사실 왕초보인 필자는 어릴 때 가지고 놀던 미니카에 들어가는 DC 모터를 뜯어본 기억이 전부인데 말입니다.
학교 앞 문구점 앞에 설치된 미니카용 트랙(Track)에서 미니카를 친구들 것보다 빠르게 달리게 하기 위해 모터를 구입하던 기억이 떠오르네요. BLDC 모터라… 무언가 DC와는 이름부터 다르니 다른점이 한, 두가지가 아닐 것 같은 느낌이 매우 많이 듭니다.
얼마나 많이 다른걸까요?
자! 그럼 Sensorless BLDC모터를 구동하기에 앞서, BLDC와 Sensorless BLDC에 대해서 알아봐야 하겠죠??
그럼 간단하게 알아보도록 합시다.
1. BLDC(Brushless DC electric motor)란?
BLDC 란 무엇일까요?? 약자를 풀어서 읽어보면, Brush가 없는 DC 모터인 것이 분명합니다. 그렇다면 일반 DC모터와는 무슨 차이가 있길래 Brush를 왜 없앴을까요? 다시 옛날에 가지고 놀던 미니카의 DC모터를 떠올려 보겠습니다.
<한참 달리고 나면 모터가 엄청 뜨겁습니다. 약간의 탄내도 올라옵니다. 모터를 뜯어보니 Brush가 탄 게 분명한 것 같습니다. 이걸 갈아줘야 다시 달릴 수 있을 것 같습니다.> 다들 미니카를 한 번쯤 다뤄봤다면 이와 같은 일을 겪었을 것입니다.
그렇습니다. DC 모터의 단점은 Brush입니다. 소음이 많고, 일정 시간이 되면 갈아줘야 하기 때문입니다. 이와 같은 단점을 없앤 것이 BLDC(Brushless DC electric motor)인 것입니다. 그렇다면 구조는 어떻게 다른지 살펴보겠습니다.
<그림1-1> 에서 볼 수 있듯이, DC 모터의 경우 회전체가 코일인 반면, BLDC 모터는 자석자체가 회전하는 회전체의 모습입니다. 그러므로 구조상 Brush가 필요 없어지게 된 것입니다. 그렇다면 실제 BLDC의 모습은 어떻게 생겼을까요?
<그림 1-2>을 보시면 <그림 1-1>에서 봤던 것처럼 코일에 전류가 흐르면 자석이 회전하게끔 만들어져 있습니다.
그리고 3개의 극성 터미널이 존재합니다 U,V,W(A,B,C) 가 바로 그것이지요.
그리고 모터 회전체인 자석의 위치를 알려주는 홀 센서가 장착되어 있습니다. 이 홀 센서를 통해 모터자석의 위치를 판단할 수 있고, 모터의 회전속도 및 회전각 등을 알 수 있는 것입니다.
여기서 궁금한 점이 있을 것입니다. DC모터와 BLDC가 구조적인 차이점이 있으니, 구동하는데도 각각의 차이점이 있지 않을까요? 물론 그렇습니다. 일반 DC 모터의 경우 Brush의 양 터미널에 (+,-)를 입력하면 간단하게 구동이 되지만, BLDC 모터의 경우 홀 센서의 출력에 따라 각각의 터미널에 전류를 흘려주어야 하므로 반드시 구동용 드라이버가 필요합니다.
<그림 1-3>은 일반적인 BLDC 모터의 내부구조입니다. BLDC모터는 영구자석으로 이루어진 회전자와 권선으로 이루어진 스테이터들로 이루어져 있으며, 전류가 흐르는 권선으로부터 자기장 관계에 의해 회전자를 회전시켜 전기적 에너지를 기계적인 에너지로 변환되게 됩니다.
<그림 1-3>의 오른쪽에 나타낸 화살표의 방향은 각각의 전류 흐름 방향이고 이를 좀더 자세히 표현한 것은 아래 <그림 1-4>와 같습니다.
< 그림 1-4 >와 같이 BLDC모터는 총 6-STEP으로 이루어져 있으며, 홀 센서의 신호에 따라 각각 다른 방향으로 전압을 인가해 주어야 합니다. 위와 같이 전류를 흘려주게 되면, 모터는 회전체(영구자석)가 순서대로 각 전자석에게 밀리고 당겨져 회전체가 회전하게 되는 것입니다.
<그림1-5>는 3상 전류제어용 인버터로, 위와 같은 회로 조합을 통해 BLDC모터를 제어하게 됩니다.
여기까지 매우 간단하게 BLDC에 대해 알아보았습니다.
다음 장에서는 Sensorless BLDC에 대해 알아보도록 하겠습니다.
2. Sensorless BLDC란?
드디어 Sensorless BLDC 모터에 대해 알아보는 시간이 되었습니다! Sensorless BLDC모터란 무엇인가? 단순히 해석하고자 하면, BLDC모터에 Sensor가 없는 것이므로, 홀 센서가 없는 것일까? 그렇습니다. 홀 센서가 장착되지 않은 BLDC모터입니다. 그렇다면 왜 홀 센서를 장착하지 않은 것일까요? 필자의 생각으로는, 소형 BLDC모터를 개발하다 보니 홀 센서까지 제거하여 크기를 줄이다가 개발된 것이 아닐까 생각이 듭니다.
즉, 기존의 BLDC모터에 비해 크기를 줄이기 위한 것이 아닐까 조심스럽게 추측해 봅니다. 본론으로 넘어와서, Sensorless BLDC 모터를 구동하기 위해서는 무엇을 알아야 할까요? 기존 BLDC모터와 구동하는데 있어서 차이점은 무엇일까요? 그럼 앞시간에 다룬 BLDC모터에 대해 다시 한번 떠올려 볼까요? 기존 BLDC모터의 경우에는, 각 홀 센서의 출력 신호를 가지고, 모터의 회전자(영구자석)의 위치를 파악하여 3개의 터미널에 순서대로 각기 다른 전압을 인가하여 회전자와 전자석 사이의 밀고 당기는 힘을 이용하여 회전하였습니다. 그렇다면,“Sensorless BLDC모터의 경우 홀 센서가 없으면, 모터의 회전체의 위치는 어떻게 알고 전압을 순서대로 인가하지? 홀 센서가 없는데 회전체의 위치를 알고 모터에 정확한 신호를 준다? 어떤 방법일까?”하는 의문이 생길 것입니다.
일단 결론부터 얘기하면, 역기전력(BACK EMF)을 이용하는 방법 입니다. BLDC 모터가 회전할 때, 각 권선은 렌츠의 법칙(Lenz’s Law)에 따라서 각 권선은 인가되는 주 전압과 반대의 극성을 갖는 역기전력(BEMF)을 발생시키게 됩니다. 이들 역기전력의 극성은 인가 전압의 방향과 반대가 되며, 주로 3개의 큰 모터 파라미터에 의해 결정됩니다.
·고정자 권선의 턴 수
·회전자의 각 속도
·회전자 자석에 의해 발생되는 자계
(더 많은 내용이 있지만, 간단하게 구동하는 방법만을 소개하므로, 복잡한 내용은 생략하도록 하겠습니다.)
<그림 2-1>은 각각의 U,V,W (이하A,B,C) 에 순서대로 전압을 인가했을 때 발생되는 Back-EMF Zero Crossing의 위치를 나타낸 것입니다. 그렇다면 역기전력은 어떻게 이용하느냐가 문제인데, 보통 Sensorless BLDC 모터를 접하면, 중성점(Neutral Point)이 나와있는 것과 그렇지 않은 것들 두 가지를 접하게 됩니다.
<그림2-2>에 나와있는것 같이 왼쪽의 중성점이 있는 경우와, 오른쪽처럼 중성점이 없는 경우 두 가지의 방법이 있습니다.
왼쪽과 같은 경우에는 중성점을 이용하여, 직접 Back-EMF를 검출할 수 있는 반면, 오른쪽과 같이 중성점이 나와있지 않은 경우, 가상의 중성점을 구성하여 간접적으로 검출하여야 합니다. 그리고 간접적으로 검출한 Back-EMF와 각각의 U,V,W (이하A,B,C) 와의 비교기를 통해 홀센서와 유사한 출력을 얻고, 그 출력에 따라 순서대로 전압을 인가하게 되는 것입니다.
드디어 BLDC모터와 Sensorless BLDC모터에 대해 간단하게 알아본 것 같군요!!
다음장에서는 제가 수행한 방법을 소개하도록 하겠습니다.
3. Sensorless BLDC 모터 구동
1장과 2장을 통해 간략히 BLDC모터와 Sensorless BLDC 모터에 대해 알아보았습니다. 1장과 2장을 통해 제 설명이 잘 전달 되었는지 궁금하군요!!
이제 BLDC 모터를 구동할 시간입니다. 그럼 저와 함께 Sensorless BLDC모터 구동을 해보도록 할까요??
우선 Sensorless BLDC 모터를 구동하기에 앞서 모터를 선정해볼까요?? 필자는 HDD Spindle Sensorless BLDC 모터를 선택하겠습니다. 종종 각 포탈게시판에 하드드라이버를 분해한 뒤 모터 돌리는 동영상을 보고, 한번 해봐야지 했었는데, 드디어 해보게 되는군요!! 모터의 배선을 보니, 4선으로써 3선은 모터의 각 상인 U,V,W(A,B,C) 임에 틀림없고, 나머지 한 선은 중성점일 것입니다. 이 모터의 데이터 시트를 찾아봤지만 인터넷에는 데이터시트가 존재하지 않는군요! 어떤 터미널이 중성점인지 어떻게 알아낼까?
생각끝에 멀티메터로 찍어보았습니다.
각각의 터미널끼리 저항값을 재보니, 한 터미널에서 2.9Ω이 나왔습니다. 만약 중성점일 경우, 각각의 터미널선 가운데 있으므로, 저항성분이 절반 밖에 되지 않을 것입니다. 그러므로 분명 이 녀석이 중성점일 것입니다. 이제 중성점의 위치를 알았으므로, 모터를 구동시킬 모터 구동부가 있어야 할 것입니다. 이 모터를 만능기판에 놓고 테스트해 본 결과, 큰 전류량을 필요로 하는 모터는 아니므로, 간단하게 범용 npn 트랜지스터인 2N2222 을 사용하여 브릿지 회로를 구성하였습니다. 그리고, Back-EMF를 검출하기 위해 LM2904를 사용하여 비교기 회로를 구성하였습니다.
(필자는 메인 MCU로 ATmega8을 사용하였습니다.)
소스코드
우선 Sensorless BLDC모터를 구동하게 되면 각각의 ABC파형은 <그림3-5>와 같이 Zero Crossing과 Back-EMF가 발생되는 floating 구간 사이에 Conducting 구간이 존재할 것입니다.
<그림 3-1,2,3>과 같이 회로는 구성했지만, 막상 Signal을 주려고 하니 막막합니다. Back-EMF 검출용 회로를 구성했는데 어떻게 써야 하나 조사해본 결과 매우 다양한 방법이 있었습니다.
그 중 가장 간단한 가정을 하나 세워 보았습니다.
<그림3-5>와 같이 처음 모터를 돌리기 전에 일정 방향으로 6-Step의 펄스를 순서대로 넣어준다면, Hall Sensor Type의 BLDC 모터 처럼 Back-EMF 검출용 비교기 회로에서 Signal을 발생시킬 것이고 어느 순간 6-Step의 어느 한 스텝과 정확히 일치하는 부분이 있을 것입니다. 그 때부터 6-Step에 맞춰 Signal을 입력한다면, 모터는 제대로 회전할 것입니다.
그럼 테스트 결과를 보도록 할까요?
<그림3-6>은 Back-EMF 검출회로를 통해 발생되는 출력 화면입니다. A,B,C 각각의 Back-EMF는 60°를 간격으로 순차적으로 발생됨을 확인 할 수 있습니다. 그렇다면 이 Signal에 맞춰서 6-Step펄스를 입력해 준다면, 모터는 정상적으로 회전할 것입니다.
<그림3-6>을 살펴보면, A의 High side 입력에 따라 모터 A Terminal에는 <그림3-4> 과 같이Back-EMF와 Zero Crossing이 일어나는 매우 유사한 펄스를 확인할 수 있었습니다.
그림3-6. 3상의 Back-EMF Signal |
그림3-6. 모터의 A terminal과 브릿지 회로의 A high side input |
<그림3-7>을 통해 확인한 결과, A 펄스가 입력될 때, A의 Back-EMF 비교기 출력이 출력됨을 확인 할 수 있었습니다.
그림3-7. 모터의 A terminal,브릿지회로의 A high side input, Back0EMF 검출기의 A-signal |
<그림3-8>은 제가 구동시킨 모터가 잘 돌아가는 사진과, 모터를 돌리기 위해 제작한 간단한 회로의 모터 드라이버입니다. 간단하게 글을 쓰다 보니 생략하고 넘어간 부분이 많은 것 같군요.
그림3-8. 모터의 구동모습(좌), 테스트를 위해 제작한 모터 드라이버(우) |
하지만 독자 여러분들 모두 Sensorless BLDC 모터를 구동할 수 있으리라 믿습니다. 여기까지 왕초보의“Sensorless BLDC 모터를 구동하자”를 읽어주신 모든분께 감사의 인사를 올립니다.
감사합니다.
※참고문헌
·Microchip AN1160 (Sensorless BLDC Control with Back-EMF filtering Using a Majority Function)
-2009 Microchip Technology Inc.
·Direct Back EMF Detection Method for Sensorless Brushless DC(BLDC) Motor Drives
- Jianwen Shao (Virginia Polytechnic Institute and the State University -September, 2003)