Interpolar Dados com o microcontrolador.

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Interpolar Dados com o microcontrolador.

Mensagempor tmarchesi2 » 16 Jan 2009 15:19

Boa dia Pessoal;

Alguém poderia me ajudar com um problema de lógica ?

Estou querendo interpolar dois dados e não consigo escrever está lógica.
Funciona assim:
Dado o valor de rotação, eu tenho um pino do microcontrolador que deve ser ficar em nivel alto.

Mapa:
0 500 1000 1500 2000 2500 RPM -> valor lido do sensor
1 2 2.5 3.3 3.5 3.9 ms -> Valor definido pelo usuário
armazenado na ROM.

O problema é o seguinte, no caso de 0 a 500 rpm o tempo passa de 1 para 2 segundos, ou seja quando a rotação for 250 o tempo devera ser 1.5 ms, mas caso o usuario mude o valor, de 2 para mais ou menos, a curva neste ponto vai alterar, e o ângulo da reta também. O valor do pulso deve ser o mais linear possível entre os dois pontos, no caso 0 a 500 e de 500 a 1000...... , pois visualizando todos os pontos da reta, ela terá uma aparência linear. MAS O QUE IMPORTA É ENTRE OS PONTOS DE ROTAÇÃO.

- Tentei uma lógica com a equação geral da reta, porém meu microcontrolador não tem tempo para resolver os 5 sistemas.
- Tentei com regra de três, porém existe a questão da inclinação da reta.

Pelo que pesquisei, seria o tema interpolação, porém não encontrei nada parecido.

Fico no aguardo da colaboração do pessoal do forum.

Estou usando isso para o meu tcc da faculdade, depois posto mais detalhes.

(utilizando Atmega32 linguagem C codevision).

Grato

Thiago
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor RobL » 16 Jan 2009 15:57

Se o problema for fazer uma correspondência com os valores do usuário e a sequencia de rotação colocada o jeito é ajuste de curva por polinômios.
Dependendo de seus recursos, micro, quanto maior o grau do polinômio maior precisão.
Procure por fórmula de interpolação de Newton, também Lagrange ou ainda teoria de Chebishev. Poderá usar diferença finita. Por exemplo Piskunov ou outro livros de cálculo. Mas o melhor é ver na net, pois encontrará isso digerido. Procure por "ajuste de curvas", tem um monte de artigos.

Só um lembrete, obviamente você vai resolver todo o sistema de equações "na mão" e finalmente obter um polinômio que melhor se ajuste a curva e a seus recursos. Este polinômio deve ser feito cortes para caber no seu micro e sua exatidão.
Editado pela última vez por RobL em 16 Jan 2009 16:10, em um total de 1 vez.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor tmarchesi2 » 16 Jan 2009 16:09

Ok RObl

Eu to pesquisando, no meu caso eu não posso adotar uma função para a curva toda. Porque:

- os pontos podem ser alterado a qualquer momento pelo usuário, então uma função acredito que não seria válido.

Estou rodando o atmega32 a 16mhz.

Eu estou pensando em uma lógica assim:

Quando o usuário for configuar o valor, o microcontrolador pega o valor faz os calculos e guarda salvo numa tabela qual devera ser o fator da rampa, ai criaria alguns case ou if a cada 500 rpm. Mas não sei como tratar este calculos ainda.

Vou pesquisar aqueles outro nomes que vc me indicou dos matemáticos.


Grato

Thiago
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor RobL » 16 Jan 2009 16:16

Pensei que fosse mais simples, ou seja que o usuário escolhesse qualquer ponto entre o intervalo citado(1 2 2.5 3.3 3.5 3.9 ms -> Valor definido pelo usuário)
por exemplo, 1,1; 1,2 ou mesmo os pontos entre parenteses, etc, mas que esses acima tivessem uma correspondência com os da rpm informado, ou seja que fosse uma curva já levantada e o problema fosse somente adequar um polinômio a essa curva. Não é isso?

Mas procure na net pos ajuste de curvas que tem muita coisa mais digerida.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor wagnerlip » 16 Jan 2009 21:30

Uma maneira muito simples de fazer tal interpolação é por porcentagem, eu uso isso direto e desconsidero qualquer curva entre pontos. Querendo envelope curvo uso mais pontos.

Para exemplificar usarei uma tabela com duas colunas, sendo a primeira uma sequencia numérica simples e a segunda um valor que dobra a cada entrada na tabela.

Código: Selecionar todos
Tabela

Coluna1    Coluna2

    a            b
    0            0
   10          250
   20          500
   30         1000
   40         2000
   50         4000
   60         8000



Agora, digamos que o µC obtenha valores de rotação, o outra variável externa, cujo valor possa ser entre zero e 10 mil.

De posse da tabela acima, determinar o valor interpolado da Coluna1 com base no valor lido e comparado na Coluna2.

A rotina de software deverá primeiro criar um contador de entradas na tabela, esse valor poderá fazer parte da tabela, logo no início, antes do 0,0, onde está o "a" e "b".

Digamos que [a] = 7 e [b] = 10000.
Esse valor de [b] é para saber de antemão, mesmo antes de fazer qualquer busca ou calculo, qual é o valor máximo admitido na rotina.

[a] está dizendo quantos pontos foram incluidos na tabela e [b] diz qual é o valor máximo possível a fazer interpolação na tabela.

Digamos que o valor lido do mundo externo seja 3700, guardará na variável [v1].

O µC irá procurar na Coluna2, [a] vezes, até encontrar uma entrada maior que o valor lido (3700). Isso ocorrerá após 6 loops na rotina, encontrará o valor 4000.

A rotina matemática guardará tal valor (4000) na variável [k2], também lerá o valor correspondente na Coluna1 e guardará na variável [h2], recuará uma entrada e lerá a coluna2 novamente, lerá 2000, guardará tal valor na variável [k1], lerá a coluna1 e guardará na variável [h1].

Agora é fácil.

Basta fazer variável [k3] = [k2] - [k1]
Também [h3] = [h2] - [h1]

[k3] conterá o salto numérico na coluna2, onde V1 está contido.
[h3] conterá o salto numérico na coluna1, onde a resposta interpolada está escondida.

Agora é encontrar a proporção;

[n1] será a diferença entre o valor lido 3700 e o valor imediatamente inferior da Coluna2.

[n1] = [v1] - [k1]
[n1] = 3700 - 2000 = 1700

Sabemos então que o valor lido externo 3700 está 1700 acima do valor imediatamente inferior na tabela, cujo salto entre esse imediatamente inferior e o imediatamente superior é de 2000 [k1].

Agora vem a única divisão da rotina, encontrar a proporção entre [n1] e [k1].

[p1] = [n1] / [k1] = 1700 / 2000 = 0.85

Note que tal divisão não precisa ser de ponto flutuante, nem nada sofisticado... para fazer de forma simples, basta adicionar 3 zeros ao [n1] e torna-lo muito maior que [k1]. Veja que estou falando em decimal, mas tudo isso roda em hexadecimal, adicionando um ou dois bytes à direta do [n1] na conta, estará multiplicando [n1] por 256 ou 65536.

[n1] passa a ser 1700000, ou 1.700.000 (decimal).


Agora, ao dividir [n1] por [k1] o resultado será 850.

Pode-se já visualizar que 850 (ou 0.85) corresponde que o valor lido 3700 está na posição 85% entre os dois pontos na coluna2 (2000 e 4000).

Já entendeu o passo seguinte, não?

A variável [h3] contém a diferença de salto na coluna1, de 40 a 50, que é 10.

Basta aplicar tal valor [p1] sobre [h3] e terá o valor interpolado da coluna1...

Entra a única multiplicação da formula.

[r1] = [h3] * [p1]

[r1] = 10 x 850 = 8500, o resultado fica 8.5, ai você faz o que bem entende com o decimal 0.5 que sobrou, usa, joga fora, etc.

Pronto, já temo a diferença de 8 ou 8.5 no salto da coluna1, basta então adicionar ao valor menor da coluna1, que era 40 [h1].

[r2] = [h1] + [r1] = 40 + 8.5 = 48.5

pronto, ai está o resultado.
Para um valor lido de 3700, o valor interpolado equivalente é 48.5

Tendo rotinas simples de multiplicação e divisão, funciona rapidinho.

Resumo rápido:

Encontra-se onde o valor lido encaixa dentro da tabela. Pega-se o trecho da tabela e encontra-se onde nesse trecho o valor lido se encaixa. Usa-se esse percentual de localização para fazer o mesmo na outra coluna da tabela e badabim, teremos o valor interpolado.
Wagner Lipnharski
Consultor AVR - Orlando Florida
wagnerlip
Bit
 
Mensagens: 15
Registrado em: 02 Jan 2007 21:34

Mensagempor tmarchesi2 » 17 Jan 2009 08:48

Robl: É um valor genérico que eu coloquei, só pra ajudar na explicação, o problema é como eu comentei, os steps de rotações são fixos de 500 em 500 porém o período para este caso é defenido pelo usuário e vai do gosto de cada um. Se fosse só levantar o polinômio, eu poderia usar o origin (software matemático) ou matlab.


Mas valeu a intenção.

Grato pela ajuda
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor tmarchesi2 » 17 Jan 2009 08:54

Caro Wagnerlip;

