임베디드 기초 강좌 5 부록 - 여러종류의 clock source

임베디드 기초 강좌 5 부록 - 여러종류의 clock source

 

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]

 

안녕하세요. 고명호 입니다 

 

 

글의 내용은 http://blog.naver.com/jimypage 에서도 확인하실수 있습니다.

 

 

지난번에는 임베디드 MPU를 다루는데 있어서 심장부가 되는 클럭에 대해서 알아보았습니다.

 

이번에는 임베디드 기기에서 클럭 소스로 사용될 수 있는 회로나 부품은 어떤것이 

 

있는지 알아보고 각각의 장단점을 살펴 보도록 하겠습니다.

 

될수있으면 고 정밀도의 고성능 부품을 사용하면 좋겠으나 각각 비용과 효율성 측면이 있으므로

 

여러가지를 다 알고 있다면 선택에 도움이 되리라 생각해서 글을 써 보았습니다.

 

 

 

 

클럭소스는 임베디드 보드에서의 프로그램이 일정한 시간으로 수행되는데 

 

필요한 클럭을 제공하는 발진 회로를 의미합니다.

 

CPU, MPU가 등장하면서 프로그램을 순차적으로 수행하는데 클럭은 필수적인 요소가 되었지만

 

임베디드 프로그래밍 또는 컴퓨터의 사용전에도 발진회로는 많은곳에서 쓰였습니다.

 

그중 대표적인것이 라디오 전파의 송 수신용도였습니다. 반송파를 만드는데 발진회로가 필요하기 

 

때문이었습니다.

 

 

 

 

최초의 발진소자는 수동소자의 성질에 의해서 발명이 되었습니다.

 

저항, 커패시터, 인덕터등의 수동소자들중 저항을 제외한 두 소자는 

 

각각 전압의 변화에 대해서 저항이 커지는 성질과 저항이 작아지는 성질을 가지고 

 

있습니다. 이러한 커패시터와 인덕터를 병렬로 배치한 후 전원이 차단되면 커패시터에서 

 

충전된 전하는 인덕터를 거치면서 자기장을 형성하여 유도 기전력을 만들고 

 

커패시터의 방전이 이루어진 경우 유도 기전력은 다시 커패시터를 충전시키는 현상을 

 

반복함으로써 발진을 하게 됩니다.

 

https://en.wikipedia.org/wiki/LC_circuit

 

 

 



 

 

이러한 현상을 이용하여 몇몇 발진기들이 발명되었는데 수동소자의 경우 에너지의 소모를 

 

보충할 방법이 없기 때문에 중간에 능동소자인 트랜지스터를 추가하여 계속적으로 발진하는

 

발진기를 만들 수 있었습니다. 

 

콜피츠 발진기, 클랩 발진기, 하틀리 발진기 등이 이러한 종류의 발진기에 속합니다.

 

 

 

 

 

 

 

 

http://www.wizmac.com/2015/lecture/board01_view.htm?No=4&Sub_No=8

 

(위의 사이트에서 그림을 가져왔습니다)

 

 

또한 멀티 바이브레이터 회로를 이용하여 발진을 시킬수도 있습니다.  이것은

 

두개의 트랜지스터가 각각 성질이 다르다는 점에 착안하여 각각의 트랜지스터가 

 

점멸을 반복하여 발진을 하게 됩니다.

 

 

 

 

 

 

 

http://efxkits.com/blog/multivibrators-types-and-thier-working/

 

 

그렇지만 수동소자를 사용하는 위의 발진기들의 경우에는 수동소자의 성질이나 온도등의 

 

변화에 민감해서 그 정밀도가 매우 떨어지는 단점이 있었습니다.

 

초기의 발진기는 라디오등의 방송에 사용되었는데 라디오 방송의 반송파의 주파수가 

 

정확하지 않아서 반송파의 정확한 발진 주기를 만드는 것이 큰 문제가 되었습니다.

 

그래서 이것을 튜닝해 주는것이 큰 문제였다고 합니다.

 

 

