이 블로그 검색

2011년 12월 21일 수요일

블랙핀 사이트 모음

아래의 부분을 참고하시어 적용해 보시고 잘 되지 않는 부분에 대해서는 다시 질의해 주시면 감사하겠습니다..
아래의 사이트들을 방문하시면 쉽게 이해 되실 것입니다.

위의 사이트에는 ADZS-BF538F-EZLITE 보드에 관련된 데이터 시트와 관련 개발 툴 매뉴얼입니다.
GettingStartedwithBlackfinProcessors.pdf는 다운로드 하실 필요 없습니다.

위의 사이트를 방문하시면 ADSP-BF538F일 경우의 데모보드와 사용할 수 있는 쪽 보드를 확인할 수 있는데요
아래의 쪽 보드만 사용 가능합니다.

실제로 기술문서를 종합적으로 정리해 놓은 곳은 아래 사이트입니다.
위의 사이트에서 Blackfin를 선택하면 아래의 카테고리가 나오며


Application note에는 부팅, 디바이스 인터페이스등 시스템에 적용될 노하우들이 있습니다.
Data Sheets는 간단한 프로세서 매뉴얼이며 자세한 매뉴얼은 Manuals에 있습니다.
Manuals 카테고리에는 프로세서 매뉴얼, evm 보드 매뉴얼, Visual DSP++ 5.0 매뉴얼,
등이 있습니다.
Code Examples는 사용되지 않으며 아래의 주소에 코드예제들이 있습니다.
코드예제

다른 유용한 정보들
소프트웨어 모듈 (ADI에서 제공하는 소프트웨어 모듈))

온라인 교육

엔지니어 존 – 엔지니어들의 커뮤니티
FAQ, Tip등이 제공되며 실제적으로 ADI 엔지니어와 직접 Contact이 가능합니다.

개발환경설치 – VisualDSP++
위의 주소에서 VisualDSP++을 다운로드한다.

VisualDSP++ Release 5.0
Software Downlaod

Update 10
 Software Download

VisualDSP++ 90 무료 사용 라이센스를 등록을 통해 얻을 있다. (아래 주소참조)

General-Purpose Counter

여기서는 general-purpose up/down counter에 대해서 살펴볼 것이다. 이 counter는 손으
로 회전하며 제어하는 볼륨 switch를 지원하며, 인버터의 경우에는 encoder를 지원한다.즉, 증가형 encoders로부터 얻은 pulses를 실제 위치를 나타내주는 data로 변환해 준다.
GP timer block과 함께 사용되면, GP counter는 속도를 계산할 수 있게 된다.
GP counter는 다음과 같은 특징들을 가지고 있다.
1) 32-bit up/down counter.
2) Quadrature encoder mode(Gray Code)
3) Binary encoder mode.
4) Alternative frequency-direction mode
5) timed direction과 up/down counting mode.
6) zero marker/push button 지원.
7) GP timer와 함께 event timing capturing.
8) 경계선 비교와 경계선 setting.
9) Input pin noise filtering(debouncing)
10) flexible error 검출과 알림 기능.
그림 1 block diagram

CUD: count up and direction
CDG: count down and gate
CZM: count zero marker
PAB: peripheral access bus에 의해 프로세스와 인터페이스

GP counter는 다음과 같이 5개의 동작 mode를 가지고 있다.
1) Quadrature encoder mode :
이 mode에서는 CUD:CDG input bits는 2-bit Gray code로서 해석되는 quadratureencoded
signal로 간주한다. CUD와 CDG inputs에 대한 전송의 순서는 증가형 counter
인지 감소형 counter인지를 결정한다. CNT_COUNTER register는 발생한 transition의
개수를 포함한다.
선택적으로 만일, 양쪽의 입력들이 하나의 SCLK cycle안에서 바뀌면 interrupt가 발생되
는데, 왜냐하면, 이와 같은 transition은 Gray Coding이 아니기 때문이다. 그러므로,
CNT_COUNTER register는 바뀌지 않고, 그대로 있으며, error condition을 알려준다.
예를 들면 다음과 같다.

2) Binary encoder mode :
이 mode는 단지, CUD:CDG input bits가 binary-encoded signal을 기대한다는 것을 제
외하고는 Quadrature encoder mode와 거의 동일하다.
3) Up/Down Counter mode :
이 mode에서는 counter가 input pints의 active edge에서대해서 증가 또는 감소된다.
CUD의 active edge가 검출되면 증가, CDG의 active edge에서 감소가 된다. CNT_CONFIG register의 CUDINV(CUD)나 CDGINV(CDG)이 0이면 rising edge가 active edge가 된다.
 동시에 active되는 것은 고려하지않음

4) Direction Counter mode :
이 mode에서는 counter는 CDG input pin의 모든 active edge에 대해서 증가 또는 감소
하게 된다. 증가, 감소의 방향설정은 CUD가 한다.

5) Timed direction mode :
이 mode에서는 counter가 각각의 SCLK cycle에서 증가 또는 감소하게 된다. 증가, 감소의 방향설정은 CUD가 한다. CDG는 클록의 게이트역활을 한다.

모든 modes에서 3개의 입력 pins는 GP counter logic에게 깨끗한 signals를 제공하기 위
해서 filtering될 수 있다.
[그림 2]는 GP counter control register인 CNT_CONFIG register를 보여주고 있다.
이 register는 peripheral을 enabling하는 것뿐만 아니라 counter modes와 input pins를 구
성하기 위해서 사용된다.
그림 2 GP counter control register인 CNT_CONFIG

CZM input pin은 모든 counter modes에서 기능적으로 다음과 같이 4개의 programming
schemes가 존재한다.
1) Push button mode :
이 mode는 CNT_IMASK register안에 있는 CZMIE bit를 setting함에 의해서 enabling된
다. CZM input에서 active edge는 CNT_STATUS register 안에 있는 CZMII bit를 set할
것이다. 만일, system interrupt controller에서 enabling되면, 이것은 interrupt request를
생성할 것이다. 그 active edge는 CNT_CONFIG register 안에 있는 CZMINV bit에 의해
서 선택된다.
[그림 3]은 CNT_IMASK register를 보여주고 있다.
그림 3 CNT_IMASK register
[그림 3]으로부터 11개의 events가 processor에 전달될 수 있다는 것을 알 수 있다.
즉, interrupts는 CNT_IMASK register안에 있는 각각의 bits에 의해서 enabling된다.
2) Zero-marker-zeros-counter mode :
이 mode는 CNT_CONFIG register 안에 있는 ZMZC bit를 setting함에 의해서 enabling
된다. CZM input에서 active level은 CNT_COUNTER register를 clearing하고, CZM
input이 deactivating될 때까지 그것을 유지한다. 게다가, CNT_IMASK register 안에 있
는 CZMZIE bit에 이해서 enablinge되면, CNT_STATUS register 안에 있는 CZMZII bit
를 set할 것이다. 만일, peripheral interrupt controller에 의해서 enabling되면, 이것은
interrupt request를 생성할 것이다. 그 active level은 CNT_CONFIG register 안에 있는
CZMINV bit에 의해서 선택된다.
3) Zero-marker-error mode :
이 mode는 어떤 rotary encoder devices의 counter 값과 zero marker 출력 사이의 차
이를 검출하기 위해서 사용된다. CNT_IMASK register 안에 있는 CZMEIE bit를 setting
함에 의해서 enabling된다. 임의의 active edge가 CZM input pin에서 검출되면,
CNT_COUNTER register의 4개 LSBs는 “0”에 비유된다. 만일, 4개의 LSBs가 “0”가 아
니면, mismatch는 CNT_STATUS register안에 있는 CZMEII bit에 반영된다. 만일,
peripheral interrupt controller에 의해서 enabling되면, 이것은 interrupt request를 생성
할 것이다. active edge는 CNT_CONFIG register 안에 있는 CZMINV bit에 의해서 선택
된다.
4) Zero-once mode :
이 mode는 active zero marker가 검출되었을 때, counter의 값을 초기 reset값으로 바꾸
기 위해서 사용된다. 그 후에 zero marker는 무시된다. 이 mode는 CNT_COMMAND
register 안에 있는 W1ZMONCE bit를 setting함에 의해서 enabling된다.
CNT_COUNTER register와 W1ZMONCE bit는 CZM pin의 다음 active edge에서
clearing된다. 그러므로, W1ZMONCE bit는 event가 이미 발생했는지 check하기 위해서
읽혀질 수 있다. CZM pin의 active edge는 CNT_CONFIG register 안에 있는 CZMINV
bit에 의해서 선택된다.
[그림 4]는 CNT_COMMAND register를 보여주고 있다.
이 register는 GP counter를 구성하거나 counter register를 “0”화하고, boundary
registers를 복사 및 swapping하는 동작을 enabling한다.
CNT_COUNTER, CNT_MIN 그리고, CNT_MAX registers는 W1LCNT_ZERO,
W1LMIN_ZERO 그리고, W1LMAX_ZERO fields에 “1”을 writing함에 의해서 “0”로 초기
화될 수 있다.
그림 4

