실험용 참고 PDF입니다.
실험의 Keyword는 아래와 같습니다.
-디지털 시스템과 아날로그 시스템
-2,8,10,16진수
-TTL
-부울함수(Boolean function), 논리회로(Logic circuit)
-바이너리 논리관계
-디지털 IC
-논리 함수와 진리표
-소자의 출력(Active high, Active low)
?)Open collector
실험용 참고 PDF입니다.
실험의 Keyword는 아래와 같습니다.
-디지털 시스템과 아날로그 시스템
-2,8,10,16진수
-TTL
-부울함수(Boolean function), 논리회로(Logic circuit)
-바이너리 논리관계
-디지털 IC
-논리 함수와 진리표
-소자의 출력(Active high, Active low)
?)Open collector
예제 및 레퍼런스를 참고하여 일부만 설명하겠다.
참고예제[초기화]
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 신호를 사용불가능하게 한다. |
3 | PRDLD | Active Period Register Load From Shadow Register Select 0 : TBCTR(time-base counter)값이 0에 도달했을 때, 주기 레지스터(period register : TBPRD)의 값을 쉐도우 레지스터를 통해 로드하게 한다. 1 : 쉐도우 레지스터를 쓰지않고 즉시 TBPRD로부터 값을 읽어들인다. TBPRD가 동작중이라도 직접 접근하여 읽고 쓰기를 한다. |
2 | 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 아래의 설정을 통해 만약 카운터의 모드를 바꿀 경우 다음 edge부터 효과를 발휘하고 현재 카운터 값은 모드 변경전에 증가 또는 감소 된다. |
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
9 |
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는 현재 쉐도우 값에 덮어쓰기를 하게된다. |
8 |
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는 현재 쉐도우 값에 덮어쓰기를 하게된다. |
6 |
SHDWBMODE |
Counter-compare B(CMPB) Register Operating Mode 0 : 쉐도우 모드. double buffer로 동작한다. 모든 쓰기는 CPU를 통하여 shadow register에 접근한다. 1 : immediate 모드(즉시 모드). |
4 |
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
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 |
========================================================================================================
초기화부터 간단히 살펴보자. 우선 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;
첨부한 벡터테이블을 참고하라
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 */
}
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 |