Embedded/Motor_control

TI 28035 BLDC 예제코드 Motor 구동 코드 Summary

현석_s 2023. 5. 7. 23:26

Ti motor구동 kit 내부에서 동작하는 모터구동 레지스터 관련 내용 정리 입니다.

28035 BLDC Code

typedef struct {  
         Uint16 CmtnPointer;        // Input: Commutation (or switching) state pointer input (Q0)
           int16  MfuncPeriod;     // Input: Duty ratio of the PWM outputs (Q15) 
           Uint16 PeriodMax;        // Parameter: Maximum period (Q0)
           int16  DutyFunc;           // Input: PWM period modulation input (Q15)
           Uint16 PwmActive;         // Parameter: 0 = PWM active low, 1 = PWM active high (0 or 1)

       } PWMGEN;
  • CmtnPointer : Comutation(전자기 전환) 상태 포인터를 저장
  • BLDC 모터의 세 개의 상에 전원을 공급하는 순서를 결정
  • MfuncPeriod
    • PWM 출력의 duty ration을 저장
    • Q15 형식으로 표현되며 0에서 1 사이의 값을 가짐
    • 모터의 토크와 속도에 영향을 줌
  • PeriodMax
    • PWM 주기의 최대 값을 저장
    • Q0 형식으로 표현되며 주기의 최대 길이를 제한함
    • PWM 주기를 조절할 수 있음
  • DutyFunc
    • PWM 주기의 변조 입력을 저장
    • Q15 형식으로 표현되며, 주기 변조를 제어하는데 사용
    • 주기 변조는 PWM 신호의 주기를 동적으로 조절하며. 모터 성능 최적화에 사용
  • PwmActive
    • PWM 출력의 활성 상태를 결정
    • active low = 0
    • active high = 1
