Índice:

Média de execução para seus projetos de microcontrolador: 6 etapas
Média de execução para seus projetos de microcontrolador: 6 etapas

Vídeo: Média de execução para seus projetos de microcontrolador: 6 etapas

Vídeo: Média de execução para seus projetos de microcontrolador: 6 etapas
Vídeo: Tem Dificuldade de Programar Microcontroladores? Não Cometa Estes ERROS - Eletronica Facil 2024, Novembro
Anonim
Média de execução para seus projetos de microcontrolador
Média de execução para seus projetos de microcontrolador

Neste instrutível irei explicar o que é uma média em execução e por que você deve se preocupar com ela, além de mostrar como ela deve ser implementada para obter a máxima eficiência computacional (não se preocupe com a complexidade, é muito simples de entender e irei forneça uma biblioteca fácil de usar para seus projetos arduino também:)

Média móvel, também comumente referida como média móvel, média móvel ou média móvel, é um termo usado para descrever o valor médio dos últimos N valores em uma série de dados. Ele pode ser calculado como a média normal ou você pode usar um truque para fazer com que tenha um impacto mínimo no desempenho do seu código.

Etapa 1: Caso de uso: suavizando as medições de ADC

Caso de uso: suavizando medições de ADC
Caso de uso: suavizando medições de ADC

O Arduino tem um ADC decente de 10 bits com muito pouco ruído. Ao medir o valor em um sensor, como potenciômetro, fotoresistor ou outros componentes de alto ruído, é difícil confiar que a medição está correta.

Uma solução é fazer várias medições toda vez que quiser ler o sensor e fazer a média. Em alguns casos, esta é uma solução viável, mas nem sempre. Se você quisesse ler ADC 1000 vezes por segundo, teria de 10.000 se fizesse uma média de 10 medições. Uma grande perda de tempo de computação.

Minha solução proposta é fazer medições 1000 vezes por segundo, atualizar a média de execução a cada vez e usá-la como valor atual. Este método introduz alguma latência, mas reduz a complexidade computacional de seu aplicativo, dando a você muito mais tempo para processamento adicional.

Na foto acima, usei a média de execução das últimas 32 medições. Você verá que este método não é 100% à prova de falhas, mas melhora significativamente a precisão (não é pior do que calcular a média de 32 amostras de cada vez). Se você quisesse calcular uma média de 32 medições a cada vez, isso levaria mais de 0,25 ms no Arduino UNO apenas para medições!

Etapa 2: Caso de uso: Medindo o componente DC do sinal do microfone

Caso de uso: Medindo o componente DC do sinal do microfone
Caso de uso: Medindo o componente DC do sinal do microfone
Caso de uso: Medindo o componente DC do sinal do microfone
Caso de uso: Medindo o componente DC do sinal do microfone
Caso de uso: Medindo o componente DC do sinal do microfone
Caso de uso: Medindo o componente DC do sinal do microfone

O Arduino pode medir tensões entre 0 e Vcc (normalmente 5 V). O sinal de áudio é completamente AC e se você quiser medi-lo em um microcontrolador, você deve enviesá-lo em torno de 1/2 Vcc. Em um projeto do Arduino UNO, isso significaria cerca de 2,5 V (DC) + sinal de áudio (AC). Ao usar ADC de 10 bits e fonte de alimentação de 5 V, a polarização de 2,5 V deve ser igual à medição de 512. Portanto, para obter um valor AC do sinal, 512 deve ser subtraído da medição do ADC e é isso, certo?

Em um mundo ideal, isso seria verdade. Infelizmente, a vida real é mais complicada e nossa polarização de sinal tende a se desviar. Muito comum é o ruído de 50 Hz (60 Hz se você mora nos EUA) da rede elétrica. Normalmente não é muito problemático, mas é bom saber que existe. Mais problemático é o desvio linear do aquecimento dos componentes. Você configura cuidadosamente a correção de deslocamento DC no início e ela se afasta lentamente enquanto seu aplicativo está em execução.

Ilustrarei esse problema com um detector de batida (musical). Você configura sua remoção de polarização e as batidas são claras (figura 2). Depois de algum tempo, os movimentos e batidas da polarização DC quase não são percebidos pelo microcontrolador (figura 3). O algoritmo de detecção de batida será explorado em profundidade em um futuro instrutível, pois excede o escopo deste artigo.

Felizmente, existe uma maneira de calcular constantemente o deslocamento DC do áudio. Não será nenhuma surpresa que a média de corrida, tópico deste instrutível, forneça uma solução.

Sabemos que o valor médio de qualquer sinal AC é 0. Usando esse conhecimento, podemos deduzir que o valor médio do sinal AC + DC é sua polarização DC. Para removê-lo, podemos obter uma média dos últimos valores e subtraí-la da leitura atual do ADC. Observe que você precisa usar uma média de execução longa o suficiente. Para áudio, um décimo de segundo (o número de amostras depende de sua taxa de amostragem) deve ser suficiente, mas saiba que médias mais longas funcionam melhor. Na primeira foto você pode ver um exemplo de cálculo de polarização DC real com média de execução com 64 elementos a uma taxa de amostragem de 1 kHz (menos do que eu recomendei, mas ainda funciona).

Etapa 3: Cálculo

Cálculo
Cálculo

Você pode imaginar a média de execução como o peso médio das pessoas na sala de espera do médico. O médico termina de examinar um paciente e, simultaneamente, um novo entra na sala de espera.