블랙핀에서 Sin함수

Blackfin을 이용하여 어떻게 sine를 구하는 지 그 방법에 대해서 살펴보도록 하겠다.
주의할 것은 기본적으로 Blackfin은 fixed point CPU이고, 16-bit fractional number에서
는 1.15 format을 사용하여 표현한다. 이와 같은 data type이 fract16이다.
예를 들면, 0.25를 표현하고 싶을때는 0x2000이 된다
음수는 2의 보수로 표시되며 아래의 그림은 하나의 예이다.

그림 1

0b1011_0001_1011_0001인데, 최상위 bit는 부호를 의미하고, 나머지로 값을 표현하는
1.15 format에서 [그림 3-8]은 2의 보수 값을 계산하기 위해서 0b1100_1110_0100_1111
이 되며 이것을 십진수로 표현하면,
>> x='0.100111001001111'
x =
0.100111001001111
>> y=LimBin2Dec(x)
y =
0.6118
결국, -0.6118의 값을 가지게 된다. 이와 같은 표현을 사용하는 경우에 주의사항들은 다음
과 같다.

1) 최대값 : 1- = 0.999969482421875 = 0x7FFF.
2) 최소값 : -1 = 0x8000, 예를 들면, 0xc000=-1/2.
3) “0” : 0xFFFF
4) resolution(또는 precision) : 
5) Dynamic range : [0.999969482421875 -1]
이 된다. 단, 1.0은 1.15 format에서 표현될 수 없다는 데 주의하자.

어쨌든, VisualDSP math library는 다음과 같은 함수들을 제공하여  sin 값을 쉽게 계산할
수 있도록 하는데, 여기서 설명한 방식과 유사한 방법으로 cos,tan등등의 삼각함수
에 대한 값들을 구할 수 있다.
#include <math.h>

double sin (double x);
float sinf (float x);
long double sind (long double x);
fract16 sin_fr16 (fract16 x);
fract32 sin_fr32 (fract32 x);
_Fract sin_fx16 (_Fract x);
long _Fract sin_fx32 (long _Fract x);

- 기능 설명 :
sin 함수는 입력 매개변수와 출력을 모두 radians로 return해 준다.
sin_fr16, sin_fr32, sin_fx16 그리고, sin_fx32 함수들은 [-π/2, π/2]에 대응하는 [-1 1] 범
위 안에 있는 임의의 소수를 입력으로 받아들인다. 만일, 입력 매개변수 x가 범위를 벗어
난 것이 들어오면 “0”을 return하며, 어떠한 error condition을 return하지 않는데 주의하
자. 그러므로, 한주기를 유도하기 위해서는 다음과 같이 나머지 반주기를 계산해 주어야 한
다.
   sine [0, π/2] = - sine [π, 3/2 π]
   sine [-π/2, 0] = - sine [π/2, π]         
             
다음의 예제는 [0, 0x7fff]의 input domain을 이용하여 sine function의 한주기를 계산하는
예제 code이다.
//예제 1
fract16 sin2pi_fr16 (fract16 x)
{
if (x < 0x2000) { /* <0.25 */
/* first quadrant [0..π/2): */
/* sin_fr16([0x0..0x7fff]) = [0..0x7fff) */
return sin_fr16(x * 4);
} else if (x == 0x2000) { /* = 0.25 */
return 0x7fff;
} else if (x < 0x6000) { /* < 0.75 */
/* if (x < 0x4000) */
/* second quadrant [π/2..π): */
/* -sin_fr16([0x8000..0x0)) = [0x7fff..0) */
/* */
/* if (x < 0x6000) */
/* third quadrant [π..3/2π): */
/* -sin_fr16([0x0..0x7fff]) = [0..0x8000) */
return -sin_fr16((0xc000 + x) * 4);
} else {
/* fourth quadrant [3/2π..π): */
/* sin_fr16([0x8000..0x0)) = [0x8000..0) */
return sin_fr16((0x8000 + x) * 4);
}
}
//예제2

fract16 TempOut[8192]={0}, TempIn=0x0000; // 0d8192=0x2000
// First Quadrant
for(TempIn=0;TempIn<8192;TempIn++) {
TempOut[TempIn]=sin_fr16(TempIn*4);
}
// Second Quadrant
for(TempIn=8192;TempIn<(8192*2);TempIn++) {
TempOut[TempIn-8192]=-sin_fr16((49152+TempIn)*4); // 0d49152=0xC000
}
// Third Quadrant
for(TempIn=(8192*2);TempIn<(8192*3);TempIn++) {
TempOut[TempIn-(8192*2)]=-sin_fr16((49152+TempIn)*4);// 0d49152=0xC000
}
// Fourth Quadrant
for(TempIn=(8192*3);TempIn<(8192*4);TempIn++) {
TempOut[TempIn-(8192*3)]=sin_fr16((32768+TempIn)*4);
}

여기서 주의할 것은 input domain의 끝이 0x7FFF, 즉, 1.15 format의 fract16이 가질 수
있는 최대 값이라는 것이다.
그런데, 여기서 주의할 것은 배열의 index를 fract16 data type으로 선언하면 “음수”를 만
나는 경우에 VisualDSP가 hang 걸리게 된다. 그러므로, 위에서 마지막 Fourth Quadrant의
경우, 즉, 8192*4의 경우, 0x8000 즉, 음수가 되어서 문제가 되므로 다음과 같이 cast 연
산자를 사용해 주어야 한다.
// Fourth Quadrant
unsigned short TempIn=0x0000; // 0d8192=0x2000
for(TempIn=(8192*3);TempIn<(8192*4);TempIn++) {
TempOut[TempIn-(8192*3)]=sin_fr16(fract16((32768+TempIn)*4));
}

이제, 예제 2로 각각의 quadrants에 대해서 simulation을 하면, 다음과 같은 그림을 얻을 수 있다.

그림 2
위에 보여준 것과 같이 4개의 사분면이 각각 8192=0x2000개의 points로 구성되고 있다.
그러므로, (π/2)/8192 = 1.9175e-004의 각도 reoslution을 가지게 되며, 이것을 degree로 환산
하면, 0.0110 degree의 resolution을 가지는 것이다.
그런데, 위에 표현해 준sin(theta)는 theta의 값이 0부터 최대 8192*4-1=32767=0x7FFF 즉, 양의
각도에 대한sin(theta)의 값들만 돌려주는 단점이 있다.
실질적으로는 theta가 음의 값을 가지는 경우도 고려해 주어야 한다.
이를 위해서 sin2pi_fr16이라는 함수를 제공해 주는 데, 이 함수는 [그림 3]에서 보는
것과 같이 0도부터 pi까지는 0x7FFF=32767=8192*4-1의 points로 구성되고, pi부터 2*pi
까지도 32768개의 points로 구성되어 총 0~0xFFFF까지, 즉, 양수 32767개의 points에 따
른 각도와 음수 32768개의 points에 따른 각도를 얻을 수 있게 지원해 준다
그림 3
그러므로, 총 65536개로 360도를 나누어서 그에 따른 각도를 얻을 수 있도록 한다.
예를 들면, sin(45)를 얻고 싶은 경우,
65536/360× 45 = 8192 이므로, sin2pi_fr16(8192)를 입력해 주면, sin(pi/4)=0.7071을 얻을 수 있게 된다. 정리하면, sin2pi_fr16(65536/360* 45*theta) = sin(theta)가 된다. 

