classe Timer – controla os timers internos¶
Os timers podem ser usados para uma grande variedade de tarefas. No momento, apenas o caso mais simples está implementado: o de chamar uma função periodicamente.
Cada timer consiste em um contador que conta de forma crescente a uma determinada taxa. A taxa na qual ele conta é a frequência do clock do periférico (em Hz) dividida pelo prescaler do timer. Quando o contador alcança o período do timer, ele dispara um evento e o contador retorna a zero. Usando o método callback, o evento do timer pode chamar uma função Python.
Exemplo de uso para alternar um LED a uma frequência fixa:
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())
Exemplo usando uma função nomeada para o callback:
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
Outros exemplos:
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
Nota: O Timer(1) é usado pela câmera. De forma semelhante, o Timer(5) controla o driver do servo, e o Timer(6) é usado para leitura/escrita temporizada do ADC/DAC. Recomenda-se usar os demais timers em seus programas.
Nota: Não é possível alocar memória durante um callback (uma interrupção) e, portanto, as exceções levantadas dentro de um callback não fornecem muitas informações. Veja micropython.alloc_emergency_exception_buf() para saber como contornar essa limitação.
Construtores¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Constrói um novo objeto timer com o id fornecido. Se argumentos adicionais forem fornecidos, então o timer é inicializado por
init(...). O conjunto de valores válidos paraiddepende do MCU STM32 da OpenMV Cam em uso; consulte o manual de referência do STM32 para conhecer os timers de propósito geral e de controle avançado disponíveis.Métodos¶
- 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¶
Inicializa o timer. A inicialização deve ser feita por frequência (em Hz) ou por prescaler e período:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Argumentos nomeados:
freq— especifica a frequência periódica do timer. Você também pode encarar isso como a frequência com que o timer percorre um ciclo completo.prescaler[0-0xffff] - especifica o valor a ser carregado no Registrador de Prescaler (PSC) do timer. A fonte de clock do timer é dividida por(prescaler + 1)para derivar o clock do timer. A fonte de clock provém do barramento APB pai do timer e é dependente do MCU. No STM32, os timers no APB1 normalmente operam a2 * pclk1e os timers no APB2 a2 * pclk2; leia as frequências atuais dos barramentos compyb.freq()e consulte o manual de referência do STM32 para o MCU da sua OpenMV Cam.period[0-0xffff] para os timers 1, 3, 4 e 6-15. [0-0x3fffffff] para os timers 2 e 5. Especifica o valor a ser carregado no Registrador de AutoReload (ARR) do timer. Isso determina o período do timer (ou seja, quando o contador completa o ciclo). O contador do timer fará o roll-over apósperiod + 1ciclos de clock do timer.modepode ser um dos seguintes:Timer.UP- configura o timer para contar de 0 até ARR (padrão)Timer.DOWN- configura o timer para contar de ARR de forma decrescente até 0.Timer.CENTER- configura o timer para contar de 0 até ARR e então de volta até 0.
divpode ser 1, 2 ou 4. Divide o clock do timer para determinar o clock de amostragem usado pelos filtros digitais.callback- conforme Timer.callback()deadtime- especifica a quantidade de tempo “morto” ou inativo entre transições em canais complementares (ambos os canais ficarão inativos durante esse tempo).deadtimepode ser um inteiro entre 0 e 1008, com as seguintes restrições: 0-128 em passos de 1, 128-256 em passos de 2, 256-512 em passos de 8 e 512-1008 em passos de 16.deadtimemede ticks desource_freqdivididos pordivticks de clock.deadtimeestá disponível apenas nos timers 1 e 8.brk- especifica se o modo de break é usado para anular a saída do PWM quando a entradaBRK_INé acionada. O valor desse argumento determina se o break está habilitado e qual é a polaridade, podendo serTimer.BRK_OFF,Timer.BRK_LOWouTimer.BRK_HIGH. Para selecionar o pinoBRK_IN, construa um objeto Pin commode=Pin.ALT, alt=Pin.AFn_TIMx. Os recursos de entrada GPIO do pino ficam disponíveis no modo alt -pull=,value()eirq().hardpode ser um dos seguintes:True- O callback será executado em contexto de interrupção de hardware (hard interrupt), o que minimiza atraso e jitter, mas está sujeito às limitações descritas em Escrevendo manipuladores de interrupção, incluindo a impossibilidade de alocar no heap.False- O callback será agendado como uma interrupção de software (soft interrupt), permitindo que ele aloque, mas possivelmente introduzindo também atrasos e jitter da coleta de lixo.
O valor padrão dessa opção é True.
Você deve especificar freq ou ambos period e prescaler.
- deinit() None¶
Desinicializa o timer.
Desabilita o callback (e a irq associada).
Desabilita quaisquer callbacks de canal (e a irq associada). Para o timer e desabilita o periférico do timer.
- callback(fun: Callable[[Timer], None] | None) None¶
Define a função a ser chamada quando o timer disparar.
funrecebe 1 argumento, o objeto timer. SefunforNoneentão o callback será desabilitado.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Se apenas um número de canal for passado, então um objeto de canal previamente inicializado é retornado (ou
Nonese não houver canal anterior).Caso contrário, um objeto TimerChannel é inicializado e retornado.
Cada canal pode ser configurado para executar pwm, comparação de saída (output compare) ou captura de entrada (input capture). Todos os canais compartilham o mesmo timer subjacente, o que significa que compartilham o mesmo clock do timer.
Argumentos nomeados:
modepode ser um dos seguintes:Timer.PWM— configura o timer no modo PWM (ativo em nível alto).Timer.PWM_INVERTED— configura o timer no modo PWM (ativo em nível baixo).Timer.OC_TIMING— indica que nenhum pino é acionado.Timer.OC_ACTIVE— o pino se tornará ativo quando ocorrer uma correspondência de comparação (o estado ativo é determinado pela polaridade)Timer.OC_INACTIVE— o pino se tornará inativo quando ocorrer uma correspondência de comparação.Timer.OC_TOGGLE— o pino será alternado quando ocorrer uma correspondência de comparação.Timer.OC_FORCED_ACTIVE— o pino é forçado a ativo (a correspondência de comparação é ignorada).Timer.OC_FORCED_INACTIVE— o pino é forçado a inativo (a correspondência de comparação é ignorada).Timer.IC— configura o timer no modo de captura de entrada (Input Capture).Timer.ENC_A— configura o timer no modo Encoder. O contador só muda quando CH1 muda.Timer.ENC_B— configura o timer no modo Encoder. O contador só muda quando CH2 muda.Timer.ENC_AB— configura o timer no modo Encoder. O contador muda quando CH1 ou CH2 muda.
callback- conforme TimerChannel.callback()pinNone (o padrão) ou um objeto Pin. Se especificado (e não None), isso fará com que a função alternativa do pino indicado seja configurada para este canal do timer. Um erro será levantado se o pino não suportar nenhuma função alternativa para este canal do timer.
Argumentos nomeados para os modos Timer.PWM:
pulse_width- determina o valor inicial de largura de pulso a ser usado.pulse_width_percent- determina a porcentagem inicial de largura de pulso a ser usada.
Argumentos nomeados para os modos Timer.OC:
compare- determina o valor inicial do registrador de comparação.polaritypode ser um dos seguintes:Timer.HIGH- a saída é ativa em nível altoTimer.LOW- a saída é ativa em nível baixo
Argumentos nomeados opcionais para os modos Timer.IC:
polaritypode ser um dos seguintes:Timer.RISING- captura na borda de subida.Timer.FALLING- captura na borda de descida.Timer.BOTH- captura em ambas as bordas.
Observe que a captura só funciona no canal primário, e não nos canais complementares.
Notas para os modos Timer.ENC:
Requer 2 pinos, de modo que um ou ambos os pinos precisarão ser configurados para usar a AF apropriada do timer por meio da API Pin.
Leia o valor do encoder usando o método timer.counter().
Funciona apenas em CH1 e CH2 (e não em CH1N ou CH2N)
O número do canal é ignorado ao definir o modo encoder.
Exemplo de PWM – em toda OpenMV Cam STM32, os canais 1 e 2 do
TIM4são roteados para os pinos de headerP7eP8, respectivamente: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)
Constantes¶
Constantes do modo de contagem (argumento
modedeinit()):Constantes do modo de break (argumento
brkdeinit()):Constantes do modo de canal (argumento
modedechannel()):- OC_ACTIVE: int¶
Modo ativo de comparação de saída; o pino se torna ativo na correspondência de comparação.
- OC_INACTIVE: int¶
Modo inativo de comparação de saída; o pino se torna inativo na correspondência de comparação.
- OC_TOGGLE: int¶
Modo de alternância de comparação de saída; o pino alterna na correspondência de comparação.
- OC_FORCED_ACTIVE: int¶
Modo de comparação de saída forçado-ativo; o pino é forçado a ativo e a correspondência de comparação é ignorada.
- OC_FORCED_INACTIVE: int¶
Modo de comparação de saída forçado-inativo; o pino é forçado a inativo e a correspondência de comparação é ignorada.
Polaridade da comparação de saída (argumento
polaritydechannel()nos modos OC):Polaridade da captura de entrada (argumento
polaritydechannel()no modo IC):