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 ;