예를 들어보자. 사용하는 모터가 8극이고, 2pi를 65536 points로 표현한다.

그림 4 전기각이 360도가 4번 나오는 구조
여기서, 앞서 설명한 것과 같이 0도부터 180도를 32640 points로 표현하였는데, 각각의
step을 128등분하였다. 즉, 32640/128=255 이므로, 결국, 0도부터 180도를 255등분한 것
이며, 0도를 포함하면, 256등분하였다고 볼 수 있고, 32640+128=32768이 되어서, 앞서
배운 내용과 동일한 것을 알 수 있다. 256은 2의 8승임으로 8bits로 0도부터 180도를 표현하게 만든 것이다. 그리고, 180도에서 360도의 경우도 동일하게 32640 points로 표현하였
으며, 이때에는 180도보다는 크고, 360와 같은 것을 역시 256등분하여 8bits로 표현하였
다. 결국, 16bits로 0도부터 360도를 표현하게 된다.또한, [그림 4]로부터 이 encoder는 한바퀴 돌면, 2048개의 pulses를 내보내는
2048ppr 증가형 encoder이고, 앞에서 설명하였듯이 4번의 360도가 나타나는 8-poles
motor이므로 2048/4=512, 즉, 512 pulses와 2*π=65536을 matching하도록 하며, 동시에
4개의 360도가 나오도록 하여야 한다.
여기서 주의할 것은 4개의 512 pulses 각각은 65536 y축과 matching되어야 한다는 것이

이에 대한 code는 다음과 같다.
s16 thetaCalc(s16 RotaryCout)
{
s16 pollnum,PiCouter;
s16 i;
pollnum = 4;//SetNum[5]; //Harry: polar number??
PiCouter = 512 * 4 / 2 / pollnum;//256
if(RotaryCout < 0) RotaryCout = - RotaryCout;
for(i = 0;i < (pollnum*2);i=i+2)
{
if(RotaryCout >= PiCouter*i && RotaryCout <= PiCouter*(i+1)) //theta range from 0 to pi
{
thetaOut = (RotaryCout -i * PiCouter) << 7;
}
if(RotaryCout > PiCouter*(i+1) && RotaryCout < PiCouter*(i+2))//range from pi to 2pi
{
thetaOut = ((RotaryCout - (i+2) * PiCouter) << 7);
}
}
return thetaOut;
}
또한, theta각은 실질적으로 encoder에서 돌려주는 것으로 PWM switching 주파수와 동기
되어 encoder에서 읽어들인다. 그러므로, PWM sync와 관련된 ISR에서 theta를 계산하는
데 주의하자.
void PreLockMag(void)
{
s16 pwmtep;
pwmtep = Max_Duty_Value/13;// 1/12 2/25 1/13
// 0x00ab
*pPWM0_CHA = (u16)pwmtep;
*pPWM0_CHB = (u16)(-pwmtep/2);
*pPWM0_CHC = (u16)(-pwmtep/2);
}
이 code는 open loop 제어가 아닌 feedback 제어를 할 때, 증가형 encoder를 사용하는
경우에 rotor가 처음 정지되어 있을 때, 강제로 PWM을 발생하여 rotor가 고정자와 정렬되
도록 rotor를 처음에 구동시키는 code로서 이와 같은 code를 사용하게 되면, 일반 상용의
경우 rotor가 처음에 어떻게 움직일 지 예측할 수 없으므로 사용하지 않는다. 이것보다는
처음에 V/F제어를 하여 rotor가 회전하게 하고, 정지시킨 뒤에 회전에 따른 각도의 변화량
을 encoder를 통하여 history를 기억한 뒤에 feedback 제어를 할 때, 자동으로 구동되도록
하는 compensation 알고리즘을 사용하는 것이 보다 합리적이다.
결국, V/F open loop또는 절대형 encoder또는 resolver를 사용하는 경우에는 필요하지 않
은 것은 확실하다.
 

2011년 12월 20일 화요일

cd/dvd servo system

BLDC, DC모터와 엑츄에이터를 이용하여 CD/DVD 서보시스템에 대한 설명이다.
물론 제어는 DSP가 사용된다.
CD와 DVD 서보시스템은 원리면에서는 동일하다.
CD에는 Track이라는 데이터라인이 원형이며 연속적으로 CD 안쪽부터 바깥쪽으로 꽈리를 튼 모양으로 나오게 된다.
트랙간의 거리는 수백nm으로 아주 짧다.

CD서보는 이 데이터라인을 따라서 데이터를 검출해 낼수있는 광학시스템의 컨테이너역활을 해야 한다.

제어대상의 관점에서 보면 Focus, Track, Sled, Spindle, Tray으로 나눌수 있다.

Focus, Track은 엑츄에이터이며 Sled와 Tray는 DC모터, Spindle은 BLDC모터로 구성된다.

Focus의 역활은 cd와 광학시스템의 높이를 적정하게 유지시키는 일을 한다. 에러신호는 정현파로 나오게 된다.
Track은 광학시스템이 트랙(데이터라인)을 잘 추종하도록 한다.에러신호는 정현파로 나오게 된다.
Sled는 Track 엑츄에이터의 거리이동의 한계가 있음으로 전체 광학시스템을 옮기는 좀더 rough한 제어를 한다
Spindle은 CD를 회전하여 Track이 회전할수 있도록한다.
Tray는 CD를 옮기는 역활을 담당한다.

이처럼 CD는 5개의 모터/엑츄에이터를 제어해야 하는 복합적인 서보시스템이다.

초기 Sled를 조종하여 적절한 위치가 되게 하고, Focus 제어를 통해 CD와 적절한 거리를 유지 시킨다. 그리고 나서 Track제어로 데이터라인을 찾으면 바로 spindle를 돌려 데이터의 검출을 확인하고 spindle의 속도를 bit rate과 구조에 맞게 제어한다.

focus, track, sled, spindle은 항상 제어 해야 함으로 적절한 sample 주파수로 에러를 감지하여 필터로 구현된 제어부에서 모터제어를 담당한다.

관련자료는 요청시 송부가 가능하다.

서보(Servo)의 개념

서보(servo)라는 것은 추종한다, 따른다는 의미이며, 명령을 따르는 모터를 서보모터라고 합니다. 좀 더 쉽게 말씀드리면, 환풍기나 선풍기, 제분기, 믹서기, 윤전기 등에 들어가는 모터처럼, 적당한 속도로 힘껏 잘 돌아가주기만 하면 되는 모터나, 자동차의 파워 윈도우 처럼 사용자가 일일이 멈추고 움직임을 제어하는 모터를 서보모터라고 하지 않습니다. 이에 반해서, 프린터, DVD, 공작기계, CCTV 카메라, 캠코더 등에 사용되는 모터처럼 명령에 따라 정확한 위치와 속도를 추종할 수 있는 모터를 서보모터라고 합니다.



여기서 중요한 사실은, 모터 자체를 가지고 이게 서보모터냐 아니냐를 따지는 것은 아닙니다. 서보모터라는 개념은, 모터의 구동시스템까지 포함하는 것입니다. 어떠한 종류의 모터라 하더라도 적당한 알고리즘과 회로를 가지는 구동시스템을 적용하여 위치나 속도에 대한 지령을 추종할 수 있도록 만들면 서보시스템이 이루어지는 것입니다.



보통, 직류전동기나 BLDC 전동기를 서보모터라고 부르는 경우가 있는데, 옳지 않습니다. 특히, 유도전동기는, 구조가 간단한 반면 회전 특성이 깔끔하지 않아서 앞에 예를 든 선풍기, 윤전기 등의 비(非)서보 응용에 주로 사용되기 때문에 서보모터가 아니라고 하는 경우가 많은데, 역시 틀린 말입니다. 구성이 아주 까다롭지만, 유도전동기를 이용해서도 서보시스템을 구성할 수 있으며, 이 경우 서보모터의 역할을 하는 것입니다. 반면, 직류모터도 그냥 모터 하나만을 놓고 건전지만 연결하면 돌아가는 상황에서 이를 서보모터라고 하면 옳지 않습니다. 적절한 구동시스템과 연계하여 어떤 위치나 속도 지령을 추종할 수 있게 된 경우에만 서보모터라고 부를 수 있는 것입니다.



