본문 바로가기
Power Electronics

디지탈 전력변환 -제3장 전력변환 보호·위치 측정 주변장치 — CMPSS, DAC, eQEP, SDFM

by linuxgo 2026. 6. 21.

3.1 서론 

1장에서 ePWM과 ADC를 다루며 우리는 전력 변환기의 가장 근본적인 두 가지 질문에 답했다 — "스위치를 언제 켜고 끌 것인가"와 "전압·전류를 어떻게 측정할 것인가"다. 그런데 실제 전력 변환기를 설계해보면 이 두 가지만으로는 풀리지 않는 문제들이 계속 나타난다.

ADC는 본질적으로 느리다. 1장에서 확인했듯 12비트 모드에서도 변환에 10.5 ADCCLK 사이클이 필요하다. 그런데 과전류 보호처럼 "마이크로초 단위로 반응해야 하는" 상황에서는 ADC가 변환을 마치고 CPU가 그 결과를 읽어 ISR에서 PWM을 끄는 일련의 과정 자체가 너무 느리다. 이 문제를 해결하는 것이 **CMPSS(비교기 서브시스템)**다 — ADC를 거치지 않고 아날로그 신호를 하드웨어에서 직접 비교하여, 위험 수준을 넘는 순간 ePWM을 즉시 차단한다.

또한 ADC는 전압을 측정만 할 뿐 만들어내지는 못한다. CMPSS의 비교 기준점을 동적으로 바꾸고 싶다거나, 외부 회로에 기준 전압을 공급하고 싶을 때는 DAC가 필요하다.

모터 제어로 넘어가면 또 다른 차원의 문제가 등장한다. 회전자의 위치와 속도를 알아야 FOC 같은 벡터 제어를 수행할 수 있는데, 이는 ADC로 측정할 수 있는 양이 아니다. 이를 위한 전용 인터페이스가 eQEP다.

마지막으로, 절연이 필요한 고전압 전력단(예: 3상 인버터의 상전류, 모터 구동단)에서는 일반 ADC 대신 절연된 시그마-델타 변조기와 그 출력을 디코딩하는 SDFM을 사용하는 것이 표준이다.

3.2 CMPSS — 비교기 서브시스템

3.2.1 왜 ADC가 아니라 비교기인가

CMPSS는 첨두 전류 모드 제어, 스위치 모드 전원, 역률 보정, 전압 트립 모니터링 등 전력 응용에 유용한 아날로그 비교기와 지원 회로로 구성된다.

CMPSS의 핵심은 CPU나 인터럽트를 전혀 거치지 않고 동작한다는 점이다. 비교기가 트립 조건을 감지하면, 그 신호는 곧바로 ePWM의 Trip-Zone(1장 1.7.3절에서 다룬 TZ1~TZ6 중 하나)으로 연결되어 하드웨어 차원에서 PWM을 차단한다. 1장에서 계산한 14사이클(70ns)의 인터럽트 레이턴시조차 거치지 않는, 사실상 아날로그 속도의 보호 회로다.

3.2.2 모듈 구성

각 CMPSS 서브시스템은 비교기 2개, 기준 12-bit DAC 2개, 디지털 필터 2개, 그리고 램프 발생기 2개로 구성된다.

구성 요소 수량 명칭
아날로그 비교기 2개 COMPH(High), COMPL(Low)
기준 12-bit DAC 2개 DACH, DACL
디지털 필터 2개 (필터 클록 최대 프리스케일 224)
램프 발생기 2개 RAMPH, RAMPL

F28P65x는 CMPSS1~CMPSS11, 총 11개 모듈을 갖는다. 각 비교기는 양(+)의 입력을 외부 핀에서, 음(-)의 입력을 외부 핀 또는 내장 기준 DAC에서 받는다. 비교 결과는 디지털 필터를 거쳐 스퓨리어스(순간적인 노이즈성) 트립을 제거할 수 있으며, 필터링 없는 출력도 함께 제공된다.

3.2.3 기준 DAC — 비교 임계값을 숫자로 설정하기

CMPSS의 기준 DAC는 비교기의 음(-)입력에 가변 임계 전압을 공급한다. 출력 전압은 다음 공식을 따른다.

$$DACOUT = (1 + DACVALA) \times \frac{DACREF}{4096}$$