현대의 발진기가 발명된것은 1880년 압전현상의 발견으로 거슬러 올라갑니다. 

 

 

 

 

 

 

(압전 현상 - 출처 위키피디아)

 

 

 

 

압전 현상이란 물질에 물리적인 에너지가 가해지면 분극이 일어나는 현상으로 

 

물질에 전기에너지가 가해지면 물리적인 변형이 가해지며 이것이 되돌아가는 과정에서 공진

 

현상을 일으킬 수 있는데 수정(crystal)이 대표적인 물질입니다. 

 

https://en.wikipedia.org/wiki/Crystal_oscillator

 

수정 발진자의 경우 위에서 설명한 LC 공진기나 멀티바이브레이터 등과는 달리 온도나 주위환경과는 

 

무관하게 고유한 진동을 일으키며 이 진동의 진동수는 전적으로 수정편의 두께나 결정방향에 

 

의존합니다.  따라서 정밀한 클럭소스로 사용할수 있습니다.

 

 

 

 

 

시계에 사용되는 수정 발진자 

 

 

 

 

 

 

 

시골집이나 옛날 드라마에서 나오는 '괘종시계'는 태엽에 감긴 에너지를 진자의 움직임으로 

 

바꾸어 이것을 이용해서 시간을 표시하는 시계입니다. 

 

 

단지 진자의 기계적인 움직임으로 시간을 측정하는 장치였기 때문에 오차가 많다는 것은 

 

당연한 것이었습니다. 

 

 

그렇지만 수정 발진자가 상용화 되면서 이러한 괘종시계보다 정밀도가 우수한 '쿼츠 시계'가 

 

널리 사용되게 되었습니다. 

 

 

'쿼츠 시계'란 수정발진자를 이용해서 정확한 시간을 표시한 아날로그 시계를 의미합니다.

 

 

 
 

 

이러한 수정 발진기의 상업적인 이용은 1910년 후반부터 이루어 졌습니다.

 

최초의 수정발진자는 천연 수정을 얇게 잘라내어서 사용하였으나 

 

정확한 주파수를 생성하기 위해서 인공적으로 순수한 수정을 결정화 하는 기술이 발명되어서

 

오늘날의 수정 발진기는 전부 인공적인 수정으로 만들어 지고 있습니다.

 

 

 

 

 

 

 

(수정 발진자 그림)

 

 

따라서 주위환경의 변화에 무관하게 대단히 고 정밀도의 클럭을 얻을 수 있게 된것입니다.

 

그렇지만 수정 발진자에도 단점이 있는데 수정편을 무한정 얇게 만들수는 없으므로 

 

현재의 기술로는 50Mhz 정도까지가 발진 한계로 인식되고 있습니다.

 

수정발진자가 진짜 수정이 맞을까요?? 

 

뜯어보면..  

 

 

 

진짜로 수정 판이 들어 있네요.. ㅎㅎ

 

 

 

 

 

 

(수정발진자의 내부)

 

 

 

 

압전현상을 이용하는 또다른 발진기로는 세라믹 발진기 (ceramic resonator)가 있습니다.

 

세라믹의 경우에도 압전현상으로 발진을 일으키지만 수정 발진기보다는 좀 덜 정확합니다.

 

그러나 가격이 저렴하다는 장점이 있습니다.

 

 

 

 

 

 

(세라믹 레조네이터)

 

 

발진기의 발진을 일으키기 위해서는 계속적인 전기 자극이 필요합니다. 이러한 전기 자극을 

 

주기 위해서는 수정발진자 주위에 회로가 필요한데 이러한 회로를 하나로 패키지화하여 

 

모아 놓은것을 오실레이터라고 합니니다. 

 

 

 

(오실레이터 그림)

 

 

 

오실레이터는 주변 회로가 간단해지고, 정확하다는 장점이 있어 전자회로의 클럭소스로 

 

많이 쓰입니다.

 

 

 

우리가 임베디드에 사용하는 클럭의 경우에도 위의 여러가지 발진 회로를 사용할 수 있습니다.

 

