Como medir dois potenciometros em portas analogicas diferentes no arduino usando PLX-DAQ

Galera,

Boa noite à todos!

Estou com dificuldade em fazer o SKETCH de um programa que irá medir duas tensões simultaneamente provenientes de 2 potenciometros, onde esarão ligados em duas portas analogicas A0 e A1.

Exibições: 1775

Responder esta

Respostas a este tópico

Entendo que seria isso abaixo, se quiser ver mais lento no MS aumente os tempos de delay. Isso vai possibilitar ler o valor dos pots, ~0 a 1023 se quiser ler tensão basta fazer as modificações para ler 0 a 255 sendo 255 o valor de +5V por exemplo.

#define pot A0 //Define pot como A0
#define pot A1 //Define pot como A1

 int potvalor; //Cria variável para armazenar o valor do potenciômetro

void setup()
 {    

Serial.begin(9600); //Inicia a serial com Baud Rate de 9600
 }

void loop()
 {     

 potvalor = analogRead(A0); //Lê o potenciômetro e armazena na variável potvalor  
 Serial.print("Valor do Potenciometro1 = "); //Imprime na serial "Valor do      Potenciometro = "  
Serial.println(potvalor); //Imprime na serial o valor lido  
delay(500); //Aguarda 500 milissegundos
potvalor = analogRead(A1); //Lê o potenciômetro e armazena na variável potvalor  
 Serial.print("Valor do Potenciometro2 = "); //Imprime na serial "Valor do      Potenciometro = "  
Serial.println(potvalor); //Imprime na serial o valor lido  
delay(500); //Aguarda 500 milissegundos

 }

Caso fosse para ler a tensão de cada um e não ler apenas o pot apenas como coloquei acima, acho que este abaixo resolve. Abs.


int var = 0;
int pot1 = A0;
int pot2 = A1;
 
float tensao = 0;
 
void setup()
{
  Serial.begin (9600);
 
}
 
void loop(){
 
  var = analogRead (pot1);
  var = analogRead (pot2);
  tensao = (var * 5.0) / 1023.0;
  Serial.print (" Valor = " );
 
  Serial.print (var);
 
  Serial.print ("\n");
 
  Serial.print (" tensao = ");
  Serial.print (tensao);
  Serial.print (" V");
  Serial.print("\n");
  delay(2000);
 }
 
 

dessa forma tb funciona 

int pot1 = A0;
int pot2 = A1;

float tensao1 = 0;
int voltagem1 = 0;
float tensao2 = 0;
int voltagem2 = 0;

void setup()
{
Serial.begin (9600);

}

void loop(){

voltagem1 = analogRead (pot1);
voltagem2 = analogRead (pot2);
tensao1 = map(voltagem1,0,1023,0,5);
tensao2 = map(voltagem2,0,1023,0,5);
Serial.println (" Valor pot1 = " );

Serial.println (tensao1);
Serial.print (" V");

Serial.println (" valor pot2 = ");
Serial.println (tensao2);
Serial.print (" V");
delay(2000);
}

Olá,

Da forma como foram escritos os sketchs, a leitura de uma entrada será afetada pela leitura da entrada anterior, devido ao tempo de aquisição do AD. O efeito é mais percebido quando a diferença entre os niveis de tensão das entradas for maior sempre existindo erros de leitura se não forem tomadas as devidas precauções durante a aquisição de cada medição.

Isto é uma deficiência da IDE do Arduino, um preço a ser pago pela sua simplicidade de programação e da filosofia de seus idealizadores em esconder do usuário a parte mais pesada da configuração dos fuse bits e registradores do microcontrolador. Isto é uma boa ideia para facilitar a vida dos iniciantes, mas acaba por se tornar um problema  em projetos mais avançados.

No link abaixo é discutido o assunto, e eu explico as causas e uma forma de como resolver o problema.

Abraços.

ScadaBr - Arduinos - Influência entre as portas analógicas

 Wiechert,

Obrigado de minha parte pela explicação, seu conhecimento tem tornado este fórum um lugar de grande valor para muitos, entre eles eu, e  elas são sempre oportunas e bem vindas.

Abraço!

No link abaixo podem ver um vídeo que fiz, simulando os dois pot e mostrando os valores de cada um em um LCD display, tem inclusive a indicação proposta pelo Wiechert aqui mesmo neste tópico sobre o delay.

A simulação foi feita com um modulo da Labcenter chamado AVR Arduino Proteus, que tem integrada além dos módulos e Shields uma IDE para programar, e carregar na placa Arduino.

https://www.youtube.com/watch?v=xW9_uY0Ifw8

Abs.

Carlos,

O sketch mostrado no seu vídeo ainda não corrige o problema da interferência de uma entrada sobre a outra no conversor AD. 

Onde você escreveu:

 

{

port1 = analogRead(A0);

delay(10);

Você deveria substituir por:

{

analogRead(A0);

delay(10);

port1 = analogRead(A0);

Desta forma você seleciona a entrada analógica desejada, aguarda o AD estabilizar e então faz a leitura da entrada, corrija o código para a entrada A1 da mesma forma.

Antes que alguém venha questionar que na simulação funciona corretamente, não mostrando a interferência entre as entradas, venho lembrar que o simulador não faz a conversão como o circuito do conversor ADC realmente faria, ele apenas pega o valor lido na entrada e faz a conversão de escala para o valor correspondente na escala do AD 0 - 1023. Nunca podemos esquecer que um simulador é só uma simulação, uma grande ferramenta de grande valia, mas não substitui os testes em bancada.

Abraço.

Bom dia Wiechert,

Fiz a correção, obrigado pela observação, assista o vídeo por favor, https://www.youtube.com/watch?v=mmjF0rdJaBw deixei o vídeo anterior também, com as mudanças no titulo advertindo sobre o erro, já que sempre aprendemos deles (dos erros), nos próximos dias farei outro, mas com componentes reais, não simulado, assim mostro o comportamento com, e sem, a correção no código, creio é uma forma de contribuir com todos transferindo conhecimento.

Um abraço!  

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço