'MCU'에 해당되는 글 8건

  1. 2017.03.12 LED 깜박이기
  2. 2017.03.11 Arduino Uno R3의 개요
  3. 2017.03.08 Power Distribution Board란?
  4. 2017.03.07 비행제어기(FC)란?
  5. 2014.06.14 Assembler의 장점
  6. 2014.05.28 아두이노(Arduino) 보드와 PC 통신
  7. 2014.04.20 변수 vs. 메모리
  8. 2014.04.01 BLDC모터란?
Embedded Lecture/Arduino2017. 3. 12. 17:41


Arduino Uno 보드는 LED가 실장되어 있으며 이는 디지털 입출력 핀 13번에 연결되어 있습니다. 이 LED를 깜박이는 예제는 이미 아두이노 IDE에서 제공되고 있으며 '파일|예제'에서 'Blink'를 선택하여 불러올 수 있으며, 다양한 예제들은 여기서 확인할 수 있습니다.



읽어들인 소스 코드인 스케치 파일은 다음과 같습니다.


int led = 13;

void setup() {

    pinMode(led, OUTPUT);

}

void loop() {

    // turn the LED on (HIGH is the voltage level)

    digitalWrite(led, HIGH);

    delay(1000); // wait for a second

    // turn the LED off by making the voltage LOW

    digitalWrite(led, LOW); 

    delay(1000); // wait for a second

}


setup() 함수 내에서 pinMode() 함수는 첫 번째 인자로 핀의 번호를, 두 번째 인자는 입출력 모드를 지정하게 되는데, 입력이면 'INPUT'을 출력이면 'OUTPUT'을 설정하게 됩니다. 그러므로 pinMode(led, OUTPUT)는 13번 핀을 출력으로 사용하겠다는 의미입니다. 참고로 아두이노에서 제공하는 함수의 문법(Syntax)이나 인자(Parameter)에 대한 자세한 설명은 아두이노 홈페이지에서 확인할 수 있습니다.


https://www.arduino.cc/en/Reference/HomePage 


사실 전통적인 표준 라이브러리 AVR libc의 문법으로는 위의 pinMode 함수는 DDRD = 0b01000000; PORTD = 0b01000000; 이들 두 문장을 대체하게 됩니다. 아두이노에서 같은 기능을 하기 위해 고유 서브함수를 호출한 반면, 표준 라이브러리는 단순한 매크로(macro)들의 사용만으로 속도나 실행 크기면에서 우수하다는 것입니다. 하지만 표준 라이브러리는 ATmega328P에 대한 전문적인 지식이 요구되어 초보자에게 결코 쉽지 않다는 것입니다.


특히 속도의 측면에서 빠른 처리나 인터럽트 처리를 요구하는 장치를 동작시키는 경우에는 아두이노는 표준 라이브러리에 비해서 상당한 열쇠에 놓이게 됩니다. AVR 칩이 C 언어를 지원함에도 불구하고 아직도 어셈블러(Assembler)로 개발하는 경우가 있는데, 이것도 같은 이유에서라는 것입니다. 하지만 점차 MCU의 속도는 끊임없이 진화하고 리소스도 풍부해지기 때문에 크게 문제는 되지 않을 것입니다.


loop() 함수내에서 digitalWrite() 함수는 첫 번째 인자로 지정된 핀에, 두 번째 인자로 HIGH 혹은 LOW 값을 쓰는데 사용하는 함수로 digitalWrite(led, HIGH)는 이미 출력으로 지정된 13번 핀에 HIGH 값을 내보냄을 의미합니다. 입출력의 지정없이 이 함수를 사용할 수는 없으며 전원 전압이 5V이면 13번 핀은 5V의 전압이 인가되어 LED를 점등하게 됩니다.


또한 delay() 함수는 입력된 시간만큼 동작을 멈추는 용도로 사용되어 delay(1000)은 1000ms 동안 지연을 줄 목적으로 사용됩니다. 여기서 단위는 ms임을 주목해야 합니다.


결국 loop() 함수 내의 동작은 13번 핀을 점등하고 1s를 기다렸다가 다시 소등하고 1s를 기다리는 코드로, loop() 함수는 영원히 반복하게 되므로 끊임 없이 LED를 1초 간격으로 점등과 소등을 반복하게 됩니다,



'Embedded Lecture > Arduino' 카테고리의 다른 글

인터럽트와 volatile 지시자  (1) 2017.03.18
아두이노의 TWI(I2C) 통신  (0) 2017.03.18
아두이노의 시리얼 통신  (0) 2017.03.18
인터럽트의 처리(1)  (0) 2017.03.12
아두이노(Arduino) 코딩의 시작  (0) 2017.03.12
Posted by Nature & Life


Arduino Uno R3는 가장 널리 사용되는 입문용 기본 보드로 R3는 세번째 버젼을 의미합니다. 이 보드는 8-bit 마이크로 콘트롤러인 ATmega328P을 탑재하며 PC와 USB로 연결할 수 있어 프로그램 다운로드 및 시리얼 통신에 가능합니다. 그 밖에도 ATmega16U2의 또 다른 마이크로 콘트롤러를 내장하는데, 이는 기존 보드들에서 사용하던 FTDI FT232R USB-to-Serial 드라이버 칩을 대체하기 위한 것으로 USB-to-Serial 변환 프로그램이 들어 있습니다. ATmega328P는 1KB의 부트로터(Bootloader)용을 포함한 32KB의 Flash 메모리와 2KB의 SRAM, 1KB의 EEPROM을 갖고 있으며, 클럭 속도(Clock speed)는 16MHz입니다.


5V로 동작하는 이 Uno 보드의 전원공급은 두 가지 방법이 있는데, 첫번째는 USB로부터 제공되는 5V를 그대로 사용할 수 있으며, 두번째로는 7~12V의 AC 어댑터를 잭에 꼽아 외부에서 공급하는 방법인데 이는 Uno 보드가 내부적으로 5V를 정류하는 레귤레이터(Regulator)를 내장하고 있기 때문이며 위의 두 가지 전원이 모두 연결되어 있다면 외부 전원이 우선이 됩니다.



디지털 입출력 핀 14개 (0번~13번)

디지털 입출력 핀들을 이용해서 외부의 이진 신호를 읽어들어나 또는 이진 신호를 내보낼 수 있다. 디지털 입출력으로 사용되면서 또한 다른 기능을 가지는 핀들이 있는데, 이 기능들은 한 핀으로 두가지를 다 사용할 수는 없으며 다른 기능은 다음과 같습니다.

    • 0번~1번: 시리얼 통신에 사용되어 USB로 PC와 통신을 할 수 있습니다.

    • 2번~3번: 인터럽트(interrupt) 기능을 갖습니다.

    • 3, 5, 6, 9, 10, 11번 핀은 PWM 기능을 가지며 아날로그 출력을 흉내낼 수 있다.


아날로그 입력 핀 6개 (A0~A5)

외부의 아날로그 입력값을 읽어들여 ATmega328P칩 내부의 ADC(Analog to Digital Converter)를 이용하여 0~1023 사이의 숫자로 변환합니다. 이때 필요한 기준 전압은 5V 이지만 1.1V의 내부 전압이 사용될 수 있으며 AREF핀으로 기준 전압을 직접 인가할 수도 있습니다. 그리고 아날로그 핀은 디지털 입출력 핀으로도 사용할 수 있습니다.


아날로그 출력핀 6개 (3,5,6,9,10,11번 핀)

아날로그 출력핀은 0~5V사이의 전압 값(256레벨)을 가질 수 있으며 이는 PWM(Pulse Width Modulation) 방식으로 동작하므로 흉내를 내는 것입니다.


인터럽트 (2, 3번 핀)

2번과 3번 핀에 가해진 외부 이벤트를 감지하여 사용자가 원하는 방향으로 이를 처리하기 위한 기능으로 이를 인터럽트 처리(interrupt handling)라 부르는데, 즉 이 핀들에 변화가 있는면 하드웨어는 즉각적으로 알리고 이때 사용자가 원하는 정해진 동작을 코딩하여 사용합니다.



ICSP for ATmega328 : 기존의 ATmega328P에 ICSP(In Circuit Serial Programming)를 위한 SPI 통신용 6핀 포트입니다. ICSP는 전통적으로 마이크로 컨트롤러에 직접 펌웨어를 프로그래밍하기 위해 마련된 것입니다.


