본문 바로가기
MCU/C2000

[TMS320F28377D] SDFM 사용법 : Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 18.
반응형

1. TMS320F28377D SDFM 모듈 개요

TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 고정밀 아날로그-디지털 변환을 위한 Sigma-Delta Filter Module(SDFM)을 제공합니다. SDFM은 고해상도 데이터 수집을 가능하게 하여 모터 제어, 전력 변환, 센서 인터페이스 등에 적합합니다. 이 문서에서는 SDFM 모듈의 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 돕겠습니다.

SDFM 주요 사양

  • 채널: 최대 8개 독립 SDFM 채널(SD1~SD8)
  • 클럭 소스: 시스템 클럭(SYSCLK, 최대 200MHz) 또는 외부 클럭
  • 해상도: 최대 24비트
  • 샘플링 속도: 최대 1.28MSPS
  • 필터: Sinc3, Sinc2, Sinc1, Fast-Settling
  • 오버샘플링 비율(OSR): 32, 64, 128, 256
  • 주요 기능:
    •    고해상도 아날로그-디지털 변환
    •    데이터 필터링 및 데시메이션
    •    비교기 인터럽트 및 트리거
    •    PWM 동기화 지원
    •    Manchester 코딩 지원
  • 인터럽트: 데이터 준비 완료, 비교기 이벤트, 에러 조건

2. SDFM Bitfield 설정 상세

SDFM 모듈의 레지스터는 F2837xD_sdfm.h 헤더 파일을 통해 Bitfield 구조로 정의되어 있어 코드 가독성과 유지보수성을 높입니다. 주요 레지스터는 다음과 같습니다:

2.1 SDCTL (Sigma-Delta 제어 레지스터)

  • bit.SDEN: SDFM 활성화 (1: 활성화)
  • bit.MFE: Manchester Failure Enable (1: 활성화)
  • bit.MIE: Manchester Interrupt Enable (1: 활성화)

2.2 SDDFPARM (데이터 필터 파라미터 레지스터)

  • bit.SST: Sinc 필터 타입 (0: Fast, 1: Sinc1, 2: Sinc2, 3: Sinc3)
  • bit.DOSR: 데이터 오버샘플링 비율 (0~255)
  • bit.FEN: 필터 활성화 (1: 활성화)
  • bit.SDSYNCEN: PWM 동기화 활성화 (1: 활성화)

2.3 SDCMPH (비교기 High Threshold 레지스터)

  • bit.HLT: 고 임계값 설정 (16비트)
  • bit.CEVT1: 비교기 이벤트 1 활성화 (1: 활성화)

2.4 SDCMPL (비교기 Low Threshold 레지스터)

  • bit.LLT: 저 임계값 설정 (16비트)
  • bit.CEVT2: 비교기 이벤트 2 활성화 (1: 활성화)

2.5 SDINT (인터럽트 제어 레지스터)

  • bit.DRINTEN: 데이터 준비 인터럽트 활성화 (1: 활성화)
  • bit.CMPHINTEN: 고 임계값 인터럽트 활성화 (1: 활성화)
  • bit.CMPLINTEN: 저 임계값 인터럽트 활성화 (1: 활성화)

3. SDFM 설정 절차

SDFM 모듈을 설정하려면 다음 단계를 따릅니다:

  1. 시스템 초기화:
    •    InitSysCtrl() 호출로 시스템 클럭 및 PLL 초기화
    •    인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
  2. SDFM 클럭 활성화:
    •    CpuSysRegs.PCLKCR3.bit.SD1 = 1로 SDFM1 클럭 활성화
    •    보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
  3. GPIO 설정:
    •    SDFM 데이터 및 클럭 핀 설정 (예: GPIO24~27 for SD1)
    •    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3 등으로 설정
  4. SDFM 설정:
    •    SD1Regs.SDCTL.bit.SDEN = 1로 모듈 활성화
    •    SDDFPARM1.bit.SST로 필터 타입 설정 (예: Sinc3)
    •    SDDFPARM1.bit.DOSR로 오버샘플링 비율 설정 (예: 128)
    •    SDDFPARM1.bit.FEN = 1로 필터 활성화
  5. 비교기 설정 (필요 시):
    •    SDCMPH1.bit.HLT와 SDCMPL1.bit.LLT로 임계값 설정
    •    SDCMPH1.bit.CEVT1 또는 SDCMPL1.bit.CEVT2로 이벤트 활성화
  6. 인터럽트 설정 (필요 시):
    •    SDINT1.bit.DRINTEN = 1로 데이터 준비 인터럽트 활성화
    •    PIE 벡터 테이블에 인터럽트 서비스 루틴 등록
  7. 모듈 실행:
    •    SDDFPARM1.bit.SDSYNCEN로 PWM 동기화 설정 (필요 시)
    •    데이터 수집 시작

