※ 해당 글은 개인 공부 기록을 남겨놓는 것이 목적임으로 오류가 발생할수 있습니다.
오류 또는 업데이트된 사항이 있다면 댓글로 알려주시면 감사하겠습니다.
STM32 input capture
MCU의 펄스 및 주어진 입력 신호의 주파수 및 펄스 폭등을 측정하고자 할 때 사용
CC1S 비트가 모두 0이면 output compare 기능이 동작(NOR gate)
CC1S 비트가 하나라도 1 이면 Input capture 기능이 동작(OR gate)
기본 타이머 설정
1. 우선 CNT의 값을 결정하기 위해서는 우선 PSC(프리스케일)값을 정하고
2. ARR(Auto-reload register)값으로 CNT의 증가 속도를 정해 줍니다. 여기까지는 기본 타이머 내용입니다.
3. capture 모드로 사용할지 compare 모드로 사용할지 결정합니다. capture 모드로 설정하겠습니다.
INPUT CAPTURE 레지스터 진행 순서
1. 입력 캡처 모드에서 캡처/비교 레지스터(TIMx_CCRx)는 해당 ICx 신호에 의해 감지
2. 카운터 값을 래치하는 데 사용됩니다.
3.캡처가 발생하면 해당 CCXIF 플래그(TIMx_SR 레지스터)가 설정되고 인터럽트 또는 DMA 요청이 활성화된 경우 보낼 수 있습니다.
4. CCxIF 플래그가 이미 높은 동안 캡처가 발생하면 오버 캡처 플래그 CCxOF(TIMx_SR 레지스터)가 설정됩니다.
5. CCxIF는 0에 쓰거나 TIMx_CCRx 레지스터에 저장된 캡처된 데이터를 읽어 소프트웨어로 지울 수 있습니다.
6. CCxOF는 0에 기록될 때 지워집니다
HAL LIBRARY 이용 펄스 주파수 계산
주파수 계산 과정
1. 카운터 스타트 함수
2. 상승/하강 에지 발생시 카운트 값 반환
3. 주파수 계산 = (카운터 1 증가하는데 걸리는 시간) / (두번째 에지 발생 카운터 값 - 첫번째 에지 발생 카운터 값)
HAL_TIM_SET_COUNTER / HAL_TIM_GET_COUNTER 이용 펄스 주파수 계산
__HAL_TIM_SET_COUNTER(&htim, number);
__HAL_TIM_GET_COUNTER (&htim);
uint32_t pMillis = 0, pulse_time = 0, counter_time = 0;
__HAL_TIM_SET_COUNTER(&htim1, 0)
pMillis = HAL_GetTick(); // used this to avoid infinite while loop (for timeout)
// wait for the echo pin to go high
while (!(HAL_GPIO_ReadPin (PORT, PIN)));
Value1 = __HAL_TIM_GET_COUNTER (&htim1);
// wait for the echo pin to go low
while ((HAL_GPIO_ReadPin (PORT, PIN)));
Value2 = __HAL_TIM_GET_COUNTER (&htim);
pulse_time = (Value2-Value1); // 1 pulse clock time
counter_time = 1/TIMER CLOCK/Prescaler/ARR;
frequency = counter_time / pulse_time;
'Stm32 > 개인 학습' 카테고리의 다른 글
[PWM] preload register (0) | 2024.12.27 |
---|---|
ST LINK V2 & SWD 디버깅[1] (0) | 2024.07.16 |
HAL 라이브러리 SPI 함수 정리 (0) | 2024.07.07 |
HAL 라이브러리 I2C 함수 정리 (0) | 2024.07.07 |
ADC란?(PCM)[1] (0) | 2024.07.05 |