ICSP for USB interface : 기존의 ATmega16U2에 ICSP(In Circuit Serial Programming)를 위한 SPI 통신용 6핀 포트입니다. 


TWI(I2C) 통신 : A0, A1 핀




Posted by Nature & Life
Radio Control/etc2017. 3. 8. 16:36


드론에서 비행제어기(FC)와 각 암(arm)의 끝에 위치하는 모터들은 ESC(Electronic Speed Controller)를 통해서 LiPo 밧데리로부터 전원이 공급됩니다. 수신기(Rx)와 각종 센서들은 대부분 비행제어기에서 공급되는 구조를 갖습니다. 모터에 공급되는 전원은 밧데리로부터 곧바로 공급되는데 이는 하나의 모터가 수십 암페어의 전류를 소비하므로 밧데리의 셀(cell)이 증가할수록 유리하다는 것입니다.


하지만 MCU와 각종 센서들을 포함하는 비행제어기는 5V의 안정된 전원이 요구되므로 일종의 전압 레귤레이터(regulator)인 UBEC(Universal Battery Elimination Circuit)를 이용하여 밧데리로부터 정류하여 전원을 공급받게 됩니다. 사실상 대부분의 전력은 양력을 얻기 위한 모터에 의해 소비되고, 수십 암페어의 전류를 소모하기에 IR 드롭이 불가피하여, 비록 드론의 중심에 밧데리를 위치하더라도 미세한 차이는 각 암의 모터의 인가전압 차이로 나타나 기체의 안정성을 해치게 됩니다. 이를 고려하여 안정적으로 전력을 각 암에 동일하게 공급하고 저항을 최소화한 전력 재분배를 위한 보드의 기하학적 설계가 요구된다는 것입니다. 이러한 보드를 Power Distribution Board(전력 분배 보드)라 일컫습니다.



기존의 모형 헬기에서는 ESC에서 제공하는 BEC(Battery Elimination Circuit)를 그대로 사용하였지만, 멀티로터(multi-rotor)는 다수의 ESC가 존재하기 때문에 보다 안정된 ESC의 선택에 의미가 없고, 다양한 센서들과 카메라, 텔레메트리(telemetry) 등 다양한 장치들의 추가로 ESC에서 자체적으로 제공하는 BEC의 용량이 한계에 부딪쳤고, ESC의 특성상 비행제어기가 간섭에 자유롭지 못하고 동작 온도의 상승으로 양질의 전원이 되지 못한다는 것입니다.


뿐만아니라 어느 순간에 모터의 추력을 최대화하면 IR 드롭 등의 이유로 UBEC 전원에 순간적인 전압강하로 이어지고, 이는 비행제어기 내에 민감한 센서들이나 MCU에 오류를 일의킬 수도 있다는 것입니다. 따라서 이러한 전기적 간섭의 문제는, 센서 모듈간에 혹은 센서 모듈과 비행제어기, 모터나 ESC와 비행제어기 등 서로간의 EMI 현상과 함께, 향후 추가되는 센서들이나 각종 장치로 인해 Power Distribution Board의 중요성의 증가하고 있다는 것입니다.



 


'Radio Control > etc' 카테고리의 다른 글

입문자를 위한 F450 기체 바디  (0) 2015.04.30
Posted by Nature & Life


과거 모형 헬기와 같은 전통적 RC는 메인 로터가 양력을 얻어 부양하고 메인 로터가 회전할 때 회전각에 따른 로터의 피치를 조절하여 헬기가 원하는 방향으로 나아가는데, 메인 로터로 인한 헬기 동체의 반동 토크를 상쇄시킬 목적으로 테일 로터도 함께 회전시키게 됩니다(안정성을 강조한 동축반전 헬기는 제외). 이때 헬기 동체가 정숙하게 방향성을 유지하고 호버링하거나 이동하기 위해서는 자이로(gyroscope) 센서의 도움을 받아 실시간 보상하였는데, 이것이 사실 비행 자동화의 전부였으며 나머지는 오직 조종자의 오랜 비행 경험을 토대로 한 자동 반사적인 키감에 의존하여 매우 역동적인 스포츠를 즐기게 되었습니다.