대개는 수정 발진자를 사용하나 그밖에도 목적에 맞는 다양한 구성으로 클럭을 

 

생성할 수 있도록 하고 있습니다.

 

단지 클럭 입력핀의 양단에 각각 수정발진자나 기타 클럭원과 연결만 하면 

 

MPU 안에 내장되어 있는 나머지 부품과 함께 발진을 하기 때문에   

 

간단하게 클럭을 구성할 수 있습니다. 

 

 

 

AVR의 클럭 설정부분을 참고하면, 몇가지 종류의 클럭소스를 선택 할 수 있습니다.

 

(단 각각의 클럭 소스나 주파수에 따라서 사용되는 수동 소자가 다르기 때문에 

 

MPU의 퓨즈 비트에는 어떤 클럭소스가 사용되었는지 설정하는 비트가 존재 합니다.

 

주의 !! 퓨즈비트의 값을 잘못 설정하면 MPU는 작동을 하지 않습니다.)


클럭소스의 결정은 클럭이 발생하기 이전에 결정되어야 하는 것이기 때문에 

 

MPU 내부의 프로그램으로는 이것을 설정할 수 없고, 퓨즈비트라는 설정용 비트에 그 

 

종류가 설정되어 클럭의 소스로 사용됩니다.

 

http://www.electroschematics.com/9481/avr-clock-source-fuse-bits/

 

 

 

 

 

 

(AVR MPU의 다양한 클럭소스)


 

마찬가지로 AVR 이외의 다른종류의 임베디드 MPU의 경우에도 위에서 설명한 발진기들을 

 

포함한 다양한 클럭소스로부터 클럭을 생성해 낼수 있습니다. 

 

MPU 내부에 클럭 발진에 사용되는 회로를 

 

내장하고 있기 때문에 굳이 비싼 오실레이터를 쓰지 않고도 수정발진자만으로도 정밀한  

 

클럭을 생성할 수 있습니다.

 

(예전의 CPU들이나 MPU의 경우에 클럭 입력핀이 하나밖에 없는 경우가 있는데 이러한 

 

경우에는 수정발진자에 발진 회로를 구성하고 이 출력을 클럭 입력에 입력 해야 했습니다.

 

즉 부가회로가 더 필요했습니다.)


 

 

또한 최근의 MPU나 FPGA의 경우 RC 수동소자로 구성된 발진 회로가 이미 내장되어 있어서 

 

외부 클럭이 없이도 초기의 값을 읽어들이거나 프로그램을 실행할 수 있습니다. 이러한 경우에는 

 

MPU는 외부모듈이 하나도 없더라도 원하는 동작을 수행할 수 있습니다. 

 

- internal rc oscillator

 

ex) ATTiny 시리즈 혹은 PIC시리즈중 일부

 

 

 

MPU의 클럭은 상한선은 있으나 하한선은 거의 없기 때문에 

 

목적에 따라 필요한 클럭소스나 주파수를 선택할 수 있습니다.

 

대개는 레퍼런스에서 사용된 클럭 주파수를 사용하나 전원관리가 중요한 경우 

 

클럭을 좀더 낮추어 사용하기도 합니다.

 

 

 

 

클럭에대해서 어느정도 감이 잡히셨는지요?

 

이번에는 MPU의 클럭원으로 사용되어지는 다양한 발진회로에 대해서 알아 보았습니다.

 

읽어 주셔서 감사합니다.

 

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]

 

관련 제품

 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P000360693

 

http://www.icbanq.com/P000362952/S

 

http://www.icbanq.com/P000541714

 

 

 

 

 

참고 사이트

 

https://www.sparkfun.com/tutorials/95

 

https://www.maximintegrated.com/en/app-notes/index.mvp/id/2154

 

 

임베디드 기초 강좌 5 - clock


임베디드 기초 강좌 5 - clock

 

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]


 

