collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: leitura de voltagens com o analogRead(A0)  (Lida 26350 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #15 em: 11 de Setembro de 2018, 18:58 »
jm_araujo, depois de ruminar repetidamente sobre o assunto, principalmente sobre que raio queriam dizer com medir nos 2 sentidos acabei por ver que a ligação afinal não é entre 2 pinos via resistência a testar para o GND mas sim entre 2 grupos de dois pinos de cada lado da resistência a testar, e há tb duas leituras do ADC, ainda não sei que contas é que se fazem para esta situação mas a luta continua...  ;D

O esquema que indicaste é o que se usa tradicionalmente com um range de n resistências, foi a primeira versão que fiz e não fiquei muito satisfeito, daí ter pensado em explorar tecnicas alternativas.

« Última modificação: 11 de Setembro de 2018, 19:04 por vasco »
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: leitura de voltagens com o analogRead(A0)
« Responder #16 em: 11 de Setembro de 2018, 21:15 »
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  (...)
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA, ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
  uint8_t high = ADCH; // unlocks both

  long result = (high << 8 )  | low;
  result = (1125300L / result); // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts


Ficava melhor com o CPU a dormir durante a espera do fim de conversão. Mantinha o loop mas metia um sleep lá dentro, mesmo no modo mais "leve", e ou habilitava a interrupção de fim de conversão ou confiava em algum timer que tivesse a correr.

O resultado final tem que ser corrigido de alguma forma, pois a referência interna não é de 1.1V certos.

A divisão final causa um arredondamento por defeito, o que não é ideal. O melhor é um arredondamento para o valor mais próximo, assim:

  result = (1125300L + result / 2) / result;
« Última modificação: 11 de Setembro de 2018, 21:18 por Njay »

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: leitura de voltagens com o analogRead(A0)
« Responder #17 em: 11 de Setembro de 2018, 22:20 »
Vasco,

A minha versão é a "descomplicação" do que eles fazem . Eles usam esse esquema porque têm 3 pinos e podes meter quase qualquer componente (não só resistências) entre eles, sem nenhuma ordem. Medem de várias formas porque usam os dados para detetar outros componentes. Se medires nos dois sentidos e o valor obtido não for igual (dentro de uma margem de erro), é porque tens um componente que não uma resistência.

Como tu queres só medir resistências, podes aproveitar só "o sumo" do que eles fazem e esquecer o resto.
« Última modificação: 11 de Setembro de 2018, 22:23 por jm_araujo »

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #18 em: 12 de Setembro de 2018, 11:31 »
Tens razão, será então uma questão do software.
Fui distraído pela parte em que dizem que medem nos dois sentidos, que é claro faz sentido quando se quer detetar outros tipos de componente.

Achas que faz sentido usar mosfets para dar 5V regulados ás resistências em vez de depender do valor do HIGH dos pinos digitais e/ou ler o pino analógico via um opamp em voltage folower para reduzir ao mínimo a corrente "puxada" do circuito ? Como é evidente tal não é absolutamente necessário uma vez que o transistor tester consegue bons resultados sem isso, mas *talvez* ajude com software inferior.
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: leitura de voltagens com o analogRead(A0)
« Responder #19 em: 12 de Setembro de 2018, 11:52 »
Eu não complicava antes de tempo. Primeiro fazia um proof of concept super simples para ver os resultados antes de começar a pensar nessas.

Inicialmente nem fazia processamento Arduino, lia o ADC nas várias configurações possíveis de resistências internas  e referencias, e cuspia o conjunto de leituras para a porta série. Depois acerta-se as formulas no PC, até em excel, e já consegues verificar a precisão e variação que consegues antes de enfiar tudo de volta no arduino.

"Premature optimization is the root of all evil (or at least most of it)" - Donald Knuth

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: leitura de voltagens com o analogRead(A0)
« Responder #20 em: 12 de Setembro de 2018, 14:12 »
O pino dum AVR tem cerca de 20 - 25 Ohm de resistência de saída (resistência em série com o "pino ideal").

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #21 em: 13 de Setembro de 2018, 09:45 »
Inicialmente nem fazia processamento Arduino, lia o ADC nas várias configurações possíveis de resistências internas  e referencias, e cuspia o conjunto de leituras para a porta série. Depois acerta-se as formulas no PC, até em excel, e já consegues verificar a precisão e variação que consegues antes de enfiar tudo de volta no arduino.

ok

Citar
"Premature optimization is the root of all evil (or at least most of it)" - Donald Knuth

R-E-S-P-E-C-T !!!  8)
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #22 em: 13 de Setembro de 2018, 09:50 »
O pino dum AVR tem cerca de 20 - 25 Ohm de resistência de saída (resistência em série com o "pino ideal").