반면에 드론은 쿼드콥터를 예를 들어, 4개의 프로펠러로 양력을 얻고 원하는 방향으로 나아가기 위해서는 개별 로터의 회전속도를 정교히 제어해야 하는데 이는 컴퓨터의 도움없이는 거의 불가능하다는 것입니다. 이러한 이유로 드론의 비행제어기(FC; Flight Controller)는 사람의 심장과도 유사하여 수신모듈로 부터 수신된 명령 신호를 처리하여 각 암(ARM)의 모터를 제어하고, 게다가 가속도계/자이로 센서를 포함하는 관성측정장치(IMU), 바로미터, 컴파스/지자계 등의 센서 데이터를 기반으로 안정적인 비행이 가능하도록 한다는 것입니다.


최근에는 GPS 센서를 탑재하여 GPS 데이터에 기반하여 사전에 입력된 경유지(waypoint)를 순차적으로 운항하거나 RTL(Return to Launch)라는 자동 회귀 기능 등의 탑재로 조종자의 명령이나 각종 기체 이상 등을 감지하여 이륙 장소로 스스로 귀환시키거나, 영상 및 소리 센서들을 활용한 충돌회피 등등 다양한 기능들이 추가되면서 FC는 날로 매우 빠른 연산을 수행하는 MCU가 필요한 추세라는 것입니다.


이를 증명하듯 수 년전에는 오픈 소스에 기반한 APM(AutoPilot Mega) 보드나 multiwii 보드는 8bit 16MHz의 ATmega328이나 ATmega2560의 MCU가 사용되었는데, 그 후로 AruPilot의 PixHawk(3DR)은 훨씬 강력한 32bit 168MHz의 STMicro사의 ARM Cortex M4를 사용하게 되었습니다. 현재의 오픈 소스의 드론 플랫폼으로 가장 인기있는 PX4는 64bit quad-core 2.26GHz의 퀄컴사 SOC(System on Chip) 기반 스냅드래곤 SOC(System on Chip)을 채용하고 있는 실정입니다.



사실 드론이 안정적인 비행으로 대중화를 선언한 그 이면에는 고성능의 MCU 채용만큼이나 FC에서 중요한 것은 센서 기술의 진화에 있다고 해도 지나치지 않다라는 것입니다. 각종 센서들로부터 드론은 비행 속도/각도, 좌표, 위치 데이타 등을 실시간으로 MCU에 제공하여 상당히 안정적인 비행을 가능하게 하지만, 최근에는 저고도에서의 정확한 고도 유지와 포지션홀드 기능을 위해 초음파센서, 옵티컬플루우(Optical Flow) 센서 등이 사용되고 있으며, 또한 충돌회피를 위해 카메라 센서 기반한 SLAM(SImultaneous Localization and Mapping)등의 알고리즘들이 활발히 연구되고 있다는 것입니다.



Posted by Nature & Life



과거에는 PC DOS 응용프로그램 개발시 어떻게 메모리를 효율적으로 관리하느냐가 관건이었던 적이 있습니다. 당시에는 메모리 집적기술의 한계로 PC에 1Mbyte를 설치하였다면 큰 자랑꺼리였으며 가격도 비쌌던 시절였습니다. 그러므로 응용프로그램은 DOS가 사용하는 영역의 나머지인 상위메모리를 사용하곤 하였습니다.


하지만 근래에는 메모리가 부족하여 응용프로그램을 실행하지 못하는 경우는 거의 없습니다. CPU의 속도와 메모리 용량 그리고 대용량 하드디스크의 발전은 더이상 가독성이 떨어지는 낮은 수준(low level)의 언어 사용은 물론 엄격한 메모리 관리의 부담을 덜어주게 되었습니다.


그러므로 언제부턴가 어셈블러(ASM)나 C-언어가 아닌 사용자에 즉, 사람에게 친숙한 높은 수준(high level)의 언어인 비쥬얼베이직(Visual Basic), C++ 언어 등이 대세가 되었습니다. 그럼에도 불구하고 AVR이나 PIC계열의 마이크로콘트롤러(MCU)에서는 여전히 낮은 수준의 프로그램 언어를 사용하고 있습니다.