안녕하세요. 고명호 입니다 

 이번에는 임베디드 MPU를 다루는데 있어서 심장부가 되는 클럭에 대해서 알아보겠습니다.

 일반적인 TTL등의 descrete IC를 이용하는 전자 기기에서는 클럭이 필요하지 않은 경우도 

 많이 있습니다만 임베디드 MPU를 제어하는데는 정해진 순서대로 프로그램이 

 수행되어야 하는데 이러한 프로그램이 정확한 시간에 수행되기 위해서 

 클럭은 필수적인 요소가 됩니다.

 

 

 

단순한 키트류의 부품또는 CPLD나 FPGA를 제외하고 프로그램이 수행되는 모든 전자기기에는

 클럭이 존재합니다. 

 

 

 

일반적으로 똑같은 MPU를 사용하는경우에 클럭이 빠르면 명령어의 수행이 

 더 빠르게 이루어 지게 됩니다. 즉 6Mhz로 동작하는 회로에서 12Mhz로 동작하도록 

 클럭을 변경하게되면 모든 작업들이 2배로 빨리 실행되게 됩니다.

 (그렇지만 MPU의 정해진 한계클럭이 존재하기 때문에 

 무한정 클럭을 올릴수는 없고 또한 클럭이 올라감과 더불어 소비전력도 비례하여 

 늘어나기 때문에 모바일 기기에서는 될수있으면 똑같은 작업을 하더라도 적은 클럭으로 

 작업을 수행하는 것이 유리합니다.) 

 

 

클럭의 소스로 쓰이는(클럭을 발생시킬수 있는) 부품에는 몇가지종류 또는 회로가 존재합니다.

 (다음회에는 클럭의 원천이 되는 몇 종류의 부품 또는 회로에 대해서 알아 보겠습니다)

 아두이노같이 이미 부품이 실장된 전자 회로의 경우 다음의 모양처럼 생긴 부품들을 본적이 

 있을 것입니다.  

 



 

(그림1. 세라믹 레조네이터 와 수정 크리스탈)

 

 

 

 

아두이노 uno등에서는 2종류의 클럭이 사용되고 있습니다. 

 (하나는 USB 통신용, 하나는 메인 칩용입니다.)

  



 

그림에서의 길고 흰모양의 부품이 Quartz crystal 이라고 하는것으로 비교적 정밀한

 주파수의 클럭을 얻을수 있는 부품인 반면에 ATMEGA chip 바로 위쪽의 작은 부품은 

 ceramic resonator 라 불리는 부품으로 Quartz crystal(수정발진자) 보다는 정밀도가 

 떨어지지만 RC, LC 발진회로보다는 비교적 정밀도가 높기 때문에 

 중등도 타이밍회로, 또는 정확한 타이밍이 요구되지 않는 전자 회로에서 많이 이용되는 

 부품입니다.

 

MPU에서 클럭은 명령을 수행할 때의 타이밍의 기준이 됩니다.

 MPU내부에서 명령을 가져오고 해석하여 최종적인 명령이 수행될때 각각 한클럭씩 소요가 되나

 최근의 MPU들은 명령 인식과 해석및 실행단계에 파이프라인이라는 처리과정을 거쳐서 

 - 각 파이프라인이 각각 독립적으로 작동하여- 파이프라인이 한클럭에 한꺼번에 실행됩니다.

 

 

  

 클럭   

   클럭   

           클럭   

     클럭  

    클럭

 명령을 가져옴

 명령의 해석 

 명령의 수행

 

 

 

 명령을 가져옴

 명령의 해석

 명령의 수행 

 

 

 

 명령을 가져옴

 명령의 해석

 명령의 수행

 

 

      <특정 순간>

 

 

 

 

위와 같은 과정이 무한히 반복됩니다.

 위처럼 3번째의 세로줄을 살펴보면 명령가져오고 해석과 수행이 한번에 이루어져서 

 거의 모든 명령이 한클럭에 실행이 되도록 하고 있습니다. 

 (단 MPU내에는 인터럽터 처리등의 회로가 부가되기 때문에 엄밀히는 위보다 더 많은 

 단계의 파이프라인 처리부분이 존재합니다. 

 

마찬가지로 코드의 분기명령어는 분기후 파이프라인이 재 설정되므로 이런 경우에는 명령이 

 한 클럭으로 완료되지 않습니다.)

 

 

