'TMS320/F28335'에 해당되는 글 23건

  1. 2015.01.11 DSP2812의 자료형과 그 길이
  2. 2015.01.11 DSP2812의 Endian
  3. 2014.08.20 PWM 1
  4. 2014.08.20 [예제분석] PWM
  5. 2014.08.20 인터럽트 관련 소스
  6. 2014.08.20 2812와 달라진 28335의 주변회로
  7. 2014.08.19 SCI
  8. 2014.08.19 Cpu Timer(2)
  9. 2014.08.19 Cpu Timer(1) 1
  10. 2014.08.18 ADC(2)
TMS320/F283352015. 1. 11. 02:10

typedef int                 int16;

typedef long                int32;

typedef long long           int64;

typedef unsigned int        Uint16;

typedef unsigned long       Uint32;

typedef unsigned long long  Uint64;

typedef float               float32;

typedef long double         float64;


또한 char는 2바이트로 이루어져 있다.

'TMS320 > F28335' 카테고리의 다른 글

10247-D creating output section ".sysmem" without SECTIONS specification  (0) 2015.07.31
cmd 메모리 문제  (0) 2015.07.31
DSP2812의 Endian  (0) 2015.01.11
PWM  (1) 2014.08.20
[예제분석] PWM  (0) 2014.08.20
Posted by 십자성군
TMS320/F283352015. 1. 11. 01:12

little Endian임

자료처리를 생각한다면 당연하겠지만...

'TMS320 > F28335' 카테고리의 다른 글

cmd 메모리 문제  (0) 2015.07.31
DSP2812의 자료형과 그 길이  (0) 2015.01.11
PWM  (1) 2014.08.20
[예제분석] PWM  (0) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
Posted by 십자성군
TMS320/F283352014. 8. 20. 16:38

PWM

예제 및 레퍼런스를 참고하여 일부만 설명하겠다.


참고예제[초기화]

void InitEPwm1Module(void)

{

/* Setup TBCLK */

EPwm1Regs.TBPRD = (SYSCLK/PWMCARRIER)-1; /* Set Timer Period */

EPwm1Regs.TBCTR = 0; /* Clear Counter */


/* Set Compare values */

EPwm1Regs.CMPA.half.CMPA = ((EPwm1Regs.TBPRD+1)>>1); /* Set Compare A value to 50% */


/* Setup counter mode */

EPwm1Regs.TBCTL.bit.CTRMODE = 0; /* Count Up (Asymmetric) */

EPwm1Regs.TBPHS.half.TBPHS = 0; /* Phase is 0 */

EPwm1Regs.TBCTL.bit.PHSEN = 0; /* Disable phase loading */

EPwm1Regs.TBCTL.bit.PRDLD = 0; /* Period Register is loaded from its shadow when CNTR=Zero */

EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; /* Clock ratio to SYSCLKOUT */

EPwm1Regs.TBCTL.bit.CLKDIV = 0; /* TBCLK = SYSCLK / (HSPCLKDIV * CLKDIV) */


/* Setup shadowing */

EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; /* Enable Shadowing */

EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; /* Load on CNTR=Zero */


/* Set actions */

EPwm1Regs.AQCTLA.bit.ZRO = 2; /* Set EPWM1A on CNTR=Zero */

EPwm1Regs.AQCTLA.bit.CAU = 1; /* Clear EPWM1A on event A, up count */


/* Set Interrupts */

EPwm1Regs.ETSEL.bit.INTSEL = 1; /* Select INT on CNTR=Zero */

EPwm1Regs.ETSEL.bit.INTEN = 1; /* Enable INT */

EPwm1Regs.ETPS.bit.INTPRD = 1; /* Generate INT on 1st event */

}





1. TBPRD : Time-Base Period Register


Time-Base Submodule Registers중 하나


값은 0~FFFF


Time-Base counter의 주기를 정하고 PWM 주파수를 설정한다.

이 레지스터에 대한 쉐도잉은 TBCTL(Time-Base Control Register)의 비트 설정에 따라 가불을 정할 수 있다. 기본적으로 가능하게 설정되어 있다.


TBCTL = 0일때

-쉐도우(은폐)가 가능하고 모든 읽고 쓰기가 자동적으로 쉐도우 레지스터로 전송된다. 이 경우, 활성화된 레지스터(TBPRD)는 time-base counter가 0이 될 때 마다 쉐도우 레지스터에 의해 로드된다.

TBCTL = 1일때

-쉐도우(은폐)가 불가능하게 되고 모든 읽고 쓰기가 직접 활성화된 레지스터로 전송된다. 이는 즉, 레지스터가 하드웨어를 조정하게 되는것이다.


active 레지스터와 shadow 레지스터는 같은 메모리 맵 주소를 공유한다.


2. TBCTR : Time-Base Counter Register



위 레지스터를 읽어 time-base counter의 값을 읽을 수 있다.

또한 위 레지스터에 쓺으로써 time-base counter의 값을 정할 수 있다. 쓰는 즉시 바로 업데이트 된다.

쓰기는 TBCLK(time-base clock)에 동기화되지 않으며 또한 위 레지스터는 쉐도우(은폐) 되지 않는다.


3. CMPA : Counter-Compare A Register


활성화된 CMPA 레지스터는 TBCTR과 계속 비교된다. 값이 같을 경우, counter-compare 모듈은 '두 값이 같다'는 이벤트를 발생시킨다. 이 이벤트는 action-qualifer(동작권한자) 영역으로 보내지는데 위 이벤트를 통과시키거나 몇가지 동작을 발생시킨다.

이 동작들은 AQCTLA와 AQCTLB레지스터에 영향을 받는 EPWMxA나 EPWMxB 출력에 적용된다. 동작들은 다음과 같다.


1. 아무것도 하지 않는다 : 이벤트를 무시한다

2. Clear : EPWMxA EPWMxB 신호를 low하게 한다

3. Set : EPWMxA EPWMxB 신호를 high하게 한다.

4. EPWMxA 나 EPWMxB신호를 반전시킨다.


좀 번역체가 되었는데 즉 이런 말이다.

TBCTR과 계속 비교하다가 값이 같을 경우에 이벤트를 발생시키고 이 이벤트를 조건으로 갖는 몇가지 이벤트를 다시 발생시킨다.

이 이벤트들은 EPWMxA나 EPWMxB의 출력과 관계된다.


CMPCTL[SHDWAMODE] = 0

:shadow가 가능하고 모든 읽고 쓰기가 자동적으로 shadow register로 전송된다. 이 경우, CMPCTL[LOADAMODE] 비트필드는 이벤트가 shadow register로부터 어떤 active register를 로드할지 정한다.

:쓰기 전에, 쉐도우 레지스터가 현재 꽉 차있는지 확인하기 위해 CPMCTL[SHDWAFULL] 비트를 읽을 수 있다.