4. SDFM 설정 고려사항

  • 클럭 설정: SYSCLK(200MHz)에서 SDCLK 설정 (예: 20MHz)
  • OSR: 높은 OSR(예: 256)는 해상도 증가, 샘플링 속도 감소
  • 필터 선택: Sinc3는 고해상도, Fast는 빠른 응답
  • PWM 동기화: 다중 채널 동기화를 위해 SDDFPARM1.bit.SDSYNCEN 사용
  • Manchester 코딩: 외부 Sigma-Delta 모듈 사용 시 SDCTL.bit.MFE 활성화
  • 인터럽트: 실시간 데이터 처리를 위해 SDINT 설정

5. 실용적인 SDFM 예제 코드 (Bitfield 구조)

아래는 SDFM 모듈을 Bitfield 구조로 설정한 4개의 실용적인 예제 코드입니다. 각 예제는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.

5.1 예제 1: 기본 SDFM 데이터 수집

// File: sdfm_basic.c
// Description: TMS320F28377D SDFM 기본 데이터 수집 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // SDFM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
    EDIS;

    // SDFM1 설정 (Bitfield 사용)
    EALLOW;
    Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
    Sdfm1Regs.SDDFPARM1.bit.SST = 3; // Sinc3 필터
    Sdfm1Regs.SDDFPARM1.bit.DOSR = 128; // OSR = 128
    Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
    Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 0; // PWM 동기화 비활성화
    EDIS;

    for(;;) {
        // 데이터 읽기
        Uint32 data = Sdfm1Regs.SDDATA1.bit.DATA; // 필터 데이터 읽기
        // 데이터 처리 (예: 디버깅용 변수 저장)
    }
}

설명:

  • 기능: SDFM1 채널 1로 아날로그 데이터를 수집 (Sinc3 필터, OSR=128).
  • 설정: Sinc3 필터, OSR=128, PWM 동기화 비활성화.
  • GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO31(LED).
  • 출력: Sdfm1Regs.SDDATA1.bit.DATA에서 데이터 읽기, 정상 동작 시 LED ON.

5.2 예제 2: 비교기 인터럽트를 사용한 임계값 감지

// File: sdfm_comparator_interrupt.c
// Description: TMS320F28377D SDFM 비교기 인터럽트 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

volatile Uint16 threshold_exceeded = 0; // 임계값 초과 플래그

