Wednesday 9 August 2017

Filtro Médio Móvel Msp430


Eu sei que isso é viável com o aumento de acordo com: Mas eu realmente gostaria de evitar usar o impulso. Eu mencionei e não encontrei nenhum exemplo adequado ou legível. Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como amostra de dados. Qual é a maneira mais fácil de alcançar isso, experimentei usar uma matriz circular, uma média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequavam minhas necessidades. 12 de junho 12 às 4:38 Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador e, à medida que seu código examina cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1 e calcula isso: você precisa apenas encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu já coloquei aqui. O problema é que 1000 é uma janela bastante longa para uma média móvel exponencial. Não tenho certeza se houver um alfa que espalhe a média nos últimos 1000 números, sem fluxo inferior no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 às 4:44 1 na sua postagem. A média móvel exponencial pode permitir que o alfa seja variável. Assim, isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar alpha be (usecs desde a última atualização1000000). Ndash jxh 12 de junho 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como uma amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados, evitando a trajetória O (N) cara para calcular a soma - necessária para a média - na demanda. Total é feito um parâmetro diferente de T para suportar, e. Usando um longo tempo quando totalizando 1000 long s, um int para char s, ou um duplo para float total s. Isso é um pouco falho em que numsamples poderia ultrapassar o INTMAX - se você se importar, você poderia usar um sinal não assinado por muito tempo. Ou use um membro extra de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondeu 12 de junho 12 às 5:19 um assume que quotvoid operator (T sample) quot é realmente quotvoid operatorltlt (T sample) quot. Ndash oPless Jun 8 14 às 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer que ele seria um operador vazio () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vou consertar, obrigado. Ndash Tony D 8 de junho 14 às 14: 27Como outros já mencionaram, você deve considerar um filtro IIR (resposta de impulso infinito) em vez do filtro FIR (filtro de resposta finito) que você está usando agora. Há mais, mas à primeira vista os filtros FIR são implementados como convoluções explícitas e filtros IIR com equações. O filtro IIR particular que eu uso muito em microcontroladores é um filtro passa-baixa de um único pólo. Este é o equivalente digital de um simples filtro analógico R-C. Para a maioria dos aplicativos, estes terão melhores características do que o filtro de caixa que você está usando. A maioria dos usos de um filtro de caixa que eu encontrei são resultado de alguém que não presta atenção na classe de processamento de sinal digital, não como resultado de precisar de suas características particulares. Se você quiser apenas atenuar as altas freqüências que você conhece são ruim, um filtro passa-baixa de um único pólo é melhor. A melhor maneira de implementar um digitalmente em um microcontrolador é geralmente: FILT lt-- FILT FF (NEW-FILT) FILT é um pedaço de estado persistente. Esta é a única variável persistente que você precisa para calcular este filtro. NOVO é o novo valor que o filtro está sendo atualizado com esta iteração. FF é a fração do filtro. Que ajusta o peso do filtro. Olhe para este algoritmo e veja que para FF 0 o filtro é infinitamente pesado, já que a saída nunca muda. Para FF 1, realmente não há nenhum filtro, já que a saída apenas segue a entrada. Os valores úteis estão no meio. Em sistemas pequenos, você escolhe FF para ser 12 N, de modo que o multiplica por FF pode ser realizado como uma mudança direta por N bits. Por exemplo, FF pode ser 116 e multiplicar por FF, portanto, uma mudança direta de 4 bits. Caso contrário, este filtro precisa apenas de uma subtração e de um som, embora os números geralmente sejam mais amplos do que o valor de entrada (mais na precisão numérica em uma seção separada abaixo). Normalmente, tomo as leituras do AD significativamente mais rápidas do que são necessárias e aplico dois desses filtros em cascata. Este é o equivalente digital de dois filtros R-C em série e atenua 12 dBoctave acima da frequência de rolagem. No entanto, para as leituras de AD, geralmente é mais relevante olhar para o filtro no domínio do tempo, considerando sua resposta passo a passo. Isso indica o quão rápido o sistema verá uma mudança quando a coisa que você está medindo muda. Para facilitar a concepção desses filtros (o que significa apenas escolher FF e decidir quantos deles entrar em cascata), uso o meu programa FILTBITS. Você especifica o número de bits de mudança para cada FF na série de filtros em cascata, e ele calcula a resposta de passo e outros valores. Na verdade, eu costumo executar isso através do meu script wrapper PLOTFILT. Isso executa FILTBITS, que faz um arquivo CSV e, em seguida, traça o arquivo CSV. Por exemplo, aqui é o resultado do PLOTFILT 4 4: os dois parâmetros para PLOTFILT significam que haverá dois filtros em cascata do tipo descrito acima. Os valores de 4 indicam o número de bits de mudança para realizar o multiplicar pelo FF. Os dois valores FF são, portanto, 116 neste caso. O rastreamento vermelho é a resposta do passo da unidade, e é o principal aspecto a ser observado. Por exemplo, isso indica que, se a entrada muda instantaneamente, a saída do filtro combinado será fixada em 90 do novo valor em 60 iterações. Se você se preocupa com 95 horas de colonização, então você precisa esperar cerca de 73 iterações e por 50 horas de reposição apenas 26 iterações. O traço verde mostra a saída de um único pico de amplitude total. Isso dá uma idéia da supressão de ruído aleatória. Parece que nenhuma amostra única causará mais de 2,5 mudanças na saída. O traço azul é dar uma sensação subjetiva do que este filtro faz com o ruído branco. Este não é um teste rigoroso, uma vez que não há garantia de que exatamente o conteúdo era dos números aleatórios escolhidos como entrada de ruído branco para esta corrida de PLOTFILT. É só dar-lhe uma sensação áspera de quanto ele será esmagado e quão suave é. PLOTFILT, talvez FILTBITS, e muitas outras coisas úteis, especialmente para o desenvolvimento de firmware PIC, estão disponíveis na versão do software PIC Development Tools na minha página de downloads de software. Adicionado sobre a precisão numérica que vejo a partir dos comentários e agora uma nova resposta que tem interesse em discutir o número de bits necessários para implementar este filtro. Observe que o Multiply by FF criará novos bits do Log 2 (FF) abaixo do ponto binário. Em sistemas pequenos, FF é geralmente escolhido para ser 12 N, de modo que esse multiplicação seja efetivamente realizado por uma mudança direta de N bits. FILT é, portanto, geralmente um inteiro de ponto fixo. Observe que isso não altera nenhuma das matemáticas do ponto de vista dos processadores. Por exemplo, se você estiver filtrando as leituras de AD de 10 bit e N 4 (FF 116), então você precisa de 4 bits de fração abaixo das leituras de AD inteiras de 10 bits. A maioria dos processadores, você estará fazendo operações inteiras de 16 bits devido às leituras AD de 10 bits. Nesse caso, você ainda pode fazer exatamente as mesmas operações de inteiro de 16 bits, mas comece com as leituras de AD esquerda deslocadas em 4 bits. O processador não conhece a diferença e não precisa. Fazer matemática em inteiros inteiros de 16 bits funciona se você considera que eles são 12.4 pontos fixos ou verdadeiros inteiros de 16 bits (16.0 ponto fixo). Em geral, você precisa adicionar N bits cada pólo de filtro se você não deseja adicionar ruído devido à representação numérica. No exemplo acima, o segundo filtro de dois teria que ter 1044 18 bits para não perder informações. Na prática, em uma máquina de 8 bits que significa que você use valores de 24 bits. Tecnicamente, apenas o segundo pólo de dois precisaria do valor mais amplo, mas, para a simplicidade do firmware, costumo usar a mesma representação e, desse modo, o mesmo código para todos os pólos de um filtro. Geralmente eu escrevo uma sub-rotina ou macro para executar uma operação de polio de filtro, depois aplique isso a cada pólo. Se uma sub-rotina ou macro depende se os ciclos ou a memória do programa são mais importantes nesse projeto específico. De qualquer forma, eu uso algum estado de rascunho para passar NOVO no subroutinemacro, que atualiza FILT, mas também carrega isso no mesmo estado de rascunho NOVO estava dentro. Isso facilita a aplicação de vários pólos desde que o FILT atualizado de um pólo é o NOVO Do próximo. Quando uma sub-rotina, é útil ter um ponteiro apontar para FILT no caminho, que é atualizado logo após FILT no caminho de saída. Dessa forma, a sub-rotina atua automaticamente em filtros consecutivos na memória se for chamado várias vezes. Com uma macro, você não precisa de um ponteiro, pois você passa no endereço para operar em cada iteração. Exemplos de código Aqui está um exemplo de uma macro como descrito acima para um PIC 18: E aqui está uma macro semelhante para um PIC 24 ou dsPIC 30 ou 33: Ambos esses exemplos são implementados como macros usando o meu pré-processador PIC assembler. Que é mais capaz do que qualquer uma das instalações de macro incorporadas. Clabacchio: Outro problema que eu deveria ter mencionado é a implementação do firmware. Você pode escrever uma sub-rotina de filtro passa-baixa de um único pó uma vez, e depois aplicá-la várias vezes. Na verdade, geralmente escrevo uma sub-rotina para levar um ponteiro na memória para o estado do filtro, então, avance o ponteiro para que possa ser chamado sucessivamente de forma fácil para realizar filtros multipolar. Ndash Olin Lathrop 20 de abril 12 às 15:03 1. Muito obrigado por suas respostas - todos eles. Eu decidi usar este Filtro IIR, mas este Filtro não é usado como um Filtro LowPass Padrão, pois eu preciso usar os Valores de Contador médios e compará-los para detectar Mudanças em um determinado intervalo. Uma vez que estes valores são de dimensões muito diferentes dependendo do hardware que eu queria tomar uma média para poder reagir automaticamente a essas mudanças específicas de hardware. Ndash sensslen 21 de maio 12 às 12:06 Se você pode viver com a restrição de um poder de dois itens a média (ou seja, 2,4,8,16,32 etc.), então a divisão pode ser feita com facilidade e eficiência em uma Micro de baixo desempenho sem divisão dedicada porque pode ser feito como uma mudança de bit. Cada turno para a direita é um poder de dois, por exemplo: O OP pensou que ele tinha dois problemas, dividindo-se em um PIC16 e memória para o buffer de anel. Esta resposta mostra que a divisão não é difícil. É certo que não aborda o problema da memória, mas o sistema SE permite respostas parciais, e os usuários podem tirar algo de cada resposta por si mesmos, ou mesmo editar e combinar as respostas de outros. Uma vez que algumas das outras respostas exigem uma operação de divisão, elas são igualmente incompletas, uma vez que não mostram como conseguir isso eficientemente em um PIC16. Ndash Martin 20 de abril 12 às 13:01 Há uma resposta para um verdadeiro filtro de média móvel (aka filtro de caixa de depósito) com menos requisitos de memória, se você não se importa com o downsampling. É chamado de filtro integrador-pente em cascata (CIC). A idéia é que você tenha um integrador que você tome diferenças em um período de tempo, e o dispositivo chave de economia de memória é que, por downsampling, você não precisa armazenar todos os valores do integrador. Ele pode ser implementado usando o seguinte pseudocódigo: seu comprimento médio móvel efetivo é decimationFactorstatesize, mas você só precisa manter em torno de amostras estadisticas. Obviamente, você pode obter um melhor desempenho se o seu estadista e decimationFactor forem poderes de 2, de modo que os operadores de divisão e restante sejam substituídos por turnos e máscaras-es. Postscript: Eu concordo com a Olin que você sempre deve considerar filtros IIR simples antes de um filtro de média móvel. Se você não precisar da freqüência-nulos de um filtro de caixa, um filtro passa-baixa de 1 pólo ou 2 pólos provavelmente funcionará bem. Por outro lado, se você estiver filtrando para fins de decimação (tomando uma entrada de alta taxa de amostragem e avaliando-a para uso por um processo de baixa taxa), um filtro CIC pode ser exatamente o que você está procurando. (Especialmente se você pode usar statesize1 e evitar o buffer de toque completamente com apenas um único valor de integrador anterior) Há uma análise aprofundada da matemática por trás do uso do filtro IIR de primeira ordem que Olin Lathrop já descreveu na troca de pilha de processamento de sinal digital (Inclui muitas imagens bonitas.) A equação para este filtro IIR é: Isto pode ser implementado usando apenas números inteiros e sem divisão usando o seguinte código (pode precisar de alguma depuração como eu estava digitando de memória.) Este filtro se aproxima de uma média móvel de As últimas K amostras, definindo o valor de alfa para 1K. Faça isso no código anterior, definindo BITS para LOG2 (K), ou seja, para K 16, defina BITS para 4, para K 4, defina BITS para 2, etc. (Verifique o código listado aqui assim que eu receber uma mudança e Edite esta resposta, se necessário.) Respondeu 23 de junho 12 às 4:04 Heres um filtro passa-baixa de um único polo (média móvel, com freqüência de corte CutoffFrequency). Muito simples, muito rápido, funciona muito bem e quase sem memória. Nota: Todas as variáveis ​​têm um alcance além da função de filtro, exceto o passado em newInput Note: Este é um filtro de estágio único. Múltiplos estágios podem ser conectados em cascata para aumentar a nitidez do filtro. Se você usar mais de um estágio, você precisará ajustar o DecayFactor (como se relaciona com a frequência de corte) para compensar. E, obviamente, tudo que você precisa é que as duas linhas colocadas em qualquer lugar, eles não precisam de sua própria função. Este filtro possui um tempo de aceleração antes que a média móvel represente a do sinal de entrada. Se você precisar ignorar esse tempo de aceleração, basta inicializar o MovingAverage para o primeiro valor do newInput em vez de 0 e espero que o primeiro NewInput não seja um outlier. (CutoffFrequencySampleRate) tem um intervalo entre 0 e 0,5. DecayFactor é um valor entre 0 e 1, geralmente perto de 1. Os flutuadores de precisão única são bons o suficiente para a maioria das coisas, eu apenas prefiro duplas. Se você precisa ficar com números inteiros, você pode converter DecayFactor e Factor de amplitude em inteiros fracionários, nos quais o numerador é armazenado como inteiro e o denominador é uma potência inteira de 2 (para que você possa mudar de bit para a direita como o Denominador em vez de ter que dividir durante o ciclo do filtro). Por exemplo, se DecayFactor 0.99 e você deseja usar números inteiros, você pode definir o DecayFactor 0.99 65536 64881. E então, sempre que você se multiplicar pelo DecayFactor no loop do filtro, basta mudar o resultado 16. Para obter mais informações sobre isso, um excelente livro é esse Online, capítulo 19 em filtros recursivos: dspguidech19.htm PS Para o paradigma da Média em Movimento, uma abordagem diferente para definir DecayFactor e AmplitudeFactor que pode ser mais relevante para suas necessidades, digamos que você quer o anterior, cerca de 6 itens em média juntos, fazendo isso discretamente, você adicionará 6 itens e dividirá por 6, então Você pode configurar o AmplitudeFactor para 16, e DecayFactor para (1.0 - AmplitudeFactor). Respondeu 12 de maio 12 às 22:55 Todos os outros comentaram detalhadamente sobre a utilidade do IIR vs. FIR e sobre a divisão de poder de dois. Eu gostaria de dar alguns detalhes de implementação. O abaixo funciona bem em pequenos microcontroladores sem FPU. Não há multiplicação, e se você mantém N um poder de dois, toda a divisão é de um único ciclo de mudança de bits. Tampão de anel FIR básico: mantenha um buffer de execução dos últimos valores de N e uma SOM em execução de todos os valores no buffer. Cada vez que uma nova amostra vem, subtrair o valor mais antigo no buffer de SUM, substituí-lo pela nova amostra, adicionar a nova amostra a SUM e SOMN de saída. Tampão de anel IIR modificado: mantenha uma SOM executória dos últimos valores de N. Cada vez que uma nova amostra vem, SUM - SUMN, adicione a nova amostra e saia SUMN. Respondeu 28 de agosto 13 às 13:45 Se eu tiver lido você direito, você descreve um filtro IIR de primeiro ordem, o valor que você está subtraindo não é o valor mais antigo que está caindo, mas sim a média dos valores anteriores. Os filtros IIR de primeiro orden certamente podem ser úteis, mas eu não tenho certeza do que você quer dizer quando você sugere que a saída seja a mesma para todos os sinais periódicos. A uma taxa de amostragem de 10KHz, a alimentação de uma onda quadrada de 100Hz em um filtro de caixa de 20 estágios produzirá um sinal que sobe uniformemente para 20 amostras, fica alto por 30, cai uniformemente para 20 amostras e fica com baixo para 30. Uma ordem de primeira ordem Filtro IIR. Ndash supercat 28 de agosto 13 às 15:31 renderá uma onda que começa a subir bruscamente e gradualmente se nivela perto (mas não em) o máximo de entrada, então começa a cair bruscamente e gradualmente nivela perto (mas não at) o mínimo de entrada. Comportamento muito diferente. Ndash supercat 28 de agosto 13 às 15:32 Uma questão é que uma média móvel simples pode ou não ser útil. Com um filtro IIR, você pode obter um bom filtro com relativamente poucos calcs. O FIR que você descreve só pode dar-lhe um retângulo no tempo - um sinc na freq - e você pode gerenciar os lobos laterais. Pode valer a pena lançar alguns números inteiros para tornar uma boa FIR sintonizada simétrica se você pode poupar os tiques do relógio. Ndash Scott Seidman 29 de agosto 13 às 13:50 ScottSeidman: Não há necessidade de se multiplicar se um simplesmente tiver cada estágio da FIR ou produzir a média da entrada para esse estágio e seu valor armazenado anterior, e depois armazenar a entrada (se tiver O intervalo numérico, pode-se usar a soma em vez da média). Se isso é melhor do que um filtro de caixa depende do aplicativo (a resposta de passo de um filtro de caixa com um atraso total de 1 ms, por exemplo, terá um pico d2dt desagradável quando a entrada muda, e novamente 1 ms depois, mas terá o mínimo Possível ddt para um filtro com um atraso total de 1ms). Ndash supercat 29 de agosto às 15:25 Como disse mikeselectricstuff, se você realmente precisa reduzir suas necessidades de memória e você não se importa que sua resposta de impulso seja exponencial (em vez de um pulso retangular), eu iria por um filtro exponencial de média móvel . Eu os uso extensivamente. Com esse tipo de filtro, você não precisa de nenhum buffer. Você não precisa armazenar N amostras passadas. Apenas um. Então, seus requisitos de memória são reduzidos por um fator de N. Além disso, você não precisa de nenhuma divisão para isso. Somente multiplicações. Se você tem acesso à aritmética de ponto flutuante, use as multiplicações de ponto flutuante. Caso contrário, faça multiplicações inteiras e mude para a direita. No entanto, estamos em 2012 e eu recomendaria que você usasse compiladores (e MCUs) que permitem que você trabalhe com números de ponto flutuante. Além de ser mais eficiente e mais eficiente em memória (você não precisa atualizar itens em qualquer buffer circular), eu diria que também é mais natural. Porque uma resposta exponencial de impulso corresponde melhor à maneira como a natureza se comporta, na maioria dos casos. Respondeu 20 de abril 12 às 9:59 Um problema com o filtro IIR como quase tocado por olin e supercat, mas aparentemente desconsiderado por outros é que o arredondamento apresenta alguma imprecisão (e potencialmente biastruncação). Assumindo que N é um poder de dois, e apenas uma aritmética inteira é usada, a direita de mudança elimina sistematicamente os LSBs da nova amostra. Isso significa que, quanto tempo a série possa ser, a média nunca levará em consideração essa série. Por exemplo, suponha uma série que diminua lentamente (8,8,8. 8,7,7,7. 7,6,6) e assume que a média é de fato 8 no início. A amostra do punho 7 trará a média para 7, independentemente da força do filtro. Apenas para uma amostra. A mesma história para 6, etc. Agora pense no contrário. A série sobe. A média permanecerá em 7 para sempre, até que a amostra seja grande o suficiente para fazê-la mudar. Claro, você pode corrigir o viés, adicionando 12N2, mas isso realmente não resolverá o problema de precisão. Nesse caso a série decrescente permanecerá para sempre em 8 até a amostra ser 8-12 (N2). Para N4, por exemplo, qualquer amostra acima de zero manterá a média inalterada. Eu acredito que uma solução para isso implicaria manter um acumulador de LSBs perdidos. Mas eu não consegui o suficiente para ter o código pronto, e não tenho certeza de que isso não prejudicaria o poder do IIR em alguns outros casos de séries (por exemplo, se 7,9,7,9 seria médio para 8). Olin, sua cascata de dois estágios também precisaria de alguma explicação. Você quer dizer segurar dois valores médios com o resultado do primeiro alimentado no segundo em cada iteração. Qual é o benefício deste MSP430 Low Cost PinOsc Touch Capacitivo Visão geral Introdução Ao considerar a solução de toque capacitivo apropriada, o custo versus o desempenho muitas vezes vem à mente. No entanto, agora adicione flexibilidade e a solução total torna-se ainda mais complicada. A sabedoria convencional pode dizer utilizar uma solução de toque capacitivo de função fixa. O problema é que essas soluções geralmente faltam flexibilidade ou são muito caras. O MSP430 Value Series aborda todas essas necessidades com uma variedade de opções MCU de baixo custo. Especificamente utilizado neste relatório de aplicação, o MSP430G2553 apresenta GPOs PinOsc projetados para detecção capacitiva de toque juntamente com módulos integrados Timer0A3 e Timer1A3 de 16 bits para controle de tempo do processo de medição e intervalo de varredura para permitir soluções de toque capacitivo flexíveis de baixo consumo e baixo custo. Nas próximas seções, os componentes do sistema serão introduzidos e discutidos. Isso incluirá o elemento Sensor, uso PinOsc GPIO, 160Timer0A3 para operação de medição e Timer1A3 para intervalo de digitalização.160 Isso será acompanhado pela discussão do Software de Medição do Sensor que se concentrará na Medição do Elemento do Sensor, no Processamento de Sensores e na Análise de Sensores.160 Incluído Na discussão do Software de Medição do Sensor, também destacaremos as operações de filtragem de filtragem de técnicas160 e linha de base que são usadas no estágio de processamento de sensores.160 Como peça final, a calibração do elemento do sensor também será endereçada. Como acompanhamento deste documento, consulte também o exemplo de aplicação do teclado tactil capacitivo PinOsc MSP430 Low Cost. Visão geral do sistema Dentro da seção Visão geral do sistema, os subcomponentes do sistema serão abordados em detalhes. A Figura 1 mostra um exemplo de sistema que implementa múltiplos sensores de toque capacitivos PinOsc MSP430.160 A Figura 2 mostra a implementação de um elemento de sensor para medição de toque capacitivo PinOsc. Figura 1. Exemplo de sistema de toque capacitivo PinOsc Figura 2. Elemento de sensor único PinOsc Ao longo desta seção, os detalhes serão discutidos em relação ao MSP430G2553. Outros dispositivos MSP430 também possuem a estrutura de GPO de PinOsc, portanto, certifique-se de referenciar a folha de dados do dispositivo apropriada para detalhes exatos do caso de uso. Elementos do sensor PinOsc O primeiro componente do usuário160componente do sistema é o sensor. Ao usar o recurso PinOsc da família MSP430, você notará vários recursos importantes. Não são necessários componentes discretos externos. Conforme mostrado na Figura 1, cada elemento sensor é conectado de forma independente a qualquer pino PinOsc GPIO (no MSP430G2553, todos os 24 GPIOs possuem a capacidade PinOsc). Existe um alto grau de flexibilidade na forma e tamanho do elemento do sensor juntamente com a configuração do sensor. Tenha em mente aqui que a definição de um sensor é a implementação funcional do sensor de toque capacitivo desejado e pode incluir um ou mais elementos individuais. Um sensor pode ser um botão de elemento único ou um deslizador ou roda de elemento múltiplo. Um sensor também pode ser um elemento único usado para detecção de proximidade ou uma estrutura de matriz para um teclado ou mesmo um trackpad.160 A seguir estão alguns exemplos de tipos de sensores com elementos individuais usados ​​para criar o Sensor. Figura 3. Exemplos de Sensores Embora a estrutura do sensor possa parecer diferente, a interface GPP MSP430 para cada elemento do sensor permanece a mesma. PinOsc GPIO (Geração de Frequência) Conectado ao elemento de sensor externo160an, o GPIO PinOsc (Pin Oscillator) é uma estrutura muito simples em alguns dispositivos MSP430 que permitem a detecção de toque capacitivo de baixo custo sem a necessidade de componentes externos. Quando a estrutura PinOsc está habilitada no GPIO, a estrutura interna combinada com uma capacitância de sensor externo produz um oscilador interno. Essa oscilação está diretamente relacionada à capacitância do elemento sensor externo. É essa frequência que será medida. Figura 4. Temporizador de bloco GPO PinOsc0A3 (Medição PinOsc) Para realizar a medição do sensor, o Timer0A3 mostrado na Figura1602 é utilizado. TA0CLK está conectado internamente ao PinOsc e fornece a fonte do relógio ao temporizador. O TAOCLK PinOsc em conjunto com uma fonte de baixa freqüência (VLO interno ou LFXT1 externo) conectado à entrada de captura TA0CCR0 permite a medição de freqüência PinOsc. Neste exemplo, o dispositivo MSP430G2553 é usado, mas é importante se referir à folha de dados do dispositivo apropriada, pois as conexões internas e os módulos do temporizador podem diferir.160 Figura1605. Timer PinOsc Timer0A3 Timer1A3 (Intervalo de digitalização) Para o período de intervalo de varredura, um segundo recurso de timer é usado no MSP430G2553. Embora seja possível também reutilizar o mesmo módulo Timer0A3, o Timer1A3 mostrado na Figura 1 mantida separadamente permite o controle mais fácil para o intervalo periódico de varredura do sensor. Este intervalo ajuda a controlar a taxa de detecção de detecção e o consumo de energia do sistema. Figura 6. Implementação do software de medição do sensor de bloco TimOA3 da PinOsc Independentemente do tipo de sensor, existem 3 estágios comuns do processo de detecção capacitiva. O primeiro é a medida do sensor, o segundo é o processamento da medição e o terceiro é a análise dos dados. Figura 7. Diagrama de fluxo de medição do sensor Medir a freqüência do PinOsc envolve a varredura individual do (s) elemento (s) do sensor para gerar uma contagem crua para cada elemento. Esta Contagem Bruta é então armazenada para cada elemento do sensor. Este recurso é idêntico para cada tipo de sensor. A geração deste Contagem Bruta é implementada usando a entrada PinOsc do elemento do sensor como a fonte do relógio para Timer0A3 (TA0CTL. TASSEL3PinOsc) 160 e contando por um período fixo (ciclo de acumulação) controlado por uma entrada de captura para Timer0A3 (TA0CCTL0.CCIS1ACLK). O Raw Count160 é a relação de contagem160 da frequência PinOsc para o Ciclo de Acumulação (controlado pela ACLK). Figura 8.160 Diagrama de fluxo de medição Medição do processo Após a etapa de medição ser realizada, analisa-se os elementos do sensor resultantes Raw Data. Várias sub-etapas são descritas em mais detalhes nas seções abaixo. Dados brutos são comparados em relação a cada elemento do sensor Valor base (basecnt) para gerar um valor Delta Count (deltacnt) .160 Depois de gerar o valor deltacnt para cada elemento sensor, é aplicado um estágio de filtragem (opcional, mas recomendado) .160 Uma vez filtrada , Os dados do elemento sensor são comparados aos elementos do sensor thresholdsense level.160 Isso determina se um sensor está ativo ou inativo.160 Se estiver inativo, o ajuste da linha de base pode ocorrer.160 Como a capacitância muda em cada elemento, a frequência PinOsc resultante. É importante lembrar que a temperatura e a tensão também afetarão a freqüência de PinOsc, portanto, ajustar o valor da linha de base durante a operação é sempre necessário (consulte Configuração da linha de base e160Ajuste abaixo). Depois de todos os elementos do sensor serem processados, o sensorial resultante é retornado. Figura 9. Diagrama de fluxo de processo Analisar sensor de sensor A análise de dados pode assumir vários significados. Isso pode ser um simples decodificador de botão, uma posição em um controle deslizante ou roda, um certo tipo de gesto ou outra coisa. O seguinte é simplesmente análise dos estados do elemento do sensor individuais definidos pelo sensor de entrada sensorpress.160 O valor do sensorpress é retirado do valor decodificado de sensores de função de processo. Figura 10. Análise das Técnicas de Filtragem do Diagrama de Fluxo Antes de continuar a gerenciar a Linha de Base, poderemos olhar para nossos dados de aquisições brutas.160 Existem muitas aplicações que experimentam o ruído ou outros distúrbios.160 Essas influências podem afetar a confiabilidade dos dados a ser Interpretado.160 No entanto, em muitos casos, alguns filtros de software simples podem auxiliar a interpretação da medição com pouco impacto no desempenho geral do sistema (potência e velocidade). Normalmente, este passo ocorre no estágio de Medição do Processo. Os métodos Three160 simples são um filtro IIR, um filtro de som e um filtro de média móvel cumulativa (filtro de somão nominalizado) .160 Se optarmos por aproveitar o sinal amplificado, podemos negligenciar o filtro CMA. Existem benefícios e desvantagens para cada método, mas a implementação pode tornar a detecção de eventos mais robusta e imune às interferências. Figura 11. Analisar o Diagrama de Fluxo Como pode ser observado, o Filtro de Soma (C2SUM) responde mais rápido do que o Filtro IIR (C2IIR) .160 No entanto, para este caso, o Filtro de Soma requer 4x o requisito de memória para o valor deltacnt (inteiro de 16 bits valor). Para um sensor com muitos elementos, os requisitos de memória160Summing Filter160 podem ser um fator limitante para soluções de baixo custo.160 Tendo isso em mente e dependendo dos requisitos de ganho do fator de ponderação IIR, a compensação de resposta versus memória pode ser considerada. Configuração e ajuste de linha de base Ao continuar com os componentes do estágio do Processo, a linha de base precisa ser discutida.160160 Uma linha de base é simplesmente o ponto de referência intocado do sistema do qual o toque é determinado. Portanto, o valor baseline (basecnt) para cada elemento do sensor deve ser inicializado e mantido. A manutenção da linha de base é extremamente importante para lembrar, devido ao fato de que o sistema é afetado por forças externas (temperatura, umidade, umidade), bem como parâmetros do sistema (tensão) .160 Esses fatores160 podem fazer com que os resultados de referência160baseline160 intocados flutuem. Se essa derivação não for levada em consideração, os erros podem ocorrer com efeitos imprevisíveis. Portanto, como parte do estágio do processo, o ajuste da linha de base (basecnt) também ocorre. Para detecção capacitiva de toque, existem três condições de erro chave que podem ser afetadas pelo ajuste da linha de base. 1) Positivos falsos - Quando um elemento sensor é interpretado como ativo quando, na realidade, não está ativo. Positivos falsos podem ocorrer por duas razões.160 O primeiro é que o ruído do sistema resultou em uma ou mais medidas errôneas que corromperam o conteúdo de dados.160160. O segundo é que a linha de base se tornou erroneamente ajustada em um estado em que os dados de medição são interpretados em Um estado inválido.160 Esses dois motivos são atenuados com o uso do PinOsc (incorporado na filtragem de hardware devido à técnica de medição) e no tratamento adequado da linha de base. 2) Positivos bloqueados -160 Quando um elemento sensor é interpretado como ativo permanece bloqueado no estado ativo devido à corrupção do balelamento.160 Os Positivos Locked estão relacionados com a segunda razão160 dos Positivos Fracos.160 Quando a linha de base é modificada erroneamente, as leituras de medição serão sempre Cair em uma faixa de detecção positiva.160 Isso se deve ao mau controle do ajuste da linha de base e, na maioria das vezes, está associado ao desejo de realizar um movimento ascendente muito rápido na linha de base devido a um grande valor negativo detectado.160 Se o dithering da linha de base for aplicado , Grandes negativos são muitas vezes nunca experimentados. 3) Positivos perdidos - Quando um elemento sensor não é interpretado como ativo, quando na realidade está ativo. Os Positivos Perdidos (às vezes denominados Finger Creep) ocorrem quando o ajuste da linha de base destinado a compensar as condições ambientais é aplicado à presença de um dedo humano.160 Se ocorrer uma abordagem muito lenta ao elemento do sensor, isso pode ser confundido como muito lento Mude para a capacitância dos elementos do sensor.160 Isso faz com que o ajuste da linha de base ocorra e acompanhe o movimento do dedo mais próximo do elemento do sensor.160 Quando o dedo está em contato com o elemento do sensor, a linha de base está no mesmo nível que a medição Nível e a detecção é perdida.160 Tenha em mente que os Positivos Perdidos normalmente envolvem dois parâmetros (taxa de varredura do elemento do sensor e técnica de ajuste da linha de base) .160 Usando algumas técnicas simples, os Positivos Perdidos podem ser facilmente evitados. Limites dos Elementos do Sensor Antes de concluir a Visão geral do toque capacitivo PinOsc do MSP430, um último endereço do point160to é a configuração dos limiares dos elementos do sensor. Ao executar a interpretação de dados, é importante ter em mente que, para um determinado elemento de sensor, o valor deltacnt (basecnt - meascnt. Para o método PinOsc) é160compare para um limite de limite específico.160 Isso implora a questão Como I160 determina o elemento do sensor desejado Limites de limiar. A resposta simples é medir isso. A melhor resposta é ter seu processo de medição automatizado.160 Abaixo está uma ferramenta de exemplo para ajudar a medir o valor máximo de delta para cada elemento de sensor. Como você pode ver, as barras pretas mostram o valor deltacnt relativo com a leitura máxima real exibida. Uma vez que este é o MAX160reading, normalmente um nível abaixo deste ponto deve ser usado para definir o limite de detecção limite.160 No exemplo dinâmico Touch Key Touch Touch PinOsc MSP430, estes valores são160saved to160a160boardxxx. h incluir arquivo na pasta CapTouchLib e referenciado pelo Estrutura. c Elemento de construção.160160Este elemento do sensor160define xxxMAXVALUE160is160 foi aplicado160 a 160 o. Limiar. Valores de thresholdsense e. maxResponse. Na estrutura. c, para cada elemento de sensor (tipo de elemento const struct), esses níveis são definidos da seguinte forma: nível thresholdcal 0.1160 xxxMAXVALUE (ou 10 do nível xxxMAXVALUE) ao qual o ajuste da linha de base do elemento sensor ocorre devido à deriva de temperatura. Nível thresholdsense160 0.3 xxxMAXVALUE (ou 30 do nível xxxMAXVALUE) acima do qual o elemento sensor é detectado como ativo. Estes níveis podem ser alterados se desejado. Referências

No comments:

Post a Comment