MCU의 속도나 메모리 용량 등과 같은 성능의 발전과 avr-gcc와 같은 컴파일러의 지속적인 향상에 힘입어 요즈음은 어셈블러보다는 C-언어를 선호하게 된 것도 사실입니다. C-언어로 작성해 굳이 오버헤드(overhead)가 있을지라도 속도와 메모리 같은 개선된 MCU 성능으로 적용하는데 크게 문제가 되지 않은다는 것입니다.


하지만 아직도 상업적인 용도의 AVR 펌웨어(firmware)는 여전히 어셈블러를 사용하고 있습니다. 고성능의 MCU를 사용하여 단가를 높이기 보다는 합리적인 성능의 자원에 펌웨어를 어셈블러로 정교하게 작성하고 최적화하여 시장 경쟁력을 얻는다는 것입니다.





그러므로 어셈블러는 적어도 한번은 다루어봐야 하는 언어로 C-언어와 비교하여 다음과 같은 장점을 갖습니다.


1) 새로운 언어를 배운다는 스트레스는 문법을 익혀야 한다는 부담일 것입니다. 하지만 어셈블러는 문법이 C-언어에 비해서 매우 간단하다는 것입니다. 어셈블러는 원하는 코드 구현 자체가 까다로운 것이지 문법을 처음 익히기는 매우 쉽다는 것입니다. 


구현이 까다롭다는 것은 하드웨어에 대해 일일이 알아야 한다는 것과 아마도 120여개에 이르는 다양한 AVR 명령어가 존재하기 때문일 것입니다. 그러나 다양한 명령어는 기능이 유사한 소위 파생된 명령어로 인하여 용도별로 분류하면 사실상 몇 종류가 되지 않으며, 필요시 그때 그때 가져다 사용하면 됩니다.


2) 어셈블러를 다루면 특히 메모리 영역과 같은 하드웨어를 자세하게 익힐 수 있으며 이러한 지식은 향후 C-언어로 구현시 최적화된 코드를 생성할 수 있는 기회를 제공한다는 것입니다.


기존의 C-언어에서는 하드웨어를 자세히 다룰 필요는 없었습니다. 왜냐하면 사용코자 하는 AVR를 지정하면 컴파일러가 알아서 해주기 때문입니다. 메모리가 부족하면 컴파일러는 이를 사용자에게 일러주고 사용자는 불필요한 변수를 삭제해주면 되었기 때문입니다.


3) 정밀한 타이밍을 요구하는 펌웨어를 작성할 수 있습니다. 


어셈블러 명령어는 1~2 사이클의 클럭을 필요로 하며 사용자는 이를 직접 보면서 다루기 때문입니다. 하지만 C-언어를 사용할 때는 해당코드가 컴파일 후에 얼마의 클럭을 요구하는지 알 수가 없고, 알아낸다 하더라도 1us 정도의 정밀한 타이밍은 사실상 불가능하다는 것입니다. 예를 들어, 브러쉬리스(brushless) 모터를 제어시에 C-언어로 작성된 펌웨어는 고속 회전 영역에서 제어 불능상태가 될 수 있다는 것입니다.







'Embedded Programming > Assembler' 카테고리의 다른 글

Assembly어의 문장 형식  (6) 2014.06.26
식별자와 상수  (0) 2014.06.16
Posted by Nature & Life



근래에 PC와 랩톱, Portable 장치들에서는 RS232C 포트가 사라진지 오래되었습니다. 기존의 RS232C 포트는 기구적으로 소형화에 걸림돌이기도 하며, 넓은 대역폭으로 빠른 전송 속도와 Plug & Play 등의 장점을 앞세운 USB 포트로 대체되었습니다.


하지만 아직도 AVR을 비롯한 많은 MCU들은 여전히 기존 시리얼 통신 방법을 채택하고 있습니다. 한편 이런 MCU와 PC간의 interactive 제어나 수행 결과를 모니터하기 위해서는 USB 통신을 지원하는 범용 툴을 사용하거나 사용자가 Win32 Application을 직접 제작하여야 한다는 것입니다.


