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.