É isso mesmo que eu preciso, vou tentar implementar este algoritmo, pela sua explicação você já deve ter feito algo parecido, pois achei está técnica muito simples e interessante para realizar controle em malha fechada. Ta certo que existe meios mais sofisticados, mas para começar acredito que terei resultados satisfatório.

Assim que meu projeto evoluir, eu vou tentar postar aqui mais observações, dúvidas e resultados.

Grato pela paciência em digitar e explicar tudo isso!

Thiago
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor RobL » 17 Jan 2009 09:35

Então o usuário entra com uma relação qualquer e você quer linearidade entre trechos dos valores de rotação.
Me confundiu a palavra ROM acima, ou seja, os valores das variáveis ficariam determinadas.
Neste caso o metodo do Wagner é um deles, sem dúvida o mais simples, me parece diferença finita de primeira ordem, que no final é um processo de ajuste de curvas polinomial também só que considerando apenas 2 pontos e de primeiro grau repetido para cada trecho.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Jorge_Francisco » 17 Jan 2009 10:26

Mas afinal, a Interpolação é linear? se for linear um sistema linear serve, se estão falando de curva então pode-se usar polinomial, cúbica,etc.

A técnica descrita aproxima-se de um sistema, o calculo acha o coeficiente linear e angular.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor RobL » 17 Jan 2009 11:23

Jorge o que foi colocado é só para chamar atenção que mesmo um processo simples como acima é um caso particular de direfença finita de primeira ordem e ajuste por um polinômio de ordem n, conforme sugerido, mesmo sendo uma reta com 2 pontos.
Coisa sem importância, como dizer que a equação de uma curva descrita por um polinômio de primeiro grau tem o apelido de reta. Para os matemáticos, a reta é um apelido, um caso particular de uma curva, ou melhor uma curva de raio infinito.

Mais uma vez penso que a sugestão do Wagner é ótima para o caso a não ser que ainda eu não tenha entendido o problema.

Acrescento mais esse trecho:
Acho que agora entendí. O usuário pode colocar por exemplo 0 500 1000 1500 2000 ... rpm e na outra variável, por exemplo 1, 2, 5 (exagerando), 6, 9...
Ao cruzar o ponto (o entorno de 2) entre 2 + delta ou 2 -delta, vai mudar bruscamente o coeficiente angular e você quer reduzir essa inclinação em torno do ponto!!!!
Como essas entradas são quaiquer (para cada usuário), se elas não forem tão bruscas como no meu exemplo, mas limitadas, terá que ter após a entrada um algoritmo para ajustar a melhor curva (no seu caso você quer a melhor reta). Dá para fazer por mínimo quadrado (menor distância dos pontos a uma reta) similar a qualquer dos métodos acima.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor wagnerlip » 18 Jan 2009 01:43

Sim, usei e uso tal algoritmo simples, e um dos equipamentos faz exatamente isso, o usuário (?) define quantos pontos ele irá calibrar o equipamento, de 2 a 20, e efetua tal calibração.

Vou usar um exemplo de temperatura lendo um termopar.

Digamos que ele especifique que irá usar 15 pontos, então essa é a primeira informação digitada. A seguir digita a temperatura do primeiro ponto e o calibrador de tensão injeta os milivolts equivalentes que o termopar geraria naquela temperatura, pressiona enter e vai para o ponto 2, ponto 3, etc. Ao final, o equipamento possui uma tabela que foi gerada de acordo com o gosto do usuário, e que contém o valor a mostrar no painel e o valor hexa lido pelo ADC. Assim, a calibração é totalmente via painel e não exige nenhum ajuset manual de trimpot, zero, spam ou mesmo o uso de resistores de altíssima precisão, pois tudo é "offsetado" pela calibração.

De acordo com a curva não linear, o usuário escolhe até onde na curva que ele quer mais pontos para melhorar a interpolação, ou onde na curva o aparelho estará mais sendo usado para a aplicação de campo.

Se digamos o equipamento for um voltímetro, onde quase não existir curva e quase tudo é linear, a calibração exigiria não mais que 5 ou 6 pontos, zero, spam, e 2 ou 3 pontos intermediários só para garantir. Não exige nenhum trimpot ou ajuste manual, pois foi dito que zero V corresponde a determinado valor lido do ADC, e não importa se é acima ou abaixo do que seria zero se calibrado por um trimpot.

Uma boa especialização nesse tipo de coisa é importante para quem trabalha com instrumentação, pois um bom projeto de entrada e conversão, permite usar tais rotinas e circuitos para diversos equipamentos sem ter que redesenhar tudo novamente em cada caso.

