STM32 타이머 애플리케이션: PWM 입력 모드
STM32 타이머의 PWM 입력 모드는 마이크로컨트롤러가 입력 PWM 신호의 주파수 및 듀티 사이클과 같은 특성을 직접 측정할 수 있도록 하는 강력한 기능입니다. 타이머의 입력 캡처 채널을 적절하게 구성하면 CPU 개입을 최소화하면서 신호의 하이 시간과 주기를 자동으로 캡처하고 처리할 수 있습니다.
이 가이드에서는 다음 내용을 다룹니다.
PWM 입력 모드 소개.
STM32CubeIDE 설정.
펌웨어 개발.
연결.
결과.
1. PWM 입력 모드 소개:
STM32 타이머의 PWM 입력 모드는 모터 제어, 센서 인터페이스 또는 데이터를 PWM 펄스로 인코딩하는 다른 장치와의 통신 등 외부 PWM 신호를 측정하고 분석해야 할 때 널리 사용됩니다. 이 모드에서 타이머는 두 개의 입력 캡처 채널로 작동하도록 구성됩니다. 한 채널은 PWM 신호의 주기를 측정하고, 다른 채널은 펄스의 하이 타임을 캡처합니다. 캡처된 두 값을 비교하여 신호의 듀티 사이클과 주파수를 정확하게 결정할 수 있습니다.
내부적으로 타이머 하드웨어가 캡처 이벤트 동기화를 담당하여 펄스 폭 측정을 위한 복잡한 소프트웨어 루틴이 필요 없게 합니다. 이를 통해 높은 입력 주파수에서도 정확한 측정이 가능하고 CPU 부하도 낮게 유지됩니다. 예를 들어, 모터 속도 모니터링에서 속도 센서에서 입력되는 PWM 신호를 타이머 입력에 직접 연결할 수 있으며, 타이머 하드웨어는 지속적인 폴링 없이도 신호의 특성을 지속적으로 캡처합니다.
PWM 입력 모드를 사용하는 주요 장점은 프로세스가 전적으로 하드웨어에서 처리된다는 것입니다. 이를 통해 소프트웨어 기반 타이밍 방식에 비해 견고성이 보장되고 지터가 감소하며 측정 정밀도가 향상됩니다. 또한, 인터럽트나 DMA와 함께 사용하면 캡처된 값을 추가 처리를 위해 메모리로 원활하게 전송할 수 있으므로 실시간 시스템에서 PWM 측정을 효율적으로 처리할 수 있습니다.
이러한 기능 덕분에 PWM 입력 모드는 서보 제어 피드백, 초음파 센서 측정, 디지털 통신 디코딩부터 범용 주파수 또는 듀티 사이클 모니터링에 이르기까지 다양한 임베디드 애플리케이션에서 핵심적인 기술로 자리 잡았습니다. PWM 입력 모드는 펄스 신호의 아날로그 세계와 마이크로컨트롤러의 디지털 로직을 안정적으로 연결하여 STM32의 고급 타이머 주변장치를 가장 실용적으로 활용하는 방법 중 하나입니다.
2. STM32CubeIDE 설정:
작업 공간을 선택한 후 STM32CubeIDE를 열고 다음과 같이 새 프로젝트를 만듭니다.
MCU를 선택하세요:
프로젝트 이름을 지정하세요:
프로젝트가 생성되면 STM32CubeMX 창이 나타납니다.
시계 구성에서 시스템 시계를 최대값(이 경우 100MHz)으로 설정하고 타이머 주파수를 다음과 같이 기록합니다.
타이머의 클록 주파수가 100MHz라는 점에 주목하세요.
다음으로, TIM2를 PWM 입력 모드에서 작동하도록 구성하겠습니다.
Pinout and Configuration에서 타이머 섹션으로 가서 TIM2를 선택하고 다음과 같이 구성합니다.
- 클록 소스: 내부 클록
- 결합 채널: CH1의 PWM 입력
다음으로, 매개변수 설정에서:
- 프리스케일러를 0으로 설정하면 최대 속도를 의미합니다.
- 최대값까지의 카운터 기간(이 경우 32비트 0xFFFFFFFF).
- 자동 재로드 사전 로드를 활성화합니다.
- 나머지는 기본값으로 두세요.
다음으로, 다음과 같이 순환 모드에서 TIM2_CH1에 대한 DMA를 활성화합니다.
다음으로, 타이머와 관련된 DMA 채널에 대한 인터럽트를 다음과 같이 비활성화합니다.
시스템 코어에서 NVIC를 열고 Enforce DMA 인터럽트를 비활성화하고 다음과 같이 채널에 대한 DMA 인터럽트를 비활성화합니다.
이렇게 하면 DMA 인터럽트 생성이 발생하지 않고 MCU 성능에 영향을 미치지 않도록 할 수 있습니다.
다음으로, TIM5를 구성하여 다음과 같이 PWM 신호를 생성합니다.
이 매개변수를 사용하여 1MHz 주파수와 50% 듀티 사이클의 PWM 신호를 생성합니다. PWM 모드에서 타이머를 구성하는 방법에 대한 자세한 내용은 이 가이드를 참조하십시오.
구성은 여기까지입니다. 프로젝트를 저장하면 생성됩니다.
3. 펌웨어 개발:
프로젝트가 생성되면 main.c가 열립니다.
main.c가 열리면 사용자 begin PV에서 다음 변수를 선언합니다.
uint32_t CCR1_Value ;
이 변수는 측정된 PWM의 주파수를 결정하는 측정된 펄스 길이(주기)를 보관합니다.
uint32_t CCR2_Value ;
이는 펄스의 측정된 길이(PWM 신호의 듀티 사이클)를 유지합니다.
uint32_t frequency ;
float duty ;
이 값은 신호의 주파수와 듀티를 유지합니다.
다음으로, 메인 함수의 사용자 begin 2에서 다음과 같이 DMA 모드에서 입력 캡처의 TIM2_CH1을 시작합니다.
HAL_TIM_IC_Start_DMA ( & htim2 , TIM_CHANNEL_1 , & CCR1_Value , 1 );
다음과 같이 입력 캡처 일반 모드에서 TIM2_CH2를 시작합니다.
HAL_TIM_IC_Start( & htim2 , TIM_CHANNEL_2 );
PWM 신호를 시작합니다.
HAL_TIM_PWM_Start( & htim5 , TIM_CHANNEL_1 );
다음으로, 사용자 코드에서 while 1 루프에서 begin 3을 실행합니다.
먼저, 신호의 주파수를 다음과 같이 계산합니다.
frequency = 100000000 / ( CCR1_Value );
타이머는 초당 1억 번 트리거되고 CCR1은 이 1억 개의 펄스가 얼마나 지속되었는지 저장하므로, 1억 개를 캡처된 값으로 나누면 주파수를 구할 수 있습니다. CCR1_Value는 DMA에 의해 업데이트되므로 수동으로 읽을 필요가 없습니다.
다음으로, CCR2를 읽어 듀티 사이클을 다음과 같이 결정합니다.
CCR2_Value = HAL_TIM_ReadCapturedValue ( & htim2 , TIM_CHANNEL_2 );
다음과 같이 CCR2/CCR1 * 100으로 나누어 듀티 사이클을 계산합니다.
duty = ((( float ) CCR2_Value / ( float ) CCR1_Value )) * 100.0 ;
10밀리초마다 주기를 반복합니다.
HAL_지연 ( 10 );
펌웨어에 대한 설명은 여기까지입니다.
다음과 같이 프로젝트를 빌드하고 디버깅 세션을 시작하세요.
4. 연결:
TIM2_CH1과 TIM5_CH1은 각각 PA0과 PA5이므로 연결은 다음과 같습니다.
5. 결과:
Live Expression에 CCR1_Value, CCR2_Value, duty 및 frequency를 추가합니다.
1MHz 테스트:
10MHz 테스트:
1kHz:
5MHz까지 사용 가능하며, 이를 넘으면 측정 측면에서 편차가 발생합니다.
즐거운 코딩 되세요 😉
'STM32' 카테고리의 다른 글
STM32 MAX485 사용한 RS485 통신 (3) | 2025.08.27 |
---|---|
STM32 펄스 카운터 사용 (2) | 2025.08.27 |
U8G2 그래픽 라이브러리를 STM32로 포팅 2부: SSD1306 OLED 디스플레이 (1) | 2025.08.26 |
새로운 AI 가속 STM32N6 시작하기 (1) | 2025.08.22 |
STM32 중급 과정 ADC 개요 8 (0) | 2025.08.22 |
STM32 중급 과정 Peripheral Hands-On: I2C 7-1 (0) | 2025.08.21 |
STM32 중급 과정 I2C 개요 7 (0) | 2025.08.20 |
STM32 중급 과정 Peripheral Hands-On: SPI 6-1 (0) | 2025.08.19 |
더욱 좋은 정보를 제공하겠습니다.~ ^^