__interrupt void sdfm1_isr(void)
{
    threshold_exceeded = 1; // 임계값 초과 감지
    GpioDataRegs.GPBTOGGLE.bit.GPIO31 = 1; // LED 토글
    Sdfm1Regs.SDINTFLG.bit.CMPH1 = 1; // 인터럽트 플래그 클리어
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP8; // PIE 그룹 8 ACK
}

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // 인터럽트 벡터 설정
    EALLOW;
    PieVectTable.SD1_INT = &sdfm1_isr; // SDFM1 인터럽트 벡터 설정
    EDIS;

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // SDFM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
    EDIS;

    // SDFM1 설정 (Bitfield 사용)
    EALLOW;
    Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
    Sdfm1Regs.SDDFPARM1.bit.SST = 3; // Sinc3 필터
    Sdfm1Regs.SDDFPARM1.bit.DOSR = 128; // OSR = 128
    Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
    Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 0; // PWM 동기화 비활성화

    // 비교기 설정
    Sdfm1Regs.SDCMPH1.bit.HLT = 0x7FFF; // 높은 임계값 (예: 50% 최대)
    Sdfm1Regs.SDCMPH1.bit.CEVT1 = 1; // 비교기 이벤트 1 활성화
    Sdfm1Regs.SDINT.bit.CMPHINTEN = 1; // 고 임계값 인터럽트 활성화

    // 인터럽트 활성화
    PieCtrlRegs.PIEIER8.bit.INTx1 = 1; // PIE 그룹 8, SDFM1 인터럽트 활성화
    IER |= M_INT8; // CPU 인터럽트 8 활성화
    EDIS;

    EINT; // 글로벌 인터럽트 활성화

    for(;;) {
        // 데이터 읽기
        Uint32 data = Sdfm1Regs.SDDATA1.bit.DATA; // 필터 데이터 읽기
        // 데이터 처리 (예: 디버깅용 변수 저장)
    }
}

설명:

  • 기능: SDFM1 채널 1로 데이터 수집, 높은 임계값 초과 시 인터럽트 발생 및 LED 토글.
  • 설정: Sinc3 필터, OSR=128, 높은 임계값 0x7FFF, 비교기 인터럽트 활성화.
  • GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO31(LED).
  • 출력: 데이터 초과 시 LED 토글, 정상 동작 시 데이터 읽기.

5.3 예제 3: PWM 동기화를 사용한 SDFM 데이터 수집

// File: sdfm_pwm_sync.c
// Description: TMS320F28377D SDFM PWM 동기화 데이터 수집 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // SDFM1 및 ePWM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
    EDIS;

    // ePWM1 설정 (동기화 신호 제공)
    EALLOW;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_OUT; // 동기화 신호 출력
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

    // SDFM1 설정 (Bitfield 사용)
    Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
    Sdfm1Regs.SDDFPARM1.bit.SST = 2; // Sinc2 필터
    Sdfm1Regs.SDDFPARM1.bit.DOSR = 64; // OSR = 64
    Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
    Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 1; // PWM 동기화 활성화
    Sdfm1Regs.SDSYNC1.bit.SDSYNCSEL = 0; // ePWM1 동기화 신호 선택
    EDIS;

    for(;;) {
        // 데이터 읽기
        Uint32 data = Sdfm1Regs.SDDATA1.bit.DATA; // 필터 데이터 읽기
        // 데이터 처리 (예: 디버깅용 변수 저장)
    }
}

설명:

  • 기능: SDFM1 채널 1로 ePWM1과 동기화된 데이터 수집 (Sinc2 필터, OSR=64).
  • 설정: Sinc2 필터, OSR=64, ePWM1 동기화 활성화, ePWM1 100kHz PWM.
  • GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO0(ePWM1A), GPIO31(LED).
  • 출력: ePWM1 동기화된 데이터 읽기, 정상 동작 시 LED ON.

5.4 예제 4: 다중 SDFM 채널 설정

// File: sdfm_multi_channel.c
// Description: TMS320F28377D SDFM 다중 채널 데이터 수집 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // GPIO24를 SD1_D1로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3; // GPIO25를 SD1_C1로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3; // GPIO26를 SD1_D2로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 3; // GPIO27를 SD1_C2로 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // SDFM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR3.bit.SD1 = 1; // SDFM1 모듈 클럭 활성화
    EDIS;

    // SDFM1 채널 1 설정 (Bitfield 사용)
    EALLOW;
    Sdfm1Regs.SDCTL.bit.SDEN = 1; // SDFM1 활성화
    Sdfm1Regs.SDDFPARM1.bit.SST = 3; // Sinc3 필터
    Sdfm1Regs.SDDFPARM1.bit.DOSR = 128; // OSR = 128
    Sdfm1Regs.SDDFPARM1.bit.FEN = 1; // 필터 활성화
    Sdfm1Regs.SDDFPARM1.bit.SDSYNCEN = 0; // PWM 동기화 비활성화

    // SDFM1 채널 2 설정 (Bitfield 사용)
    Sdfm1Regs.SDDFPARM2.bit.SST = 2; // Sinc2 필터
    Sdfm1Regs.SDDFPARM2.bit.DOSR = 64; // OSR = 64
    Sdfm1Regs.SDDFPARM2.bit.FEN = 1; // 필터 활성화
    Sdfm1Regs.SDDFPARM2.bit.SDSYNCEN = 0; // PWM 동기화 비활성화
    EDIS;

    for(;;) {
        // 데이터 읽기
        Uint32 data1 = Sdfm1Regs.SDDATA1.bit.DATA; // 채널 1 데이터
        Uint32 data2 = Sdfm1Regs.SDDATA2.bit.DATA; // 채널 2 데이터
        // 데이터 처리 (예: 디버깅용 변수 저장)
    }
}