CMPCTL[SHDWAMODE] = 1

:shadow register가 사용불가하고 모든 읽고 쓰기가 직접 active register로 전송된다. 이는 레지스터가 직접 하드웨어를 제어함을 의미한다.

:어떤 모드라도 active 및 shadow 레지스터는 같은 메모리맵 주소를 공유한다.


4. TBCTL

[CTRMODE, PHSEN, PRDLD, HSPCLKDIV, CLKDIV]






15:14

 FREE,SOFT

 Emulatio Mode Bits

emulation events과정중 ePWM time-base counter의 동작을 선정한다.


00:time-base counter의 증감 후 정지한다.

01:카운터가 전체 사이클을 종료 후 정지한다

: Up-count mode : time-base counter = period(TBCTR = TBPRD)일때 정지한다.

즉, 카운터의 값이 period값에 도달했을 때 정지한다.

: Down-count mode : time-base counter = 0x0000(TBCTR = 0x0000)일때 정지한다.

즉, 카운터의 값이 0에 도달했을 때 정지한다.

: Up-down-count mode : time-base counter = 0x0000(TBCTR = 0x0000)일때 정지한다.

즉, 카운터의 값이 0에 도달했을 때 정지한다.

13 

PHSDIR 

 Phase Direction Bit

time-base counter가 up-down-count mode일 때만 사용된다.


PHSDIR bit는 time-base counter(TBCTR)가 동기화 이벤트가 발생했을 때의 카운트 하는 방향성(count up/count down)을 가리킨다. 또한 새로운 phase value를 TBPHS레지스터로부터 불러온다. 동기화 이벤트가 발생하기 전에는 카운터 방향성에 의존하지 않는다.


up-count 또는 down-count일 때는 무시된다.


0 : 동기화 이벤트 발생 후 count-down 한다.

1 : 동기화 이벤트 발생 후 count-up 한다.

12:10 

CLKDIV 

 Time-base Clock Prescale Bits


이 3개의 비트는 time-base 클럭의 프리스케일 값의 일부를 정한다.

TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV)


CLK는 2의 n승이 된다. 예를들어 CLKDIV = 111일 때, 2^7=128이다

9:7 

HSPCLKDIV 

 High Speed Time-base Clock Prescale Bits


이 3개의 비트는 time-base 클럭의 프리스케일 값의 일부를 정한다.

TBCLK = SYSCLKOUT / (HSPCLKDIV*CLKDIV)


이 분주기는 TMS320x281x 시스템의 Event Manager peripheral 의 HSPCLK를 모방하고 있다.


000 : /1(default)

...

...

111 : /14 : /(2*7)

 6

 SWFSYNC

 Software Forced Synchronization Pulse


0 : 

 5:4

SYNCOSEL 

Synchronization Output Select


EPWMxSYNCO 신호의 출처를 정한다

00 : EPWMxSYNC

01 : CTR = zero

10 : CTR = CMPB

11 : EPWMxSYNCO 신호를 사용불가능하게 한다.

PRDLD 

Active Period Register Load From Shadow Register Select


0 :

TBCTR(time-base counter)값이 0에 도달했을 때, 주기 레지스터(period register : TBPRD)의 값을 쉐도우 레지스터를 통해 로드하게 한다.


1 :

쉐도우 레지스터를 쓰지않고 즉시 TBPRD로부터 값을 읽어들인다.

TBPRD가 동작중이라도 직접 접근하여 읽고 쓰기를 한다.

PHSEN 

 Counter Register Load From Phase Register Enable


0 :

TBCTR(time-base counter)의 값을 읽을 때, TBPHS(time-base phase register)를 사용하지 않는다.


1 : 

EPWMxSYNCI 입력 신호가 발생하거나 SWFSYNC 비트에 의해 software synchronization 이 들어왔을 때 phase register를 통해서 time-base counter를 로드한다.

 1:0

CTRMODE 

 Counter Mode
time-base ocunter 모드는 한번 설정된 후 일반적인 동작중에서는 바뀌지 않는다.

아래의 설정을 통해 만약 카운터의 모드를 바꿀 경우 다음 edge부터 효과를 발휘하고 현재 카운터 값은 모드 변경전에 증가 또는 감소 된다.

모드설정
00 : Up-count mode
01 : Down-count mode
10 : Up-down-count mode
11 : Stop-freeze counter operation(default on reset)



TBPHS : Time-Base Phase Register


선택된 ePWM의 time-base counter phase[단계]를 설정한다. 이 phase는 동기화 입력신호를 공급하는 time-base에 대한 것이다.


TBCLT의 PHSEN = 0일 때,

:동기화 이벤트는 무시되고 time-base counter은 phase와 무관하게 로드된다.

TBCLT의 PHSEN = 1일 때,

:동기화 이벤트가 발생했을 때, TBCTR은 phase를 로드한다. 동기화 이벤트는 동기화 입력신호(EPWMxSYNCI)나 software forced synchronization에 의해 초기화된다.


CMPCTL : Counter-Compare Control Register



SHDWBFULL 

 Counter-compare B(CMPB) Shadow Register Full Status Flag


CMPB 쉐도우 레지스터가 꽉 찼는지에 대한 상태레지스터이다.

load-strobe 발생 시 한번 자동 클리어 된다.


0 : CMPB shadow FIFO not full yet

1 : CMPB 쉐도우 FIFO가 가득 찼다. CPU wirte는 현재 쉐도우 값에 덮어쓰기를 하게된다.

SHDWAFULL 

Counter-compare A(CMPa)Shadow Register Full Status Flag


CMPA:CMPAHR 레지스터에 32비트가 쓰이거나 CMPA레지스터에 16비트가 쓰일 때 flag가 1로 셋팅된다. 단, CMPAHR레지스터에 대한 16비트 쓰기에는 영향을 받지 않는다.


0 : CMPA 쉐도우 FIFO가 아직 full 되지 않았다.

1 : CMPA 쉐도우 FIFO가 가득 찼다. CPU Write는 현재 쉐도우 값에 덮어쓰기를 하게된다.  

SHDWBMODE 

 Counter-compare B(CMPB) Register Operating Mode


0 : 쉐도우 모드. double buffer로 동작한다. 모든 쓰기는 CPU를 통하여 shadow register에 접근한다.

1 : immediate 모드(즉시 모드). 

SHDWAMODE 

 Counter-compare A(CMPA) Register Operating Mode


위와 같다.

3-2 

LOADBMODE 

Active Counter-Compare B(CMPB) Load From Shadow Select Mode


immediate mode(CMPCTL[SHDWBMODE]=1])일 때는 동작하지 않는다.

00 : Load on CTR = Zero : TBCTR=0 일 때 

01 : Load on CTR = PRD : TBCTR=TBPRD 일 때

10 : Load on either CTR = Zero or CTR = PRD : CTR이 0이거나 PRD와 같을 때

