728x90
반응형

Holtek사 MCU중 HT32F52357와 HT32F52367은 기능은 같은데 Flash와 SRAM 용량 차이가 있음. Holtek사 예제 프로그램을 사용해서 Motor Control Timer (MCTM0)를 사용하여 PWM 출력을 확인해 보자.

사용자 메뉴얼 보면 MCTM으로 검색하면 위와 같은 그림이 있다.

3상 BLDC Motor를 구동하기 위한 기능은 모두 있는거 같다.

example -> MCTM -> ComplementaryOutput 폴더에가서 _CreateProject.bat를 실행 해서 프로젝트를 만들자.

프로젝트가 만들어지면 MDK_ARMv5 폴더에 들어가서 프로젝트를 실행 하자.

 

int main(void)
{
  MCTM_Configuration(); //MCTM0 셋팅

  while (1);
}

main에는 달랑 2줄 써있다.

 

다음은 중요한 타이머 셋팅 부분이다.

void MCTM_Configuration(void)
{
  /* !!! NOTICE !!!
     Notice that the local variable (structure) did not have an initial value.
     Please confirm that there are no missing members in the parameter settings below in this function.
  */
  TM_TimeBaseInitTypeDef MCTM_TimeBaseInitStructure;
  TM_OutputInitTypeDef MCTM_OutputInitStructure;
  MCTM_CHBRKCTRInitTypeDef MCTM_CHBRKCTRInitStructure;

  CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
  CKCUClock.Bit.AFIO       = 1; //AFIO Clock 공급
  CKCUClock.Bit.MCTM0      = 1; //MCTM0 Clock 공급
  CKCU_PeripClockConfig(CKCUClock, ENABLE); //AHB, APB, AFIO, MCTM0에 클럭 공급 셋팅 하라는것.

  /* Configure MCTM Channel 0 output pin                                                                    */
  AFIO_GPxConfig(HTCFG_MCTM_CH0_GPIO_ID, HTCFG_MCTM_CH0_AFIO_PIN, AFIO_FUN_MCTM_GPTM);  //PA14번 핀을 MCTM0에 CH0 PWM으로 동작하게함.
  AFIO_GPxConfig(HTCFG_MCTM_CH0N_GPIO_ID, HTCFG_MCTM_CH0N_AFIO_PIN, AFIO_FUN_MCTM_GPTM);    //PA15번 핀을 MCTM0에 CH0N PWM으로 동작 하게함.
  /* Configure MCTM Channel 1 output pin                                                                    */
  AFIO_GPxConfig(HTCFG_MCTM_CH1_GPIO_ID, HTCFG_MCTM_CH1_AFIO_PIN, AFIO_FUN_MCTM_GPTM);  //PB0번 핀을 MCTM0에 CH0 PWM으로 동작하게함.
  AFIO_GPxConfig(HTCFG_MCTM_CH1N_GPIO_ID, HTCFG_MCTM_CH1N_AFIO_PIN, AFIO_FUN_MCTM_GPTM);    //PB1번 핀을 MCTM0에 CH0N PWM으로 동작 하게함.
  /* Configure MCTM Channel 2 output pin                                                                    */
  AFIO_GPxConfig(HTCFG_MCTM_CH2_GPIO_ID, HTCFG_MCTM_CH2_AFIO_PIN, AFIO_FUN_MCTM_GPTM);  //PD1번 핀을 MCTM0에 CH0 PWM으로 동작하게함.
  AFIO_GPxConfig(HTCFG_MCTM_CH2N_GPIO_ID, HTCFG_MCTM_CH2N_AFIO_PIN, AFIO_FUN_MCTM_GPTM);    //PD2번 핀을 MCTM0에 CH0N PWM으로 동작 하게함.
  /* Configure MCTM Break pin                                                                               */
  AFIO_GPxConfig(HTCFG_MCTM_BREAK_GPIO_ID, HTCFG_MCTM_BREAK_AFIO_PIN, AFIO_FUN_MCTM_GPTM);  //PB4번 핀을 MCTM0에 Break 핀으로 연결 이핀에 신호가 들어오면 PWM 모두 정지 하고 LOW 신호를 출력한다.

  /* MCTM Time Base configuration                                                                           */
  MCTM_TimeBaseInitStructure.CounterReload = HTCFG_MCTM_RELOAD - 1; //HTCFG_MCTM_RELOAD값이 60000000/2000 이라고 되어 있다. (CRR 값임.) 60000000값은 MCTM Count Clock값이고 2000은 MCTM Reload 값이다. 이렇게 셋팅하면 주파수가 2KHz가 나옴.
  MCTM_TimeBaseInitStructure.Prescaler = 0; //PSC Prescaler값이다. 클럭이나 트리거 신호를 받았을때 이값이 0이 아니면 해당하는 숫자(Prescaler + 1)값 만큼 나누어져서 출력이 나온다.
  MCTM_TimeBaseInitStructure.RepetitionCounter = 0; //One Plus 방식이 아니므로 값은 0로 설정
  MCTM_TimeBaseInitStructure.CounterMode = TM_CNT_MODE_UP;  //카운트 방식 설정, 현재 증가 카운터로 설정함.
  MCTM_TimeBaseInitStructure.PSCReloadTime = TM_PSC_RLD_IMMEDIATE;  //소프트웨어적으로 트리거를 설정 할수 있는데 즉시 적용하는것으로 설정 (Update event 발생시에 적용할수도 있다.)
  TM_TimeBaseInit(HT_MCTM0, &MCTM_TimeBaseInitStructure);   //MCTM0 타이머 설정

  /* MCTM Channel 0, 1, 2 output configuration                                                              */
  MCTM_OutputInitStructure.Channel = TM_CH_0;   //MCTM0에 CH0을 뜻한다.
  MCTM_OutputInitStructure.OutputMode = TM_OM_PWM1; //PWM 출력 방식은 PWM1 방식으로 출력 한다.
  MCTM_OutputInitStructure.Control = TM_CHCTL_ENABLE;   //MCTM0에 CH0 출력을 사용 하게 한다.
  MCTM_OutputInitStructure.ControlN = TM_CHCTL_ENABLE;  //MCTM0에 CH0N 출력을 사용 하게 한다.
  MCTM_OutputInitStructure.Polarity = TM_CHP_NONINVERTED;   //High 또는 Rising Edge로 설정
  MCTM_OutputInitStructure.PolarityN = TM_CHP_NONINVERTED;  //High 또는 Rising Edge로 설정
  MCTM_OutputInitStructure.IdleState = MCTM_OIS_LOW;    //동작 중이 아닐때 CH0는 Low를 출력 한다.
  MCTM_OutputInitStructure.IdleStateN = MCTM_OIS_HIGH;  //동작 중이 아닐때 CH0N은 High를 출력 한다.
  MCTM_OutputInitStructure.Compare = HTCFG_MCTM_RELOAD * 3 / 4; //MCTM0에 CH0CCR값과 비교 값  (CH0 : 75%, CH0N : 25%)
  MCTM_OutputInitStructure.AsymmetricCompare = 0;   //MCTM0 CH0가 비대칭 PWM 모드로 구성되고 카운트다운 중일때 AsymmetricCompare값과 비교 된다고 한다..
  TM_OutputInit(HT_MCTM0, &MCTM_OutputInitStructure);   //MCTM0에 CH0,CH0N 셋팅

  MCTM_OutputInitStructure.Channel = TM_CH_1;   //MCTM0에 CH1을 뜻한다.
  MCTM_OutputInitStructure.Compare = HTCFG_MCTM_RELOAD * 1 / 2; //MCTM0에 CH1CCR값과 비교 값  (CH1 : 50%, CH1N : 50%)
  TM_OutputInit(HT_MCTM0, &MCTM_OutputInitStructure);   //MCTM0에 CH1, CH1N 셋팅

  MCTM_OutputInitStructure.Channel = TM_CH_2;   //MCTM0에 CH2을 뜻한다.
  MCTM_OutputInitStructure.Compare = HTCFG_MCTM_RELOAD * 1 / 4; //MCTM0에 CH2CCR값과 비교 값  (CH2 : 25%, CH2N : 75%)
  TM_OutputInit(HT_MCTM0, &MCTM_OutputInitStructure);   //MCTM0에 CH2, CH2N 셋팅

  /* MCTM Off State, lock, Break, Automatic Output enable, dead time configuration                          */
  MCTM_CHBRKCTRInitStructure.OSSRState = MCTM_OSSR_STATE_ENABLE;    //0x00200000
  MCTM_CHBRKCTRInitStructure.OSSIState = MCTM_OSSI_STATE_ENABLE;    //0x00100000
  MCTM_CHBRKCTRInitStructure.LockLevel = MCTM_LOCK_LEVEL_2; //0x00020000
  MCTM_CHBRKCTRInitStructure.Break0 = MCTM_BREAK_ENABLE;    //MCTM0에 Break0를 사용한다고함.
  MCTM_CHBRKCTRInitStructure.Break0Polarity = MCTM_BREAK_POLARITY_LOW;  //Break신호가 Low가 들어오면 MCTM0가 정지한다.
  MCTM_CHBRKCTRInitStructure.AutomaticOutput = MCTM_CHAOE_DISABLE;   //Break 신호가 Low 값이 들어와서 출력이 안나오다가 Break 신호가 High 신호가 들어오면 정상동작을 해라.
  MCTM_CHBRKCTRInitStructure.DeadTime = HTCFG_MCTM_DEAD_TIME;   //CHx와 CHxN간에 동시에 변화 하지 않고 HTCFG_MCTM_DEAD_TIME값 만큼 지연시간을 준다.
  MCTM_CHBRKCTRInitStructure.BreakFilter = 0;   //Break 입력 필터 셋팅으로 값이 0이면 필터를 사용하지 않음.
  MCTM_CHBRKCTRConfig(HT_MCTM0, &MCTM_CHBRKCTRInitStructure);   //필터 설정

  /* MCTM counter enable                                                                                    */
  TM_Cmd(HT_MCTM0, ENABLE);     //MCTM0 카운터 동작함.

  /* MCTM Channel Main Output enable                                                                        */
  MCTM_CHMOECmd(HT_MCTM0, ENABLE);  //MCTM0에 채널 동작함.
}

위 프로그램을 실행후 출력 파형은 다음과 같다.

위에 파형사진에서 위쪽 파형이 PA14번 포트에서 측정 한 MCTM0에 CH0 파형이다. 2KHz에 약 74.7%가 잘 나온다.

아래쪽 파형은 PA15번 포트에서 측정한 MCTM0에 CH0N 파형이다. 2KHz에 약 24.7%가 나오는것을 확인 할수 있다.

정확히 75%나 25%가 안나오는 이유는 PWM Dead Time이 포함 되어 있기 때문이다. 프로그램상에 90만큼 Dead Time이 설정 되어 있다.

위에 파형사진에서 위쪽 파형이 PB0번 포트에서 측정 한 MCTM0에 CH1 파형이다. 2KHz에 약 49.7%가 잘 나온다.

아래쪽 파형은 PB2번 포트에서 측정한 MCTM0에 CH1N 파형이다. 2KHz에 약 49.7%가 나오는것을 확인 할수 있다.

정확히 50%나 50%가 안나오는 이유는 PWM Dead Time이 포함 되어 있기 때문이다. 프로그램상에 90만큼 Dead Time이 설정 되어 있다.

위에 파형사진에서 위쪽 파형이 PD1번 포트에서 측정 한 MCTM0에 CH2 파형이다. 2KHz에 약 24.7%가 잘 나온다.

아래쪽 파형은 PD2번 포트에서 측정한 MCTM0에 CH2N 파형이다. 2KHz에 약 74.7%가 나오는것을 확인 할수 있다.

정확히 25%나 75%가 안나오는 이유는 PWM Dead Time이 포함 되어 있기 때문이다. 프로그램상에 90만큼 Dead Time이 설정 되어 있다.

위에 파형은 MCTM0에 CH0과 CH1을 같이 측정한 사진이다.

CH0는 약 75%, CH1은 약 50% 나오는것을 확인 할수 있다.

위에 파형은 MCTM0에 CH0과 CH2을 같이 측정한 사진이다.

CH0는 약 75%, CH2은 약 25% 나오는것을 확인 할수 있다.

 

ComplementaryOutput.zip
5.04MB

728x90
반응형

+ Recent posts