본문 바로가기
Programming/Embedded

[STM32F103C8] PWM-주파수, Duty 변화

by No Brainer 2022. 2. 19.

PWM제어는 펄스폭을 제어하여, 모터의 RPM이나 LED의 밝기를 제어하는데에 의의가 있습니다.

따라서, 제어를 하기 위해서는 펄스폭을 유동적으로 변하게 하는것이 필요합니다.

이번 포스팅에서는 CUBEMX의 초기 설정 이후, truestudio 코드 내에서 듀티비와 주파수를 변화시키는 방법을 살펴보겠습니다.

 

기본 설정은 이전의 포스팅과 동일한 상태입니다.

https://blog.naver.com/dongjungim20/221801142700

 
우선 듀티사이클을 결정하는 pulse의 값을 변화시키기 위해서는 CCR레지스터에 접근하여 그 값을 쓸 수 (Write)있습니다.
다음은 예제 코드 입니다.
  /* USER CODE BEGIN 1 */
uint8_t duty=0;
uint8_t flag =0;
  /* USER CODE END 1 */
=========================
  while (1)
  {
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  if(flag == 0){//rising
  while(1){
  TIM2->CCR1=duty;
  
  duty++;
  HAL_Delay(10);
  if(duty==255){
  flag = 1;
  break;
  }
  }
  }
 
  if(flag == 1){//rising
  while(1){
  //TIM2->CCR1=duty;
  duty--;
  HAL_Delay(10);
  if(duty==0){
  flag = 0;
  break;
  }
  }
  }
 
 
 
  }
=========================================
펄스폭을 조절하여, LED의 밝기가 밝아졌다 어두워졌다 하는 동작을 구현할 수 있습니다.
 
유사하게, 주파수를 변화시키고자 할때는 ARR레지스터의 값을 변경해주면 됩니다.
  while (1)
  {
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  uint16_t freq=60;
 
  TIM2->ARR=1000000/freq;
 
 
 
  }
 
다음코드를 작성하면, freq에 해당하는 주파수가 출력되게 됩니다.