Para descobrir o peso médio de todos os pacientes em espera na sala de espera, a enfermeira poderia perguntar a cada paciente sobre seu peso, somar esses números e dividir pelo número de pacientes. Cada vez que o médico aceita um novo paciente, o enfermeiro repete todo o processo.

Você pode estar pensando: "Isso não parece muito eficiente … Deve haver uma maneira melhor de fazer isso." E você estaria correto.

Para otimizar esse processo, a enfermeira poderia manter um registro do peso total do grupo atual de pacientes. Uma vez que o médico chama um novo paciente, a enfermeira pergunta a ele sobre seu peso e o subtrai do total do grupo e o dispensa. A enfermeira então perguntava ao paciente que acabou de entrar na sala de espera sobre seu peso e o somava ao total. O peso médio dos pacientes após cada turno seria a soma dos pesos dividida pelo número de pacientes (sim, igual a antes, mas agora a enfermeira só perguntou a duas pessoas sobre o peso em vez de todas). Sei que este parágrafo pode ter sido um pouco confuso, portanto, consulte a ilustração acima para obter mais clareza (ou faça perguntas nos comentários).

Mas mesmo que você não tenha achado o último parágrafo confuso, você pode ter perguntas como o que deveria estar no acumulador no início, como coloco o que acabei de ler em um código C real? Isso será abordado na próxima etapa, onde você também obterá meu código-fonte.

Etapa 4: O Código

O código
O código

Para calcular a média de execução, primeiro você precisa de uma maneira de armazenar os últimos N valores. você poderia ter uma matriz com N elementos e mover todo o conteúdo para um lugar cada vez que você adicionar um elemento (por favor, não faça isso), ou você poderia sobrescrever um elemento antigo e ajustar o ponteiro para o próximo elemento a ser jogado fora (por favor, faça isso:)

O acumulador deve iniciar inicializado em 0, o mesmo vale para todos os elementos na linha de atraso. Em outro caso, sua média de corrida estará sempre errada. Você verá que o delayLine_init se encarrega de inicializar a linha de atraso, você mesmo deve cuidar do acumulador.

adicionar um elemento à linha de atraso é tão fácil quanto diminuir o índice do elemento mais novo em 1, garantindo que ele não aponte o lado da matriz de linha de atraso. após decrementar o índice quando for 0, ele fará um loop em torno de 255 (porque é um inteiro sem sinal de 8 bits). O operador Módulo (%) com o tamanho da matriz de linha de atraso garantirá que o índice apontará para um elemento válido.

Calcular uma média contínua deve ser fácil de entender se você seguiu minha analogia na etapa anterior. Subtraia o elemento mais antigo do acumulador, adicione o valor mais novo ao acumulador, coloque o valor mais novo na linha de atraso, retorne o acumulador dividido pelo número de elementos.

Fácil, certo?

Sinta-se à vontade para experimentar o uso do código em anexo para entender melhor como tudo isso funciona. Como está atualmente, o arduino lê o valor analógico no pino analógico A0 e imprime "[valor ADC], [média de execução]" na porta serial a 115200 baud rate. Se você abrir o plotter serial do arduino na taxa de transmissão correta, verá duas linhas: valor ADC (azul) e valor suavizado (vermelho).

Etapa 5: extras

Extras
Extras

Existem algumas coisas que você não precisa necessariamente saber para usar a média móvel em seu projeto, mas não custa saber.

atraso: começarei falando sobre a ilustração desta etapa. Você notará que a média de execução de mais elementos introduz um atraso maior. Se o seu tempo de resposta para alterar o valor for crítico, você pode querer usar uma média de execução mais curta ou aumentar a taxa de amostragem (medir com mais frequência).

Se movendo.

inicializando: quando falei sobre inicializar o acumulador e os elementos de atraso, disse que você deveria inicializá-los todos com 0. Alternativamente, você poderia inicializar a linha de atraso para qualquer coisa que você quiser, mas o acumulador deve começar como uma soma dos N elementos mais novos na linha de atraso (onde N é o número de elementos em sua média de corrida). Se o acumulador começar com qualquer outro valor, a média calculada estará errada - muito baixa ou muito alta, sempre na mesma quantidade (assumindo as mesmas condições iniciais). Eu sugiro que você tente aprender por que isso acontece usando alguma "simulação de caneta e papel".

tamanho do acumulador: você também deve observar que o acumulador deve ser grande o suficiente para armazenar a soma de todos os elementos na linha de retardo se todos eles forem positivos ou negativos no máximo. Praticamente isso significa que o acumulador deve ser um tipo de dados maior que os elementos da linha de retardo e assinado, se os elementos da linha de retardo forem assinados.

truque: Longas linhas de atraso ocupam muita memória. Isso pode rapidamente se tornar um problema. Se você tem muita restrição de memória e não se preocupa muito com a precisão, pode aproximar a média de execução omitindo totalmente o atraso e fazendo isso: subtraia o acumulador 1 / N * do acumulador e adicione um novo valor (no exemplo de 8 média de execução longa: acumulador = acumulador * 7/8 + novoValor). Este método dá resultado errado, mas é um método decente de calcular a média de execução quando você está com pouca memória.

lingüística: "média / média em execução" é normalmente usada para se referir à média em tempo real, enquanto "média / média móvel" geralmente significa que o algoritmo está sendo executado em um conjunto de dados estáticos, como planilhas do Excel.

Etapa 6: Conclusão

Espero que este instrutivo tenha sido fácil de entender e que o ajude em seus projetos futuros. Sinta-se à vontade para postar perguntas nos comentários abaixo se houver alguma dúvida.

Recomendado: