먼저 내가 사용할 Fan은 아래와 같다.
외부 전압을 이용할 예정이다.
일단 보드의 데이터 시트를 보고 Timer를 선택하자 ( PWM제어를 할 예정임)
살펴보니 38번핀에 PA15번인 TIM2 채널 1이 있다. 이것을 이용해보겠다. ( TIM3이 아니고 2이다.)
이것을 설정해주고, 우리는 외부 크리스탈을 이용해 더욱더 정확한 시간을 측정할 예정이기에 다음과 같이 설정해준다.
내가 쓰는 보드의 회로도를 보면 외부 크리스탈이 달려있음을 알수 있다.
다음으로 클럭을 설정해주자
외부 크리스탈을 사용한다고 해주니 Clock Configuration에 HSE가 선택할 수 있게되었다.
HCLK를 72로 누르고 엔터치면 알아서 IDE에서 계산해서 만들어준다. (너무 편한기능)
우리가 사용할 부분은 APB1 Timer clocks 부분이기에 보면 72MHz를 사용할 수 있음을 알 수있다.
다음으론 다시 pinout쪽으로 가서 pwm을 설정해주자
나는 Timer 2에 채널 1을 사용함으로 TIM2를 눌러서 Channel1 을 PWM_Generation_CH1로 설정해준다.
그리고 밑에 Configuration을 다음과 같이 설정해준다.
우리가 손 댈곳은 총 3군데 인데 왜 저렇게 설정했는지 하나씩 알아가보자
이름 | 설명 |
Prescaler | 타이머의 입력 클록 주파수를 분주하는 값 |
Counter Period | 타이머가 카운트할 총 개수 |
Pulse | PWM 신호가 HIGH 상태를 유지하는 기간을 설정 |
Prescaler을 72 -1 로 설정한 이유
타이머 클럭 주파수를 72로 나눈다는 뜻이다.
현재 우리는 72,000,000Hz 사용중이다.
여기서 72로 나누면 1MHz를 낮추어 진다.
낮춘이유은 72MHz는 너무 빠르다. (1초에 72,000,000번을 카운터함)
1번 카운트하는데 1 / 72,000,000 시간이 걸린다. ( 13.89나노초)
이 주기는 너무 빨라 PWM제어하기엔 적절치 않다고 생각했다.
따라서 타이머의 유효 클럭 주파수를 1MHz로 낮추기 위해 72 - 1로 설정한것이다.
여기서 궁금한점이 있을 것이다.
왜 -1을 하는거죠?
이유는 STM32의 타이머 레지스터에서 Prescaler 값이 0부터 시작하기 때문에 설정값에 1을 빼서 입력하게 되어 있다. 따라서 1을 빼야하는 것이다.
우리가 1MHz로 줄임으로써 1번 카운트 하는데 걸리는 시간은 1 / 1,000,000 즉, 1 마이크로초가 된다.
Counter Period가 1000 - 1인 이유
여기서 1000 - 1로 설정한 이유는 일단 이 값을 통해 PWM 주파수를 결정할 수 있는데,
우리가 설정한 1MHz에서 1000을 나누면 1kHz가 된다.
즉, 내가 설정한 pwm의 주파수가 1kHz인것이다.
이 의미는 타이머가 한 주기, 1000번을 카운터 할 때마다 하나의 pwm주기가 끝나는 것이다.
(조금 더 이해하기 쉽게 타이머 1000번의 주기가 pwm 하나의 주가, 즉, 1000번 카운터는 pwm 1번 카운트)
-1 인 이유는 0 ~ 999이기 때문에 1000 - 1을 한것이다.
Pulse가 500 - 1이유
500 - 1은 이제 알거라고 생각한다.
0 ~ 499이고, 이 값은 초기 펄스값이다.
따라서 코드내에서 변경할 수 있다.
처음에 오작동하지 말라고 1000 / 2인 500 즉, 1000중 500까지만 High유지하고, 나머진 Low로 두라는 의미이다.
따라서 여기서는 듀티사이클을 정한다고 보면 된다.
조금 설명이 길었다.
이 부분은 조금 자세히 알아야 한다고 생각했다. 이유는 클럭은 mcu의 시간이다.
우리에게도 시간은 중요하다. 따라서 mcu에도 시간은 중요하다.
이제 코드를 입력하자
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
/* USER CODE END 2 */
while(1)
{
htim2.Instance->CCR1 = value; // duty
HAL_Delay(10);
value += 1;
if(value > 999){
value = 0;
}
}
10ms 간격으로 듀티 사이클을 점진적으로 증가시키며, 최대치에 도달하면 다시 0으로 돌아가면서 계속해서 듀티 사이클을 순환하도록 만드는 코드이다.
오실로스코프로 확인하자
다음 포스팅에서 이걸로 Fan을 제어해보겠다.
'STM32' 카테고리의 다른 글
STM32F407VE - 기초 1) (1) | 2024.11.16 |
---|---|
STM32으로 Fan을 제어해보자 2) (0) | 2024.11.12 |
7세그먼트 코드 수정 (0) | 2024.11.10 |
버튼 누르면 1씩 올라가는 7세그먼트 (1) | 2024.11.10 |
HAL_Driver로 7세그먼트와 Button 다루기 (3) | 2024.11.09 |