직류모터는 무조건 전류에 비례하는 토크를 내기 때문에 제어가 아주 쉬워서 서보응용에 매우 많이 쓰입니다. 직류모터의 치명적인 단점은, 모터 안에 있는 브러쉬와 정류자의 기계적인 접촉전환을 이용하여 회전력을 만들기 때문에, 브러쉬나 정류자가 쉽게 손상된다는 점입니다.



이 단점을 극복한 것이 영구자석동기전동기(Permanent Magnet Synchronous Motor)인데, 반도체 소자를 이용한 인버터를 사용하여 회전자계를 만들어주기 때문에 모터 자체가 닳거나 부서지지 않는 한 반영구적으로 사용할 수 있습니다. 다만, 직류모터에는 사용되지 않는 인버터를 사용하기 때문에 구동시스템이 복잡해진다는 단점이 있는 것입니다. (영구자석을 사용하지 않고 전자석을 쓴 종류도 있는데, 이 것은 영구자석이라는 말은 제외하고 그냥 동기전동기 또는 권선형 동기전동기라고 부릅니다.) 한편, BLDC(brushless dc) 모터라는 것은 실제로 직류모터가 아니고 PMSM을 적당한 알고리즘으로 돌려서 직류모터와 아주 유사한 토크 특성을 보이게 만든 경우에 칭하는 말입니다.



서보시스템은 사용되는 모터에 따라 AC 서보시스템과 DC 서보시스템으로 나눌 수 있습니다. AC 서보시스템은 BLDC 모터나 동기전동기, 드물게는 유도전동기 등의 AC 모터를 사용한 경우를 칭하는 말이며, DC 서보시스템은 서보시스템에 직류모터를 사용한 경우를 칭하는 말입니다. AC 모터는 DC 모터에 비해 구동 시스템이 복잡하다는 단점이 있지만, 같은 크기의 DC 모터에 비해 더 큰 힘을 낼 수 있고, 고정자가 권선으로 이루어져 있어 방열특성이 좋으며, 브러쉬와 정류자가 없어서 수명이 길다는 장점이 있습니다.



세탁기처럼 비교적 큰 힘이 필요한 곳에는 AC 서보가 쓰이지만, 수명은 짧아도 좋으니 아주 고성능의 추종능력이 필요한 경우에는 DC 서보가 쓰이기도 합니다. 수명이 중요한 경우에는 당연히 AC 서보가 쓰이고, 값싸게 구성할 필요가 있는 시스템에는 DC 서보가 쓰입니다. 그러나, AC 서보와 DC 서보는 서로 섞여서 쓰이는 분야가 많기 때문에 쓰임을 딱히 구분하기는 어렵습니다

모터의 종류

1. DC브러쉬모터

일반적인 DC모터입니다. 플레밍의 왼손법칙을 이용한 전동기로서,

Commutation(전류를 흘렸다 끊었다 하는 일련의 과정)마다

전류의 방향을 반대로 해주어야 하기 때문에, 필시 브러시라는

기계적인 요소가 필요합니다. 브러시는 정류자편에 전류를 공급해 주지만,

기계적인 요소라, 브러시가 닳아 없어지는 단점이 있습니다.

따라서 주기적으로 브러시를 교체하지 않으면 안됩니다.

또한 브러시가 닳아가면서 모터의 성능또한 저하되고, 분진이 날리는 등

환경적인 문제가 대두됩니다.

장점은 제어가 간편하고, 토오크가 전류에 비례하므로 단순히 전류제어만으로

토오크 직접제어를 행할 수 있습니다.

2. BLDC(BrushLess DC)모터, PMSM(Permanent Magnet Syncronous Motor),

Syncronous Motor(동기전동기)

BLDC, PMSM 둘다 기본적인 구조는 비슷합니다. 대개 3상으로 구성되어 있습니다.

단지 두개의 차이라면, 역기전력(Back EMF)가 사다리꼴파인가 정현파인가의

차이입니다.

BLDC는 대부분 집중권으로 권선이 감겨져 있고,

PMSM은 분산권으로 권선이 감겨져 있습니다.

PMSM의 경우는 요즈음의 대부분의 산업용 서보모터의 방식입니다.

회전하는 부분(회전자)는 영구자석으로 이루어져 있고,

전류를 주는 부분(고정자)는 3상의 권선이 감겨져 있습니다.

3상이기 때문에 3상의 전원을 투입하면 내부에 회전자계가 생겨나고,

회전자(자석)는 회전자계와 동기화(Syncronous)하여 회전하게 됩니다.

브러시가 없기 때문에, 브러시의 마모가 없는 것이 가장 큰 장점이고,

공간벡터제어(Space Vector Control)기법의 상용화로

기존의 DC모터를 대체해가면서 DC모터와 유사한 방법으로 전동기를 제어합니다.

이또한 토오크 직접제어가 가능하고, 속도제어, 위치제어 등에서

탁월한 성능을 발휘합니다.

BLDC는 최근 많은 연구가 진행되고 있고, 상용화가 한창인 전동기 입니다.

PMSM이 주로 정밀 서보용인 반면에, BLDC는 고토오크 및 고속도 제어에

많이 이용됩니다. 미사일의 속도제어, 러닝머신의 벨트제어 등등...

여러가지로 이용되죠.

Syncronous Motor는 PMSM과 완전히 같은 구조입니다만, 차이점이

회전자가 권선으로 사실상 전자석인 구조입니다.

따라서 회전자에 직류전원을 투입해야 전자석이 유지됩니다.

Syncronous Motor에는 슬립링(Slip Ring)이라는 구조가 있어서

외부 DC전원을 슬립링을 통해서 회전자에 공급하게 됩니다.

Syncronous Motor는 발전기 및 제철소의 압연기 등의

일정한 속도를 요구하는데 많이 쓰이고,

영구자석으로는 도저히 만들 수 없는 초대형 모터에 주로 사용됩니다.

하지만 최근 희토류자석(현재 발견된 자성체중 가장 강한 자석입니다)등의

저가화에 힘입어 메가와트급 전동기도 영구자석으로 개발되고 있습니다.

3. 유도전동기(Induction Motor)

유도전동기는 변압기의 구조와 완전히 동일하며, 1차측과 2차측이분리된

그러한 형태입니다.

유도전동기는 최초 3상유도전동기가 먼저 상용화 되었고, 후에

일반 단상유도전동기가 상용화됩니다.

이유는 단상전원으로는 회전자계를 만들 수가 없었고, 3상은

각상이 120도의 위상차를 가지면서 공급되므로, 적절한 구조에 의해서

쉽게 3상회전자계를 구성할 수 있기 때문입니다.

단상유도전동기는 보조권선을 첨가하여 자기(磁氣)벡터를 전기벡터와

위상차게 생기게끔해서 회전시킵니다.

유도전동기는 말그대로 회전자에 전류를 유도시킵니다.

회전자는 권선 또는 다람쥐챗바퀴처럼 생긴(농형) 형태로 되어 있습니다.

회전자에는 자석도 없고, 따로 외부에서 전원을 공급해 주지 않지만,

고정자의 회전자계가 회전자를 훑고 지나가면 회전자에서는

발전기와 같은 역할이 되어서, 회전자도 자성체가 됩니다.

회전자는 슬립주파수(Slip Frequency)라는 게 있는데,

회전자의 회전속도는 고정자의 회전자계속도와 일치하지 않습니다.

왜냐하면 완전히 일치하면 회전자계가 훑고 지나갈 수 없으므로

전동기의 토오크는 0가 됩니다. 따라서 늘 회전자계보다 조금 늦은 속도로

회전하게 됩니다.

4. 릴럭턴스 모터(Reluctance Motor)

공기와 철은 자속을 흘리는데 있어서 6000배의 차이를 보입니다.

이 원리를 이용한 것이 바로 릴럭턴스(자계저항)모터라고 합니다.

회전자는 자석도 아니고 그냥 쇳덩어리 입니다.

단 뾰족뾰족 튀어나온 부분이 있어서 튀어나온 부분은 자속이

잘 지나갈 것이고, 들어간 부분은 잘 지나갈 수 없습니다.

고정자에서 자속을 공급하면 회전자는 자속이 좀더 잘 지나가는 방향으로

회전을 하게 됩니다.

이모터는 매우 튼튼한 것이 장점이지만, 토오크리플이 크고 소음이 있는 것이 단점입니다.

5. 스테핑모터(Stepping Motor)

스테핑 모터는 위에서 열거한 모터들과 크게 다르지 않으나,

단지 한 스텝씩 작은회전을 정밀하게 하고 싶을 때 사용합니다.

종류는, 릴럭턴스타입, 영구자석타입, 하이브리드타입이 있습니다.

스테핑 모터는 사무용기기등에 많이 사용되며 위의 2번에서 4번까지의 전동기가

각도를 알려주는 엔코더가 필요한 반면, 이 스테핑 전동기는 엔코더가 없이도

사용이 가능한 장점이 있습니다.

최근에는 스테핑모터의 위치를 PMSM이 점차 잠식하고 있는 추세입니다.

6. 초음파 모터(Ultrasonic Motor)

압전전동기라고도 하며, 두개의 울룩불룩한 판에 고주파의 전원을 넣어줍니다.

두개의 판이 미세하게 진동을 일으키며 회전을 하게 됩니다.

이모터는 소형밖에 제작할 수 없지만, 매우 고토오크가 나옵니다.

따라서 카메라의 렌즈촛점조절용 모터 등에서 많이 쓰이고 있습니다.

7. 리니어 모터(Linear Motor)

일반적인 전동기가 회전운동을 하는 반면에 이 모터는 직선운동을 합니다.

주로 PCB기판 자동화용 기기 및 반도체 제작장비등에 많이 사용됩니다.

예전에는 볼네지 라는 스크류를 이용해서 일반적인 회전모터를 사용했지만,

볼네지의 백러쉬(Backlash) 및 마모문제로 마이크로미터 정도의 정밀한 단위에서

오차가 발생하고, 효율이 낮은 등의 문제가 있어서

요즈음 리니어 모터가 많은 각광을 받고 있습니다.

리니어 모터를 대형화하면 리니어모터식 전기철도가 됩니다. ^^

8. 그외 기타 모터

2011년 12월 19일 월요일

PWM Controller

블랙핀 프로세서중 BF506F등에 PWM 모듈이 포함되어 있다.

우리는 여기에서 PWM의 기본적인 개념과 블랙핀에서의 PWM대해 다루어 보고자 한다.

PWM은 프로세서의 디지털 출력으로 아날로그 회로를 제어하는 강력한 기법이다. PWM은 계측과 통신에서 전력제어와 전력변환에 이르기까지 광범위한 영역에서 사용되고 있다.

PWM은 펄스폭 변조이다. 스위칭 주파수, 튜티사이클등의 주요변수들이 있게 된다.

PWM을 이용한 제어의 원리에 간단히 설명하면

PWM은 스위치의 ON/OFF시간(Duty cycle)을 이용하여 대상을 제어한다.

예를 들면  9V 최대출력의 램프가 있다고 가정하면 50%듀티 사이클로 대상을 제어 할때는 4.5V의 효과를 나타낼것이다. 이때의 스위칭주파수는 램프의 ON/OFF에 대한 반응시간 보다 빨라야 할것이다. 만약 제어 대상이 모터이라면 해당 RPM(속도)가 스위칭주파수 설정에 중요한 변수가 될것이다.  제어대상의 상태를 체크하는 센서가 부착되면 우리는 폐루프제어를 통해 정확한 Duty Cycle를 찾는 부분이 필요할것이다.

따라서 우리의 관심은 대상의 상태변화감지와 이에 대한 스위칭 주파수 설정, 해당 Duty Cycle 계산 등이 될것이다.
 보통의 MCU/DSP에서 PWM블록이 있다면 다음과 같은 조건을 만족해야 한다.

 1. 사각형파 변조를 제공하는 칩에 내장된 타이머와 카운터의 길이를 설정
 2. PWM레지스터의 ON-TIME을 설정
 3. 범용 목적의 I/O핀인 PWM OUTPUT의 방향을 설정
 4. 타이머시작
 5. PWM컨트롤러를 가능으로설정


Blackfin에서의 PWM

PWM은 AC유도모터(ac induction motor)(ACIM), 영구자석동기모터(permanent magnet synchronous motor(PMSM)), BLDC,전기정류모터(electronically commutated motors(ECMs))등을 제어하는 3상 PWM패턴을 생성한다.

또한 PWM_CTRL의 PWM_SRMODE bit를 세팅함으로 switched reluctance motors (SRMs)을 위한 특정모드도 지원한다.



그림 1
블랙핀은 PWM 생성을 위해 6개의 UNIT으로 나누어진다.
1. PWM SHUTDOWN AND INTERRUPT CONTROL UNIT
   - /PWM_TRIP pin과 PWM_CTRL register에 의해서 다양한 PWM shutdown modes를
      제공한다.
   - Three-Phase PWM Timing Unit을 위한 정확한 reset signal과 Interrupt Control Unit
     을 위한 interrupt signals를 생성한다.
2. PWM SYNC PULSE CONTROL UNIT
  - 내부 PWM 동기화 pulse를 생성하고, 외부 PWM_SYNC pulse를 이용할 것인지를 제어
     한다.
3. THREE-PHASE PWM TIMMING UNIT
  - 3-pairs Complemented, center-based PWM signals와 PWM_SYNC signal을 생성한
     다.

4. DEAD TIME CONTROL UNIT
5. OUTPUT CONTROL UNIT
   - 6개의 PWM output signals 각각에 대해서 enabling/disabling을 할 수 있다.

6. GATE DRIVE UNIT
  - PWM_CTRL register의 PWM_POLARITY bit의 state에 근거하여 정확한 극성을 가지는
    PWM signals의 출력을 제공한다. 또한, 고주파 chopping waveform를 생성한다.

PWM Controller는 SCLK로 구동된다.
생성된 PWM patterns의 switching 주파수와 dead time은 PWM_TM과 PWM_DT
registers에 의해서 programming된다. 또한, 3개의 duty-cycle control registers
(PWM_CHA, PWM_CHB, 그리고, PWM_CHC)는 3-pairs PWM signals의 duty cycles를
직접 제어한다.


6개의 PWM output signals 각각은 PWM_SEG register의 독립적인 output enable bits에
의해서 enabled 또는 disabled될 수 있다.

16-bit read/write PWM period register(PWM_TM)는 PWM switching frequency를 제
어한다.
 PWM_TM register에 작성되는 값은 실질적으로 PWM period의 절반에 대한
