class Timer – 내부 타이머 제어

타이머는 매우 다양한 작업에 사용할 수 있습니다. 현재로서는 가장 단순한 경우, 즉 함수를 주기적으로 호출하는 경우만 구현되어 있습니다.

각 타이머는 일정한 속도로 증가하는 카운터로 구성됩니다. 카운터가 증가하는 속도는 주변장치 클럭 주파수(Hz 단위)를 타이머 프리스케일러로 나눈 값입니다. 카운터가 타이머 주기에 도달하면 이벤트를 트리거하고, 카운터는 다시 0으로 초기화됩니다. callback 메서드를 사용하면 타이머 이벤트로 Python 함수를 호출할 수 있습니다.

고정된 주파수로 LED를 토글하는 사용 예제:

tim = pyb.Timer(4)              # create a timer object using timer 4
tim.init(freq=2)                # trigger at 2Hz
tim.callback(lambda t:pyb.LED(1).toggle())

콜백에 이름이 있는 함수를 사용하는 예제:

def tick(timer):                # we will receive the timer object when being called
    print(timer.counter())      # show current timer's counter value
tim = pyb.Timer(4, freq=1)      # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick)              # set the callback to our tick function

추가 예제:

tim = pyb.Timer(4, freq=100)    # freq in Hz
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter()                   # get counter (can also set)
tim.prescaler(2)                # set prescaler (can also get)
tim.period(199)                 # set period (can also get)
tim.callback(lambda t: ...)     # set callback for update interrupt (t=tim instance)
tim.callback(None)              # clear callback

참고: Timer(1)은 카메라에 사용됩니다. 마찬가지로 Timer(5)는 서보 드라이버를 제어하고, Timer(6)은 타이밍이 지정된 ADC/DAC 읽기/쓰기에 사용됩니다. 프로그램에서는 다른 타이머를 사용하는 것이 좋습니다.

참고: 콜백(인터럽트) 도중에는 메모리를 할당할 수 없으므로, 콜백 내에서 발생한 예외는 많은 정보를 제공하지 못합니다. 이 제한을 우회하는 방법은 micropython.alloc_emergency_exception_buf() 를 참조하세요.

생성자

class pyb.Timer(id: int, *args, **kwargs)

주어진 id로 새 타이머 객체를 생성합니다. 추가 인수가 주어지면 init(...) 으로 타이머가 초기화됩니다. 유효한 id 값의 집합은 사용 중인 OpenMV Cam의 STM32 MCU에 따라 다릅니다. 사용 가능한 범용 및 고급 제어 타이머에 대해서는 STM32 레퍼런스 매뉴얼을 참조하세요.

메서드

init(*, freq: int | float | None = None, prescaler: int | None = None, period: int | None = None, mode: int = Timer.UP, div: int = 1, callback: Callable[[Timer], None] | None = None, deadtime: int = 0, brk: int = Timer.BRK_OFF, hard: bool = True) None

타이머를 초기화합니다. 초기화는 주파수(Hz 단위)로 하거나 프리스케일러와 주기로 해야 합니다:

tim.init(freq=100)                  # set the timer to trigger at 100Hz
tim.init(prescaler=83, period=999)  # set the prescaler and period directly

키워드 인수:

  • freq — 타이머의 주기적 주파수를 지정합니다. 이는 타이머가 한 번의 완전한 주기를 거치는 주파수로 볼 수도 있습니다.

  • prescaler [0-0xffff] - 타이머의 프리스케일러 레지스터(PSC)에 로드할 값을 지정합니다. 타이머 클럭 소스는 (prescaler + 1) 로 나누어져 타이머 클럭을 산출합니다. 클럭 소스는 타이머의 상위 APB 버스에서 오며 MCU에 따라 다릅니다. STM32에서 APB1의 타이머는 일반적으로 2 * pclk1 로 클럭되고 APB2의 타이머는 2 * pclk2 로 클럭됩니다. 현재 버스 주파수는 pyb.freq() 로 읽을 수 있으며 사용 중인 OpenMV Cam의 MCU에 대해서는 STM32 레퍼런스 매뉴얼을 참조하세요.

  • period 타이머 1, 3, 4, 6-15의 경우 [0-0xffff], 타이머 2 및 5의 경우 [0-0x3fffffff]. 타이머의 자동 리로드 레지스터(ARR)에 로드할 값을 지정합니다. 이는 타이머의 주기(즉, 카운터가 순환하는 시점)를 결정합니다. 타이머 카운터는 period + 1 타이머 클럭 사이클 후에 롤오버됩니다.

  • mode 는 다음 중 하나일 수 있습니다:

    • Timer.UP - 타이머가 0에서 ARR까지 카운트하도록 구성합니다(기본값)

    • Timer.DOWN - 타이머가 ARR에서 0까지 카운트다운하도록 구성합니다.

    • Timer.CENTER - 타이머가 0에서 ARR까지 카운트한 다음 다시 0까지 카운트다운하도록 구성합니다.

  • div 는 1, 2 또는 4 중 하나일 수 있습니다. 타이머 클럭을 나누어 디지털 필터에 사용되는 샘플링 클럭을 결정합니다.

  • callback - Timer.callback()과 동일합니다

  • deadtime - 상보 채널의 전환 사이에 있는 “데드” 또는 비활성 시간의 양을 지정합니다(이 시간 동안 두 채널 모두 비활성 상태가 됩니다). deadtime 은 0에서 1008 사이의 정수일 수 있으며 다음과 같은 제한이 있습니다: 0-128은 1 단위, 128-256은 2 단위, 256-512는 8 단위, 512-1008은 16 단위입니다. deadtimesource_freqdiv 로 나눈 클럭 틱을 측정합니다. deadtime 은 타이머 1과 8에서만 사용할 수 있습니다.

  • brk - BRK_IN 입력이 어서트될 때 PWM 출력을 종료하는 브레이크 모드를 사용할지 여부를 지정합니다. 이 인수의 값은 브레이크가 활성화되는지와 극성이 무엇인지를 결정하며, Timer.BRK_OFF, Timer.BRK_LOW 또는 Timer.BRK_HIGH 중 하나일 수 있습니다. BRK_IN 핀을 선택하려면 mode=Pin.ALT, alt=Pin.AFn_TIMx 로 Pin 객체를 생성하세요. 핀의 GPIO 입력 기능은 alt 모드에서 사용할 수 있습니다 - pull= , value()irq().

  • hard 는 다음 중 하나일 수 있습니다:

    • True - 콜백이 하드 인터럽트 컨텍스트에서 실행되어 지연과 지터를 최소화하지만, 힙에 할당할 수 없는 것을 포함하여 인터럽트 핸들러 작성하기 에 설명된 제한이 적용됩니다.

    • False - 콜백이 소프트 인터럽트로 스케줄링되어 할당이 가능하지만 가비지 컬렉션 지연과 지터가 발생할 수도 있습니다.

    이 옵션의 기본값은 True입니다.

freq를 지정하거나 period와 prescaler를 모두 지정해야 합니다.

deinit() None

타이머를 역초기화합니다.

콜백(및 관련 irq)을 비활성화합니다.

모든 채널 콜백(및 관련 irq)을 비활성화합니다. 타이머를 멈추고 타이머 주변장치를 비활성화합니다.

callback(fun: Callable[[Timer], None] | None) None

타이머가 트리거될 때 호출할 함수를 설정합니다. fun 에는 1개의 인수, 즉 타이머 객체가 전달됩니다. funNone 이면 콜백이 비활성화됩니다.

channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None

채널 번호만 전달되면 이전에 초기화된 채널 객체가 반환됩니다(이전 채널이 없으면 None).

그렇지 않으면 TimerChannel 객체가 초기화되어 반환됩니다.

각 채널은 pwm, 출력 비교 또는 입력 캡처를 수행하도록 구성할 수 있습니다. 모든 채널은 동일한 기본 타이머를 공유하며, 이는 동일한 타이머 클럭을 공유함을 의미합니다.

키워드 인수:

  • mode 는 다음 중 하나일 수 있습니다:

    • Timer.PWM — 타이머를 PWM 모드(액티브 하이)로 구성합니다.

    • Timer.PWM_INVERTED — 타이머를 PWM 모드(액티브 로우)로 구성합니다.

    • Timer.OC_TIMING — 어떤 핀도 구동되지 않음을 나타냅니다.

    • Timer.OC_ACTIVE — 비교 일치가 발생하면 핀이 활성화됩니다(활성 여부는 극성에 의해 결정됨)

    • Timer.OC_INACTIVE — 비교 일치가 발생하면 핀이 비활성화됩니다.

    • Timer.OC_TOGGLE — 비교 일치가 발생하면 핀이 토글됩니다.

    • Timer.OC_FORCED_ACTIVE — 핀이 강제로 활성화됩니다(비교 일치는 무시됨).

    • Timer.OC_FORCED_INACTIVE — 핀이 강제로 비활성화됩니다(비교 일치는 무시됨).

    • Timer.IC — 타이머를 입력 캡처 모드로 구성합니다.

    • Timer.ENC_A — 타이머를 엔코더 모드로 구성합니다. 카운터는 CH1이 변경될 때만 변경됩니다.

    • Timer.ENC_B — 타이머를 엔코더 모드로 구성합니다. 카운터는 CH2가 변경될 때만 변경됩니다.

    • Timer.ENC_AB — 타이머를 엔코더 모드로 구성합니다. 카운터는 CH1 또는 CH2가 변경될 때 변경됩니다.

  • callback - TimerChannel.callback()과 동일합니다

  • pin None(기본값) 또는 Pin 객체입니다. 지정되면(그리고 None이 아니면) 이 타이머 채널에 대해 표시된 핀의 대체 기능이 구성됩니다. 핀이 이 타이머 채널에 대한 어떤 대체 기능도 지원하지 않으면 오류가 발생합니다.

Timer.PWM 모드의 키워드 인수:

  • pulse_width - 사용할 초기 펄스 폭 값을 결정합니다.

  • pulse_width_percent - 사용할 초기 펄스 폭 백분율을 결정합니다.

Timer.OC 모드의 키워드 인수:

  • compare - 비교 레지스터의 초기값을 결정합니다.

  • polarity 는 다음 중 하나일 수 있습니다:

    • Timer.HIGH - 출력이 액티브 하이입니다

    • Timer.LOW - 출력이 액티브 로우입니다

Timer.IC 모드의 선택적 키워드 인수:

  • polarity 는 다음 중 하나일 수 있습니다:

    • Timer.RISING - 상승 에지에서 캡처합니다.

    • Timer.FALLING - 하강 에지에서 캡처합니다.

    • Timer.BOTH - 양쪽 에지에서 캡처합니다.

캡처는 기본 채널에서만 작동하며 상보 채널에서는 작동하지 않습니다.

Timer.ENC 모드에 대한 참고 사항:

  • 2개의 핀이 필요하므로 Pin API를 사용하여 적절한 타이머 AF를 사용하도록 하나 또는 두 핀을 모두 구성해야 합니다.

  • timer.counter() 메서드를 사용하여 엔코더 값을 읽으세요.

  • CH1과 CH2에서만 작동합니다(CH1N 또는 CH2N에서는 작동하지 않음)

  • 엔코더 모드를 설정할 때 채널 번호는 무시됩니다.

PWM 예제 – 모든 STM32 OpenMV Cam에서 TIM4 채널 1과 2는 각각 헤더 핀 P7P8 에 연결되어 있습니다:

timer = pyb.Timer(4, freq=1000)
ch1 = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.P7,
                    pulse_width=8000)
ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.P8,
                    pulse_width=16000)
counter(value: int | None = None) int | None

타이머 카운터를 가져오거나 설정합니다.

freq(value: int | float | None = None) int | float | None

타이머의 주파수를 가져오거나 설정합니다(설정하면 프리스케일러와 주기가 변경됨).

period(value: int | None = None) int | None

타이머의 주기를 가져오거나 설정합니다.

prescaler(value: int | None = None) int | None

타이머의 프리스케일러를 가져오거나 설정합니다.

source_freq() int

타이머 소스의 주파수를 가져옵니다.

상수

카운터 모드 상수(init()mode 인수):

UP: int

0 에서 ARR까지 카운트합니다(기본 모드).

DOWN: int

ARR에서 0 까지 카운트합니다.

CENTER: int

0 에서 ARR까지 카운트한 다음 다시 0 까지 카운트합니다.

브레이크 모드 상수(init()brk 인수):

BRK_OFF: int

브레이크 입력이 비활성화됩니다.

BRK_LOW: int

브레이크 입력이 액티브 로우입니다.

BRK_HIGH: int

브레이크 입력이 액티브 하이입니다.

채널 모드 상수(channel()mode 인수):

PWM: int

채널을 PWM 출력(액티브 하이)으로 구성합니다.

PWM_INVERTED: int

채널을 PWM 출력(액티브 로우)으로 구성합니다.

OC_TIMING: int

출력 비교 타이밍 모드; 어떤 핀도 구동되지 않습니다.

OC_ACTIVE: int

출력 비교 활성 모드; 비교 일치 시 핀이 활성화됩니다.

OC_INACTIVE: int

출력 비교 비활성 모드; 비교 일치 시 핀이 비활성화됩니다.

OC_TOGGLE: int

출력 비교 토글 모드; 비교 일치 시 핀이 토글됩니다.

OC_FORCED_ACTIVE: int

출력 비교 강제 활성 모드; 핀이 강제로 활성화되고 비교 일치는 무시됩니다.

OC_FORCED_INACTIVE: int

출력 비교 강제 비활성 모드; 핀이 강제로 비활성화되고 비교 일치는 무시됩니다.

IC: int

채널을 입력 캡처 모드로 구성합니다.

ENC_A: int

엔코더 모드: 카운터는 CH1이 변경될 때만 변경됩니다.

ENC_B: int

엔코더 모드: 카운터는 CH2가 변경될 때만 변경됩니다.

ENC_AB: int

엔코더 모드: 카운터는 CH1 또는 CH2가 변경될 때마다 변경됩니다.

출력 비교 극성(OC 모드에서 channel()polarity 인수):

HIGH: int

출력이 액티브 하이입니다.

LOW: int

출력이 액티브 로우입니다.

입력 캡처 극성(IC 모드에서 channel()polarity 인수):

RISING: int

상승 에지에서 캡처합니다.

FALLING: int

하강 에지에서 캡처합니다.

BOTH: int

양쪽 에지에서 캡처합니다.