태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

1. 실습 안내

TMS320F28377D의 Enhanced PWM 모듈이 가진 16비트 타이머를 통해, 주기적인 인터럽트를 발생시켜보고, EPWM 모듈의 인터럽트 소스들과 이벤트 분주(Pre-scale) 기능에 대해 이해합니다.



2. 실습 준비

본 예제는 아래의 개발환경에서 테스트 되었습니다.


1) CCS 버전 : v6.2.0.00050

2) Compiler 버전 : TI v15.12.3.LTS

3) ControlSUITE 버전 : v3.4.1

4) 개발보드 : Delfino 개발보드

5) CPU 모듈 1 : TMS320F28377D-337 모듈 + 전용 어댑터

6) CPU 모듈 2 : TMS320F28377D-176 모듈 + 전용 어댑터

7) 계측장비 : 오실로스코프 (PWM 출력파형 및 인터럽트 발생지점 지시용 트리거 신호 확인용)


* 본 예제는 TMS320F28377D-337 모듈과 TMS320F28377D-176 모듈 모두 실행 가능합니다. 



3. 실습 예제 설치

예제를 실행하기 위해서 TI의 ControlSUITE 설치가 선행되어야 합니다. PC에 ControlSUITE가 설치되어 있지 않다면 아래의 링크를 클릭하여 최신버전의 ControlSUITE를 설치해주세요. (ti.com에 로그인 할 수 있는 아이디 및 패스워드가 필요합니다.)

>> ControlSUITE 다운로드 (클릭)


아래의 링크를 클릭하여 실습 예제를 다운로드 합니다. 예제는 실행형 설치 패키지로 제작되어 있으며, 압축해제 후 실행해주시면 지정된 경로에 자동으로 설치됩니다. (혹, 설치 파일 실행에 문제가 있다면, 관리자 권한으로 실행해보세요.)

>> 실습 예제 다운로드 (클릭)


예제의 설치 경로는 아래와 같습니다.

C:\SyncWorks\DELFINO_EVM_28377D\Example100_Cpu1_V600\EPWM04_1Ch_PWM_Periodic_Interrupts



4. 예제 실행

PC에 설치된 Code Composer Studio(이하 CCS)를 실행하고, Workspace 경로를 아래와 같이 설정합니다.

>> C:\SyncWorks\DELFINO_EVM_28377D\Example100_Cpu1_V600


 



CCS가 실행되면 위의 예제 설치경로를 참조하여 예제 프로젝트를 불러들인 후 컴파일하여 실행해보세요.


예제를 실행한 후 아래의 안내 이미지를 참고하여, Delfino 개발보드 우측에 인출된 핀-헤더 CN9110의 25번 포트(EPWM4A)와 29번 포트(ADCSOCBO)를 관찰하시면 PWM 파형과 현재의 예제 옵션설정에서의 인터럽트 발생지점을 지시하는 ADCSOCBO 포트 신호출력(Active Low)을 확인하실 수 있습니다. (Oscilloscope의 Probe 접지는 GND 포트에 연결하세요.)


 


예제의 메인 소스파일인 'EPWM04_1Ch_PWM_Periodic_Interrupts.c' 파일의 상단에는 전처리정의문으로 구성된 여러 가지 옵션 항목들이 있습니다. 이를 통해 여러 가지 옵션들을 달리 설정되고 그에 맞는 코드들이 선택적으로 컴파일되게 됩니다.


첫번째 옵션은 인터럽트 생성에 사용할 타이머 이벤트 종류를 선택하는 것 입니다.


 


22번 줄에 정의된 'INTSOURCE' 항목 뒤에 원하시는 이벤트 종류를 정의하시면 그에 맞는 코드들을 선택적으로 컴파일하여 결과를 확인하실 수 있습니다. (기본값은 CNTRZERO 옵션 입니다.)


CNTRZERO : 타이머 카운터 값이 0과 일치할 때

CNTRPRD : 타이머 카운터 값이 주기값(Period, TBPRD)과 일치할 때

CNTRZEROPRD : 타이머 카운터 값이 0과 일치하거나 주기값과 일치할 때

CNTRUCMPACMPC : 타이머가 상승계수 하는 도중, 비교 레지스터 A(CMPA) 혹은 C(CMPC)와 일치할 때

CNTRDCMPACMPC : 타이머가 하강계수 하는 도중, 비교 레지스터 A(CMPA) 혹은 C(CMPC)와 일치할 때

CNTRUCMPBCMPD : 타이머가 상승계수 하는 도중, 비교 레지스터 B(CMPB) 혹은 D(CMPD)와 일치할 때

CNTRDCMPBCMPD : 타이버가 하강계수 하는 도중, 비교 레지스터 B(CMPB) 혹은 D(CMPD)와 일치할 때


또한, INTSOURCE 옵션 설정은 비교 레지스터 선택 옵션인 'COMPAREREGSEL' 과도 연관이 있습니다.


 


COMPAREREGSEL 옵션이 'CMPACMPB' 일 경우, INTSOURCE 옵션들 중 비교 레지스터와 관련된 옵션들이 비교 레지스터 A와 B를 기준으로 하게되고, 'CMPCCMPD' 옵션으로 설정한다면 비교 레지스터 C와 D를 기준으로 하게 됩니다. (참고 : 비교 레지스터 C와 D는 PWM 출력파형의 Duty-ratio 조절에 사용되지 않으며, 오직 이벤트 발생 기준으로만 활용될 수 있습니다. PWM 출력파형 제어에는 비교 레지스터 A와 B가 사용됩니다.)