fundamental time increment(tsclk) clock 증가량이다.
예를 들어서, 원하는 PWM switching frequency(f PWM )의 함수로서 요구되는 PWM_TM의 값은 다음의 수식에 의해서 얻어진다.
 PWMTM = fSCLK  / (2 * fPWM(수식 3-1)
그러므로, PWM switching period(Ts)는 다음 수식으로서 작성될 수 있다.
Ts = 2 *PWMTM * t SCLK (수식 3-2)
단, Ts = 1/ fPWM 인데 주의하자

 예를 들어서 fSCLK  = 100Mhz이고 원하는 fPWM = 10Khz 인경우 PWM_TM register에서loading될 정확한 값은 수식 3-1을 이용하여 계산하면 5000이 된다. 16진수로 1388이다.
16-bit PWM_TM register에 작성될 수 있는 가장 큰 값은 0xFFFF이고,  fSCLK  = 100Mhz 일 때, 최소 PWM switching frequency는 수식 3-1을 이용하여 계산하면 762[Hz]가 된다. 이는 PWM이 발생할수 있는 최소 스위칭 주파수이다.

예를 들어 PWM_TM register값이 4166이면  fPWM  은  120002가 되어 12Khz가 된다.

 PWM_TMregister에 0,1은 세팅할수 없다. PWM outputs 또는 PWM sync가 enabling되어 있을 때는 지정하면 안 된다

다음으로 10-bit read/write PWM_DT register는 PWM output signals 3상에 삽입되는 dead time
을 제어한다. Dead time (Td )는 다음의 수식에 의해서 PWM_DT register안에 값을 지정
한다.
Td = 2 *PWMDT * t SCLK (수식 3-3)

결국, dead time은 2t SCLK 의 단위로 programming 될 수 있다.
예를 들면,  fSCLK  = 100Mhz인 경우에는 20[ns]의 단위로 programming 될 수 있다.

PWM_DT register는 10-bit이므로 최대값은 0x3FF가 된다. 이를 수식 3-3으로 계산하면 20.5us가 나오게 된다. 식에 의하면 PWM_DT register에 0을 대입하면 Dead time이 0이 됨으로 시스템에 Short의 빌미가 될수 있기에 주의해야 한다. 물론 이를 원천 차단하는 회로가 포함되어 소프트웨어의 실수를 지원해 준다.

예를 들어 PWM_DT 가 0x0096이면 Td 는 수식 3-3의해 3[us]가 된다


왼쪽의 그림에서 노란색과 초록색의 falling과 rising의 간격이 dead time이다. PWM_CTRL register에서 PWM output polarity를 active high로 바꾸었다. 그리고,
3[us]의 dead time을 적용한 경우이다.
만일, PWM output polarity를 active low로 하면 극성이 반대가 되어서 나타난다.








그림 2


그림 3

 
그림 4
Typical PWM Outputs of Three-Phase Timing Unit
in Single-Update Mode (Active-Low Waveforms)

일단, PWM_AH에 대한 on time과 off time을 SVPWM에 의해서 계산한다. 그
리고, 이 on time과 off time에 도달하기 위한 counter 값을 찾아서 PWM_CHA에 setting
해 준다. 그리고 나서, dead time을 첨가해 주면 원하는 PWM_AH pulse를 DSP PWM
port에서 발생하게 된다.

PWM_AL은 그것에 대한 not gate로 생성되고, PWM_SYNC
signal에 맞추어서 120도 phase delay된 PWM_BH, 그리고 또 다시 120도 phase delay된
PWM_CH pulse를 생성하게 된다.

위의 그림에서 보여준 것과 같이 예를 들어서, 외부 XTAL에서 30[MHz]를 공급한 경우
에 내부 PLL을 거쳐서 150[MHz]를 만든다. 그리고, 이것을 절반한 75[MHz]로 counter를
돌리면, 현재 10[KHz]의 switching frequency를 가지므로 하나의 switching period에 총 7500개의 pulse를 생성하게 된다.

그러나, BF506F의 경우, PWM_STAT register의 PWM_PHASE bit default 값은 clear이
고, 이때 오른쪽 그림과 같이 counter의 증가 및 감소 방향이 바뀌게 되는데, 주의하자. 즉,
3상 PWM Timing Unit은 +PWMTM/2로부터 -PWMTM/2까지 2의 보수 counting을 이용
하여 감소하고, 그리고 나서, count 방향이 바뀌어서 -PWMTM/2로부터 PWMTM/2 값으
로 증가하게 된다.
PWM_TM은 double-buffered이다. 즉, PWM switching period의 절반에서의 변화는 단지,
다음 절반 주기 기간안에 효과를 줄 것이다.
또한, 12channel 2MSPS의 ADC를 가지는 BF506F의 경우, [그림 5]에서 보는 것과 같
이 각각의 channel 마다 2MSPS/12 = 166.7kHz, 즉, 6[us]의 time 구간만 있으면, sample
& hold, ADC, buffering까지 끝나고, 이어서 SVPWM 및 여타 관련 code를 동작시키고,
마지막으로 [그림 4]와 같이 PWM pulses를 생성하는 데 걸리는 총 시간은 결코,
10[kHz]보다 크지 않다.

그림 5 ADC & PWM 생성 시간과 Switching 주파수와의 관계.

즉, [그림 5]에서 보듯이 매 PWMSYNC_out이 10[kHz]마다 interrupt를 발생시키고, 그
리고, 위와 같은 일련의 과정을 수행하여 PWM pulses를 생성하는 경우에 interrupt 구간이
PWM pulses를 생성하는 일련의 과정에 비해서 상당히 짧은 시간을 요구하므로 동작하는
데 아무런 문제가 될 것이 없다.
만일, [그림 4]에서 counter의 값을 7500개가 아닌, 7500*2=15000개로 setting하였다
면, switching 주파수는 10[kHz]가 아니라 계산에 의해서 5[kHz]가 되는데 주의하기 바란
다.
또한, 일반적으로 counter의 값은 음의 정수를 사용하지 않으며, 대부분의 IGBT/FET gate
driver 특성 때문에 low active switching을 사용하지만, 이것은 DSP PWM port와 관련
된 register에서 그 극성을 바꿀 수 있다.
3개의 16-bit read/write duty cycle registers(PWM_CHA, PWM_CHB, 그리고
PWM_CHC)는 PWM_AH/AL, PWM_BH/BL, PWM_CH/CL pins에 대한 6개의 PWM
output signals의 duty cycles를 제어한다.
duty cycle registers는 fundamental time unit(t SCLK )에 대한 2의 보수 정수 개수로
programming되고, 1/2 PWM period에 대해서 high-side PWM signal에 대한 원하는
on-time을 정의한다.

각각의 duty cycle register 범위는 -PWMTM/2 - PWMDT ~ PWMTM/2 + PWMDT이
다. 정의에 의해서 결국, “0”의 값은 50% PWM duty cycle을 표현한다
PWM_CTRL안에 active low polarity를 programming 함에 의해서 PWM_DT register안
에 있는 programming 된 dead time 값을 적용하여 조정된다. 즉, programming 된 duty
cycles는 PWM_AH와 PWM_AL 양쪽의 PWM signals의 switching 순간들을 PWM_CHA
register에 의해서 조정된 순간으로부터 dead time을 합쳐서 PWM signals pair옮김으로
인해서 조정된다. 양쪽의 switching edges는 대칭 output patterns를 유지하기 위해서 동
일한 PWMDT × t SCLK 만큼 옮겨진다.

[그림 4]에서 PWM_SYNC pulse의 rising edge는 switching period의 시작을 나타내고,
그리고, PWM_SYNC의 폭은 PWM_SYNCWT register에 의해서 조정된다. 그리고,
PWM_STAT register의 PWM_PHASE bit는 동작이 PWM period의 첫 번째 절반 또는 두
번째 절반 cycle 중에서 어디에 있는지를 가리킨다.
[그림 4]에서 설명한 3상 PWM Timing Unit에 의해서 생성된 full PWM period에 대한
PWM signals의 주기적인 pulse의 active low 구간은 다음과 같이 계산될 수 있다.
 TAH = (PWMTM+ 2*(PWMCHA-PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]

TAL = (PWMTM- 2*(PWMCHA+PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]

그러므로, 대응하는 duty cycles는 다음수식과 같다.
 dAH = TAH/TS = 1/2 + (PWMCHA-PWMDT)/PWMTM
 dAL = TAL/TS = 1/2 - (PWMCHA+PWMDT)/PWMTM

단, [그림 4]에서 보면 알 수 있듯이 switching period TS = 2 * PWMTM인데, 주의하
자.

3상 PWM Timing Unit이 PWM output pins에 가변 duty-cycle 값들로 PWM signals를
생성하는 경우, 변조의 끝에서 0% modulation(full off mode)과 100% modulation(full on
mode)이 발생할 수 있다.

1) Full On Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “on" 상태에 있을 때를 의미
한다. 여기서 ”on" 상태는 PWM_CTRL register의 PWM_POLARITY bit에 의해서 지정
된 active low 또는 active high에 대한 것임.
2) Full Off Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “off" 상태에 있을 때를 의미
한다.
3) Normal Operation :
PWM signals의 임의의 pair를 위한 PWM이 연속적인 PWM_SYNC 사이에 desired
output duty cycle이 0% 또는 100%와 다른 값을 가질 때를 의미한다.