이렇듯 사용자는 PC의 USB 포트로 통신하는 Win32 Application을 기존의 시리얼(RS232C) 통신 프로그램과 마찬가지로 ReadFile(), WriteFile() 혹은 DeviceIoControl() 함수를 이용하여 구현하게 됩니다. 그런데 USB 통신에서는 물리적인 장치에 접근하기 위해서 드라이버(예를 들어, *.sys)가 필요하게 되는데, 좀더 구체적으로 MS Windows 환경하에서는 Windows가 장치에 접근하기 위해서 Windows Driver Model(WDM) 드라이버가 필요하다는 것입니다.


USB 드라이버는 어떻게 해야 할지요?


가장 좋은 방법은 사용자가 직접 자신이 사용할 드라이버를 드라이버 제작 툴(예를 들어, Jungo社의 WinDriver)을 이용하여 만드는 것입니다. 하지만 그리 쉬운 작업이 아니므로 두 번째 방법인 USB 드라이버 칩 제조사가 제공하는 드라이버를 가져다 사용하는 것입니다. 예를 들어, CypressFTDI Chip의 칩셋을 사용하는 경우 각 에서 제공하는 드라이버를 무료로 사용할 수 있습니다.





이러한 드라이버는 범용이기에 필요없는 오버헤드로 인해 다소 느릴 수는 있지만, 대부분의 USB 통신에서 만족할만한 결과를 얻을 수 있을 것입니다. 그러나 최신 아두이노(Arduino) 보드에서는 위와 같은 칩셋을 사용하지 않고 ATmega16U2를 사용하니 세 번째 방법인 직접 드라이버를 일일이 제작해야 합니다.


하지만 다행이도 아두이노는 다음과 같이 설명합니다.

http://arduino.cc/en/Main/arduinoBoardUno


The Uno differs from all preceding boards in that it does not use the FTDI USB-to-serial driver chip. Instead, it features the Atmega16U2 (Atmega8U2 up to version R2) programmed as a USB-to-serial converter.

우노는 FTDI USB-to-serial 드라이버 칩을 사용했던 모든 이전 보드와 다름니다. 대신에 USB-to-serial 컨버터로써 프로그램된 Atmega16U2를 사용합니다.


The '16U2 firmware uses the standard USB COM drivers, and no external driver is needed. However, on Windows, a .inf file is required. The Arduino software includes a serial monitor which allows simple textual data to be sent to and from the Arduino board. The RX and TX LEDs on the board will flash when data is being transmitted via the USB-to-serial chip and USB connection to the computer (but not for serial communication on pins 0 and 1).

'16U2 펌웨어는 표준 USB COM 드라이버를 사용합니다. 그리고 어떤 외부의 드라이버도 필요하지 않습니다. 그러나 Windows 상에서 *.inf 파일이 요구됩니다. 아두이노 소프트웨어는 간단한 텍스트 기반의 데이터를 아두이노 보드로 송수신하기 위한 시리얼 모니터(serial monitor)를 포함합니다. 보드상에 RX와 TX LED들은 컴퓨터의 USB와 USB-to-serial 칩을 경유하여 데이터가 전송될 때 반짝일 것입니다(pin 0 그리고 pin 1 상에 시리얼 통신을 위한 것이 아닙니다).


A SoftwareSerial library allows for serial communication on any of the Uno's digital pins.

SoftwareSerial 라이브러리는 우노의 디지털 pin들이 시리얼 통신을 가능하게 합니다.


The ATmega328 also supports I2C (TWI) and SPI communication. The Arduino software includes a Wire library to simplify use of the I2C bus; see the documentation for details. For SPI communication, use the SPI library.

ATmega328은 또한 I2C(TWI)와 SPI 통신을 지원합니다. 아두이노 소프트웨어는 I2C 버스의 사용을 간단화하기 위한 Wire 라이브러리를 포함합니다. 자세한 사항은 문서를 확인하세요. SPI 통신에 대해서는 SPI 라이브러리를 사용하세요.


그러므로 아두이노 보드는 별도의 USB 드라이버를 사용하지 않고 표준 USB COM 드라이버를 사용하므로 기존의 RS232C 통신과 동일한 Win32 함수로 데이터를 송수신하는 사용자 전용 통신 프로그램을 제작할 수 있습니다. 간단히 모니터를 위한 것이라면 아두이노 IDE 환경에서 제공하는 '시리얼 모니터'로도 충분하리라 생각됩니다.