예제에서는 인터럽트 발생 후 프로그램 카운터가 서비스루틴 EPwm4Isr( ) 으로 분기하면 가장 먼저 EPWM 모듈의 16비트 타이머 카운터 값과 현재의 타이머 계수방향을 변수에 저장하도록 하고 있습니다. 이 값들을 각 비교 레지스터나 주기 레지스터의 값과 비교해보시면, INTSOURCE 옵션 선택에 따라 실제로 해당 시점에서 인터럽트가 발생했는지를 확인해보실 수 있습니다.


EPwmTimerValueAtIsrFirstLine : 타이머 카운터 값 저장용 변수

EPwmTimerDirectionAtIsrFirstLine : 타이머 계수방향 저장용 변수 (1: 상승계수 , 0: 하강계수)


 


위의 예는 INTSOURCE 옵션을 CNTRZERO로 설정하여 타이머 카운터 값이 0과 일치할 때 인터럽트를 발생시키도록 한 후 주요 변수 및 레지스터들을 관찰한 것 입니다. EPwmTimerValueAtIsrFirstLine 변수의 값이 21 인 것의 의미는 타이머 카운터가 0과 일치하는 시점에 인터럽트가 발생되고 Context Save 과정에 그만큼의 시간이 걸렸다는 것을 의미합니다. 예제에서 EPWM 타이머가 사용하는 클럭과 CPU 클럭이 동일하게 설정되어 있으므로 CPU 클럭 기준 21 Cycle 만큼의 시간, 약 105nsec 만큼의 시간이 인터럽트 서비스 루틴 분기 전 Context Save 과정에서 소비되었다고 볼 수 있습니다. Context Save 과정이 CPU 클럭 기준 21~24 Cycle 정도 소비되므로 이를 기준으로 INTSOURCE 옵션을 변경해가면서 EPwmTimerValueAtIsrFirstLine 변수의 값과 각 비교 레지스터들 및 주기 레지스터의 값을 비교해보시면 인터럽트가 어느 시점에서 발생되었는지를 추측해보실 수 있습니다. EPwmTimerDirectionAtIsrFirstLine 변수에는 타이머 카운터 값이 EPwmTimerValueAtIsrFirstLine 변수에 기록되는 시점에서의 타이머 계수방향이 저장되므로 이 값도 참조하세요.  


그 다음으로는 EPWM 이벤트 분주에 사용할 카운터 그룹을 선택하는 옵션이 있습니다.


 


PRESCALESCHEME 항목을 'PRESCALESCHEME1'로 설정하면, 이전의 TMS320F2833x 칩 EPWM 모듈과 동일하게 타이머에 의해 발생되는 이벤트를 '매 3회마다' 까지 분주할 수 있습니다.


하지만, 'PRESCALESCHEME2' 를 선택한다면, '매 15회마다'까지로 최대 이벤트 분주 설정을 확장할 수 있습니다. 예를 들어 PWM 주파수가 20kHz 이고 타이머 카운터 값이 0과 일치할 때 인터럽트를 발생시키도록 관련 레지스터들을 설정했다고 가정해봅시다. 그와 동시에 이벤트 분주 관련 레지스터를 조작하여 '매 10회마다' 로 설정했다면 실제로 인터럽트가 발생되는 주기는 어떻게 될까요? 타이머 및 인터럽트 설정에 따라 20kHz 주기로 인터럽트가 발생되어야 하지만 이벤트 분주를 통해 실제 인터럽트의 발생을 '매 10회마다'로 정했기에 인터럽트의 발생 주기는 2kHz가 됩니다. 이런 EPWM 모듈의 이벤트 분주 기능을 활용하면 PWM의 주파수는 아주 높게 가져가면서 보다 낮은 주기로 인터럽트를 발생시키는 일이 아주 쉽게 처리됩니다.


더욱이 TMS320F2833x 에 내장된 EPWM 모듈 회로까지는 '매 3회마다' 까지로 이벤트 분주 폭이 제한적이었지만, 그 이후에 출시된 최신 28X 칩들에는 더 개선된 EPWM 모듈이 내장되면서 이벤트 분주 폭이 0~15 까지 늘어났습니다.


INTPERIOD 옵션을 변경하여 결과를 확인해보세요. 예제가 실제 인터럽트 발생 시점과 동일한 시점에 칩 외부로 ADC SOC 신호를 출력하도록 구성되어 있으므로 오실로스코프를 이용하여 EPWM4A 포트와 ADCSOCBO 포트를 함께 관찰하면 이벤트 분주 설정 변화에 따라 실제 인터럽트 발생 주기가 어떻게 달라지는지 눈으로 확인하실 수 있습니다.


 



아래의 파형 예시는 INTSOURCE 옵션은 CNTRPRD로, INTPERIOD 옵션은 FIRST로 설정한 경우를 가정하여 EPWM4A 포트로 출력되는 파형과 인터럽트 발생시점에 ADCSOCBO 포트로 출력되는 파형을 나타낸 것 입니다. (EPWM4A 포트의 출력은 타이머 카운터 값이 0과 일치하는 시점마다 반전(Toggle)되도록 설정되어 있습니다.)


예제 프로그램 상의 각종 옵션들을 변경하면서 계측기(Oscilloscope)로 파형을 관찰해보세요.





 

Posted by 남상일

댓글을 달아 주세요

티스토리 툴바