[그림 4]로부터 유추 할 수 있듯이 PWM controller는 16-bit resolution을 가진다. 그
러나, 정확성은 PWM period에 의존한다.
PWM_CHA, PWM_CHB 그리고 PWM_CHC의 동일한 값들은 PWM 주기의 양쪽 절반안에
서 주기적으로 정의한다. 결국, PWM 생성과정에서 유효 정밀도는 2 × tSCLK 즉,fSCLK = 100MHz의 경우, 20[ns]가 된다. 그러므로, duty cycle registers 중에서 어느 하나를 “1”만큼 증가시키면, 각각의 절반 주기 안에서 tSCLK만큼 관련된 PWM signals를
주기적으로 바꾸어 준다.
[표 1]은 최소 얻을 수 있는 PWM 주파수와 bit resolution을 비교한 table이다.
단, SCLK=100[MHz]이다.

표 1
[표 1]에서 Single Update mode에서 resolution bits가 8bits일 때, 얻을 수 있는 최소
PWM 주파수는 다음과 같이 계산된 것이다. 즉,
8bits는 [그림 4]의 오른쪽 그림 부분에 나와 있듯이 PWM 주기의 절반에 대한
counting bits이므로 256개의 counting number를 가질 수 있다. 그러나, 나머지 절반도 대
칭적으로 동작하므로 결국, 각각의 counting number는 SCLK 100[MHz]에서 20[ns]를 필
요하게 되므로, 총 256개의 counting을 수행하는 데 필요한 시간은 256☓20[ns]=5.12[us]
가 된다. 이것이 하나의 PWM signal을 만들 때 필요한 시간이 되므로, 주파수는
1/5.12[us]=195.3125[kHz]가 된다.
일반적으로 10[kHz]를 switching 주파수로 사용하므로 12bit resolution을 가지는 counter
를 사용하여 PWM을 생성하면 된다.


PWM sync는 PWM_TM과 PWMSYNCWT register 값들의 함수로서 내부적으로 생성될
수 있거나 외부에서 입력으로 들어올 수 있다.
이 PWM SYNC pulse의 폭은 10bit read/write PWM_SYNCWT register에 의해서
programming 될 수 있다. PWM SYNC pulse의 폭은 다음과 같이 계산된다


그림 6 PWM_SYNCWT

TPWMSYNC = tSYNC *(PWM_SYNCWT +1)

결국, pulse의 폭은tSCLK로부터 1024× tSCLK 까지이다. 즉, fSCLK = 100MHz의 경우,10[ns] ~ 10.24[us]이다. default 값은 [그림 3-7]과 같이 0x03FF이다. 그러므로, fSCLK = 100MHz의 경우, 10.24[us]이다

PWM_SYNC로부터 PWM outputs안에서 결과까지의 latency는 동기화 mode에서는 3
SCLK cycles이고, 비동기화 mode에서는 5 SCLK cycles이다

/PWM_TRIP pin의 falling edge는 순간적으로 그리고 processor clock과 비동기적으로
PWM controller의 shutdown을 제공한다. 단, PWM_CTRL register의 PWM_TRIP_DSBL
bit가 disabling되지 않은 경우.
그러나, 만일, 이전에 PWM_SYNC가 enabling되어 있다면, PWM_SYNC pulse는 계속해서
발생하고, 그로 인한 interrupt도 계속해서 발생하여 ISR이 동작한다는 데 주의하기 바란다.
또한, trip이 발생하면, dead time counters는 reset되는 데 주의하기 바란다.


Core Timer

Core timer는 주기적인 interrupts를 발생할 수 있는 programmable 32-bit interval
timer이다. 다른 peripherals와 다르게 core timer는 Blackfin core 안에 위치하며 core
clock 즉, CCLK로 동작한다.

다음은 Core Timer의 특징들을 요약 정리한 것이다.
1) 8-bit prescaler를 가진 32-bit timer.
2) CCLK로 동작.
3) 전용 high-priority interrupt channel.
4) Single-shot 또는 연속적인 동작.


다음은 Core timer에 대한 block diagram이다.

















[그림 4-1] Core Timer Block Diagram

Core timer는 임의의 chip pins와 직접적으로 상호작용하지 않는다.
우선, timer가 enabling되기 전에 TCOUNT register를 초기화해야 한다. 물론, 직접
TCOUNT register에 작성할 수도 있지만, TPERIOD register를 통하여 작성될 수도 있다.
[그림 4-2]는 Core timer Control Register TCNTL을 보여주고 있다.
[그림 4-2] TCNTL register.
TCNTL 안에 있는 TMREN bit를 setting함에 의해서 timer가 enabling되면, TCOUNT
register는 prescaler TSCALE이 만료될 때마다 한번 감소하게 된다. 즉, TSCALE +
CCLK clock cyles 1개마다 한번 감소한다. 예를 들면, TSCALE register의 값이 “0”이면,
TCOUNT register의 값은 모든 CCLK clock cycle마다 한번 감소하고, TSCALE이 “1”이
면, 모든 2개의 CCLK clock cycles마다 한번 감소한다.
TCOUNT register의 값이 “0”이 되면, interrupt가 발생하게 되고, TINT bit는 TCNTL
register안에서 set된다.
만일, TAUTORLD bit가 set되어 있다면, TCOUNT register는 TPERIOD register의 내용
을 다시 loading하고, counting을 시작한다. 그러나, 만일, TAUTORLD bit가 clear되어 있
다면, timer는 동작을 멈춘다.
또한, TMPWR=0일 때, TMREN=1이면, undefined 동작을 하는 데 주의하자.
Core timer interrupt request는 edge-sensitive이고, interrupt가 servicing되면 바로 자
동으로 hardware에 의해서 clearing된다.






예로 TPERIOD에 15000을 세팅하면 CCLK=400[MHz]이므로, 150[us]마다 Core Timer
Interrupt가 발생하게 된다

2011년 12월 18일 일요일

Flag(GPIO)-General-Purpose Ports

ADSP-BF506F인 경우에는 3개의 Port modules로 분류할 수 있다
port F/G/H 이다. 다른 ADSP-BFXXX프로세서의 GPIO는 해당 프로세서에 맞게 특화되었지만 제어레지스터는 동일하다.

1) Port F : 16 pins.
(1) PPI data signals.
(2) UART0/1 signals.
(3) SPORT0 signals
(4) SPI0 signals.
(5) CNT0(GP Counter 0) signals.
(6) PWM0 signals.
(7) GP Timer signals.
(8) 부가적인 SPI0/1 slave selects.
(9) GPIOs.
2) Port G : 16 pins.
(1) SPORT1 signals
(2) CAN signals.
(3) ACM signals.
(4) PPI signals.
(5) GP Timer signals.
(6) PWM1 signals.
(7) CNT1(GP Counter 1) signals.
(8) SPI1 signals.
(9) UART0 signals
(10) RSI signals.
(11) GPIOs.
3) Port H : 3 pins.
(1) SPORT1 signals
(2) ACM signals.
(3) SPI0/1 slave select signals.
(4) GP Timer signals
(5) GPIOs.
부가적으로 독립적인 pins로 구성된 TWI signals를 제공한다.

Port의 초기모드는 GPIO Mode이다.
만약 Peripheral기능을 사용하고 싶다면
    1. PORTx_FER의 해당 비트를 셋하여 Enable시킴
    2. PORTx_MUX로 해당 기능을 선택해 주어야 한다.
하나의 물리적인 포트는 다양한 기능의 입출력으로 사용됨으로 내부 레지스터를 통해 스위칭이 되어야 한다.

floating pin 즉, 입,출력으로 사용하지 않는 GPIO pin은 특별히, pull-up/down해 줄 필요
가 없다.

GPIO로 사용될 경우

(1) 출력으로 사용될 때 :
① SCLK에 동기
② 레지스터
     -  PORTxIO_DIR : 방향 설정(입/출력, 초기값 입력)
     - PORTFIO, PORTGIO, PORTHIO - GPIO data registers이며 쓰기동작에서 동시에 값이 변하므로 주의해야 한다.
     - PORTxIO_SET,PORTxIO_CLEAR, PORTxIO_TOGGLE - 비트 단위로 동작하며 그 결과가 위의 GPIO data registers에도 반영되며 이것을 interrupt source로 사용할 수 있다는