Posted by Nature & Life
Embedded Programming/AVR 2014. 4. 20. 21:51



1) 전역변수(Global variable)


SRAM에 저장되어 있다가 이를 사용할 때마다 register로 읽혀지며 사용이 끝나면 다시 SRAM에 저장되므로 처리속도가 늦은 변수로, 특별히 속성을 정하지 않고 변수를 정의하면 SRAM 영역에 저장됩니다. 게다가 Compiler는 이를 변수로 처리하지 않고 그 상황에서 이 변수가 갖는 값에 해당하는 상수로 처리하는 경우가 있는데 이런 상황에서 여러 함수가 이 변수를 공유하여 사용하는데 문제를 야기하고 컴파일 시 최적화 옵션에 따라서도 영향을 받게 됩니다.


특히 인터럽트 서비스 루틴(Interrupt Serve Routine, ISR) 함수와 그 밖의 함수 사이에 공유하는 전역변수의 경우에 흔하게 발생하며 이를 방지하기 위해서는 전역변수에 'volatile'을 선언해 주어야 합니다.

ex) volatile unsigned char zc_count;


2) 지역변수(Local variable)


ATmega8의 경우, 다른 MCU에서처럼 지역변수를 Stack에 저장하는 것이 아닌 32개의 General Purpose Registers(GPFs)로 처리하므로 항상 처리속도가 빠릅니다. 하지만 ISR에 사용되는 변수는 특성상 Stack에 저장합니다.


3) 정적변수(static variable) 


함수가 시작될 때 register로 옮겨지고 함수가 종료될 때 SRAM으로 다시 옮겨져 저장되므로 만일 함수 내에서 여러 번 사용된다면 전역변수보다 정적변수가 처리속도가 증가하게 됩니다.





4) Flash Memory에 데이터의 저장


물론 메모리 용량이 크고 고성능의 MCU를 사용하면 문제가 되지는 않지만 가격대 성능비 등을 고려하여 그렇지 못한 경우, 변수로 사용해야 할 SRAM 용량을 절약할 필요가 있습니다. 만일 SRAM 용량이 부족하게 되면 Stack overflow가 발생하거나 프로그램이 오동작을 할 수 있습니다.


avr-gcc에서 상수 데이터를 프로그램이 적재되는 Flash Memory에 저장하기 위해서는 먼저 상수 데이터를 전역변수처럼 함수의 밖에서 정의하고 이때 상수가 byte 데이터라면 prog_char 또는 prog_uchar로 선언하며 읽을 때문 pgm_read_byte() 또는 pgm_read_word() 함수를 사용합니다.


참고로 비록 상수 데이터를 prog_char 또는 prog_uchar로 정의하더라도 이들이 함수 내에서 정의되면 컴파일 시 SRAM 변수로 처리되므로 주의가 요구되며, 일반적으로 Flash Memory는 SRAM에 비하여 용량이 훨씬 크므로 유용하게 사용할 수 있습니다.


5) EEPROM에 데이터의 저장


AVR에서 EEPROM을 I/O register를 사용하여야 접근할 수 있으므로 avr-gcc 에서는 EEPROM을 eeprom_read_byte() 혹은 eeprom_write_byte() 함수로 각각 읽기, 쓰기가 가능합니다.



'Embedded Programming > AVR ' 카테고리의 다른 글

다양한 AVR Package 비교  (0) 2014.06.14
AVR의 메모리 구조  (3) 2014.04.20
AVR이란?  (0) 2014.03.11
부트로더란?  (0) 2012.12.10
Posted by Nature & Life

 

 

모터(motor)란 전기에너지를 이용하여 회전 토크(torque)를 얻는 장치로, RC에서는 로터(rotor)를 회전시켜 양력을 얻기 위해 반드시 필요합니다. 과거에는 DC 모터를 이용하였지만 최근에는 비용을 최소화하기 위한 초소형 기체를 제외하고는 Brushless DC 모터를 채택하게 된다고 알려집니다.

 