11 : Freeze : load하지 않는다.

1-0 

LOADAMODE 

 Active Counter-Compare A(CMPA) Load From Shadow Select Mode


위와 같다


AQCTL


ETSEL


ETPS


'TMS320 > F28335' 카테고리의 다른 글

DSP2812의 자료형과 그 길이  (0) 2015.01.11
DSP2812의 Endian  (0) 2015.01.11
[예제분석] PWM  (0) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
Posted by 십자성군
TMS320/F283352014. 8. 20. 14:57

========================================================================================================

초기화부터 간단히 살펴보자. 우선 main문 부터 다룬다


/*-----------------------------------------------------------------------------

Step 1

Disable Global Interrupt & Interrupt Flag Clear

-----------------------------------------------------------------------------*/

DINT;

IER = 0x0000;

IFR = 0x0000;


전역 인터럽트를 off시켜주고 인터럽트 플래그를 클리어 하였다.


/*-----------------------------------------------------------------------------

Step 2

2.1 InitSysCtrl()

2.1.1 Disables the watchdog

    2.1.2 Set the PLLCR for proper SYSCLKOUT frequency

    2.1.3 Set the pre-scaler for the high and low frequency peripheral clocks

    2.1.4 Enable the clocks to the peripherals

2.2 Initialize GPIO MUX

-----------------------------------------------------------------------------*/

InitSysCtrl();


/* for EPWM1A, EPWM1B */

InitEPwm1Gpio();


InitSysCtrl() 함수를 통해 시스템 초기화를 시켜준다.

1.왓치독을 off시켜주었다.

2.SYSCLKOUT 주파수 설정을 위해 PLLCR을 설정하였다

3.High, Low주변회로를 위한 클럭설정을 한다

4.주변회로에 클럭분배를 하게한다.


InitEPwm1Gpio()함수를 통해 GPIOMUX를 초기화 시켜준다.


/*-----------------------------------------------------------------------------

Step 3

3.1 Initialize Peripheral Interrupt Expansion circuit

-----------------------------------------------------------------------------*/

InitPieCtrl();


InitPieCtrl() : PIE회로 초기화 함수

PIE회로를 disable시키고 각 PIEIER과 PIEIFR 레지스터를 clear시켜 놓는다.


/*-----------------------------------------------------------------------------

Step 4

4.1 Pie Vector Table Re-allocation

-----------------------------------------------------------------------------*/

InitPieVectTable();


PIE활성화 작업을 한다. 모든 인터럽트 벡터들을 Mapping시켜놨기 때문에 이 함수를 통해 모든 인터럽트 벡터들이 TI가 정한 디폴트 인터럽트 서비스 루틴에 연결되게 된다. 인터럽트 벡터의 서비스 루틴은 DefaultIsr.c에 기술되어 있다.


/*-----------------------------------------------------------------------------

Step 5

5.1 Interrupt Service routine re-mapping and Interrupt vector enable

-----------------------------------------------------------------------------*/

/* Interrupt Service Routine Re-mapping */

EALLOW;

PieVectTable.EPWM1_INT = &EPwm1Isr;

EDIS;


/* Enable PIE group 3 interrupt 1 for EPWM1_INT */

PieCtrlRegs.PIEIER3.bit.INTx1 = 1;


/* Enable CPU INT3 for EPWM1_INT */

IER |= M_INT3;



vectortable.zip

첨부한 벡터테이블을 참고하라

EPWM1_INT 의 인터럽트 함수를 EPwm1Isr로 명명하였다. 이는 사용자 정의 함수이다.


EALLOW : MRR보호영역 해제

EDIS : MRR보호


PieCtrlRegs.PIEIER3.bit.INTx1 = 1 : PIEIER과 IER레지스터를 set시키는 작업


/*-----------------------------------------------------------------------------

Step 6

    6.1 Initialize Periphrals for User Application

-----------------------------------------------------------------------------*/

/* Initialize EPWM1 Module */

InitEPwm1Module();


위는 사용자 정의함수이다. EPWM1 모듈을 초기화 시켜주기 위하여 작성되었다.

/*-----------------------------------------------------------------------------

Step 7

7.1 Initialize S/W modules and Variables

-----------------------------------------------------------------------------*/

BackTicker = 0;

IsrTicker = 0;


PwmCarrier = TBCLK / (EPwm1Regs.TBPRD+1);

PwmDuty = (float32)EPwm1Regs.CMPA.half.CMPA / (EPwm1Regs.TBPRD+1);


소프트웨어적인 초기화 작업이다. 나중에 설명하도록 한다.

/*-----------------------------------------------------------------------------

Step 8

8.1 Enable Global realtime interrupt DBGM

8.2 Enable Global Interrupt

-----------------------------------------------------------------------------*/

ERTM; /* Enable Global realtime interrupt DBGM */

EINT;   /* Enable Global interrupt INTM */


ERTM : 전역 인터럽트를 realtime으로 해준다.

EINt : 전역인터럽트를 사용가능하게 한다.

/*-----------------------------------------------------------------------------

Step 9

9.1 Idle Loop

-----------------------------------------------------------------------------*/

/* IDLE loop. Just sit and loop forever: */

for(;;)

{

BackTicker++;


CurrentCarrier = TBCLK / (EPwm1Regs.TBPRD+1);

CurrentDuty = (float32)EPwm1Regs.CMPA.half.CMPA / (EPwm1Regs.TBPRD+1);

}


작업내용이다. 나중에 설명하도록 한다.

}


========================================================================================================

ePWM1 모듈 초기화 함수를 아래와 같이 작성하였다.


void InitEPwm1Module(void)

{

/* Setup TBCLK */

EPwm1Regs.TBPRD = (SYSCLK/PWMCARRIER)-1; /* Set Timer Period */

EPwm1Regs.TBCTR = 0; /* Clear Counter */


/* Set Compare values */

EPwm1Regs.CMPA.half.CMPA = ((EPwm1Regs.TBPRD+1)>>1); /* Set Compare A value to 50% */


/* Setup counter mode */

EPwm1Regs.TBCTL.bit.CTRMODE = 0; /* Count Up (Asymmetric) */

EPwm1Regs.TBPHS.half.TBPHS = 0; /* Phase is 0 */

EPwm1Regs.TBCTL.bit.PHSEN = 0; /* Disable phase loading */

EPwm1Regs.TBCTL.bit.PRDLD = 0; /* Period Register is loaded from its shadow when CNTR=Zero */

EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; /* Clock ratio to SYSCLKOUT */

EPwm1Regs.TBCTL.bit.CLKDIV = 0; /* TBCLK = SYSCLK / (HSPCLKDIV * CLKDIV) */


/* Setup shadowing */

EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; /* Enable Shadowing */

EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; /* Load on CNTR=Zero */


/* Set actions */

EPwm1Regs.AQCTLA.bit.ZRO = 2; /* Set EPWM1A on CNTR=Zero */

EPwm1Regs.AQCTLA.bit.CAU = 1; /* Clear EPWM1A on event A, up count */


/* Set Interrupts */

EPwm1Regs.ETSEL.bit.INTSEL = 1; /* Select INT on CNTR=Zero */

EPwm1Regs.ETSEL.bit.INTEN = 1; /* Enable INT */

EPwm1Regs.ETPS.bit.INTPRD = 1; /* Generate INT on 1st event */

}

'TMS320 > F28335' 카테고리의 다른 글

DSP2812의 Endian  (0) 2015.01.11
PWM  (1) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
SCI  (0) 2014.08.19
Posted by 십자성군
TMS320/F283352014. 8. 20. 14:32

출처 : 싱크웍스 블로그


1. DINT : 전역 인터럽트 스위치 off

-시스템 초기화 과정에서 원인 모를 이유로 인터럽트가 걸릴 경우 이후의 칩 동작에 치명적인 영향을 줄 수 있다.

이를 미연에 방지하기 위해 시스템 초기화 맨 처음 과정에 사용해준다.


2. InitPieCtrl() : PIE회로 초기화 함수

PIE회로를 disable시키고 각 PIEIER과 PIEIFR 레지스터를 clear시켜 놓는다.


3. IER, IFR

IFR : Interrupt Flag Register


IER = 0x0000;

IFR = 0x0000;


위의 경우에는 모든 인터럽트를 0으로 clear하여 사용불가로 만든다.

IER = 0x0001;

1번 인터럽트를 사용가능으로 한다.


4 : InitPieVectTable()

PIE활성화 작업을 한다. 모든 인터럽트 벡터들을 Mapping시켜놨기 때문에 이 함수를 통해 모든 인터럽트 벡터들이 TI가 정한 디폴트 인터럽트 서비스 루틴에 연결되게 된다. 인터럽트 벡터의 서비스 루틴은 DefaultIsr.c에 기술되어 있다.


5 :PieCtrlRegs.PIEIER9.bit.INTx1 = 1 ;


PIEIER과 IER레지스터를 set시키는 작업. 인터럽트 표를 확인하여 설정해주도록 하자.



보충예정


관련 URL : http://blog.naver.com/zero8997/130122556251

'TMS320 > F28335' 카테고리의 다른 글

PWM  (1) 2014.08.20
[예제분석] PWM  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
SCI  (0) 2014.08.19
Cpu Timer(2)  (0) 2014.08.19
Posted by 십자성군
TMS320/F283352014. 8. 20. 13:27

출처 : http://blog.daum.net/5975240/54


제일 큰 구별점은 소수점 연산이 가능해 졌다는 것이다.   그외 달라진 것은 더 진보한 주변회로 설계이다.

 

기존 2812에서는 PWM의 출력, 외부신호의 Capture, 엔코더펄스의 해석, 시간축의 이벤트 관리 등등을 모두 Event Manager이 관리했다.

 

Event Manager에는 4개의 16비트 타이머가 내정되어 있다. 위의 모든 기능들이 이 공용 타이머에 의해 관리되는 구조였다.

 

28335에서는 대신 그 역할을 ePWM, eCAP, eQEP라고 이름 지어진 3개의 독립모듈들이 수행한다.

 

1) PWM 및 시간축 이벤트의 관리자 - ePWM 모듈

 

ePWM모듈은 서로 독립적으로 존재하며 자신만의 16비트 타이머와 개별 회로들을 갖추고 있고, 이벤트 관련 서브모듈을 통해 칩에서 일어나는

 

 각종 시간축의 이벤트들을 제어한다. 하나의 ePWM 모듈은 내부의 타이머와 비교회로를 통해 한 쌍의 PWM 채널을 관리한다. 즉 EPWMxA와

 

EPWMxB이다.

 

2) 외부 신호의 Edge Detector- eCAP

 

eCAP 모듈은 칩의 외부에서 들어오는 신호의 Edge를 잡아내고 이 Edge가의 시간 간격을 카운트하여 기록하는 역할을 한다.  2812에서는

 

공용타이머를 사용했기에 느린 외부의 신호간격을 카운트할 때 자주 카운터 값이 넘치게 되어 별도의 코드로 처리해줘야 하는 불편함이

 

있었지만, 28335에서는 내부에 자체 32비트 타이머를 가지게 되어, 외부 신호에 더 유연하게 대처할 수 있는 능력을 갖추게 되었다.

 

또한 외부신호의 Capture외에 APWM모드로 운용하면 단상 PWM을 외부로 출력할 수도 있다.

 

3) 엔코더 출력 펄스의 해석-eQEP

 

28계열이 주로 사용되는 분야 중 하나가 바로 모터제어이다. 이러한 칩이 목적에 걸맞게 28335에서는 모터의 엔코더 출력 신호를 해석하는

 

eQEP회로를 탑재하고 있다. 이 모듈도 내부에 자체 32비트 타이머를 내장하고 있으면, 신호를 통해 모터의 회전속도, 회전방향 등을 해석

 

해내는 역할을 한다. 또 별도로 QEP회로만을 위한 와치독 타이머를 가지고 있어, 모터의 stall 상태를 감지할 수 있다.

 

4)  ADC 방식

 

첫째로 결과값의 옵셋을 조절할 수 있는 레지스터를 추가하였다.  ADC는 아날로그 값을 디지털로 변화할 때 결과값에 오류를 포함하게 된다.

 

이 옵셋오류를 보정할 수 있는 레지스터를  28335에 추가하였다.

 

두번째 변화는 결과 저장 레지스터에 있다. 2812에서는 Peripherals Frame 0 영역에 결과저장 레지스터가 위치하고 변환의 결과는 항상

 

최상위 비트부터 채워지는 방식이었다.  28335에서는 듀얼 방식을 채용하여  Peripherals Frame 0 와 Peripherals Frame 2에 결과저장

 

레지스터가 위치해 있다.  Peripherals Frame 0 영역에서는 기존의 방식대로 하면서 0Peripherals Frame 2에서는 값들은 좌측으로

 

정렬되어 최상위 비트부터 채워지는 방식의 결과값을 좌측으로 4비트 이동시킨 것과 동일한 값을 가지게끔 하여 2wait의 지연이

 

발생한다.  고속으로 샘플링해야 할 경우에는 기존방식으로, 저속의 샘플링도 괜찮은 경우에는 2영역의 결과값을 사용하는

 

선택의 여지가 생기게 된다.

 

세번째 변화는 인터럽터 벡터의 추가이다. 2812에서는 ADC회로에 인터럽트 벡터 하나가 배정되어 변환과정완료를 알리는 목적으로

 

사용되었다. 28335에서는 총 3개의 인터럽트 벡터가 할당되어 시퀀서를 독립적으로 운용할 경우 시퀀서별로 개별 운용하여 서로 다른

 