설명:

  • 기능: SDFM1 채널 1(Sinc3, OSR=128)과 채널 2(Sinc2, OSR=64)로 동시 데이터 수집.
  • 설정: 채널 1은 Sinc3, OSR=128; 채널 2는 Sinc2, OSR=64; PWM 동기화 비활성화.
  • GPIO: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO26(SD1_D2), GPIO27(SD1_C2), GPIO31(LED).
  • 출력: 두 채널 데이터 동시 읽기, 정상 동작 시 LED ON.

6. 사용 방법

6.1 환경 설정

  • C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx에서 라이브러리 다운로드
  • CCS 프로젝트: TMS320F28377D 타겟으로 프로젝트 생성, F28x_Project.h 포함
  • 링커 파일: device_support\f2837xd 폴더에서 링커 파일 추가

6.2 코드 실행

  •    각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
  •    원하는 예제만 실행되도록 다른 코드 주석 처리

6.3 하드웨어 준비

  • SDFM 입력: GPIO24(SD1_D1), GPIO25(SD1_C1), GPIO26(SD1_D2), GPIO27(SD1_C2)에 Sigma-Delta 모듈 연결
  • LED: GPIO31에 LED 연결 (정상 동작 확인용)
  • 외부 클럭: 필요 시 SD1_C1, SD1_C2에 외부 클럭 소스 연결
  • PWM 동기화: 예제 3의 경우 GPIO0(ePWM1A)에 오실로스코프 연결

6.4 디버깅

  • CCS Expressions 창: Sdfm1Regs.SDDATA1.bit.DATA, Sdfm1Regs.SDDATA2.bit.DATA로 데이터 확인
  • 레지스터 점검: Sdfm1Regs.SDCTL, Sdfm1Regs.SDDFPARM1, Sdfm1Regs.SDDFPARM2 모니터링
  • 인터럽트 확인: Sdfm1Regs.SDINTFLG로 이벤트 상태 점검

7. 추가 팁

  • 캘리브레이션: Device_cal() 호출로 클럭 보정
  • 노이즈 감소: 아날로그 입력에 저역통과 필터 사용
  • C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\sdfm
  • 문제 해결:
    •    데이터 오류: SDCTL.bit.SDEN, SDDFPARM1.bit.FEN 확인
    •    인터럽트 실패: SDINT.bit.CMPHINTEN, SDINT.bit.DRINTEN 확인
    •    동기화 문제: SDDFPARM1.bit.SDSYNCEN, SDSYNC1.bit.SDSYNCSEL 확인
  • TI 리소스: TI E2E 포럼, C2000Ware 예제

8. 결론

이 문서는 TMS320F28377D SDFM 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 고해상도 아날로그-디지털 변환 애플리케이션에 쉽게 적용할 수 있도록 구성했습니다. 기본 데이터 수집, 비교기 인터럽트, PWM 동기화, 다중 채널 설정 예제를 통해 다양한 애플리케이션(모터 제어, 센서 인터페이스 등)에 활용 가능합니다.

키워드: TMS320F28377D, SDFM, C2000, Sigma-Delta, 마이크로컨트롤러, Code Composer Studio, 고해상도 ADC, Sinc 필터, 오버샘플링, PWM 동기화, Manchester 코딩

반응형