collapse

* Posts Recentes

Como transformar um mosquito killer de tomada em um portátil? por jm_araujo
[Hoje às 13:35]


Carregador para 18650 por brunus
[Ontem às 23:16]


cabo utp cravar por brunus
[Ontem às 23:15]


Keysight UXR 110GHz BW, 256GS/s, 10-bit Real-Time Oscilloscope por SerraCabo
[Ontem às 20:26]


leitura de voltagens com o analogRead(A0) por jm_araujo
[16 de Setembro de 2018, 18:36]


BostonDynamics - Vai uma mãozinha? por josecarlos
[16 de Setembro de 2018, 11:26]


Comunidades Online de Drones por MAntunes
[09 de Setembro de 2018, 18:00]


Sorte do catano por Njay
[09 de Setembro de 2018, 16:51]


BUILD: Toolmaker's Clamp Thingy por TigPT
[08 de Setembro de 2018, 20:19]


Telescopio por Njay
[08 de Setembro de 2018, 15:27]

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

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

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 244
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.343
    • 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.389
  • 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: 244
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.389
  • 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.343
    • 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: 244
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: 244
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.548
  • 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: 244
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.343
    • 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: 244
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: 244
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: 244
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.