Olá  pessoal estou utilizando o Arduino UNO, para adaptar um sensor automotivo de fluxo de ar genérico,
num carro importado, a fórmula de conversão é: y = (a+bx)/(1+cx+dx^2), onde:

 

a = 0.25299904

b = 1.4363284

c = 0.23501546

d = -0.026938141


Com isso recebo a seguinte resposta:

 

X=Vin

Y=Vout

0

1

1

1.5

2

2

3

3.5

4

3.75

5

5


O codgo utilizado foi:

 

float A =  0.25299904;

float B =  1.4363284;

float C =  0.23501546;

float D =  -0.026938141;

void setup() {

pinMode(3,OUTPUT);

}

void loop() {

float Vin= analogRead(A1); 

float Vout = (A+(B*Vin))/(1+(C* Vin)+(D*pow(Vin,2)));  // function y=(a+bx)/(1+cx+dx2)

analogWrite(3, Vout /4);

}

 

A saída não segue a expressão de Vout, alguém saberia explicar o meu erro?

Exibições: 523

As respostas para este tópico estão encerradas.

Respostas a este tópico

Bom dia Sr. GLMC.


Só ajudo amigos que não colam sketch na área de texto do tópico.
Sou velho ranzinza.
Se remove o code, e anexar como arquivo, posso reconsiderar minha decisão.

Leia: http://labdegaragem.com/forum/topics/sugest-o-de-como-postar

Rui

PS. Já identifiquei o problema no seu sketch.

Conforme sua exigência segue os arquivos anexo.

Anexos

Falta remover o sketck postado na área de texto.

Rui

Bom dia!

Primeiro transforme seu Vin em tensão,  entre 0- 5V se considerar 5V como referencia.

int Vin = analogRead(1);
float volt = Vin * (5 / 1023.0);
float Vout = (A + (B * volt)) / (1 + (C * volt) + (D * pow(volt, 2))); // function y=(a+bx)/(1+cx+dx2)

Serial.println(Vout);   //debug...

Depois terá que transformar seu resultado em um valor entre 0 e 255 para ser utilizado na saída analógica.

Obs. Não vai ficar muito preciso o resultado. 

Ref..

https://www.arduino.cc/en/Reference/AnalogRead

https://www.arduino.cc/en/Reference/map

https://www.arduino.cc/en/Reference/analogWrite

Abs

Mauricio Ortega

A tenção de entrada funciona de 0V a 5V, Utilizei um exemplo de analogInOutSerial onde existe a função MAP, e nada mudou:

Não tenho experiencia em Arduino, mas nos meus ensaios percebi que a váriavela "Sida" = (A+(B*outputValue))/(1+(C*outputValue)+(D*pow(outputValue,2))); , parece ter limite de armazenamento, pois se a expressão for diminuída ela funciona, tentei fazer em fases mas não adiantou. a resposta do simulador da pagina: ":https://circuits.io" é idêntico da prática.

const float A = 0.25299904;
const float B = 1.4363284;
const float C = 0.23501546;
const float D = -0.026938141;
const float analogInPin = A0;
const float analogOutPin = 9;

float sensorValue = 0;
float outputValue = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255);

float Saida = (A+(B*outputValue))/(1+(C*outputValue)+(D*pow(outputValue,2)));

analogWrite(analogOutPin, Saida);

Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
delay(2);
}

 

Não cole sketch na área de texto do tópico.

Já leu http://labdegaragem.com/forum/topics/sugest-o-de-como-postar  ?

Rui

Minha sugestão - para efeito de teste, faça essa linha como comentário 

// analogWrite(analogOutPin, Saida);

Para a função de analog Read ou analog write funcionar, gasta-se alguns milisegundos.

Talvez seja isso a causa do seu problema. 

Pessoal encontrei! o problema é que no caso de analogRead que a entrada faça parte de uma expressão é necessário utilizar o faor de correção: analogRead*5/1023.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço