Embedded/1. STM32, Arduino

STM32 - OC (Output Capture)

잇(IT) 2024. 6. 24. 22:04

OC (Output Capture)

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

이전 PWM의 경우 TIM의 PSC의 값과 ARR값에 의해 타이머의 주기가 정해지고, CCR 값에 의해 Duty ratio를 통해 PWM가 정해지는 것을 알게되었다.

OC (Output Compare) 또한 마찬가지로 PSC와 ARR에 의해  타이머의 주기가 정해지고 CCR의 값에 의해 비교가 발생한다.

위 DataSheet를 보게되면 CCR의 값이 003A로 설정되어 있을 경우 CNT가 003A를 만나게되면 OC1의 출력 값이 반전되고, 중간에 CCR의 값이 B201로 바뀌게 되면 CNT가 B201을 만나게 되는 순간 OC!의 출력값이 또 한 번 반전되게 된다.

PWM과 마찬가지로 OC도 채널을 통해 Output Compare를 사용할 수 있다.

 

파라미터를 통해 Pulse를 CCR을 조절할 수 있다.


https://insoobaik.tistory.com/619

 

STM32 - ADC값에 따른 LED 점멸 (Nucleo-144용 I/O 보드)

Nucleo-144용 I/O 보드는 위와 같이 생겼고, 각 부품에 대한 포트 및 핀 번호는 위의 표와 같다. 이전 글에서 ADC를 통해 아날로그 신호를 디지털로 변환시켜 출력하는 작업을 해보았다. I/O 보드에

insoobaik.tistory.com

위 글에서 사용한ㄷ Nucleo-144용 I/O 보드를 통해 해당 보드에 있는 스위치를 통해 CCR값을 조절하여 LED의 밝기 및 주기를 조절할 것이다.

LED와 스위치에 해당하는 Port를 설정해주고, 스위치 Port의 경우 인터럽트를 발생시킬 것이기 때문에 EXTI로 설정하여 사용해준다.

Uart 값도 설정해준다.

EXTI 인터럽트, TIM3 global interrupt의 경우 OC가 발생했을 때 인터럽트를 사용하기 위해 사용되는 TIM에 대한 인터럽트를 활성화 시켜줘야 한다

코드를 생성한 뒤 TIM에 대한 인터럽트와 OC에 대한 인터럽트를 사용할 것이기 때문에 두 IT를 실행시켜 준다.

 

위 콜백 함수 3개는 각각 TIM, OC, EXTI에 대한 인터럽트가 발생했을 때 동작하는 콜백 함수에 해당한다.

 

HAL_TIM_PeriodElapsedCallback의 경우 TIM이 발생했을 때 htim->Instance를 통해 몇번 TIM인지 확인하고, TIM의 번호가 일치할 경우 아래 코드를 실행 시킨다.

 

HAL_TIM_OC_DelayElapsedCallback의 경우 타이머 주기에 대해 CCR값을 비교하여 해당 CCR 값이 도달했을 때 발생하는 인터럽트에 해당하고, TIM 번호와, 활성화된 Channel을 비교하여 아래 코드들을 실행 시킨다. 현재 Channel 3번에 OC를 부여했기 때문에 ACTIVE_CHANNEL_3이 확인되면 1의 값을 반환하게 된다.

 

HAL_GPIO_EXTI_Callback의 스위치에 할당한 인터럽트로 해당 핀에 Falling edge가 발생하면 해당 인터럽트가 발생한다. (스위치가 풀업 저항에 있기 때문이다.)

 

위 코드를 확인하게 되면 각 EXTI 인터럽트가 발생했을 때 CCR의 값을 변화 시키는 코드가 작성되어 있다.

TIM3은 APB1을 통해 클럭을 전달받고 있고,  84MHz이기 때문에 현재 PSC와 ARR값에 의해 타이머의 주기는 1초에 해당한다.

 

ARR의 값이 10000으로 설정되어 있을 때, EXTI에 의해 CCR 값이 각각 999, 2999, 4999, 9999로 CCR 값이 변경되면, 각 OC가 발생하는 시간은 0.1초, 0.3초, 0.5초, 1초 마다 OC에 의해 인터럽트가 발생하고 코드가 실행된다.

 

 

 

헌재 타이머의 주기가 1Hz이기 때문에 LED에 평균 전압이 최대 불빛을 전달할 만큼 충분한 시간이기 때문에 LED의 밝기를 조절하기 위해서는 타이머 주기값을 빠르게 조절해줘야 한다.

위와 같이 PSC 값을 100배 줄이게 되면 타이머 주기가 100배 빨라지게 되어 OC에 의해 LED 핀에 전달되는 평균 전압이 세분화되어 밝기가 조절되는 것처럼 보이게 된다.

 

 

 

 

 

 

728x90