TMS3202014. 8. 19. 15:35

SysCtrl.c에 관한 글을 보았다면 알 수 있듯이 pll(Phase Lock Loop)와 HSPCLK,LSPCLK의 설정을 통해 주변회로 클럭을 설정할 수 있다.


HSPCLK를 필요로 하는 ADC나 EV를 위한 설정을 알아보자.


프로그램을 작성하기 전에 필수적으로 불러오는 함수 InitSysCtrl()을 확인해보자.


void InitSysCtrl(void)

{


   // Disable the watchdog

   DisableDog();


   // Initialize the PLL control: PLLCR and DIVSEL

   // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h

   InitPll(DSP28_PLLCR,DSP28_DIVSEL);


   // Initialize the peripheral clocks

   InitPeripheralClocks();

}


1.

InitPll(DSP28_PLLCR,DSP28_DIVSEL);


그냥 값을 넣으면 되었던 2812와는 달리 28335는 위의 DPS28_PLLCR, DPS28_DIVSEL의 값을 정해주어야 한다. 그 정의로 들어가면

#define DSP28_DIVSEL     2

#define DSP28_PLLCR   10

을 확인할 수 있다. 입력 클럭에 대한 PLL의 출력을 10배와 1/2배를 적용한다. 2812에서는 1/2배는 고정되어 있었으나 28335에서는 변경이 가능하다.


2.

InitPeripheralClocks()의 초반 부분을 보면 

SysCtrlRegs.HISPCP.all = 0x0001;

SysCtrlRegs.LOSPCP.all = 0x0002;


가 있다. SysCtrl.c에 대하여 게시한 글을 확인하면 0x0001인 상태에서는 SYSCLKOUT/2로 적용된다.


3.

클럭을 넣을 주변회로 결정

SysCtrlRegs.PCLKCR.all = 0x00FF;


위 1,2,3의 결과를 모두 적용할 경우 HISPCP = SYSCLKOUT/2 = (30(MHz)*10/2)/2 = 75MHz일 것이다.


Posted by 십자성군
Project/Balancing 283352014. 8. 19. 14:18

#include "DSP2833x_device.h"

#include "DSP2833x_GlobalPrototypes.h"

#include "GlobalProtoypesLee.h"


void Init_ADC()

{


// 현재 ADC_CLK으로

InitAdc();


// ADC 설정

AdcRegs.ADCTRL3.bit.ADCCLKPS = 15;   // 재분주값 = HSPCLK  /(2*ADCCLKPS)

AdcRegs.ADCTRL1.bit.CPS = 1; // ADCCLK = ADCCLKPS / 2 (ADC의 구동 클럭을 결정 : ADCCLK = 1.25MHz)

AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 시퀀스 직렬 모드

AdcRegs.ADCTRL1.bit.ACQ_PS = 7 ; // 샘플링 윈도우 size를 8 ADC_CLK 설정

AdcRegs.ADCMAXCONV.all = 0x0004;

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // Murata [ Gyro ]

AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1; // SA1 [ Tilt ] 4


AdcRegs.ADCTRL1.bit.CONT_RUN = 1;   // Cont. conv. mode

AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // 시퀀스 시작


}


Part1

1. 현재 HSPCLK는 75MHz로 설정되어 있기에 분주된 값=2.5MHz로 설정되었다. : HSPCLK/(2*ADCCLKPS)

2. ADCCLK = Fclk/1 or 2로 CPS=1이므로 2분주이다.

3. SEQ_CASC = 1이면 시퀀스 직렬모드, 0이면 병렬모드이다.

4. SOC펄스의 길이는 ADCLK주기의 (ACQ_PS + 1)배이다. 즉, 여기서는 8배


Part2

5. MAXCONV.all = 0x0004로 인해, 최대 변환 채널수는 4개가 된다. 단, 직렬 시퀀서 모드는 두 시퀀서 1,2를 하나의 시퀀서처럼 사용하기 때문에 총 합쳐서 4개일 것이다.

6. ADCCHSELSEQ는 ADC변환의 순서와 관련된 것으로 위에서는 시퀀서1(1,2통합되있음)의 0번인 Gyro를 첫째로, 1번인 Tilt를 두번째 순서로 잡아줬다.

수정이 필요한 사항인것이, 현재 각각의 센서를 어느 핀에 연결했느냐에 따라 CONV0~15사이에서 선택해주어야 한다.

7.CONT_RUN = 1로 인해 Continus run mode로 설정하였다. 한번 변환이 끝나면 자동으로 다음 변환을 한다.

8.SOC_SEQ1에 1을 줌으로써 시퀀서 1에 변환시작신호를 전달하였다.

(굳이 줄 필요가 없다고 생각하는게, 이는 시퀀스에 대한 동작신호라기 보다는 변환강제신호로 볼 수 있다. 신호가 들어가면 0으로 클리어되고 끝나니 말이다.)



'Project > Balancing 28335' 카테고리의 다른 글

Init_Timer  (0) 2014.08.19
GpioInit  (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 십자성군