아두이노에서 쓰이는 AVR 계열의 MPU는 레지스터 제어 명령이 1클럭에 수행이 되며 

 분기명령및 기타 메모리관련 명령은 2클럭에 수행됩니다.

 마이크로칩사의 PIC 계열의 경우에는 분기명령을 제외한 모든 명령이 4클럭에 수행이 되며 

 분기명령만 8클럭에 수행이 됩니다. 

 

(타이밍을 맞추는데는 AVR보다 PIC이 좀더 수월합니다. 하지만 PIC계열은 AVR보다 4배나 빠른 

 클럭을 사용해야 합니다.)

 

(물론 C 언어로 프로그래밍을 하는경우에는 각각 컴파일된 코드의 길이가 다르므로 

 정확한 타이밍이 요구되는 경우에는 AVR이던, PIC이던 직접 어셈블리로 

 코드를 작성하여 타이밍을 맞추어야 합니다.)

 

 MPU를 이용해서 일정한 주파수의 소리를 발생시킨다거나, 아니면 UART 시리얼 등으로 

 타 주변기기와의 통신을 하는경우에는 정확한 클럭이 필요하게 되는데, 이때 MPU는 

 클럭에서 발생된 기준클럭을 두배 혹은 세배, 아니면 n 배를 해서 기준클럭의 

 배수가 되는 더 느린 클럭을 만들어서 각종 내부 제어회로에 이용하게 됩니다.

  

MPU내부에서 클럭이 사용되는 경우는 일반적으로 다음과 같습니다.

 

UART, PWM, 카운터, 타이머

 이중 카운터 타이머의 경우에는 정해진 숫자의 값을 카운트 다운 또는 카운트 업 하여 

 정해진 숫자에 도달하면 인터럽트를 발생시켜 필요한 동작을 수행합니다.

 이렇게 하면 모든 IO 핀을 매번 모니터링 하거나 일일히 

 명령의 instruction cycle을 계산하지 않고도 정확한 시간에 정해진 작업을 수행할 수 있습니다.

 

즉 예를 들자면 아두이노등에서의 sleep명령처럼 아무일도 하지 않고 노는 시간에 다른 일을 

 할 수 있는것 입니다.

 

타이머는 대개 내부의 기준 클럭이 일정한 시간에 발생하는 클럭 펄스에 의해서 동작하며

카운터의 경우 외부의 펄스변화를 인식하여 각 펄스가 정해진 갯수가 되는 경우에 인터럽트가

발생합니다.

마찬가지로 UART의 경우에는 전송되는 데이터 값을 어느정도 시간동안 유지해야 하는지를 

결정하는데 클럭이 사용되며

PWM의 경우에는 펄스폭의 길이를 결정하는데 클럭이 이용됩니다. 

 

이때 기준 클럭보다 엄청나게 긴 시간동안의 카운팅이 일어나야 하는데 

프리스케일러라는 내부 회로를 두어서 클럭을 2배 4배 또는 심지어 256 배 정도 까지의 긴 

 

시간동안을 한 단위로 하여 타이밍을 맞추는 데 사용하고 있습니다.

 

설명을 위해서 다음과 같은 프로그램을 봅시다.

 

 

// the setup function runs once when you press reset or power the board

void setup() {

  // initialize digital pin 13 as an output.

  pinMode(13, OUTPUT);

}

 

// the loop function runs over and over again forever

void loop() {

  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)

  delay(1000);              // wait for a second

  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW

  delay(1000);              // wait for a second

}


 

 

위의 예제는 아두이노의 블링크 예제 입니다. 

 

LED를 점등하고 1초를 기다리고, 또 소등하고 1초를 기다리는 프로그램입니다.

 위 프로그램은 기다리는 동안 아두이노는 아무일도 못하고 단지 기다리기만 할 뿐입니다.

 (이러한 루프를 idle loop라고 부릅니다.)

 그렇지만 인터럽트를 이용하면 

 

 

 

