Delays Precisos em STM32: Técnicas com Temporizadores

Em sistemas embarcados, delays precisos são essenciais para temporizar eventos como leitura de sensores, controle de motores ou comunicação serial. No STM32, os temporizadores (TIM) oferecem uma solução hardware para criar delays com resolução de microssegundos, sem bloquear a CPU. Este artigo explora técnicas avançadas, desde configurações básicas até otimizações com DMA, modos de baixo consumoGerenciamento de energia e modos de baixo consumo no STM32Gerenciamento de energia e modos de baixo consumo no STM32Aprenda a reduzir o consumo de energia com os modos STM32, garantindo eficiência e prolongando a vida útil de baterias em sistemas embarcados. e casos práticos, garantindo precisão e eficiência energética.

Índice

Visão Geral dos Temporizadores no STM32🔗

Os temporizadoresImplementando um sistema de alarme com sensores de movimento e STM32Implementando um sistema de alarme com sensores de movimento e STM32Aprenda a criar um sistema de alarme robusto com STM32, sensores de movimento, técnicas de debounce e otimização de energia. Confira o tutorial completo! do STM32 são periféricos flexíveis que operam em modos como contagem ascendente/descendente, PWMGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo., Input CaptureCaptura de entrada e medição de frequência com STM32Captura de entrada e medição de frequência com STM32Aprenda a configurar e usar o Input Capture do STM32 para medir frequências com precisão. Descubra métodos, tratamento de overflow e técnicas avançadas. e Encoder Mode. Cada temporizador possui um contador de 16 ou 32 bits, um prescaler e registradores de auto-recarregamento (ARR). A frequência do clock é derivada do clock do sistemaConfigurando clocks e PLL no STM32: otimização de desempenho e consumoConfigurando clocks e PLL no STM32: otimização de desempenho e consumoAprenda a otimizar o desempenho e consumo dos STM32 com uma abordagem completa sobre configuração de clocks, PLL e modos de baixo consumo. (SYSCLK), ajustada via prescaler:

$$ f_{timer} = \frac{SYSCLK}{(PSC + 1)} $$

Exemplo de Clock:

Se SYSCLKConfigurando clocks e PLL no STM32: otimização de desempenho e consumoConfigurando clocks e PLL no STM32: otimização de desempenho e consumoAprenda a otimizar o desempenho e consumo dos STM32 com uma abordagem completa sobre configuração de clocks, PLL e modos de baixo consumo. = 72 MHz e PSC = 7199:

$$ f_{timer} = \frac{72 \times 10^6}{7200} = 10 kHz \quad (\text{período} = 0.1 \text{ ms}) $$
Tipo de TemporizadorResolução MáximaAplicações Típicas
TIM2 (32-bit)0.0001 msDelays longos
TIM6 (Basic)0.1 msTasks de baixa precisão
TIM1 (Advanced)0.001 msControle PWM complexo

Configurando um Temporizador para Delays Precisos🔗

Parâmetros Fundamentais

Os temporizadoresImplementando um sistema de alarme com sensores de movimento e STM32Implementando um sistema de alarme com sensores de movimento e STM32Aprenda a criar um sistema de alarme robusto com STM32, sensores de movimento, técnicas de debounce e otimização de energia. Confira o tutorial completo! dependem do prescalerEntendendo os temporizadores no STM32Entendendo os temporizadores no STM32Descubra como configurar temporizadores STM32 para gerar PWM, medir intervalos e capturar eventos com exemplos práticos e dicas de troubleshooting. e do auto-reload registerEntendendo os temporizadores no STM32Entendendo os temporizadores no STM32Descubra como configurar temporizadores STM32 para gerar PWM, medir intervalos e capturar eventos com exemplos práticos e dicas de troubleshooting. (ARR) para definir a frequência de contagem e o período. A equação básica para calcular o delay é:

$$ \text{Tempo do Delay} = \frac{(\text{ARR} + 1) \times (\text{Prescaler} + 1)}{f_{\text{clk}}} $$

Passo a Passo:

1. Habilite o clock do temporizador via RCC_APB1ENR ou RCC_APB2ENR.

2. Configure o prescalerEntendendo os temporizadores no STM32Entendendo os temporizadores no STM32Descubra como configurar temporizadores STM32 para gerar PWM, medir intervalos e capturar eventos com exemplos práticos e dicas de troubleshooting. (TIMx->PSCGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo.) e ARRGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo. (TIMx->ARRGerando sinais PWM com STM32 para controle de motoresGerando sinais PWM com STM32 para controle de motoresAprenda os fundamentos e técnicas avançadas do PWM em sistemas STM32, otimizados para controle preciso de motores DC e servos com códigos de exemplo.).

3. Habilite o temporizador com TIMx->CR1 |= TIM_CR1_CEN.

Código Exemplo (HALUsando o DAC no STM32 para gerar sinais analógicosUsando o DAC no STM32 para gerar sinais analógicosAprenda a configurar e calibrar o DAC do STM32 para gerar sinais analógicos precisos. Descubra técnicas avançadas, exemplos práticos e dicas de otimização.):

TIM_HandleTypeDef htim3;
void MX_TIM3_Init(void) {
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 7199; // 72MHz / 7200 = 10 kHz
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 9999; // 10.000 contagens = 1 segundo
  HAL_TIM_Base_Init(&htim3);
  HAL_TIM_Base_Start(&htim3);
}

Implementação de Delays Bloqueantes e Não Bloqueantes🔗

Delay Bloqueante (Polling)

void delay_us(uint32_t us) {
  __HAL_TIM_SET_COUNTER(&htim3, 0);
  while (__HAL_TIM_GET_COUNTER(&htim3) < us);
}
  • Problema: Consome 100% da CPU.

Delay Não-Bloqueante (Interrupt)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  if (htim == &htim3) {
    // Ação após o delay
  }
}
HAL_TIM_Base_Start_IT(&htim3); // Habilita interrupção

Comparação de Métodos

MétodoCPU UsagePrecisãoComplexidade
Polling100%±0.1%Baixa
Interrupt0%±1%Média
DMA0%±0.01%Alta

Técnicas Avançadas: Multi-Temporizadores, DMA e Interrupções🔗

Multi-Temporizadores

Use TIM2 (32-bit) para delays longos (horas) e TIM6 para tarefasImplementando um sistema multitarefa com STM32 e RTOSImplementando um sistema multitarefa com STM32 e RTOSAprenda a migrar de código bare-metal para multitarefa robusta usando FreeRTOS no STM32. Descubra técnicas avançadas e exemplos práticos. críticas (µs).

Exemplo com DMA

// Configura DMA para transferir o valor do contador para uma variável
HAL_TIM_Base_Start_DMA(&htim3, (uint32_t*)&timer_val, 1);

Interrupções para Eficiência

Configure interrupções para evitar polling e liberar a CPU:

void Timer2_Init_IT(void) {
  // ... (configuração do timer)
  HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(TIM2_IRQn);
  HAL_TIM_Base_Start_IT(&htim2);
}
void TIM2_IRQHandler(void) {
  if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET) {
    __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
    // Ação após o delay
  }
}

Gráfico de Timing com Mermaid:

sequenceDiagram Timer->>DMA: Trigger on update event DMA->>Memory: Transfer counter value Memory->>Interrupt: Generate complete callback

Otimização de Energia com Delays em Modos de Baixo Consumo🔗

Em modos como STOP ou SLEEP, a CPU é desligada, mas os temporizadoresImplementando um sistema de alarme com sensores de movimento e STM32Implementando um sistema de alarme com sensores de movimento e STM32Aprenda a criar um sistema de alarme robusto com STM32, sensores de movimento, técnicas de debounce e otimização de energia. Confira o tutorial completo! podem permanecer ativos para acordar o sistema:

HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
HAL_TIM_Base_Start_IT(&htim3); // Wake-up após 5 segundos

Depuração e Troubleshooting de Delays🔗

Problemas Comuns:

1. Clock não configurado: Verifique RCC e use __HAL_RCC_TIMx_CLK_ENABLE().

2. Interrupções não habilitadas: Ative NVICInterrupções no STM32: Conceitos básicos e implementaçãoInterrupções no STM32: Conceitos básicos e implementaçãoDescubra como configurar interrupções no STM32 com NVIC e EXTI. Aprenda com exemplos práticos a melhorar a resposta em tempo real de sistemas embarcados. com HAL_NVIC_EnableIRQ(TIMx_IRQn).

3. Jitter elevado: Priorize interrupções no NVICInterrupções no STM32: Conceitos básicos e implementaçãoInterrupções no STM32: Conceitos básicos e implementaçãoDescubra como configurar interrupções no STM32 com NVIC e EXTI. Aprenda com exemplos práticos a melhorar a resposta em tempo real de sistemas embarcados. ou use DMA.

Ferramentas Úteis:

Aplicações Práticas: Casos de Uso Reais🔗

Controle de Tráfego com Semáforo

void traffic_light() {
  set_led(RED, ON);
  delay_ms(30000); // 30s via TIM2
  set_led(GREEN, ON);
  delay_ms(20000); // 20s
}

Servo Motor com PWM Preciso

// Posiciona o servo em 90 graus (1.5 ms pulse)
TIM1->CCR1 = 1500; // 1.5 ms @ 1 MHz timer

Piscar LED com Precisão

int main(void) {
  HAL_Init();
  SystemClock_Config();
  Timer2_Init();
  while (1) {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    delay_ms(500); // 500ms usando TIM2
  }
}

Equação do Servo:

$$ \text{Pulse Width (ms)} = 1.0 + \frac{\text{ângulo}}{180} \times 1.0 $$

Conclusão

Utilizar temporizadores para delays precisos no STM32 maximiza a eficiência e a precisão de sistemas embarcados. Desde técnicas básicas de polling até métodos avançados com DMA e interrupções, a flexibilidade dos timers permite adaptação a cenários diversos, como controle de motores, comunicação serialTouchscreen capacitivo com STM32: Integração e calibraçãoTouchscreen capacitivo com STM32: Integração e calibraçãoDescubra como utilizar touchscreens capacitivos com STM32, explorando conexão, calibração e firmware para interfaces precisas e responsivas. e gestão de energia. A combinação de hardware dedicado e configuração adequada garante desempenho otimizado, liberando a CPU para tarefas críticas e reduzindo consumo energético.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados