Domine Oversampling no STM32: Aumente Resolução do ADC

Em sistemas embarcados, a resolução do ADC é crítica para aplicações de alta precisão, como medições biomédicas ou instrumentação industrial. Microcontroladores STM32Famílias de microcontroladores STM32: Uma visão geralFamílias de microcontroladores STM32: Uma visão geralProfundo mergulho nas famílias STM32, explorando arquitetura, aplicações e desempenho. Descubra dicas e casos práticos para projetos embarcados. possuem ADCs de 12 bits nativos, mas e se seu projeto exigir 14 ou 16 bits? O oversampling surge como uma técnica de software para aumentar a resolução efetiva sem hardware adicional. Este artigo detalha os fundamentos teóricos, a implementação prática e as otimizações necessárias para dominar essa técnica.

Tabela de Conteúdo🔗

Fundamentos do ADC no STM32🔗

Os ADCs do STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora. operam com resoluções de 12 bits nativos, oferecendo 4096 níveis discretos (2¹²). A conversão é definida por:

$$ V_{medido} = \frac{Leitura_{ADC} \times V_{ref}}{4095} $$

Parâmetros críticos:

  • Taxa de amostragem: Conversões por segundo.
  • Ruído de quantização: Erro inerente à digitalização.
  • SNR (Signal-to-Noise Ratio): Relação sinal-ruído, afetada pela resolução.

O que é Oversampling?🔗

Oversampling é a técnica de coletar mais amostras do que o necessário (acima da taxa de Nyquist) e processá-las para reduzir ruído e ganhar resolução efetiva. Funciona sob duas premissas:

1. Presença de ruído aleatório (pelo menos 1 LSB).

2. Média estatística para suavizar variações.

Fundamentos Teóricos do Oversampling🔗

Relação entre Oversampling e Resolução

O ganhoCalibração de ADC no STM32: Melhore a precisão de leituras analógicasCalibração de ADC no STM32: Melhore a precisão de leituras analógicasDescubra métodos avançados para calibração de ADC em microcontroladores STM32, combinando teoria e prática para garantir precisão em aplicações críticas. de resolução é dado por:

$$ Bits_{efetivos} = Bits_{nativos} + \frac{\log_2(N)}{2} $$

ou alternativamente:

$$ \Delta R \approx \frac{1}{2}\log_2(N) $$

Onde \( N \) é o número de amostras. Para 2 bits extras, são necessárias 16 amostras (\( 4^2 \)).

Exemplo:

Com \( N = 16 \):

$$ \Delta R = \frac{1}{2} \log_2(16) = 2 \text{ bits} $$

Filtragem e Decimação

Após a coleta, aplica-se um filtro digital (ex: média móvel) para reduzir ruído, seguido de decimação para ajustar a taxa de dados.

Implementação no STM32🔗

Passo a Passo:

1. Configurar o ADCConfigurando e usando o ADC no STM32Configurando e usando o ADC no STM32Este tutorial para STM32 ensina a configurar o ADC via registradores e HAL, explicando calibração, DMA, filtragem e resolução de problemas práticos. em modo contínuo ou DMAConfigurando e usando o ADC no STM32Configurando e usando o ADC no STM32Este tutorial para STM32 ensina a configurar o ADC via registradores e HAL, explicando calibração, DMA, filtragem e resolução de problemas práticos. para alta taxa de amostragem.

2. Coletar N amostras (ex: 256 para 4 bits extras).

3. Processar as amostras:

  • Somar as amostras.
  • Aplicar média e deslocamento de bits.

Código com DMA (STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora. HAL):

#define OVERSAMPLING_FACTOR 256  // 4⁴ = 256 (4 bits extras)
uint32_t adc_buffer[OVERSAMPLING_FACTOR];
uint32_t oversampled_value = 0;
HAL_ADC_Start_DMA(&hadc1, adc_buffer, OVERSAMPLING_FACTOR);
// Após coleta:
for(int i=0; i<OVERSAMPLING_FACTOR; i++){
    oversampled_value += adc_buffer[i];
}
oversampled_value = oversampled_value >> 4;  // Deslocamento para 16 bits

Cuidados Importantes:

  • Sincronismo: Garanta amostras sincronizadas para evitar erros.
  • Memória: Buffers grandes consomem RAM (ex: 256 amostras = 1024 bytes).
  • Latência: Oversampling reduz a taxa efetiva (ex: 1 MHz / 256 = 3.9 kHz).

Trade-offs:

FatorBits GanhosMemóriaTempo de Processamento
16x264 bytes0.8 ms
256x41024 bytes5 ms

Exemplo Prático: Aumentando de 12 para 16 bits🔗

Para 16 bits de resolução:

$$ N = 4^{4} = 256 \space \text{amostras} $$

Código ajustado:

#define OVERSAMPLING_16BIT 256
uint32_t adc_buffer[OVERSAMPLING_16BIT];
HAL_ADC_Start_DMA(&hadc1, adc_buffer, OVERSAMPLING_16BIT);
// Pós-processamento:
uint64_t raw_sum = 0;  // Evita overflow
for(int i=0; i<OVERSAMPLING_16BIT; i++){
    raw_sum += adc_buffer[i];
}
uint16_t high_res_value = raw_sum >> 4;  // 12 + 4 = 16 bits

Fluxo do processo:

flowchart TD A[Início] --> B[Coletar 256 amostras] B --> C[Somar amostras] C --> D[Deslocar 4 bits] D --> E[Valor de 16 bits]

Considerações Práticas e Otimizações🔗

1. Dithering: Adicione ±1 LSB de ruído se o sinal for muito "limpo":

uint16_t adc_value = HAL_ADC_GetValue(&hadc1) + (rand() % 3 - 1);

2. Filtragem Pós-Processamento: Combine com média móvel ou filtro IIR:

#define FILTER_WINDOW 8
uint32_t moving_avg(uint32_t new_sample) {
    static uint32_t buffer[FILTER_WINDOW];
    static uint8_t index = 0;
    buffer[index++] = new_sample;
    index %= FILTER_WINDOW;
    uint64_t sum = 0;
    for(int i=0; i<FILTER_WINDOW; i++){
        sum += buffer[i];
    }
    return sum / FILTER_WINDOW;
}

3. Velocidade vs. Precisão: Ajuste o fator de oversampling conforme a aplicação.

Testando e Validando os Resultados🔗

Metodologia:

1. Use uma fonte de tensão estável (ex: 1.5V).

2. Execute 1000 medições com oversampling.

3. Calcule desvio padrão e resolução efetiva:

$$ Resolução_{efetiva} = \frac{V_{ref}}{2^{Bits_{efetivos}}} $$

Resultados Esperados (3.3V e 16 bits):

$$ Resolução = \frac{3.3}{65536} \approx 0.05 \text{ mV} $$

Conclusões e Melhores Práticas🔗

O oversampling é uma técnica poderosa para aumentar a resolução do ADC em STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora., mas exige equilíbrio entre velocidade, memória e processamento.

Melhores Práticas:

Com essa técnica, ADCsImplementando um osciloscópio simples com STM32Implementando um osciloscópio simples com STM32Descubra como implementar um osciloscópio digital com STM32, desde a aquisição de sinais via ADC com DMA até a visualização e processamento em tempo real. de 12 bits podem atingir resoluções superiores a 16 bits, tornando-se viáveis para aplicações críticas em medicina, automação e aquisição científica.

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