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:
- 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).
- 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):
- O valor atual do registrador de contagem (CNT) do temporizador é automaticamente copiado para o registrador de captura/comparação (CCR1).
- 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:
1000000representa 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} \]