Medição de Frequência Utilizando Captura de Entrada no STM32

A medição de frequência com microcontroladores STM32 pode ser implementada eficientemente através do módulo de Captura de Entrada (Input Capture) dos temporizadores. Uma abordagem comum e de alta precisão para frequências mais baixas é a medição de período (Period Measurement), empregando o modo escravo de reset (Reset Mode) do temporizador. Este método foca na determinação do tempo decorrido entre eventos consecutivos para calcular a frequência do sinal de entrada.

Princípio Fundamental: Medição de Período

A relação entre frequência (\(f\)) e período (\(T\)) é expressa por:

\[ f = \frac{1}{T} \]

Portanto, ao medir o tempo preciso (\(T\)) entre dois flancos (geralmente ascendentes) adjacentes de um sinal, é possível calcular sua frequência. Na prática, isso envolve contar os "ticks" do temporizador entre esses dois eventos.

Configuração do Relógio do Temporizador

Para garantir uma medição precisa, o temporizador deve ser configurado com uma base de tempo conhecida. Consideremos a seguinte configuração de pré-escalonador:

TIM_Prescaler = 72 - 1; // Pré-escalador para dividir o clock

Asssumindo um clock de sistema (SYSCLK) de 72 MHz e que o clock do periférico APB1 (onde o TIM3 geralmente está) também seja 72 MHz (após os divisores de barramento), a frequência do temporizador será:

\[ \text{Frequência do Temporizador} = \frac{72 \text{ MHz}}{72} = 1 \text{ MHz} \]

Isso significa que o contador do temporizador incrementa a cada 1 microssegundo (µs). Assim, cada unidade na conatgem do temporizador corresponde a 1 µs.

Valor do Contador Tempo Real
1 1 µs
1000 1 ms

Operação do Módulo de Captura de Entrada

A medição envolve a configuração de um canal de captura de entrada para detectar transições no sinal de interesse:

  1. Associação do Pino GPIO ao Temporizador: Um pino GPIO (ex: PA6) é configurado como entrada alternativa e conectado a um canal de temporizador (ex: TIM3_CH1).
  2. Definição da Polaridade do Evento: O temporizador é configurado para detectar um flanco específico.
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; // Detectar flancos de subida

Esta configuração instrui o TIM3 a capturar eventos no seu Canal 1, especificamente nos flancos de subida.

Modo Escravo: Reset Automático (Chave da Medição de Período)

A característica mais importante desta técnica reside na configuração do temporizador em modo escravo de reset:

TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // Seleciona o canal 1 como trigger
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // Configura o modo escravo de reset

Estas linhas são cruciais para a medição de período. Quando um flanco de subida é detectado no Canal 1 (configurado como trigger):

  1. O valor atual do registrador de contagem (CNT) do temporizador é automaticamente copiado para o registrador de captura/comparação (CCR1).
  2. O registrador de contagem (CNT) do temporizador é automaticamente reiniciado para zero.

Em outras palavras:

  • No primeiro flanco de subida, o contador CNT é zerado.
  • No segundo flanco de subida, o valor acumulado em CNT (que representa o tempo desde o primeiro flanco) é salvo em CCR1, e CNT é zerado novamente.

Portanto, o registrador CCR1 armazena a duração do período entre dois flancos de subida consecutivos.

Exemplo de Fluxo Temporal

Consideremos um sinal de entrada com frequência de 1 kHz, o que corresponde a um período (\(T\)) de 1 ms (1000 µs).

Momento Evento Estado do Temporizador (TIM3)
Flanco de subida 1 Detecção de flanco CNT é zerado (CNT = 0)
Após 1000 µs (Nenhum flanco) CNT incrementa até 1000
Flanco de subida 2 Detecção de flanco Valor de CNT (1000) é salvo em CCR1; CNT é zerado novamente

Cálculo da Frequência

A frequência pode ser calculada a partir do valor capturado em CCR1:

float frequencia_hz = 1000000.0f / ((float)TIM_GetCapture1(TIM3) + 1.0f);

Onde:

  • 1000000 representa a frequência do temporizador em Hz (1 MHz).
  • TIM_GetCapture1(TIM3) retorna o valor armazenado em CCR1, que é o número de "ticks" em µs.

A fórmula é derivada da seguinte forma:

\[ \text{Período (T)} = (\text{Valor\_Capturado\_CCR1} + 1) \text{ µs} \]

\[ f = \frac{1}{\text{Período (T)}} = \frac{1}{\text{Valor\_Capturado\_CCR1} + 1} \text{ (em MHz)} \]

Para obter a frequência em Hz, multiplicamos por \(10^6\) (1 MHz):

\[ f = \frac{1000000}{\text{Valor\_Capturado\_CCR1} + 1} \text{ Hz} \]

Por que Adicoinar 1 (+1)?

A contagem do temporizador geralmente começa em 0. Se o temporizador contar de 0 a N, foram \(N+1\) "ticks" ou unidades de tempo. Por exemplo, se um período dura 1000 µs e o temporizador conta a cada 1 µs, ele contará de 0 a 999. O valor capturado em CCR1 seria 999. Para obter o tempo real de 1000 µs, é necessário adicionar 1 ao valor capturado.

Ou seja:

\[ \text{Tempo Real} = \text{Valor Capturado em CCR1} + 1 \]

Visualização do Processo

Sinal de Entrada:

      ↑            ↑
      |            |
------|------------|---------
      |<--  Período -->|

Contagem do Temporizador (CNT):

0 → 1 → 2 → ... → CCR1 (no próximo flanco)

Vantagens e Desvantagens do Método de Medição de Período

Vantagens:

  • Alta Precisão para Baixas Frequências: Quanto maior o período, mais "ticks" o temporizador acumula, resultando em maior resolução na medição.
  • Hardware-Assistido: A maior parte da lógica de medição é executada pelo hardware do temporizador, minimizando a carga na CPU.
  • Baixo Uso da CPU: A CPU só precisa ler o valor de CCR1 e realizar o cálculo final.

Desvantagens:

  • Erro Aumenta em Altas Frequências: Para frequências muito altas (períodos curtos), o número de "ticks" pode ser pequeno, diminuindo a resolução e aumentando o erro relativo.
  • Sensibilidade a Ruídos: Ruídos no sinal podem gerar flancos falsos, afetando a precisão.
  • Lenta Resposta para Baixas Frequências: Para sinais de baixíssima frequência, a leitura da frequência só é atualizada após a conclusão de um período completo, o que pode levar tempo.

Comparativo: Medição de Período vs. Medição de Frequência Direta

Método Princípio Ideal para Frequências
Medição de Período Mede o tempo de um ciclo (T) Baixas frequências
Medição de Frequência Direta Conta pulsos em um tempo fixo (gate time) Altas frequências

Sumário da Abordagem

Em resumo, esta técnica para medir frequência no STM32 emprega o módulo de Captura de Entrada (Input Capture) do TIM3 em conjunto com o modo escravo de Reset. Cada flanco de subida do sinal de entrada reinicia automaticamente o contador do temporizador, e o valor do contador acumulado até o próximo flanco de subida é salvo no registrador de captura (CCR1), representando o período do sinal. Com uma base de tempo de 1 MHz para o temporizador, a frequência em Hertz é derivada pela fórmula:

\[ f = \frac{1000000}{\text{Valor do CCR1} + 1} \text{ Hz} \]

Tags: STM32 InputCapture Temporizadores Frequencímetro Microcontroladores

Publicado em 7-31 17:17