ARM TIM/PWM

Park SeungChan·2024년 4월 8일
0

TIMER

TIM2, TIM10번을 이용해 PC5, PC12의 LED를 Toggle하는 동작을 만드려고한다.

TIM10은 APB2에 연결되있고, TIM2는 APB1에 연결되있다.

TIM2와 TIM10을 activated해주고

  • TIM10 : 20MHz / 10000 (Prescaler) = 2kHz -> 2kHz / 2000 (Counter) -> 1sec
  • TIM2 : 80MHz / 10000 (Prescaler) = 8kHz -> 8kHz / 800 (Counter) -> 0.1sec

timer는 주파수가 분주되고 분주된 주파수로 카운트되면서 카운트가 완료되면 TIM interrupt 이벤트가 진행된다. TIM10의 Prescaler와 Counter Period는 16bit로 최대가 제한되있다. 그리고 -1의 의미는 만약 5를 count한다고 할때 1,2,3,4까지 세고 5는 0으로 돌아가 다시 셈을 시작하기 때문이다.

NVIC setting에서 global interrupt도 enable한다.

extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim10;

void User_Task1(void){
	HAL_TIM_Base_Start_IT(&htim10); // timer10을 interrupt감지 시작
	HAL_TIM_Base_Start_IT(&htim2); // timer2를 interrupt감지 시작
	while(1){
		HAL_Delay(100);
	}
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ // 인터럽트 발동
	if (htim->Instance == TIM10) {
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
	}
	if (htim->Instance == TIM2) {
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_12);
	}
}

1초에 한번 PA5가 toggle하고, 0.1초에 한번 PC12가 toggle한다.

PWM

PWM(Pulse Width Modulation)은 디지털 신호를 아날로그 신호와 비슷하게 바꿔주는 방법이다. PWM주파수와 Duty비를 조절하며 LED 또는 모터를 제어할 수 있다.

Clock Source를 Internal Clock, Channel1을 PWM Generation CH1으로 설정한다.

PWM Generation Channel설정에서 Pulse는 카운터의 값이 Pulse의 값과 같아질때까지 HIGH를 출력한다. Pulse는 타이머가 Period중에 몇번의 클럭동안 HIGH를 유지할 지 결정하는 값이다. 따라서 (Pulse / Period) X 100 = DutyCycle(%)이 결정된다.

#include "user.h"

extern TIM_HandleTypeDef htim2;
unsigned char kk = 0;

void User_Task1(void){
	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // PWM Mode TIM 시작
	while(1){
		for (kk = 0; kk < 99; ++kk) { // LED 밝아짐
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, kk);
			HAL_Delay(10);
		}
		for (kk = 99; kk > 0; --kk) { // LED 어두워짐
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, kk);
			HAL_Delay(10);
		}
	}
}
profile
RTL Circuit Design & Verification

1개의 댓글

comment-user-thumbnail
2024년 4월 22일

🤔... 이게 머누..? 먹는 건가요? 응@애?

답글 달기

관련 채용 정보