Friday 7 December 2018

Movimento média filtro acelerômetro


Um filtro IIR recursivo de passagem simples simples, de passagem simples é rápido e fácil de implementar, e. Onde x, y são os sinais do acelerômetro XY bruto (não filtrados), xf, yf são os sinais de saída filtrados e k determina a constante de tempo dos filtros (tipicamente um valor entre 0,9 e 0,9999, onde k maior significa uma maior constante de tempo ). Você pode determinar k empiricamente, ou se você sabe a freqüência de corte necessária, Fc. Então você pode usar a fórmula: onde Fs é a taxa de amostragem. Observe que xf, yf são os valores anteriores do sinal de saída no RHS, e os novos valores de saída no LHS da expressão acima. Observe também que estamos assumindo aqui que você estará amostrando os sinais do acelerômetro em intervalos de tempo regulares, e. Cada 10 ms. A constante de tempo será uma função de k e deste intervalo de amostragem. Filtro de avaliação Este exemplo mostra o fluxo de trabalho recomendado para gerar código C a partir de uma função MATLAB usando o comando codegen. Estas são as etapas: 1. Adicionar a diretiva codegen para a função MATLAB para indicar que ele é destinado para geração de código. Esta diretiva também permite que o analisador de código MATLAB para identificar avisos e erros específicos para MATLAB para a geração de código. 2. Gere uma função MEX para verificar se o código MATLAB é adequado para geração de código. Se ocorrerem erros, você deve corrigi-los antes de gerar o código C. 3. Testar a função MEX no MATLAB para garantir que é funcionalmente equivalente ao código MATLAB original e que não ocorrem erros de tempo de execução. 4. Gere código C. 5. Inspecione o código C. Pré-requisitos Não existem pré-requisitos para este exemplo. Criar uma nova pasta e copiar arquivos relevantes O código a seguir criará uma pasta em sua pasta de trabalho atual (pwd). A nova pasta conterá somente os arquivos que são relevantes para este exemplo. Se você não quiser afetar a pasta atual (ou se você não pode gerar arquivos nesta pasta), você deve alterar sua pasta de trabalho. Comando de Execução: Criar uma Nova Pasta e Copiar Arquivos Relevantes Sobre a função de averagingfilter A função averagingfilter. m atua como um filtro de média no sinal de entrada que toma um vetor de entrada de valores e calcula uma média para cada valor no vetor. O vetor de saída tem o mesmo tamanho e forma que o vetor de entrada. A diretiva compilação codegen indica que o código MATLAB é destinado a geração de código. Crie alguns dados de amostra Gere uma onda senoidal barulhenta e trace o resultado. Gerar uma função MEX para teste Gerar uma função MEX usando o comando codegen. O comando codegen verifica se a função MATLAB é adequada para geração de código e gera uma função MEX que você pode testar no MATLAB antes de gerar código C. Como C usa a digitação estática, codegen deve determinar as propriedades de todas as variáveis ​​nos arquivos MATLAB em tempo de compilação. Aqui, a opção de linha de comando - args fornece uma entrada de exemplo para que o codegen possa inferir novos tipos com base nos tipos de entrada. Usando o sinal de amostra criado acima como entrada de exemplo garante que a função MEX pode usar a mesma entrada. Por padrão, codegen gera uma função MEX chamada averagingfiltermex na pasta atual. Isso permite testar o código MATLAB ea função MEX e comparar os resultados. Teste a função MEX no MATLAB Execute a função MEX no código MATLAB Generate C Inspecione o código gerado O comando codegen com a opção - config coder. config (lib) gera código C empacotado como uma biblioteca C independente. O código C gerado está na pasta codegenlibaveragingfilter. Os arquivos são: Inspecionar o código C para a função averagingfilter. c Selecionar seus acelerômetros CountryAccelerometers Medir a aceleração. Isso é aceleração devido ao movimento e também aceleração devido à gravidade. Acelerômetros são freqüentemente usados ​​para calcular um ângulo de inclinação. Eles só podem fazer isso confiável quando eles são estáticos e não se movendo. Para obter um ângulo de inclinação preciso, eles são frequentemente combinados com um ou mais giroscópios ea combinação de dados é usada para calcular o ângulo. Os acelerômetros digitais dar-lhe-ão a informação usando um protocolo de série como I2C. SPI ou USART, enquanto os acelerômetros analógicos produzirão um nível de tensão dentro de uma faixa predefinida que você precisa converter para um valor digital usando um módulo ADC (conversor analógico para digital). Neste tutorial explicaremos brevemente a funcionalidade dos acelerômetros, como eles são usados ​​para medir ângulos de inclinação e finalmente fornecer algum código de exemplo. Veja também o tutorial sobre a combinação de acelerômetro e dados de giroscópios para dar um melhor ângulo de inclinação para um sistema dinâmico. O que faz uma medida de acelerômetro Acelerômetros medir a aceleração. Para um objeto estático que é a aceleração devido à gravidade (1g). Observe também que a saída de acelerômetros não é linear, mas é uma onda senoidal, portanto, você não pode tomar a saída direta como uma representação proporcional de um ângulo de inclinação com base na gravidade. Normalmente, as tensões de saída x e y de um acelerômetro serão metade da tensão de alimentação quando se mede zero g (isto é, o dispositivo é perpendicular à gravidade - horizontal). Incliná-lo de uma maneira ea tensão vai aumentar, incliná-lo da outra forma e ele vai diminuir. Com um acelerômetro de três eixos, o eixo z medirá 1g com o dispositivo horizontal. A saída de um acelerômetro é uma onda senoidal da aceleração medida. Os acelerômetros são mais sensíveis a pequenas mudanças de inclinação quando são perpendiculares à gravidade. I. e. Quando horizontal, pequenas alterações na inclinação dão leituras úteis. Passado cerca de 45 graus de inclinação tornam-se cada vez menos sensíveis. Por esta razão é comum usar mais de um valor de eixo ao determinar o ângulo de inclinação como será visto abaixo. Medindo o ângulo de inclinação usando um eixo Se você quiser medir a inclinação no eixo x e y com um acelerômetro de 2 eixos, então você pode simplesmente usar sin-1 (a) onde a é a saída de um eixo do acelerômetro. Lembre-se que além de 45 e -45 graus a precisão irá diminuir Medindo ângulo de inclinação usando dois eixos A redução na resolução e precisão além de 45 graus de inclinação pode ser melhorada usando 2 eixos para medir a inclinação A componente de gravidade agindo sobre o eixo x é Uma função senoidal enquanto que a atuação sobre o eixo y é um coseno. Quando a sensibilidade do eixo x começa a cair após 45 graus de inclinação, a sensibilidade do eixo y está aumentando. Como pode ser visto no gráfico abaixo, as partes em negrito de cada linha mostram a área de maior sensibilidade. Assim, combinando os valores x e y uma precisão muito melhor pode ser obtida Medindo ângulo de inclinação usando três eixos Para medições precisas de inclinação nos planos x e y, portanto, precisamos de um acelerômetro de 3 eixos. Podemos usar a fórmula acima para calcular os ângulos usando x e z para o eixo x e usando y e z para o eixo y. No entanto, podemos melhorar as coisas ainda mais usando todas as três saídas para calcular cada ângulo. Isso é feito usando as seguintes fórmulas. Vamos começar a alguns Codificação Esperançosamente, estamos agora bastante claro sobre os princípios, mas vamos ver como isso é feito na prática. Usaremos um acelerômetro de 3 eixos e elaboraremos ângulos para rolo (x) e passo (y). Assumiremos que, dependendo do tipo de acelerômetro usado, você leu os valores para x, yez e também tem valores de linha de base para x, yez quando o acelerômetro está parado e nivelado. Void calcxyangles (void) Usando xy e z a partir do acelerômetro, calcule os ângulos x e y flutuam xval, yval, zval, resultado unsigned curto longo x2, y2, z2 24 bit Permite obter os desvios de nossa linha de base xval (float) accelvaluex - (float ) Acelcenterx yval (float) accelvaluey - (flutuador) accelcentery zval (flutuador) accelvaluez - (flutuante) accelcenterz Elabore os quadrados x2 (unsigned curto longo) (xvalxval) y2 (unsigned curto longo) (yvalyval) z2 (unsigned short long) (Zvalzval) X Eixo resultsqrt (y2z2) resultxvalresult accelanglex atan (resultado) Y Axis resultsqrt (x2z2) resultyvalresult accelangley atan (resultado) Ok, é isso. Apenas um par de notas sobre acelerômetros em geral. Eles são muito sensíveis e, portanto, são bastante propensos a vibração. Se você estiver usando um em um sistema com motores ou outras fontes de vibração eu sugiro fortemente alguma forma de amortecimento de espuma. Além disso, tomar várias leituras do acelerômetro e média deles para filtrar qualquer ruído.

No comments:

Post a Comment