Já tinha lido isso, mas nunca percebi porquê, haverá certamente uma boa razão. Isso só se verifica quando o pino está em modo de OUTPUT ?
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: leitura de voltagens com o analogRead(A0)
« Responder #23 em: 13 de Setembro de 2018, 10:11 »
Porque vivemos no mundo real, e não faz sentido ter transistors/FET's ultra low rdsOn nos pinos de IO.
« Última modificação: 13 de Setembro de 2018, 13:35 por senso »
Avr fanboy

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #24 em: 14 de Setembro de 2018, 09:24 »
Inicialmente nem fazia processamento Arduino, lia o ADC nas várias configurações possíveis de resistências internas  e referencias, e cuspia o conjunto de leituras para a porta série. Depois acerta-se as formulas no PC, até em excel, e já consegues verificar a precisão e variação que consegues antes de enfiar tudo de volta no arduino.

Já fiz uma amostragem e com todas as contas na spreadsheet estou a conseguir valores que andam pelo menos próximo dos 5% em comparações com os valores do DMM.
A meio do teste lembrei-me de fazer tb a leitura com o transistor tester que tenho, e ele consegue melhores resultados (não estou surpreendido  ;D).
Um ponto fraco da minha montagem é certamente a ligação à resistência a testar, não se compara nem com as pontas de prova com gancho que tenho no DMM nem o zif socket que tenho no TT.

A ver se logo à noite consigo por aqui os resultados, se bem que acho que o forum não me deixa enviar um .xls, logo se vê.
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: leitura de voltagens com o analogRead(A0)
« Responder #25 em: 14 de Setembro de 2018, 12:24 »
Se calibrares o sistema como um todo, ajustas de uma vez só a tolerância da tensão de referência, a das resistências fixas e outras incertezas que possam introduzir erro na leitura. Se o sistema for linear (que no teu caso deve ser), colocas 2 resistências de teste, uma para cada extremo do intervalo que o teu aparelho mede, e usas esses 2 pontos para calcular uma função (recta) de mapeamento directo entre a contagem do ADC e o valor final nas unidades que quiseres.
Se vais tentando compensar a tolerância de cada parte do sistema individualmente, os erros de medida e cálculo acumulam-se e nunca consegues resultados tão bons.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #26 em: 14 de Setembro de 2018, 14:01 »
Tenho que olhar melhor para os dados recolhidos para ver se é possível melhorar a exatidão apenas com um offset, ontem quando recolhi os dados nem pensei nisso, estava mais de olho na % de diferença.

Este projeto está a ser um curso...  ;D
Stupid men are often capable of things the clever wouldn't dare to contemplate.


Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #28 em: 15 de Setembro de 2018, 09:59 »
Nunca me disseram no liceu que as retas serviam para isso !!!!!!!!!!!!!!!!!
Essa thread tem lá muita info, tks.

Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #29 em: 15 de Setembro de 2018, 11:30 »
Aqui fica um boneco da montagem mais os valores que recolhi e calculei no libre office, não tenho o excel, por isso incluo os dois formatos já que se pode sempre perder qq coisa quando se grava em formato xls.

O que achei interessante daqui é que o valor absoluto do Vin não interessa muito, portanto é mais ou menos irrelevante se este é dado por um pino do arduino é se é dado por uma voltagem regulada que seja exactamente 5V. Desde que seja igual para todos.
Ainda vou ver como integro isto à luz da reta no Njay  ;D



Relativamente ao codigo

Para ler o A0 estou a usar

Código: [Seleccione]
int read_A(int pin)
{
  int f, X;
  float Xtot=0L, Xmed=0L;

  // 100 é um valor completamente arbitrário, provavelmente 20 funcionava igualmente bem
  for(f=0;f<100;f++)
  {
    X=analogRead(pin);
    Xtot+=X;
    delay(1);
  }
  Xmed=Xtot/100;
  return(int(round(Xmed)));
}

Para "ligar" e "desligar" um pino, estou a fazer

Código: [Seleccione]
void on(int pin)
{
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH);
  delay(1);
}

void off(int pin)
{
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
  pinMode(pin, INPUT);
  delay(1);
}
« Última modificação: 15 de Setembro de 2018, 11:57 por vasco »
Stupid men are often capable of things the clever wouldn't dare to contemplate.