Brushless DC 모터란 Brush가 없는 DC 모터로 이하 BLDC로 약칭합니다. BLDC가 대중화된 이유는 여러가지가 있을 것입니다. 아래는 일반적인 DC 모터의 내부 모습니다. 케이스 안쪽에 영구자석을 부착하고 철심(core)에 코일(coil)을 감은 회전자(rotator)를 서로 베어링을 이용해 고정하고 Brush를 이용하여 DC 전압을 회전자에 급전하면 플레밍의 왼손 법칙에 의해 회전하게 됩니다.

 

 

 

 

이때 Brush는 기계적인 기구로 회전자에 의해 접점이 마찰되면서 닳을 수 밖에 구조이며, 회전시 모터의 역기전력(Back Ekectro-motive Force, BEMF)과 합세하여 스파크를 발생시키고 어쿠스틱 소음(acoustic noise)을 만들게 됩니다. 이러한 스파크와 소음은 결국 밧데리의 소모를 부추기게 됩니다.

 

BLDC 모터를 사용하면 우선 Brush로 인한 스파크와 소음이 없어져 반영구적인 모터의 수명 뿐만아니라 밧데리의 효율을 증가시켜 RC 기체의 체공시간을 길게 만들어 줍니다. 또한 일반 DC 모터의 소음은 콘덴서를 모터의 양 단자에 연결하여 줄일 수는 있지만, MCU 기반에 정교하게 동작하는 비행제어기(Flight controller)나 전자변속기(Electronic Speed Controller, ESC)의 오동작을 초래할 수도 있다는 것입니다.

 

기존의 RC 기체는 동력원으로 엔진을 사용하였지만 근래에 밧데리 용량과 방전 특성 그리고 안전성이 크게 개선된데다가 BLDC 모터의 채용으로 중소형 기체에서는 엔진에서 모터로 옮겨가는 추세라는 것입니다. 이로 인하여 엔진을 사용시 연료나 그으름으로 누더기 되었던 기체의 관리가 쉬워졌고 소음이 줄어들어 정숙비행이 가능해졌다는 것입니다.

 

Brush를 사용한 DC 모터와는 달리, BLDC 모터는 철심에 코일이 감긴 고정자(stator)와 안쪽에 자석이 부착된 케이스로 구성되어 케이스가 회전하는 소위 '통돌이 모터'라고도 부릅니다. 하지만 기계적 기구인 Brush가 하던 일을 다른 방식으로 해주어야 하니 전자변속기라는 별도의 제어기가 필요하게 됩니다.

 

 

 

 

RC용 전자변속기는 대부분 마이크로컨트롤러(MCU)와 H-bridge를 구성하는 트랜지스터들과 그 주변회로 구성되며, 현재 회전자의 위치를 파악하여 다음 위치로 회전시키기 위한 구동 신호를 가하는 방식으로 동작합니다.

 

일반적으로 산업용으로 사용되는 BLDC 모터는 엔코더(encoder)라는 장치나 홀센서(Hall sensor)가 모터에 부착되어 회전자의 현재 위치를 알려주는데 RC에 사용되는 BLDC 모터는 이러한 장치가 없어 전자변속기를 더욱 복잡하게 만듭니다. 하지만 고성능 MCU의 출현으로 어렵지 않게 구현이 가능해졌는데 이러한 기술 또한 엔진을 전기모터로 대체하는 요인 중에 하나가 될 것입니다.

 

통상 홀센서를 가지는 BLDC 모터는 전력을 공급받는 3상의 리드선과 별도의 홀센서 리드선이 다수가 필요하여 신뢰성이 중요한 RC 기체에서는 꺼리게 되었지만, 그 보다도 RC 기체가 비행하는 외부조건이 다양한데 홀센서는 이러한 외부조건에 취약하고 [기계적] 엔코더 타입의 모터는 소형화와 경량화가 어렵다는 것입니다.

 

 

'Flight Controller 이해 > 모터제어이론' 카테고리의 다른 글

모터의 토크 발생원리  (2) 2015.12.12
BLDC와 PMSM의 구조  (0) 2015.12.12
BLDC와 PMSM의 토크  (0) 2015.12.10
BLDC vs. PMSM  (0) 2015.12.09
BLDC의 장단점  (0) 2014.04.03
Posted by Nature & Life