것이다. 이때, edge-sensitive pin이 interrupt request를 생성하는 경우에 ISR은 clear
register를 통하여 각각의 GPIO latch를 clearing함에 의해서 그 request를 인정해야 한
다는 것이다. 또한, PORTxIO register는 PORTxIO_INEN register에 의해서 enabling된 input pin의
상태도 반영해 주는 데 주의하기 바란다.


(2) 입력으로 사용될 때 :
① core와 system clocks 사이의 potential latency를 고려해야 한다. 즉, processor에
의해서 입력의 변화가 받아들여지기 위해서는 3 SCLK latency를 가진다.

② 기본적으로 모든 peripheral pins는 reset 이후에 GPIO 입력으로 setting된다. 그러
나, GPIO input drivers는 power 소비를 최소하기 위해서 disabling되어 있다는 데 주의
하자. 그러므로, digial input 또는 interrupt input으로 사용하려면, PORTxIO_INEN
register에서 enabling해 주어야 한다. 만일, enabling해 주지 않는다면, input pins에 변
화가 processor에 의해서 인식되지 않는다. GPIO input enable registers(
PORTFIO_INEN, PORTGIO_INEN, 그리고, PORTHIO_INEN)는 input으로 사용될 임의
의 GPIO에 대한 input buffers를 enable하기 위해서 사용된다. 임의의 GPIO pin의 입력
driver가 enabling되면, 그 GPIO는 더 이상 output으로 작동하지 않는다. 즉, 동일한
GPIO에 대해서 input driver와 output driver를 동시에 enabling할 수 없다.
또한, 외부 pull-up resistors를 사용해 주는 것이 좋다.

(3) Interrupt에 사용될 때 :
각각의 GPIO는 interrupt를 발생하도록 구성될 수 있다. processor는 6개의 interrupt
channels를 통하여 interrupts를 요청하는 최대 35개의 비동기 off-chip signals까지 분별
할 수 있다. 임의의 pin을 interrupt pin으로 만들기 위해서는 해당 PORTxIO_INEN
register 안에 bit가 set되어야 한다. 물론, GPIO 기능을 가지도록 PORTx_FER register
안의 function enable bit는 clear되어 있어야 한다. edge의 경우에 both edge에 대해서
도 사용할 수 있다. interrupt 입력에 대한 triggering 시점은 GPIO polarity registers와
GPIO interrupt sensitivity registers 에 의한 bit별 정의되어 있다.
또한, PORTxIO_DIR registers는 출력으로 구성되어 있을 때, 그 GPIO의 input drivers가
enable 되었다면, software가 data/set/toggle registers에 writing함에 의해서 GPIO
interrupt를 triggering할 수 있다. ISR은 request를 인정하기 위해서는 GPIO를 clearing
해야 한다.


위의 그림은 GPIO interrupt flow이다.

3개의 GPIO modules의 각각은 2개의 독립적인 interrupt channels를 제공하는데, 기능은
동일하고, interrupt A/B라고 불린다. 양쪽의 interrupt channels는 각각의 GPIOs를
none, 어느 하나, 또는 양쪽의 interrupt channels에 할당하는 것을 허락하는 자신만의
mask register를 가지고 있다. 또한, 모든 mask registers는 “0”로 reset되어 있기 때문
에 어떠한 GPIOs도 default에서는 interrupt가 할당되어 있지 않다.
임의의 GPIO interrupt는 그 interrupt를 위한 모든 unmasked GPIOs의 logical OR에 의
해서 발생한다. 예를 들어서, 만일, PF0/1이 GPIO interrupt channel A를 위해서 양쪽이
모두 unmasked되었다면, GPIO interrupt A는 PF0 또는 PF1 어느 하나에 의해서
triggering되었을 때 발생될 것이다. 그러므로, ISR은 실질적으로 interrupt를 발생한
source를 알아내기 위해서 GPIO data register를 check해야 한다.


다음은 지금까지 설명한 GPIO interrupt 처리 routine으로서 임의의 GPIO module의
interrupt A channel에 대한 interrupt flow를 설명한 것이다.






























① level-sensitive interrupt로 사용될 때 :
㉠ signal이 pin에 asserting되고, program flow가 interrupt 되는 시간 사이에 최소 4
SCLK cycles의 latency가 존재한다.
② edge-sensitive interrupt로 사용될 때 :
㉠ 총 5 SCLK latency가 필요하다.
㉡ ISR은 GPIO clear register를 통하여 해당 GPIO latch를 clearing하는 부분을 사용
해야 한다.
그 밖에도 PORTxIO_POLAR, PORTxIO_EDGE 그리고, PORTxIO_BOTH registers를 가
지고 있다. default 값은 active high level이며, single edge이다.




Dynamic Power Management(PLL..)











왼쪽의 그림은 PLL관련한 블록도이다.
CLKIN를 통해 외부클락을 받아 CCLK, SCLK를 생성한다.
CCLK는 코어 클럭을 SCLK는 시스템 클럭을 의미한다.
CCLK >= SCLK의 등식이 성립한다.
해당 제어 부부은 아래의 레지스터 리스트에서 볼수 있다.




















표1. MSEL Encodings
Signal name
MSEL[]
VCO Frequency
DF = 0                      DF = 1
0
64x
32x
1
1x
0.5x
2
2x
1x
N = 3-62
Nx
0.5Nx
63
63x
31.5x
1 MSEL DF parameter를 조정하여, CLKIN VCO로 만드는 배율을 나타내고 있다.


표 2. Core Clock Ratio

Signal Name
CSEL[]
Divider Ratio
VCO/CCLK
Example Frequency Ratio(MHz)
VCO                 CCLK
00
1
300
300
01
2
300
150
10
4
400
100
11
8
400
50

2 VCO CCLK 비율을 나타내고 있다. CSEL parameter 조정하여 Core clock 조정한다


Table 3. System Clock Ratio

Signal Name
SSEL[]
Divider Ratio
VCO/SCLK
Example Frequency Ratio(MHz)
VCO                 SCLK
0000
Reserved
N/A
N/A
0001
50
50
0010
150
75
0011
150
50
0100
200
50
0101
300
60
0110
360
60
N = 7-15
N:1
400
400/N

3 VCO SCLK의 비율을 나타내고 있다. SSEL parameter를 조정하여 System clock을 조정한다.
만일,
 SSEL을 변경한다면,SCLK가 변하면서 주변장치의 data를 잃어버릴수도 있으니 주의하시오.















 -  PLL output clock SCLK CCLK로 나눈다
 -  PLL_DIV parameter 변경하여, CCLK SCLK frequency 변경 있다













PLL control 하는 operation이다
- 여러 register 값을 변경하여 PLL 동작을 제어한다.

 
- PLL processor operating mode 지시한다









-  Processor PLL_LOCKED bit set할떄까지의 SCLK를 정의한다.
-  Lock counter SCLK 1cycle 1 증가한다
-  Lock counter PLL_LOCKCNT register 정의된 값까지 증가하면, PLL_LOCKED bit setting된다.
















아래에는 간단 pll 세팅 예제 프로그램이다.


 void init_pll()
{
     unsigned int imask;
    *pPLL_CTL = SET_MSEL(16); /* Write new value for (400MHz)to PLL_CTL.*/
    ssync();
    *pVR_CTL = /*--- REPROGRAM VR_CTL ---*/
                          0x00B0 | /* Bits #7,6 set by default */
                          0x3000 | /* FREQ=00 indicates hibernate. FREQ=11 indicates non-Hibernate */
                          0;
     imask = cli(); /* VR_CTL Re-programming Sequence. */
     idle(); /* Core is idle'ed to allow the PPL to re-lock. */
     sti( imask );
/*----- REPROGRAM PLL_DIV ------*/
     *pPLL_DIV = SET_SSEL(4); /* PLL_DIV can be re-programmed on the fly.*/
   /* No core idling required. */
     ssync();
}