#define BLDCPWM_INIT_MACRO(ch1,ch2,ch3,v)                                        \
         /* Setup Sync*/                                                            \
         (*ePWM[ch1]).TBCTL.bit.SYNCOSEL = 0;                                          \
         (*ePWM[ch2]).TBCTL.bit.SYNCOSEL = 0;                                          \
         (*ePWM[ch3]).TBCTL.bit.SYNCOSEL = 0;                                          \
                                                                                    \
        /* Allow each timer to be sync'ed*/                                            \
         (*ePWM[ch1]).TBCTL.bit.PHSEN = 1;                                             \
         (*ePWM[ch2]).TBCTL.bit.PHSEN = 1;                                             \
         (*ePWM[ch3]).TBCTL.bit.PHSEN = 1;                                             \
                                                                                    \
        /* Init Timer-Base Period Register for EPWM1-EPWM3*/                        \
         (*ePWM[ch1]).TBPRD = v.PeriodMax;                                             \
         (*ePWM[ch2]).TBPRD = v.PeriodMax;                                             \
         (*ePWM[ch3]).TBPRD = v.PeriodMax;                                             \
                                                                                    \
        /* Init Timer-Base Phase Register for EPWM1-EPWM3*/                            \
         (*ePWM[ch1]).TBPHS.half.TBPHS = 0;                                         \
         (*ePWM[ch2]).TBPHS.half.TBPHS = 0;                                         \
         (*ePWM[ch3]).TBPHS.half.TBPHS = 0;                                         \
                                                                                    \
        /* Init Timer-Base Control Register for EPWM1-EPWM3*/                        \
         (*ePWM[ch1]).TBCTL.all = BLDCPWM_INIT_STATE;                                  \
         (*ePWM[ch2]).TBCTL.all = BLDCPWM_INIT_STATE;                                  \
         (*ePWM[ch3]).TBCTL.all = BLDCPWM_INIT_STATE;                                  \
                                                                                    \
        /* Init Compare Control Register for EPWM1-EPWM3    */                        \
         (*ePWM[ch1]).CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE;                       \
         (*ePWM[ch2]).CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE;                         \
         (*ePWM[ch3]).CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE;                       \
                                                                                    \
        /* Init Action Qualifier Output A Register for EPWM1-EPWM3*/                \
         (*ePWM[ch1]).AQCTLA.all = BLDCPWM_AQCTLA_INIT_STATE;                       \
         (*ePWM[ch2]).AQCTLA.all = BLDCPWM_AQCTLA_INIT_STATE;                       \
         (*ePWM[ch3]).AQCTLA.all = BLDCPWM_AQCTLA_INIT_STATE;                       \
                                                                                    \
        /* Init Dead-Band Generator Control Register for EPWM1-EPWM3*/                \
         (*ePWM[ch1]).DBCTL.all = BLDCPWM_DBCTL_INIT_STATE;                         \
         (*ePWM[ch2]).DBCTL.all = BLDCPWM_DBCTL_INIT_STATE;                         \
         (*ePWM[ch3]).DBCTL.all = BLDCPWM_DBCTL_INIT_STATE;                         \
                                                                                    \
        /* Init PWM Chopper Control Register for EPWM1-EPWM3*/                        \
         (*ePWM[ch1]).PCCTL.all = BLDCPWM_PCCTL_INIT_STATE;                         \
         (*ePWM[ch2]).PCCTL.all = BLDCPWM_PCCTL_INIT_STATE;                         \
         (*ePWM[ch3]).PCCTL.all = BLDCPWM_PCCTL_INIT_STATE;                         \
                                                                                     \
  • TBCTL.bit.SYNCOSEL
    • epwm 모듈의 동기화 출력을 선택
    • 0 : 동기화 출력이 비활성화 되고, 동기화 펄스가 생성되지 않음
    • 1 : 동기화 출력이 CTR =0일 때 발생. 모든 epwm모듈이 동시에 리셋 되는 시점에 동기화 펄스가 생성
    • 2 : 동기화 출력이 CTR = PRD일 때 발생 모든 epwm 모듈이 주기의 끝에 도달했을 때 동기화 펄스가 생성
    • 3: 동기화 출력이 SW_SYNC이 발생 할때 생성됨 소프트웨어를 통한 강제 동기
  • TBCTL.bit.PHSEN
    • 0 : 동기화 신호에 응답 하지 않고 독립적으로 작동(외부 동기 신호가 epwm모듈에 동작x)
    • 1 : 외부 신호에 응답 가능
  • TBPRD
    • Time_base 주기
  • TBPHS.half.TBPHS
    • PWM 동기화 시점을 설정하는데 사용
    • TBPHS 레지스터를 사용해 epwm 모듈 간의 상대적인 위상 차이를 설정할 수 있음
  • Shadow Register
    • 새로운 값을 업데이트 하기 전에 현재 레지스터의 값을 보호하기 위해 사용
    • 레지스터 값이 즉시 변경되지 않고 중간에 저장되는 임시 레지스터
    • 글리치 방지 : 레지스터의 값이 즉시 변경되지 않고 적절한 시점에만 변경 (글리치는 신호의 일시적인 오류로, 원하지 않는 동작을 유발함)
    • 정확한 타이밍 조절 : 주 레지스터의 값을 변경할 때 출력 신호의 타이밍을 정확하게 조절 가능, 특정 시점에만 변경되므로 출력 신호의 주기와 상관없이 정확하게 출력
    • ex) 주기를 변경하는 등 상황에서 현재 파형이 동작 중 이면 현재 파형이 완료 되고 변경 된 사항이 적용
  • LOADAMODE_ZRO
    • TBCTL이 0일때 쉐도우 레지스터에서 Compare 값을 가지고 옴
  • SHDWAMODE_SHADOW
    • 쉐도우 레지스터를 사용
  • DBCTL.all = BLDCPWM_DBCTL_INIT_STATE
    • Dead Band사용 안함
typedef struct {   
        Uint16 PeriodMax;   // Parameter: PWM Half-Period in CPU clock cycles (Q0)
        Uint16 HalfPerMax;    // Parameter: Half of PeriodMax (Q0)
        Uint16 Deadband;    // Parameter: PWM deadband in CPU clock cycles (Q0) 
        Uint16 clkdiv;    // Parameter: PWM clkdiv in CPU clock cycles (Q0)
        _iq MfuncC1;        // Input: EPWM1 A&B Duty cycle ratio (Q24)
        _iq MfuncC2;        // Input: EPWM2 A&B Duty cycle ratio (Q24)
        _iq MfuncC3;        // Input: EPWM3 A&B Duty cycle ratio (Q24)
        Uint16 EnableFlag;    // Parameter: PWM deadband in CPU clock cycles (Q0)
        } PWMGEN ;