// avr-libc library includes

#include

#include

#define LEDPIN 13

 

void setup()

{

pinMode(LEDPIN, OUTPUT);

// initialize Timer1

cli();         // disable global interrupts

TCCR1A = 0;    // set entire TCCR1A register to 0

TCCR1B = 0;    // set entire TCCR1B register to 0 

               // (as we do not know the initial  values) 

 

// enable Timer1 overflow interrupt:

TIMSK1 | = (1 << TOIE1); //Atmega8 has no TIMSK1 but a TIMSK register

 

// Set CS10 bit so timer runs at clock speed: (no prescaling)

TCCR1B |= (1 << CS10); // Sets bit CS10 in TCCR1B

// This is achieved by shifting binary 1 (0b00000001)

// to the left by CS10 bits. This is then bitwise

// OR-ed into the current value of TCCR1B, which effectively set

// this one bit high. Similar: TCCR1B |= _BV(CS10);

 

// enable global interrupts:

sei();

 

ISR(TIMER1_OVF_vect)

{

 

digitalWrite(LEDPIN, !digitalRead(LEDPIN));

// or use: PORTB ^= _BV(PB5);// PB5 =pin 19 is digitalpin 13

}


 

 

 

이렇게 작성할 수 있고, 뭔가 조금 복잡해 보이기는 해도 

 노는 시간동안 아두이노는 다른 유익한 일을 할 수가 있습니다.

 

 

임베디드 프로그래밍도 최적화를 잘 하면 더 상위의 MPU를 쓰지 않고도 원하는 작업이 가능합니다.

 즉 임베디드 하드웨어를 잘 이해하면 이해할 수록 효율적인 프로그래밍이 가능하다는 것입니다.

 

이야기가 길어져서 

 클럭 설명드리다가 인터럽트, 타이머까지 간단히 설명을 드리게 되었습니다.

 모든 제어회로의 기준 시간이 된다는 사실을 말씀드린것 이구요..

 

 

암튼 ..

 

결론적으로 말씀드리면 임베디드 기기에서는 클럭을 선정할때 전원의 소모, 프로그램의 수행시간, 

 그리고 심지어는 UART회로, PWM회로 타이머, 카운터의 거의 모든 회로가 영향을 받기 때문에

 기준클럭을 선정해야할 때 목적에 맞는 최적의 클럭을 선정하도록 해야 합니다.

 

  

예전에는 임베디드 프로그래밍을 할때는 UART통신을 하기 위해서 클럭이 바뀔때 마다 

 통신 제어 레지스터에 일일히 계산을 해서 계산된 값을 입력해 줘야하는 불편함이 있었습니다만

 요즘은 대개 정해진 클럭을 사용하는 상용화 제품들이 많고 (아두이노의 경우에 기준클럭은 16Mhz 

 입니다.) 또한 각 칩마다 클럭에 따라 각각의 계수들을 계산해 주는 도우미 어플리케이션이 

 많이 있어서 

 

(예를 들자면 PIC - http://www.nicksoft.info/el/calc/?ac=spbrg 

 AVR - http://wormfood.net/avrbaudcalc.php

 등의 사이트)

 

현재는 예전처럼 클럭 제어 레지스터를 직접 다루어야 하는 일은 많지 않아졌습니다.

  

이번에는 클럭을 바꿀때 프로그램도 바뀌어야 한다는 것만 알고 가시면 될것 같습니다.

  

도움이 되셨는지요 ??

  

많은 도움이 되셨기를 바라며 이번회의 강좌를 마치도록 하겠습니다.

  

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]


 

 

참고 사이트

 

 

http://www.nicksoft.info/el/calc/?ac=spbrg 

 

http://wormfood.net/avrbaudcalc.php

 

https://www.arduino.cc/en/Tutorial/Blink

 

https://arduinodiy.wordpress.com/2012/02/28/timer-interrupts/

 

 

 

참고 부품

 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P000360693

 

http://www.icbanq.com/P001943166/S