여기서 DACVALA는 0~4095 범위의 12-bit 값이며, DACREF는 기준 전압(기본값 VDDA, COMPDACHCTL 레지스터로 VDAC 선택 가능)이다.

과전류 보호에서 상한(DACH)과 하한(DACL)을 모두 사용하는 윈도우 비교 구성을 만들 때는, DACH 값이 항상 DACL 값보다 커야 한다는 제약이 하드웨어 차원에서 존재한다. 또한 DACL을 쓰지 않는 경우 DACLVALS를 반드시 0으로 설정해야 하는데, 이는 두 DAC가 같은 비교기 트립 이벤트에 간섭을 일으킬 수 있기 때문이다.

3.2.4 램프 발생기 — 첨두전류모드 제어의 슬로프 보상

CMPSS의 가장 독특한 기능은 램프 발생기다. 이는 기준 DAC의 값을 매 SYSCLK 사이클마다 일정량씩 증가 또는 감소시켜, 시간에 따라 선형으로 변하는 비교 기준선을 만든다. TRIGSYNC 신호(보통 ePWM 주기 시작)를 받으면 RAMPxSTEPVALA 값이 매 후속 SYSCLK 사이클마다 누적된다.

이 기능이 정확히 필요한 곳이 **첨두 전류 모드 제어(Peak Current Mode Control, PCMC)**다. PCMC는 인덕터 전류가 듀티비 50% 이상에서 본질적으로 불안정해지는 서브하모닉 발진 문제를 갖는데, 이를 해결하는 고전적 기법이 "슬로프 보상(slope compensation)" — 비교 기준선에 인위적인 기울기를 더하는 것이다. CMPSS의 램프 발생기는 이 슬로프 보상을 ADC나 CPU 개입 없이 순수 하드웨어로 생성한다. 램프는 TRIGSYNC 신호에서 RAMPxREFS 값으로 리셋되고, 그 후 매 사이클 RAMPxSTEPVALA만큼 감소(또는 증가)하다가, 비교기가 트립되는 순간(COMPHSTS) 정지한다 — 이는 PCMC의 "피크에서 끄고 다음 주기 시작에서 다시 켠다"는 동작과 정확히 대응한다.

3.2.5 디지털 필터 초기화 절차

디지털 필터의 올바른 초기화는 다음 순서를 따른다.

1. 비교기를 먼저 구성하고 활성화
2. 디지털 필터 파라미터 설정
     SAMPWIN — FIFO 윈도우에서 모니터링할 샘플 수
     THRESH  — 다수결 판정에 필요한 임계값
     CLKPRESCALE — 필터 클록 프리스케일 값
3. FILINIT으로 디지털 FIFO 윈도우의 샘플 초기화
4. 래치 경로를 사용한다면 COMPSTSCLR로 COMPSTS 래치 클리어
5. CTRIP / CTRIPOUT 신호 경로 구성
6. 목적지 모듈(ePWM, GPIO 등)이 필터링된 신호를 받도록 구성

3.2.6 Driverlib 코드 — 과전류 보호 비교기 설정

/*==============================================================================
 * 파일   : cmpss_init.c
 * 목적   : CMPSS1 COMPH를 이용한 과전류 보호 — 비교기 임계값 트립 시
 *          ePWM1을 즉시 차단(Trip-Zone)
 *============================================================================*/

#include "driverlib.h"
#include "device.h"

/* DACOUT = (1+DACVALA) x DACREF/4096, DACREF=VDDA=3.3V 가정
 * 과전류 트립 기준: 2.0V (DACVALA 역산)                                */
#define CMPSS1_TRIP_DACVAL  2483U  /* (2.0/3.3 x 4096) - 1 ~= 2483 */

void CMPSS1_OvercurrentInit(void)
{
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1);

    /* 비교기 음(-) 입력 소스: 내장 기준 DAC
     * 양(+) 입력은 별도 설정 없이 외부 핀이 기본 경로                    */
    CMPSS_configHighComparator(CMPSS1_BASE, CMPSS_INSRC_DAC);

    /* 기준 DAC: DACREF=VDDA */
    CMPSS_configDACHigh(CMPSS1_BASE, CMPSS_DACREF_VDDA);
    CMPSS_setDACValueHigh(CMPSS1_BASE, CMPSS1_TRIP_DACVAL);

    /* 디지털 필터: 다수결 판정 - 8 샘플 윈도우 중 6개 이상 같은 값일 때만
     * 트립 인정(스퓨리어스 노이즈 트립 방지)                            */
    CMPSS_configFilterHigh(CMPSS1_BASE,
                           0U,   /* samplePrescale: SYSCLK 그대로 사용 */
                           8U,   /* sampleWindow: 8 샘플 */
                           6U);  /* threshold: 6개 이상 일치 시 트립   */
    CMPSS_initFilterHigh(CMPSS1_BASE);

    /* COMPH 트립 출력 소스: 디지털 필터 출력 사용 */
    CMPSS_configOutputsHigh(CMPSS1_BASE, CMPSS_TRIPOUT_FILTER);

    CMPSS_enableModule(CMPSS1_BASE);

    /* COMPSS1 COMPH 출력은 이후 ePWM X-BAR 설정을 통해
     * ePWM1의 TZ 입력으로 라우팅한다 (1장 1.7.3절 TZ1~TZ6 참조).      */
}

 

3.3 버퍼드 DAC

3.3.1 CMPSS DAC와의 차이

F28P65x는 CMPSS 내부의 "기준 DAC"와는 별개로, 외부 핀으로 실제 출력 가능한 범용 버퍼드 DAC를 갖는다. 버퍼드 DAC는 DACA와 DACC, 정확히 2개 인스턴스만 존재한다(DACB는 없다).

버퍼드 DAC의 출력 공식은 CMPSS 기준 DAC와 미묘하게 다르다 — +1이 없다.

$$DACOUT = DACVALA \times \frac{DACREF}{4096}$$

이 차이는 사소해 보이지만, CMPSS 코드를 그대로 복사해 버퍼드 DAC에 사용하면 출력 전압이 미세하게 어긋나는 원인이 된다.

3.3.2 게인 모드 — VDDA를 넘어설 수 없는 이유

내부 기준 전압을 사용할 때 x1/x2 게인 모드를 지원하지만, x2 게인 모드를 켜더라도 출력 전압이 VDDA(3.3V)를 초과하는 것은 물리적으로 불가능하다. 지원되는 조합은 다음과 같다.

레퍼런스 소스 레퍼런스 전압 게인 모드 최대 DAC 출력  지원 여부
외부 VDAC 2.5V x1 2.5V 지원
내부 1.65V 1.65V x1 1.65V 미지원
내부 1.65V 1.65V x2 3.3V 지원
내부 2.5V 2.5V x1 2.5V 지원
외부 VREFHI 2.5V x1 2.5V 지원

실무에서는 3.3V 풀스케일이 필요하면 "내부 1.65V 기준 + x2 게인"을, 2.5V 풀스케일이면 "내부 2.5V 기준 + x1 게인"을 사용하는 것이 권장 경로다.

3.3.3 초기화 순서

1. 버퍼드 DAC 클록 활성화
2. DACREFSEL로 DACREF 설정
3. DACOUTEN으로 버퍼드 DAC 파워업
4. 전압 출력 전 파워업 시간 대기 (정확한 시간은 데이터시트 참조)
5. (예측 가능한 동작을 위한 추가 설정)

3.3.4 Driverlib 코드 — 슬로프 보상 기준 전압 출력

/*==============================================================================
 * 파일   : dac_init.c
 * 목적   : DACA를 이용해 외부 아날로그 회로에 기준 전압 공급
 *          (예: 외부 슬로프 보상 회로, 외부 비교기 기준)
 *============================================================================*/

#include "driverlib.h"
#include "device.h"

void DACA_Init(void)
{
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACA);

    /* 내부 2.5V 기준, x1 게인 → 최대 출력 2.5V */
    DAC_setReferenceVoltage(DACA_BASE, DAC_REF_ADC_VREFHI);
    DAC_setGainMode(DACA_BASE, DAC_GAIN_ONE);

    DAC_enableOutput(DACA_BASE);
    DEVICE_DELAY_US(10U);  /* 파워업 대기 — 정확한 시간은 데이터시트 참조 */

    /* DACOUT = DACVALA x DACREF / 4096 (CMPSS와 달리 +1 없음) */
    DAC_setShadowValue(DACA_BASE, 2048U);  /* 약 1.25V (중간값) */
}

 

3.4 eQEP — 모터 위치/속도 측정

3.4.1 직교 신호에서 위치를 얻는 원리

