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?
Tags:
As respostas para este tópico estão encerradas.
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.
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por