코드를 수행할 수 있게 되었다.

 

5) 늘어난 통신모듈의 숫자   

'TMS320 > F28335' 카테고리의 다른 글

[예제분석] PWM  (0) 2014.08.20
인터럽트 관련 소스  (0) 2014.08.20
SCI  (0) 2014.08.19
Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
Posted by 십자성군
TMS320/F283352014. 8. 19. 20:43

SCI

SCI : Serial Communication Interface


비동기 통신 방식(UART : Universal Asynchronous Receive and Transmit)

범용 컴퓨터와 주로 RS-232C 규격으로 데이터를 교환한다. 장거리 통신이 가능하고 281X DSP가 150MHz 구동시 지원 가능한 최고 속도는 9.375Mbps라 한다.


FIFO(First In First Out)가 버퍼 역할을 해주기에 CPU가 통신에 대한 작업 부담을 덜 수 있다.

시리얼 부트로더 사용시 PC와 DSP간 Baud Rate가 정확히 맞아 떨어져야 한다.


고속 트랜시버가 필요한데, MAX3232의 경우 250Kbps에 불과하지만 SN75C3232와 같은 트랜시버는 1Mbps까지 지원한다.

=============================================================================================================

출처 : http://blog.naver.com/zeratool2/80113821155


28335는 3개의 SCI모듈을 지원하고 있고 이 셋 모두 그 형태가 같다.

또한 SCI는 LSPCLK의 클럭값을 가진다.





FIFO에 대해서는 위 그림을 보면 대충 이해가 갈것이라 본다. First In First Out 말 그대로 처음 들어온 송.수신값이 제일 우선 처리된다는 뜻으로 이해된다.



SCI-A의 레지스터이다. B,C또한 같다.

Description을 보면 그 내용 또한 명확히 알 수 있다.



SCICCR : SCI Communication Control Register




Stop Bits

0이면 1Stop Bits

1이면 2Stop Bits 

 EVEN/ODD PARITY

0 : 홀수 패리티

1 : 짝수 패리티 

PARITY ENABLE 

0 : 패리티 비트를 사용하지 않는다

1 : 패리티 비트를 사용한다 

LOOPBACK
ENA 

루프백 모드의 사용여부를 결정한다.

LoopBack Mode : 28335의 TX핀과 RX핀을 내부적으로 연결하여 TX핀으로 나가는 데이터가 다시 RX핀으로 들어오는 echo mode라고 할 수 있다. 송신 신호를 수신하여 송신값을 확인할 수 있다. 

IDLE/ADDR MODE 

0 : idle-line 모드 프로토콜 사용

1 : address-bit 모드 프로토콜 사용

idle-line 모드는 일반적인 1:1 통신 프로토콜이며 Address-bit모드 프로토콜은 한 비트를 추가한 다중 프로세서 통신 프로토콜이다. RS-232타입과는 호환되지 않고 이를 지원하는 프로세서 사이에서만 사용 가능하다. 

2-0 

SCICHAR2-0 

세 개의 비트로 0에서 7까지 선택할 수 있으며, 한 통신 패킷에 몇 개의 데이터 비트를 담을 것인지 결정한다. 0일 때 1개 비트, 7일 때 8개 비트를 담겠다는 뜻이다.(N+1) 


SCICTL1 : SCI Control Register1





 RX ERR INT ENA

통신 에러가 있을 때, SCIRXST의 7번 비트가 1로 set된다. 이 때 인터럽트의 가부를 설정한다.

1일 때 인터럽트 허용. 0일 때 허용하지 않는다

5

SW RESET 

값이 0일 때, SCI모듈의 플래그 값들을 모두 초기화 한다.

전송 속도 및 기타 다른 설정에는 영향을 미치지 않는다. 0인 동안에는 플래그 값이 초기화 된 채로 변경이 불가능하며 다시 1이 되었을 때 비로소 플래그 값이 SCI모듈의 상태에 따라 변화한다. 

3

TXWAKE 

다중 프로세서 관련. 

2

SLEEP 

다중 프로세서 관련 

1

TXENA 

송신 사용 여부를 설정한다.

SCITXEMU와 SCITXBUF로부터 데이터 출력을 차단(0)할 것인지 내보낼(1) 것인지를 결정한다. 

0

RXENA

수신 사용 여부를 설정한다.

SCIRXEMU와 SCIRXBUF로부터 데이터 입력을 차단(0)할 것인지 내보낼(1) 것인지를 결정한다. 


SCIHBAUD, SCILBAUD : 




통신속도를 정하기 위한 레지스터로 아래의 공식에 따라 결정 된다.


통신속도 = LSPCLK/[(레지스터값+1)*8]

16비트 레지스터를 사용하므로 값은 0부터 65535까지 설정 할 수 있다.


SCICTL2 : SCI Control Register2



TXRDY 

값이 1일 때, 송신버퍼(SCITXBUF)가 준비됐음을 나타내는 상태비트이다. 즉, 송신버퍼가 비어있으니 전송할 데이터를 받을 수 있다는 의미이다 

TX EMPTY 

값이 1일 때, 송신버퍼와 송신 시프트 레지스터(TXSHF)가 모두 비워져 있는 상태를 나타낸다. 

RX/BK INT ENA 

값이 1일 때, 수신 인터럽트를 허용한다. 

TX INT ENA 

값이 1일 때, 송신 인터럽트를 허용한다. 



SCIRXST : SCI Receiver Status Register




 7

 RX ERROR

수신 상태에서 에러가 있음을 알려주는 플래그.

브레이크 검출, 프레이밍 에러, 오버런 패리티 에러 중 하나 이상이 발생하면 비트가 1로 바뀐다. 

 6

RXRDY

수신 완료 플래그, 데이터 한 프레임이 모두 도착 했을 때, 이 플래그가 1로 바뀐다. 

BRKDT 

브레이크 검출 플래그. 브레이크 상황이 발생하면 이 비트가 1로 바뀐다 

FE 

프레이밍 에러 플래그 

OE 

오버런 에러 플래그 

PE 

패리터 에러 플래그 

RXWAKE 

수신 웨이크 업 검출 플래그 


SCIRXBUF : Reciver Data Buffer




 15

SCIFFFE 

FIFO모드에서 프레이밍 에러가 발생하면 1로 바뀐다. 

14 

SCIFFPE 

FIFO모드에서 패리티 에러가 발생하면 1로 바뀐다. 

7-0 

 RXDT

수신된 데이터가 저장된다. 저장이 완료 되면, SCICTL2의 RX/BK INT 플래그 비트가 1로 바뀌고, 데이터를 읽으면 플래그가 다시 0으로 클리어 된다 


SCITXBUF : SCI Transmit Data Buffer Register



SCI모듈에서 전송할 데이터를 집어 넣는 레지스터 이다. 이 레지스터에 데이터를 집어 넣으면, TXSHF레지스터를 통해 데이터가 밖으로 전송된다.