증분형 인코더는 디스크에 새겨진 슬롯을 통해 두 개의 광검출 신호 QEPA·QEPB를 만들어내며, 이 둘은 기계적으로 1/4 라인 피치만큼 어긋나 있어 90도 위상차를 갖는다. 대부분의 인코더에서 시계 방향 회전은 QEPB보다 QEPA가 먼저 양(+)이 되는 것으로 정의되며, 반시계 방향은 그 반대다.

eQEP는 QEPA·QEPB 두 신호의 모든 에지(상승·하강 둘 다)를 감지하여 위치 카운터를 증감시킨다. 이로써 인코더 자체의 분해능보다 4배 높은 분해능을 얻는다. 예를 들어 1000선(line) 인코더는 eQEP를 거치면 회전당 4000 카운트의 위치 분해능을 제공한다.

3.4.2 속도 추정 — 두 가지 공식과 그 트레이드오프

위치 센서로부터 속도를 추정하는 방법은 크게 두 가지다.

방법 1 — 위치차분법(주기적 샘플링):

$$v(k) = \frac{x(k) - x(k-1)}{T} = \frac{\Delta x}{T}$$

방법 2 — 시간차분법(엣지 캡처):

$$v(k) = \frac{X}{t(k) - t(k-1)} = \frac{X}{\Delta t}$$

이 두 식에는 트레이드오프가 있다. 500선 인코더를 400Hz로 샘플링하는 경우(방법 1), 회전당 2000카운트 분해능이지만 12rpm 미만에서는 속도 추정값이 0으로 오판될 수 있다 — 한 샘플링 주기 동안 카운트 변화가 전혀 감지되지 않기 때문이다. 반대로 고속 영역에서는 시간차분법(방법 2)이 타이머 분해능의 한계로 오차가 커진다. 따라서 저속에서는 방법 2, 고속에서는 방법 1로 전환하는 하이브리드 전략이 실무 표준이며, eQEP는 이를 위해 두 방법 모두를 하드웨어로 지원한다 — 방법 1은 QPOSCNT(위치 카운터), 방법 2는 **eQEP 엣지 캡처 유닛(QCAP)**이 담당한다.

3.4.3 입력 모드 — 직교 신호가 아닌 인코더도 지원

모든 인코더가 90도 위상차 직교 신호를 내는 것은 아니다. QDECCTL[QSRC]로 선택 가능한 4가지 입력 모드가 있다.

모드 동작
Quadrature-count QEPA·QEPB 위상차로 방향·클록 자동 생성 (표준 직교 인코더)
Direction-count QEPA=클록, QEPB=방향을 외부에서 직접 제공
Up-count QEPA만 사용, 카운터 방향 고정 업카운트(주파수 측정용)
Down-count QEPA만 사용, 카운터 방향 고정 다운카운트

3.4.4 위치 카운터 리셋 모드

QEPCTL[PCRM] 레지스터로 위치 카운터(QPOSCNT)가 언제 0으로 리셋될지 4가지 모드 중 선택할 수 있다.

PCRM=00 (인덱스 이벤트 리셋): 매 인덱스 펄스마다 0으로 리셋
                              — 절대 기계 기준점이 있는 경우
PCRM=01 (최대값 리셋):        QPOSMAX 도달 시 0으로 리셋(오버플로/언더플로)
                              — 연속 회전 위치 누적이 필요한 경우
PCRM=10 (최초 인덱스만 리셋): 첫 인덱스에서만 리셋, 이후는 PCRM=01과 동일
PCRM=11 (단위시간 리셋):      유닛 타이머 타임아웃마다 리셋
                              — 주파수 측정 전용

전력 변환 응용에서 BLDC/PMSM 모터 제어에 흔히 쓰이는 모드는 PCRM=01이다. 회전자가 여러 바퀴 연속 회전해도 QPOSCNT가 끊김 없이 누적되어, FOC의 전기각 계산에 바로 사용할 수 있기 때문이다.

3.4.5 위치 비교 유닛 — 하드웨어 동기 신호 생성

QPOSCMP 레지스터에 목표 위치값을 설정해두면, 위치 카운터가 그 값을 통과하는 순간 동기 펄스(PCSOUT)가 자동 생성된다. 이는 특정 회전 각도에서 ADC 샘플링을 트리거하거나, 정해진 위치에서 다른 주변장치에 신호를 보낼 때 CPU 개입 없이 활용할 수 있다.

3.4.6 입력 소스 다중화 — SinCos 트랜스듀서 디코딩

eQEP의 QEPA/QEPB/QEPI 입력은 단순 GPIO 핀만이 아니라 CMPSS의 비교기 출력이나 ePWM X-BAR에서도 받을 수 있다(QEPASEL 등 레지스터로 선택). 이를 활용하면 리졸버/SinCos 트랜스듀서의 아날로그 사인·코사인 신호를 ADC로 디지털화한 뒤, CMPSS로 그 부호를 비교하여 eQEP에 직교 신호 형태로 공급할 수 있다. 이는 광학식 인코더 없이도 eQEP의 위치 추적 로직을 그대로 재사용할 수 있게 해준다.

3.4.7 Driverlib 코드 — PMSM 위치/속도 측정

/*==============================================================================
 * 파일   : eqep_init.c
 * 목적   : eQEP1을 이용한 PMSM 회전자 위치 측정 (1000선 인코더 가정)
 *          연속 회전 누적(PCRM=01) + 저속 보완용 엣지 캡처
 *============================================================================*/

#include "driverlib.h"
#include "device.h"

#define ENCODER_LINES        1000U
#define QPOSMAX_VALUE        (ENCODER_LINES * 4U - 1U)  /* 4x 분해능 → 3999 */

void EQEP1_Init(void)
{
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP1);

    /* 직교 카운트 모드 (표준 광학 인코더) */
    EQEP_setDecoderConfig(EQEP1_BASE,
                          EQEP_CONFIG_2X_RESOLUTION |
                          EQEP_CONFIG_QUADRATURE);

    /* 위치 카운터 최댓값 — 4x 분해능 기준 3999 */
    EQEP_setPositionCounterConfig(EQEP1_BASE,
                                  EQEP_POSITION_RESET_MAX_POS,  /* PCRM=01 */
                                  QPOSMAX_VALUE);

    /* 엣지 캡처 유닛 활성화 — 저속에서 시간차분법(방법2) 사용 */
    EQEP_enableCapture(EQEP1_BASE);
    EQEP_setCaptureConfig(EQEP1_BASE,
                          EQEP_CAPTURE_CLK_DIV_64,   /* QCTMR 프리스케일 */
                          EQEP_UNIT_POS_EVNT_DIV_1);

    /* 위치 비교 유닛 활성화 — 특정 위치에서 동기 펄스 생성 */
    EQEP_enableCompare(EQEP1_BASE);

    EQEP_enableModule(EQEP1_BASE);
}

/* 방법1: 주기적 샘플링 기반 속도 (고속 영역에 적합) */
float EQEP1_GetSpeed_PositionDiff(int32_t prev_pos, int32_t curr_pos,
                                   float dt_sec)
{
    int32_t delta = curr_pos - prev_pos;
    /* QPOSMAX 경계 래핑 보정 */
    if (delta >  (int32_t)(QPOSMAX_VALUE/2)) delta -= (QPOSMAX_VALUE+1);
    if (delta < -(int32_t)(QPOSMAX_VALUE/2)) delta += (QPOSMAX_VALUE+1);

    float rev = (float)delta / (float)(QPOSMAX_VALUE + 1);
    return rev / dt_sec;  /* [rev/s] */
}

 

3.5 SDFM — 시그마-델타 필터 모듈

3.5.1 절연 전류 측정이 필요한 이유와 SDFM의 위치

고전압 인버터의 상전류를 측정할 때는 전류 센서와 MCU 사이에 전기적 절연이 필수적이다. 이때 업계 표준 방식은 절연된 시그마-델타 변조기(예: AMC1306) — 아날로그 전류를 1비트 비트스트림으로 변조하여 절연 경계를 디지털 신호로 통과시키는 칩 — 를 쓰고, MCU 쪽에서 그 비트스트림을 디코딩하는 것이다. SDFM은 모터 제어 응용의 전류 측정과 리졸버 위치 디코딩을 위해 설계된 4채널 디지털 필터다.

F28P65x에는 SDFM이 4개 모듈(SDFM1~SDFM4) 존재하며, 각 모듈은 4개의 독립 채널을 가진다. 즉 4모듈×4채널 = 총 16채널이다. 3상 인버터라면 SDFM1 한 모듈만으로 3상 전류를 모두 커버하고 1채널이 여유로 남는 구성이 일반적이다.

3.5.2 1차 필터와 2차 필터 — 정밀도와 속도의 역할 분담

