본문 바로가기
임베디드 개발/STM32 (ARM Cortex-M)

STM32 ] TIMER OC (Output Compare 단자 출력) 사용 예제

by eteo 2022. 7. 21.

OC : 출력비교 모드는 카운터(CNT)의 값이 캡쳐/비교기에 설정된 (CCRx)값과 일치할 때 인터럽트 또는 해당 핀에 출력을 발생시키는 모드이다.

 

 

이전에 이어서 타이머 OC 모드에서 핀의 출력을 사용하는 버전이다.

 

 

 

 

핀 출력을 쓰는 모드로 설정했기 때문에 핀이 잡힌다.

 

 

PSC를 9000-1로 해서 10KHz로 분주하고 ARR은 16비트 카운터 타이머의 최대값인 0xffff-1로 한다. 이렇게 하면 업데이트 인터럽트가 6.5535초 마다 발생할 거다 하지만 업데이트 인터럽트는 안쓴다.

 

모든채널을 OC 인터럽트 발생시 출력이 토글되게끔 설정하고 CCR값은 위와 같이 설정한다.

 

 

소스코드

  /* USER CODE BEGIN 2 */
  HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_1);
  HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_2);
  HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_3);
  HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_4);
  /* USER CODE END 2 */
  
  ...
  
  /* USER CODE BEGIN 0 */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  uint32_t capture = 0;

  if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
	  //capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
	  //__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, capture + 10000-1);

	  capture = TIM3->CCR1;
	  TIM3->CCR1 = capture + 10000-1;
	  //0.5hz
  }

  if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
	  //capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
	  //__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, capture + 5000-1);

	  capture = TIM3->CCR2;
	  TIM3->CCR2 = capture + 5000-1;
	  //1hz
  }

  if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3){

	  //capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
	 //__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, capture + 2500-1);


	  capture = TIM3->CCR3;
	  TIM3->CCR3 = capture + 2500-1;
	  //2hz
  }

  if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4){

	  //capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_4);
	  //__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_4, capture + 1250-1);

	  capture = TIM3->CCR4;
	  TIM3->CCR4 = capture + 1250-1;
	  //4hz
  }
}
/* USER CODE END 0 */

 

 

ARR이 최대니까 CCR값을 초기설정값만큼 다시 더해주는 식으로 코드를 짰다.

 

예를 들어 첫번째 채널을 보면, 동일한 간격으로 토글이 되니 듀티비는 당연히 50%이고, 분주한 타이머 클락값이 10KHz 인데 CCR을 10000-1로 해주니까 1Hz로 출력이 토글되고 해당 펄스의 주파수는 그 절반인 0.5Hz가 된다.

 

오실로스코프로 시간축 한칸의 스케일을 조정해서 주파수가 맞게 나오는지 확인도 해봤는데 미처 영상을 못찍었다.