Já usei muitas vezes o mesmo hardware e rotinas de software para criar calibradores de pressão, geradores e calibradores de µV e corrente, e até mesmo um projeto que me foi roubado (numa universidade ai do nordeste) de um coletor estatístico de radiação solar, que o governo brasileiro contratou um professor de física para desenvolver, o cara me contratou aqui nos states, confiança confiança, 80% do projeto acabou nas mãos dele antes do contrato assinado... trouxa eu, não? Se um dia encontrar algo nos postes por ai identificado como Lumen-4 (claro que o cara trocou o nome, mas...) pode lembrar de mim.
Wagner Lipnharski
Consultor AVR - Orlando Florida
wagnerlip
Bit
 
Mensagens: 15
Registrado em: 02 Jan 2007 21:34

Mensagempor tmarchesi2 » 20 Jan 2009 23:15

Boa Noite Wagner;

Comei a escrever o software no codevision, como estou enferrujado na programação, estou re-lembrando como colocar a tabela no Avr, outra coisa que já comecei a desenvolver é a entrada das tabelas.

Está sendo bem util o algorimo que você passou, dando certo aqui eu posto os resultados.

Vi que você comentou sobre termopar, você já leu o temopar com AVR ? Eu comecei um projeto que também teve o software roubado por uma pessoa que dizia ser meu sócio.... porém é passado. Mas até hoje eu gostaria de terminar aquilo, o meu era com termopar tipo k.

Estou pesando em implementar com os chips da Maxim, porém é caro. Você tem alguma sugestão ?

Grato

Thiago
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor porcao » 13 Mar 2009 17:41

Thiago, voce precisa de uma resolução muito grande entre os pontos?
Se puder arredondar porque não faz os cálculos na inicialização do ucontolador e o loop principal fica apenas consultando um array?
Pelo que saquei dos tempos que voce descreve seu projeto vai manter o bico injetor aberto por mais um tempo de acordo com o RPM. Eu acredito que não precisa de curvas suaves demais nesses seus calculos ok?
[]s
porcao
Nibble
 
Mensagens: 58
Registrado em: 12 Mar 2009 09:05
Localização: Santo André - SP

Mensagempor tmarchesi2 » 14 Mar 2009 17:20

Fala Porcao;

Ontem a tarde conseguimos implementar o resto do software, encontrei um amigo que conhece mais de software do que eu e ai mostrei pra ele o que eu estava fazendo. Gastamos 3 horas entre teste e programa e deu tudo certo. Basicamente ficou descrito isso que você surgere. A matriz é chamada via ponteiro e o while está bem livre.

Neste caso, ficou bem suave, porque eu trato a correçao a cada 250rpm. Nesta primeira etapa eu estou atuando no ponto de ignição, que na minha opnião é bem mais crítico do que ler sinais analógicos e calcular um perído de injeção. Não sei se comentei, estou desenvolvendo com roda fônica 60-2 dentes. Segundo um amigo meu que fez um mestrado semelhante para motor a diesel, quando você altera o ponto, o motor leva um "grande tempo" para perceber a alteração. Mas com não queromais imprevistos ja criamos a cada 250rpm.


Eu queria implementar o algoritmo do nosso amigo Wagnerlip, que achei mais simples, mas ai meu amigo leu o post e fez um método chamado "aproximações dos triangulos", que també é muito semelhante.

Após alguns testes e correções na lógica dos calculos, o programinha funcionou legal.
ficou assim:
- Criamos uma matriz de 64 posições por 2 colunas. no caso 16mil rpm com passo de 250.
- duas funções com ponteiros
- e comparamos os dados plotados na RS232.

Ficou muito legal e com grande precisão.

Ainda tem muita coisa pra programar e testar, mas ontem foi um grande passo, porque ja posso definir as demais matrizes de dados e fazer testes com sensores, caracterizando cada um.

Maiores dúvidas e resultados eu postarei aqui neste tópico.

Um grande obrigado a todos que participaram deste tópico. Sem este pessoal, muita coisa estaria parada.

Thiago;
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor porcao » 16 Mar 2009 09:25

Uma coisa que eu aprendi principalmente com desenvolvimento de jogos. As vezes dá impressão que muita matematica é usada e que é bem complicado. Mas se for assim voce nao tem tempo para executar, então tem que ter uns truques desses para tornar as coisas mais simples e rapidas. O uso de tabelas com valores pre calculados é uma dela. E dificilmente voce precisara de valores tao precisos, ainda mais em mecanica, pois voce tem tanta variação e somatoria de folgas que nao importa o calculo que voce faça, sempre sera aproximado.

Abs e boa sorte com seu projeto!
porcao
Nibble
 
Mensagens: 58
Registrado em: 12 Mar 2009 09:05
Localização: Santo André - SP


Voltar para AVR

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x