b. 임베디드/STM32

[STM32F407VGT Discovery] Timer PWM으로 LED 밝기 조절

로봇쟁이 2019. 6. 19. 00:01

이번에는 타이머 기능 중 PWM을 동작시켜보겠습니다.

 

먼저 LED가 이미 부착되어있는 TIM4 CH1과 CH2를 PWM으로 그림과 같이 설정해줍니다.

 

그리고 저는 주기를 1KHz로 만들것임으로

Prescaler = 99

Couter Period = 839 

※ 계산식 = 1/84MHz * (PC + 1) * (CP + 1) = 0.001s : 1KHz

auto-reload preload를 Enable 시키고 (자동으로 update)

Mode = PWM mode 1 (mode1 과 mode2의 차이점 상하 반전)

Fast Mode = Enable 

Pulse -> Counter Period (ARR) 의 %로 Duty비

저는 일단 0으로 셋팅 후 코드 안에서 변경하도록 하겠습니다.

 

 

그리고 LL로 변경 후 Generate Code 실행 해주세요 ^^;

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */

  LL_TIM_EnableCounter(TIM4);
  LL_TIM_CC_EnableChannel(TIM4, LL_TIM_CHANNEL_CH1);
  LL_TIM_CC_EnableChannel(TIM4, LL_TIM_CHANNEL_CH2);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  for(int i=0; i<840; i++)
	  {
		  TIM4->CCR1 = i;
		  TIM4->CCR2 = 839 - i;
		  HAL_Delay(1);
	  }
  }
  /* USER CODE END 3 */
}

 

타이머 카운터를 Enable하고 CC_EnableChannel을 진행하면 해당 PWM채널이 동작됨을 확인 가능합니다.

저는 Duty비를 변경하여 LED 밝기를 조절해봤습니다.

코드를 보니 각 타이머의 CCR1, CCR2를 통해 채널별 Duty비 설정이 가능하네요 :D

반응형