반응형
STM32에서 펄스 카운터는 주로 타이머 모듈을 사용하여 펄스 신호의 개수나 펄스 폭 등을 측정합니다. 제너럴 퍼포스 타이머 또는 어드밴스드 컨트롤 타이머의 입력 캡처(Input Capture) 모드를 활용하면, 외부에서 들어오는 펄스 신호의 펄스 폭을 측정하거나 펄스 발생 빈도를 카운트할 수 있습니다. 이를 위해 타이머의 클럭 분주를 설정하고, 특정 입력 채널을 캡처 모드로 설정한 뒤, HAL 라이브러리의 HAL_TIM_IC_Start() 함수를 호출하여 캡처 기능을 시작하고, HAL_TIM_ReadCapturedValue() 함수로 캡처된 값을 읽어 펄스 개수나 폭을 계산할 수 있습니다.
펄스 카운터 구현 단계
-
1. 타이머 및 입력 채널 설정:
- 타이머 선택: 펄스 카운터로 사용할 제너럴 퍼포스 타이머(예: TIM2, TIM3) 또는 어드밴스드 컨트롤 타이머를 선택합니다.
- 타이머 모드: 입력 캡처 모드(Input Capture Mode)로 타이머 채널을 설정합니다.
- 입력 핀 할당: 캡처할 펄스 신호가 연결될 타이머의 특정 채널을 지정된 GPIO 핀에 할당합니다.
-
2. 클럭 및 prescaler 설정:
- RCC 클럭 설정: MCU의 시스템 클럭을 설정하고, 타이머에 공급될 클럭을 활성화합니다.
- Prescaler(분주비) 설정: 타이머의 클럭 주파수를 조절하기 위한 Prescaler 값을 설정합니다. 이 값에 따라 펄스 카운트의 분해능이 결정됩니다.
-
3. 펄스 카운터 시작:
- HAL 라이브러리 사용: STM32CubeMX 또는 HAL 라이브러리를 사용하여 타이머를 초기화합니다.
- 캡처 시작: `HAL_TIM_IC_Start()`와 같은 함수를 호출하여 설정된 입력 채널의 캡처 기능을 활성화합니다.
-
4. 펄스 값 읽기 및 처리:
- 캡처 값 읽기: HAL_TIM_ReadCapturedValue() 함수를 사용하여 캡처된 펄스 값을 읽습니다. 이 값은 입력 신호의 펄스 폭, 펄스 간격 등을 나타냅니다.
- 펄스 카운트 계산: 캡처된 값들을 이용하여 펄스 개수를 세거나, 펄스 폭을 계산하여 원하는 데이터를 얻습니다.
-
5. 인터럽트 활용 (선택 사항):
- 타이머 인터럽트: 타이머의 캡처 이벤트 발생 시 인터럽트를 활성화하면 실시간으로 펄스 변화를 감지할 수 있습니다.
- NVIC 설정: 인터럽트 서비스 루틴(ISR)을 통해 펄스 값을 처리하고 카운트를 갱신합니다.
STM32 마이크로컨트롤러는 "인코더 모드" 또는 "입력 캡처 모드"에서 내장된 하드웨어 타이머를 사용하여 외부 펄스를 계산하도록 구성할 수 있습니다.
1. 인코더 모드를 사용한 펄스 계산:
-
개념:이 모드는 직교 인코더용으로 설계되었지만, 타이머 채널 중 하나를 펄스 입력으로 설정하여 단순 펄스를 계산하는 데에도 사용할 수 있습니다. 타이머의 카운터 레지스터는 각 펄스 에지(설정에 따라 상승 또는 하강)에 따라 증가 또는 감소합니다.
-
구현 단계(STM32CubeIDE):
- 타이머 선택: 사용 가능한 일반용 또는 고급 제어 타이머(예: TIM2, TIM3)를 선택합니다.
- 타이머 모드 구성: CubeMX 구성에서 타이머를 "인코더 모드"로 설정합니다.
- GPIO 핀 할당: 타이머의 입력 채널(예: 채널 1 및/또는 채널 2)에 적합한 GPIO 핀을 선택하고 선택한 타이머에 대한 올바른 대체 기능 매핑을 사용하여 이를 "대체 기능 푸시-풀"로 구성합니다.
- 프리스케일러 및 주기 설정: 프리스케일러 및 주기 레지스터를 구성합니다. 간단한 펄스 계산의 경우, 주기를 최대값(예: 16비트 타이머의 경우 0xFFFF)으로 설정하여 연속 계산을 허용할 수 있습니다.
- 타이머 활성화: 인코더 모드에서 타이머를 시작하거나 HAL_TIM_Encoder_Start()이와 유사한 저수준 함수를 사용합니다.
- 카운터 읽기: 타이머의 카운터 레지스터(예: __HAL_TIM_GET_COUNTER(&htimx))에서 현재 펄스 카운트를 읽습니다.
2. 입력 캡처 모드를 사용한 펄스 계산:
-
개념:이 모드에서 타이머는 지정된 입력 핀에서 특정 에지(상승, 하강 또는 둘 다)가 감지될 때마다 내부 카운터 값을 캡처합니다. 연속적인 펄스 에지에서 카운터 값을 캡처함으로써 펄스 수를 확인할 수 있습니다.
-
구현 단계(STM32CubeIDE):
- 타이머 선택: 사용 가능한 타이머를 선택하세요.
- 입력 캡처 구성: 타이머 채널 중 하나를 "입력 캡처 직접 모드" 또는 "입력 캡처 간접 모드"로 설정합니다.
- GPIO 핀 할당: 선택한 입력 캡처 채널에 해당하는 GPIO 핀을 선택하고 "대체 기능 푸시풀"로 구성합니다.
- 입력 캡처 극성 설정: 펄스 신호에 따라 캡처할 에지(상승, 하강 또는 둘 다)를 선택합니다.
- 입력 캡처 인터럽트 활성화: 선택한 채널에 대한 입력 캡처 인터럽트를 활성화합니다.
- 인터럽트 핸들러 구현: 함수 내에서 HAL_TIM_IC_CaptureCallback()(HAL을 사용하는 경우) 캡처된 카운터 값을 읽습니다. 캡처된 연속된 값을 비교하거나 인터럽트 내에서 소프트웨어 카운터를 증가시키면 펄스 수를 추적할 수 있습니다.
- 타이머 시작: 또는 유사한 것을 사용하여 입력 캡처 모드에서 타이머를 시작합니다 HAL_TIM_IC_Start_IT().
예제 코드 조각(개념적 - HAL 라이브러리):
// Encoder Mode Initialization (CubeMX generated)
TIM_HandleTypeDef htimx; // Replace x with your timer number
// In main() or a dedicated init function
HAL_TIM_Encoder_Start(&htimx, TIM_CHANNEL_ALL);
// Read pulse count
uint32_t pulse_count = __HAL_TIM_GET_COUNTER(&htimx);
// Input Capture Initialization (CubeMX generated)
TIM_HandleTypeDef htimx; // Replace x with your timer number
// In main() or a dedicated init function
HAL_TIM_IC_Start_IT(&htimx, TIM_CHANNEL_x); // Replace x with your channel
// In your TIM Input Capture Callback function
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIMx && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_x) // Replace x with your timer/channel
{
// Increment a software counter or process captured values
pulse_counter++;
}
}
참고: 특정 레지스터 이름, 함수 호출 및 구성 옵션은 STM32 시리즈 및 선택한 개발 환경(예: STM32CubeIDE, Keil MDK, IAR Embedded Workbench)에 따라 약간씩 다를 수 있습니다. 자세한 내용은 해당 마이크로컨트롤러의 STM32 참조 설명서와 선택한 라이브러리 설명서를 참조하십시오.
참고사이트는 관련이 없더라도 한 번 찾아보기 바람
반응형
'STM32' 카테고리의 다른 글
STM32 MAX485 사용한 RS485 통신 (3) | 2025.08.27 |
---|---|
U8G2 그래픽 라이브러리를 STM32로 포팅 2부: SSD1306 OLED 디스플레이 (1) | 2025.08.26 |
STM32 타이머 애플리케이션: PWM 입력 모드 (1) | 2025.08.25 |
새로운 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 |
더욱 좋은 정보를 제공하겠습니다.~ ^^