SCIRXEMU : SCI Emulation Data Buffer



에뮬레이터에 의해 SCIRXBUF레지스터를 보고자 할 때 사용된다.



SCIFFTX : SCI FIFO Registers[Transmit]



 15

SCIRST 

값이 0일 때, 수신/송신 FIFO채널을 초기화 한다. FIFO설정은 그대로 남는다.

1을 쓰면 다시 재 기능을 하게 된다. 

 14

SCIFFENA 

1을 쓰면, FIFO기능을 활성화 한다. 

13 

TXFIFO Reset

1일 때, 송신 FIFO 포인터를 초기화 하고, 그 상태를 유지한다. 0일 때, 다시 활성화 된다. 

12-8 

TXFFST4-0 

송신 FIFO에 데이터가 몇 BYTE 들어와 있는지를 표시해 준다. 

TXFFINT Flag 

TX FIFO인터럽트 상태를 나타내는 플래그 비트이다. 1이면 인터럽트가 요청된 것이다. 

TXFFINT CLR 

1을 쓰면, TXFFINT Flag를 클리어한다. 

TXFFIENA 

송신 FIFO 인터럽트의 사용 가불을 설정한다. 1이면 인터럽트를 허용한다. 

4-0 

TXFFIL4-0 

송신 FIFO에 몇 바이트가 차면 인터럽트를 발생시킬 것인지를 설정하는 레지스터이다.

즉, TXFFIL과 TXFFST의 값이 일치할 때, 인터럽트가 발생한다. 


SCIFFRX : SCI FIFO Registers[Receiver]


 15

RXFFOVF 

수신 FIFO에 16바이트가 모두 차고 1바이트가 더 전송되어 오버플로우가 일어났을 때, 1로 리셋된다. 

14 

RXFFOVR CLR 

1이면 RXFFOVF비트를 클리어 시킨다 

13 

RXFIFO Reset 

1일 때, 수신 FIFO포인터를 초기화 하고, 그 상태를 유지한다. 1일 때, 다시 활성화 된다. 

12-8 

RXFFST4-0 

수신 FIFO에 데이터가 몇 BYTE들어와 있는지를 표시해 준다. 

RXFFINT Flag 

수신 FIFO 인터럽틑 상태를 나타내는 플래그 비트이다. 1이면 인터럽트가 요청된 것이다. 

RXFFINT CLR 

1을 쓰면, RXFFINT Flag를 클리어 한다. 

RXFFIENA 

수신 FIFO 인터럽트의 사용 가불을 설정한다. 1이면 인터럽트를 허용한다. 

4-0

RXFFIL4-0 

수신 FIFO에 몇 바이트가 차면 인터럽트를 발생시킬 것인지를 설정하는 레지스터이다. 


SCIFFCT : SCI FIFO Registers[Control]




15-13

ABD,

ABD CLR,CDC 

Auto-baud detect기능을 사용하기 위한 설정으로써, 외부에서 들어오는 데이터의 전송속도를 자동으로 측정하는 기능이다.


사용방법:

1.CDC비트를 1로하고 ADBCLR에 1을써 ABD 비트를 0으로 한다.->autobaud-detect 모드 진입 

2.보레이트 레지스터(?)를 1이나 0으로 하여 보레이트를 500Kbps로 세팅한다.

3.RX핀으로 문자가 수신되게끔 한다.->내부적으로 수신되는 데이터의 보레이트를 계산하게됨

 ->ABD비트가 1로 바뀐다.

4.자동으로 보레이트 레지스터가 감지된 속도로 셋팅되고 CPU에 수신 완료 인터럽트를 요청한다

5.인터럽트에서 SCIFFCT레지스터의 ABD CLR비트를 1로 써주어 ABD비트를 0으로 클리어 해주고, CDC비트도 0으로 클리어 해주어야 한다. 마지막으로 수신 된 문자를 읽어온다.

 7-0

FFTXDLY7-0 

TX FIFO모드에서 TXSHF레지스터와 FIFOTXBUF레지스터 사이에 데이터가 복사되는 주기(딜레이)를 결정한다.

TX FIFO모드에서 사용작 SCITXBUF레지스터에 데이터를 집어 넣으면 그 데이터는 곧바로 FIFOTXBUF에 복사되고, 또 곧바로 TXSHF레지스터에 복사되는데 여기에서 FIFOTXBUF에서 TXSHF로 복사되는 주기(딜레이)를 결정하는것 

딜레이 계산 방법

딜레이 시간 = 1/(통신속도[bps])*FFTXDLY(8bit)


SCIPRI : SCI Priority Control Register


SCI통신 중에 에뮬레이터에 의해 브레이크가 걸렸을 경우, 어떻게 동작할 것인가를 결정한다.

00 : 즉시 멈춘다.

10 : 현재의 TX또는 RX동작이 끝난 후에 멈춘다.

X1 : 브레이크와 상관없이 계속 동작한다.

'TMS320 > F28335' 카테고리의 다른 글

인터럽트 관련 소스  (0) 2014.08.20
2812와 달라진 28335의 주변회로  (0) 2014.08.20
Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
Posted by 십자성군
TMS320/F283352014. 8. 19. 17:53

DSP2833x_CpuTimers.c, h를 분석한다.


1. InitCpuTimers()

타이머 초기화 함수로써, 우리가 이 함수를 사용할 때는 그냥 호출하면 될것이다. 영어를 읽을 수 있을테니 주석을 잘 보도록 하자.


void InitCpuTimers(void)

{

    // CPU Timer 0

    // Initialize address pointers to respective timer registers:

    CpuTimer0.RegsAddr = &CpuTimer0Regs;

    // Initialize timer period to maximum:

    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;

    // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):

    CpuTimer0Regs.TPR.all  = 0;

    CpuTimer0Regs.TPRH.all = 0;

    // Make sure timer is stopped:

    CpuTimer0Regs.TCR.bit.TSS = 1;

    // Reload all counter register with period value:

    CpuTimer0Regs.TCR.bit.TRB = 1;

    // Reset interrupt counters:

    CpuTimer0.InterruptCount = 0;



// CpuTimer2 is reserved for DSP BIOS & other RTOS

// Do not use this timer if you ever plan on integrating

// DSP-BIOS or another realtime OS.


    // Initialize address pointers to respective timer registers:

    CpuTimer1.RegsAddr = &CpuTimer1Regs;

    CpuTimer2.RegsAddr = &CpuTimer2Regs;

    // Initialize timer period to maximum:

    CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;

    CpuTimer2Regs.PRD.all  = 0xFFFFFFFF;

    // Make sure timers are stopped:

    CpuTimer1Regs.TCR.bit.TSS = 1;

    CpuTimer2Regs.TCR.bit.TSS = 1;

    // Reload all counter register with period value:

    CpuTimer1Regs.TCR.bit.TRB = 1;

    CpuTimer2Regs.TCR.bit.TRB = 1;

    // Reset interrupt counters:

    CpuTimer1.InterruptCount = 0;

    CpuTimer2.InterruptCount = 0;

}


Timer2에 대한 경고사항이 나와있다. BIOS, RTOS일 때는 Timer2를 사용하지 말라고 한다.

===============================================================================================

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)

{

    Uint32  temp;


    // Initialize timer period:

    Timer->CPUFreqInMHz = Freq;

    Timer->PeriodInUSec = Period;

    temp = (long) (Freq * Period);

    Timer->RegsAddr->PRD.all = temp;


    // Set pre-scale counter to divide by 1 (SYSCLKOUT):

    Timer->RegsAddr->TPR.all  = 0;

    Timer->RegsAddr->TPRH.all  = 0;


    // Initialize timer control register:

    Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer

    Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer

    Timer->RegsAddr->TCR.bit.SOFT = 1;

    Timer->RegsAddr->TCR.bit.FREE = 1;     // Timer Free Run

    Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt


    // Reset interrupt counter:

    Timer->InterruptCount = 0;

}

===============================================================================================

ConfigCpuTimer(&CpuTimer0, 150, 1000);


인수는 설정할 CpuTimer의 주소, 주파수(MHz), 주기(uSeconds)이다. 인수에 따른 설정 후 각종 레지스터를 초기화 시켜준다.

위의 경우는 초당 150*10^6회, 인터럽트는 1000us:0.001초당 한번씩 발생하도록 하였다.

두 수를 곱하면 150000으로 초당 150000회의 인터럽트가 발생하는 것이다.


주파수 부분에 아무 값이나 넣으면 안된다. 현재 설정한 SYSCLKOUT의 값을 넣어주도록 하자. 기본적으로 150MHz로 잡혀있다.

===============================================================================================

DSP2833x_CpuTimer.h를 보면 레지스터 및 명령 정의가 나와있다. 예를들어 아래와 같다.


// Start Timer:

#define StartCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 0


// Stop Timer:

#define StopCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 1


// Reload Timer With period Value:

#define ReloadCpuTimer0() CpuTimer0Regs.TCR.bit.TRB = 1


// Read 32-Bit Timer Value:

#define ReadCpuTimer0Counter() CpuTimer0Regs.TIM.all


// Read 32-Bit Period Value:

#define ReadCpuTimer0Period() CpuTimer0Regs.PRD.all


친절하게 설명이 나와있으니 사용하는데는 문제가 없다고 본다.

'TMS320 > F28335' 카테고리의 다른 글

2812와 달라진 28335의 주변회로  (0) 2014.08.20
SCI  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
Posted by 십자성군
TMS320/F283352014. 8. 19. 17:47

CPU Timer에 대하여 소스 및 구조차원에서 접근한다.


출처 : http://blog.naver.com/zeratool2/80106355498


위의 내용과 함께 보충하여 설명한다.




28335는 CPU Timer 0/1/2 세 개의 모듈을 가지고 있다. 내부 구조는 모두 동일하다.

DSP에 OS를 포팅 시켜서 RTOS로 사용할 경우, CPU Timer2는 BIOS스케쥴링에 사용하게 되어 Timer0과 Timer1만을 사용할 수 있다.


CPU타이머는 PLL을 거친 SYSCLKOUT을 공급받아 돌아가게 된다. 이와 관련된 소스차원의 간략한 글을 올려놓았으니 참고하자.

동작원리를 설명한다


-TDDRH:TDDR(16bit:16bit)와 PSCH:PSC는 AVR의 프리스케일러와 같다.

-타이머가 가동되면 PSCH:PSC는 TDDRH:TDDR의 값을 그대로 복사해오고, SYSCLKOUT 한 클럭당 1씩 Down-Counting을 한다.

-Down-Counting으로 1씩 빼다가 0이 넘어가면 TIMH:TIM에 1클럭의 신호를 보낸다.

-TIMH:TIM 또한 타이머가 가동되면서 PRDH:PRD의 값을 복사해오고, 대기중에 PSCH:PSC로부터 넘어오는 한 클럭당 1씩 DOWN-Counting을 한다.

-Down-Counting에 의해 0이 넘어가는 순간 TINT에 신호를 보내고 인터럽트가 발생한다.


위를 종합하여 인터럽트 주기는

(1/SYSCLKOUT)*(TDDRH:TDDR+1)*(PRDH:PRD+1)

이 된다. (1/SYSCLKOUT)은 1클럭당 주기임을 알아두자.



레지스터 표이다.





TIMERxTCR 레지스터이다.



15 

인터럽트가 요청 됐는지의 유무를 표시해준다.

1이면 인터럽트가 요청된 것이다. 

여기에 1을 써주어 강제 클리어 할 수 있다.

14 

1을 입력하면 타이머 인터럽트를 사용할 수 있다. 

 11-10

JTAG와 같은 에뮬레이터를 사용할 때 쓰는 옵션이다.

컴파일러에서 브레이크 포인트를 걸고 실행했을 때, 브레이크 포인트를 만나면 아래와 같이 작동한다.


00 일 때 : TIMH:TIM의 바로 다음 카운팅에서 타이머가 멈춘다.

01 일 때 : TIMH:TIM이 0까지 감소한 후 타이머가 멈춘다

10or11 : 브레이크 포인트를 만나더라도 타이머는 계속 카운팅을 한다. 

 5

1만 쓸 수 있으며 1을 쓸 경우, TIM이 PRD의 값을 다시 복사해 온다. 0밖에 읽히지 않는다.

 

이게 무슨 의미를 가질까? TIM단계의 카운팅을 새로 한다는 뜻이겠지만 어떤 때 쓰이는지 모르겟다.

1을 쓰면 타이머가 멈춘다. 0을 써주면 즉시 타이머가 카운팅을 시작한다. 


다음 글에서는 소스코드 분석


'TMS320 > F28335' 카테고리의 다른 글

SCI  (0) 2014.08.19
Cpu Timer(2)  (0) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
Gpio  (0) 2014.08.18
Posted by 십자성군
TMS320/F283352014. 8. 18. 21:10

ADCMAXCPNV : Maximum Conversion Channels Register





MAX_CONVn 비트필드는 자동변환 세션에서의 최대 변환채널 수를 정해준다. 시퀀서 모드(병렬, 직렬)에 따라 사용하는 비트필드 및 작업이 다양하다.


시퀀서1에 대해서 MAX_CONV1[2:0] (0~2번)이 사용되며

시퀀서2에 대해서 MAX_CONV2[2:0] (4~6번)이 사용된다.

위 둘 모두 병렬 시퀀서의 경우가 될 것이다.


직렬 시퀀서 모드일 때, 두 시퀀서 1,2를 하나의 시퀀서처럼 사용하기 때문에 총 16개 채널을 입력으로 설정할 수 있으며 이 설정을 위해 4비트를 사용한다.





