본문 바로가기

[STM32F746G-DISCO] Timer PWM 사용하기

by rudals.kim 2024. 7. 9. 댓글 개
반응형
아래 테스트는 STM32CubeIDE 1.6.1/STM32Cube_FW_F7_V1.16.1를 사용하여 테스트 되었습니다.


STM32F746G-DISCO 보드의 타이머는 PWM(Pulse Width Modulation)기능을 제공하여 간단히 1초마다 50% duty를 갖는 펄스를 발생시키는 테스트를 해 보았습니다.

일반적인 타이머 사용은 아래 게시글을 참고해 주시기 바랍니다

2024.07.05 - [Hardware/STM32] - [STM32F746G-DISCO] Timer 사용하기


PWM을 사용하기 위해 회로도를 살펴보니 아두이노 포트 D3번이 TIM3_CH1번으로 PWM으로 사용할 수 있습니다.

STM32CubeIDE에서 새 프로젝트를 생성하여 핀 초기화후 RCC/SYS/TIM3/USART1만 설정하였습니다.


클럭은 HCLK는 200MHz, APB1는 100MHz로 설정하였고 TIM3의 PWM 설정은 아래를 참고하시면 됩니다.

원하는 타이머 시간 = APB1 clock/((Prescaler+1)* (AutoReload Register+1))로 계산할 수 있으며 Precaler와 AutoReload Register는 16bit 값으로 0 ~ 65535까지 사용할 수 있습니다.

코드를 생성 후 main 함수의 초기화 부분에 TIM3를 초기화합니다.

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);
/* USER CODE END 2 */

 

PWM의 한 펄스가 종료될때마 PWM_PulseFinishedCallback이 호출되는데 PWM이 종료되는 시간간격을 표시해 보았습니다.

/* USER CODE BEGIN 0 */
static uint32_t old_tick = 0;
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
  uint32_t new_tick;
  if(htim->Instance == TIM3){
    new_tick = HAL_GetTick();
    printf("TIM3 expired!!!(%d ms)\r\n", (int)(new_tick - old_tick));
    old_tick = new_tick;
  }
}
/* USER CODE END 0 */


코드를 실행해 보면 터미널상에 1초 간격으로 PWM callback 함수가 호출됨을 알 수 있습니다.

D3번 핀에 Logic Analyzer를 연결하여 PWM 신호를 측정해 보았습니다.

Logic Analyzer로 측정해 보니 설정한 대로 50%의 duty를 가진 PWM 신호가 정상적으로 출력되었습니다.

 

반응형

댓글