SDFM의 가장 중요한 설계적 특징은, 같은 비트스트림을 완전히 독립적인 두 개의 필터가 동시에 처리한다는 점이다. 각 필터 모듈은 1차(데이터) 필터와 2차(비교기) 필터 쌍을 가지며, 입력 비트스트림을 제외하면 두 필터는 서로 완전히 독립적으로 동작한다.

구분 1차 필터(Data Filter)  2차 필터(Comparator Filter)
용도 정밀 전류값 측정 (제어 루프 피드백) 즉각적 과전류/부족전류 감지
OSR 범위 1~256 1~32
출력 형태 16-bit 또는 32-bit 부호 있는 값 디지털 비교 결과(임계 초과 여부)
비교기 구성 상한 2개, 하한 2개, 임계교차 1개

이 분담 구조는 1장의 ADC·CMPSS 관계와 정확히 같은 철학이다 — 정밀하지만 느린 경로(1차 필터, ADC에 해당)와 거칠지만 즉각적인 경로(2차 필터, CMPSS에 해당)를 같은 입력 신호에 대해 동시에 운용하는 것이다.

3.5.3 Sinc 필터 — 데이터율과 지연시간의 트레이드오프

SDFM의 필터 핵심은 적분기와 미분기를 다운샘플러로 분리한 SincN 구조다. 데이터율과 지연시간은 다음 공식을 따른다.

$$\text{데이터율} = \frac{\text{변조기 데이터율}}{OSR}$$

$$\text{지연시간} = \frac{\text{필터 차수}}{\text{데이터율}}$$

필터 종류별 차수는 다음과 같이 정해져 있다.

필터 종류 차수
Sinc1 1
Sinc2 2
Sinc3 3
SincFast 3 (단, Sinc3과 내부 구조가 달라 지연시간이 더 짧음)

변조기 데이터율 10MHz, OSR=256 기준 계산 예시는 다음과 같다.

필터 종류 데이터율 지연시간
Sinc3 39.1 k샘플/초 76.8 μs
Sinc2 39.1 k샘플/초 51.2 μs

두 필터의 데이터율은 OSR이 같으므로 동일하지만, 지연시간은 필터 차수에 비례해 달라진다. 전력 변환 제어 루프 설계 시 이 지연시간은 1장에서 다룬 ADC 변환시간과 마찬가지로 제어 대역폭을 제한하는 요소이므로, 20kHz 제어 루프(50μs 주기)에 76.8μs 지연을 가진 Sinc3 필터를 무심코 사용하면 한 제어 주기 이상 뒤처진 전류 데이터로 제어하게 되는 위험이 있다. 빠른 전류 루프가 필요하다면 Sinc2나 SincFast로 차수를 낮추고 OSR로 노이즈 억제와 속도의 균형을 맞추는 것이 일반적이다.

3.5.4 데이터 표현 범위 — OSR을 높일수록 줄어드는 유효 비트

1차 필터의 출력은 26-bit 부호 있는 정수이지만, 실제 유효 범위는 필터 종류와 OSR에 따라 달라진다. Sinc3 필터 기준 일부를 보면 다음과 같다.

DOSR Sinc3  최대 출력 범위
16 −4096 ~ +4096
64 −262,144 ~ +262,144
256 −16,777,216 ~ +16,777,216

이 값을 16-bit 레지스터에 담아야 한다면 적절한 비트 시프트가 필요하다. OSR·필터 종류별 정확한 시프트량은 별도 표로 제공되며, 이 시프트 설정을 잘못하면 잘못된 16-bit 데이터 필터 출력을 얻게 되므로, 필터를 구성할 때는 항상 해당 표와 대조하여 시프트값을 결정해야 한다.

3.5.5 Driverlib 코드 — 3상 전류 측정 (1차 필터) + 과전류 보호 (2차 필터)

SDFM의 Driverlib API는 채널 번호·필터 종류·OSR을 하나의 비트마스크 인자로 결합하는 구조를 가진다. SDFM_configDataFilter()의 config1 파라미터는 [3:0]에 필터(채널) 번호, [7:4]에 필터 종류, [15:8]에 오버샘플링비를 담으며, SDFM_SET_OSR(x) 매크로로 이 비트 위치를 자동 계산한다.

/*==============================================================================
 * 파일   : sdfm_init.c
 * 목적   : SDFM1 채널1~3 — 3상 인버터 전류 측정 + 하드웨어 과전류 보호
 *          1차 필터: Sinc3, OSR=32 (빠른 제어 루프 우선, 저지연)
 *          2차 필터: 과전류 임계 비교, ePWM Trip 직결
 *============================================================================*/

#include "driverlib.h"
#include "device.h"

void SDFM1_ThreePhaseCurrentInit(void)
{
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD1);

    SDFM_FilterNumber channels[3] = {SDFM_FILTER_1, SDFM_FILTER_2,
                                      SDFM_FILTER_3};

    for (uint16_t i = 0U; i < 3U; i++)
    {
        SDFM_FilterNumber ch = channels[i];

        /* 모듈레이터 클록: 데이터율과 동일한 단일 모드만 지원 */
        SDFM_setupModulatorClock(SDFM1_BASE, ch,
                                 SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);

        /* 1차(데이터) 필터: Sinc3, OSR=32
         * config1 = 채널|필터종류|OSR 비트마스크 결합
         * 데이터율 = 10MHz/32 = 312.5k 샘플/초
         * 지연시간 = 3 / 312.5k ≈ 9.6 μs — 20kHz(50μs) 루프에 충분히 여유 */
        SDFM_configDataFilter(SDFM1_BASE,
            (uint16_t)ch | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(32),
            SDFM_DATA_FORMAT_16_BIT | SDFM_FILTER_ENABLE);

        SDFM_enableFilter(SDFM1_BASE, ch);

        /* 2차(비교기) 필터: 과전류 보호, OSR=8(고속 응답 우선)
         * config2는 SDFM_THRESHOLD(High,Low) 매크로로 상·하한 결합
         * 음수 L은 uint16_t로 마스킹해야 상위 16비트(H)가 깨지지 않는다 */
        SDFM_configComparator(SDFM1_BASE,
            (uint16_t)ch | SDFM_FILTER_SINC_FAST | SDFM_SET_OSR(8),
            SDFM_THRESHOLD(30000, (uint16_t)(-30000)),
            0U /* 영점교차 임계값 미사용 */);

        SDFM_enableComparator(SDFM1_BASE, ch);
    }

    /* 4개 채널(모듈 내 전체) 동시 시작 */
    SDFM_enableMainFilter(SDFM1_BASE);
}

 

3.6 장 요약

본 장에서 다룬 네 가지 주변장치는 공통적으로 "ADC와 CPU 인터럽트만으로는 충분히 빠르거나 충분히 정밀하지 않은 영역"을 메우는 전용 하드웨어라는 성격을 가진다.

  • CMPSS는 ADC의 변환 지연조차 기다릴 수 없는 과전류 보호를, 비교기와 ePWM Trip-Zone의 직결로 해결한다. 램프 발생기는 첨두 전류 모드 제어의 슬로프 보상을 순수 하드웨어로 생성한다.
  • 버퍼드 DAC는 CMPSS 기준 DAC와 닮았지만 출력 공식이 미묘하게 다르며($DACVALA$에 +1이 없음), DACA·DACC 2개 인스턴스만 존재한다.
  • eQEP는 직교 신호의 4배 분해능 디코딩과, 저속·고속 영역에서 서로 다른 두 속도 추정 공식을 모두 하드웨어로 지원한다. 위치 카운터 리셋 모드 선택이 FOC 전기각 계산의 연속성을 좌우한다.
  • SDFM은 1차(정밀)·2차(고속) 필터의 역할 분담을 통해, 절연된 전류 측정에서도 ADC+CMPSS와 동일한 철학 — 느리지만 정확한 경로와 빠르지만 거친 경로의 병행 — 을 구현한다. Sinc 필터의 차수가 곧 제어 루프 지연으로 직결된다는 점이 설계 시 핵심 고려사항이다.

참고문헌

  1. Texas Instruments, TMS320F28P65x Real-Time Microcontrollers Technical Reference Manual, SPRUIZ1B, July 2023 – Revised August 2024.
  2. Texas Instruments, Peak Current Mode Controlled PSFB Converter Reference Design Using C2000™ Real-time MCU, Application Report.
  3. Texas Instruments, Understanding and Applying Current-Mode Control Theory, Application Report.
  4. Texas Instruments, Achieving Better Signal Integrity With Isolated Delta-Sigma Modulators in Motor Drives, Application Report.