==================================================================================================

ADCCHSELSEQ1~4 : ADC Input Channel Select Sequecning Control Registers


DSP의 ADC가 한번의 변환주기에 여러 개의 채널에서 신호를 입력받아 한번에 처리하는데 그 처리 순서와 관련된 레지스터이다.

각각이 4비트의 레지스터를 가지며 아래의 초기화 예시를 보면 이해가 갈것이다.


AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup conv from ADCINA0 & ADCINB0

AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup conv from ADCINA1 & ADCINB1

AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // Setup conv from ADCINA2 & ADCINB2

AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // Setup conv from ADCINA3 & ADCINB3

AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x4; // Setup conv from ADCINA4 & ADCINB4

AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x5; // Setup conv from ADCINA5 & ADCINB5

AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x6; // Setup conv from ADCINA6 & ADCINB6

AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x7; // Setup conv from ADCINA7 & ADCINB7


0에서 7은 ADCINA0~7을, 8~15는 ADCINB0~7 입력채널을 의미한다.


==================================================================================================

ADCASEQSR : Autosequence Status Register



11~8 : SEQ_CNTR [Sequencing counter status bits]

시퀀서 변환채널 카운터, SEQ_CNTR[3:0]의 비트필트는 4비트의 카운터로 변환과정 시작과 동시에 MAX CONVn레지스터(입력채널 개수 설정)의 값을 여기로 불러와 매 변환마다 1씩 감소하여 남은 변환채널 갯수를 표시한다. 병렬시퀀서 모드의 경우 시퀀서1과 2의 입력채널 개수를 더한 값을 Load한다.

6~4 : SEQ2_STATE

SEQ2인 ADCINB의 입력채널 중 어떤 채널이 변환 중인지 표시된다

3~9 : SEQ1_STATE

SEQ1인 ADCINA의 입력채널 중 어떤 채널이 변환 중인지 표시된다.


==================================================================================================

ADCST : ADC Status and Flag Register




read-only 상태레지스터


7 : EOS_BUF2[End of sequence buffer bit for SEQ2]

시퀀서 2의 변환완료횟수 버퍼. 인터럽트 모드0(매 변환 완료때마다 인터럽트 발생)에서는 사용되지 않으며 모드1에서 매 EOS마다 Toggle된다.

인터럽트 Flag비트의 Clear나 시퀀서의 리셋에 의해서 Clear되지 않으며 오직 칩의 리셋 과정에서 Clear된다.


6 : EOS_BUF1[End of sequence buffer bit for SEQ1]

시퀀서 1 변환완료 횟수 버퍼. 위와 같다


5 : INT_SEQ2_CLR[Interrupt clear bit]

1을 쓰면 INT_SEQ2비트를 클리어 한다.

인터럽트 서비스 루틴 마지막에는 항상 INT_SEQ2비트를 클리어 해주는 코드가 있어야 한다.


4 : INT_SEQ1_CLR[Interrupt clear bit]

1을 쓰면 INT_SEQ1비트를 클리어 한다.

인터럽트 서비스 루틴 마지막에는 항상 INT_SEQ1비트를 클리어 해주는 코드가 있어야 한다.


3 : SEQ2_BSY[SEQ2 busy status bit]

1이면 시퀀스2의 입력채널이 변환중임을 뜻한다.


2 : SEQ1_BSY[SEQ1 busy status bit]

1이면 시퀀스1의 입력채널이 변환중임을 뜻한다.


1 : INT_SEQ2[SEQ2 interrupt flag bit]

시퀀서2의 인터럽트 요청 플래그 비트


0 : INT_SEQ1[SEQ1 interrupt flag bit]

시퀀서1의 인터럽트 요청 플래그 비트


==================================================================================================

ADCREFSEL[ADC Reference Select Register]


내부 레퍼런스 전압 설정 레지스터




15~14

00일 때, 내부 레퍼런스 전압을 사용한다 

 

01일 때, 외부의 2.048V를 ADCREFIN핀을 통해서 레퍼런스 전압으로 사용한다 

 

10일 때, 외부의 1.500V를 ADCREFIN핀을 통해서 레퍼런스 전압으로 사용한다 

 

11일 때,  외부의 1.024V를 ADCREFIN핀을 통해서 레퍼런스 전압으로 사용한다


==================================================================================================

ADCOFFTRIM[ADC Offset Trim Register]




DSP초기화 함수에서 선행 함수인 InitSysCtrl()함수 안에 InitPeripheralClock()이라는 함수가 있다.

이 함수 안의 ADC_cal()이라는 함수에서 사용되는 레지스터로 ADC_cal()함수는 ADC의 INL,DNL,Gain,Offset오차 중 Gain과 Offset오차를 교정하기 위해서 사용한다. 과정은 아래와 같다.



1. GND와 연결되어 있는 ADCLO핀을 20번 AD변환을 한다.

2. AD변환 값이 0이 나오지 않을 때까지 OFFTRIM에 십진수 40을 계속 더한다.

3. AD변환 값이 0이 나오지 않으면 AD변환 값들의 평균치를 계산한다.

4. ADCOFFTRIM에 평균치를 빼고 OFFTRIM에 저장되어 실제 offset에러 값이 저장되게 된다.

5. ADC결과값에 ADCOFFTRIM레지스터에 있는 값을 뺀다.

6. 교정된 ADC결과값이 저장된다.


ADCLO는 AGND와 직결되어 있으므로 0V이다. 즉, 0V를 ADC하여 오차를 잡는 작업이다.


==================================================================================================

ADCRESULT


16개의 12비트 결과 저장 레지스터.

개당 두 개의 주소를 가지며 0x7108~0x7117에는 왼쪽 정렬되어 저장

0ㅌ0B00~0x0B0F에는 오른쪽 정렬되어 저장




결과 저장 레지스터의 저장 규칙이 있는데

1. 순차샘플링 & 직렬시퀀서 모드

:무조건 먼저 ADC변환된 순서대로 ADCRESULT0부터 차례대로 채워진다.

2. 순차샘플링 & 병렬시퀀서 모드

:시퀀서1은 변환된 순서대로 ADCRESULT0부터 차례대로

:시퀀서2는 먼저 변환된 순서대로 ADCRESULT8부터 차례대로 저장

3. 동시샘플링 모드

:최대 8번 변환을 하며 한번에 두 채널씩 변환을 한다(시퀀서1 1회, 시퀀서2 1회)

ADCRESULT0부터 채워지며 시퀀서1의 결과가 2의 결과보다 먼저 채워진다.

'TMS320 > F28335' 카테고리의 다른 글

Cpu Timer(2)  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(1)  (0) 2014.08.18
Gpio  (0) 2014.08.18
기본자료  (0) 2014.08.18
Posted by 십자성군