collapse

* Posts Recentes

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]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

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

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

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: leitura de voltagens com o analogRead(A0)
« Responder #30 em: 16 de Setembro de 2018, 13:34 »
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.

De facto faz sentido, pois estás a medir um rácio de resistências e não uma tensão arbitrária, pelo que a tensão de alimentação é irrelevante. Quando a corrente sobe ou desce na resistência que estás a medir devido a uma tensão de referência diferente, ela também sobe ou desce na outra resistência - acaba por ser uma medida raciométrica, a tensão de saída (lida no ADC) é sempre a mesma proporção (dada pelas 2 resistências) de Vref.

Num caso genérico, quando estás a medir uma tensão arbitrária, essa tensão não está relacionada com Vref, podes alterar Vref à vontade que a tensão a medir não muda; daí que Vref tem influência no valor medido, não é uma medida raciométrica. A interpolação linear só é útil para este caso.
« Última modificação: 16 de Setembro de 2018, 13:36 por Njay »

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.943
  • NERD!
Re: leitura de voltagens com o analogRead(A0)
« Responder #31 em: 16 de Setembro de 2018, 18:36 »
Já tinha referido o facto há 2 páginas atrás, mas acho que passou despercebido.

É um divisor resistivo e o ADC tem a mesma referência. Se a alimentação variar o resultado da conversão deve manter-se constante.

Eu preocupava-me mais era se tiveres de usar a referência interna, que já não varia em simultâneo. Não estive a ver o diagrama, talvez dê para converter o valor dessa referência e descobrir a sua relação com a alimentação.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #32 em: 13 de Outubro de 2018, 12:24 »
Conclui que estar a desenvolver sobre um protótipo que era bastante diferente do que eu queria fazer no fim não seria a melhor das ideias.
No mínimo, toda a parte da calibração teria que ser refeita. E como queria incluir um display e um ADC I2C não o conseguia fazer sem voltar para uma breadboard, coisa que não queria fazer por causa dos problemas de maus contactos que sempre tive com estes breadboards chinocas (sim, já sei, valem o que se paga por eles... :-)
Portanto montei a coisa e não resisto a mostrar, não tenho muito orgulho na parte de baixo, mas tenho um imenso orgulho de ter conseguido fazer uma montagem que até está a fazer o que eu queria... Acho que é a parte importante do hobismo (acabei de inventar a palavra).

Fotos em: https://photos.app.goo.gl/JtnzarXNyFVSNMBc7

Queria colocar 1 foto aqui como chamariz, mas o forum está a dizer-me que o meu anexo não passou as verificações de segurança... estranho.

A alteração mais significativa terá sido ir para um ADC I2C baseado no ADS1115 em vez de usar o do AVR.
Não tenho grande utilidade para os 15 bits, de resolução, mas estava a passar-me um bocado com as referências, Vins, etc... Parece-me que isto mata o assunto.
Podia ter ido para um modulo com o ADS1015 (12 bits, mas devem ser só 11) mas o modulo até era mais caro que este que estou a usar.
« Última modificação: 13 de Outubro de 2018, 12:42 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 #33 em: 14 de Outubro de 2018, 03:02 »
Oh Vasco, desperdiçaste um ADC, mas tá fixe, parabéns pelo projecto acabado :)
A parte de baixo não tá má, normal para uma montagem do género, apenas um bocadinho de solda em excesso.
De resto é continuar a produzir e mostrar :)

Tens que meter as referências no sítio. O que é que tá a fazer confusão?

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #34 em: 14 de Outubro de 2018, 14:04 »
Oh Vasco, desperdiçaste um ADC, mas tá fixe, parabéns pelo projecto acabado :)
A parte de baixo não tá má, normal para uma montagem do género, apenas um bocadinho de solda em excesso.
De resto é continuar a produzir e mostrar :)

Tens que meter as referências no sítio. O que é que tá a fazer confusão?

Obrigado pelo cumprimento :-) Odiava ver uma montagem realmente má... :-P
Quando falava em referências era a voltagem de referência do ADC interno no AVR estava a fazer-me imensa confusão, daí o ADC externo, tem referência própria e é problema dele... :-)

Mas ando a pensar numa coisa, posso por uma ligação ao pino A0 no mesmo ponto que vai ligar ao ADC externo e medir pelos 2 lados ?
Podia simplesmente meter um jumper para poder selecionar ou um ou outro, mas fiquei a pensar se perturbaria simplesmente ligar os 2 ao mesmo ponto. Sei muito pouco disto mas desconfio que não deve funcionar, deve depender a impedância do A0 vs o pino do ADC externo. Certo ? Um deles iria sempre medir 0V ?

Possivelmente poderia ser feito via um opamp a servir como buffer já que é suposto as entradas terem um impedância mt. alta não deviram afetar o sinal ???
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 #35 em: 14 de Outubro de 2018, 14:49 »
Ok, em comparação com este a minha montagem está aceitável....

https://www.eevblog.com/forum/beginners/horrible-solder-job-buyer-wants-money-back-after-butchering-kit-with-his-skill/

Procurem por "bad solder jobs"... Horas de divertimento garantidas.
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 #36 em: 14 de Outubro de 2018, 22:30 »
Quando falava em referências era a voltagem de referência do ADC interno no AVR estava a fazer-me imensa confusão, daí o ADC externo, tem referência própria e é problema dele... :-)

Easy easy :)

Citar
Mas ando a pensar numa coisa, posso por uma ligação ao pino A0 no mesmo ponto que vai ligar ao ADC externo e medir pelos 2 lados ?

Tens um esquema eléctrico do que tens montado? Se não tens, é por onde deverias ter começado :)...

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #37 em: 15 de Outubro de 2018, 11:52 »
Tens um esquema eléctrico do que tens montado? Se não tens, é por onde deverias ter começado :)...

Já estava desatualizado... :-)

NOTA:
    Os valoers de C1 e C2 não são esses;
    A resistência a testar é ligada entre os pinos do J2

A duvida é se posso ligar o A0 do Nano ao mesmo ponto onde está o A0 do ADC externo diretamente (linha laranja). Provavelmente não tem qualquer utilidade mas acho que era giro comparar os valores.

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 #38 em: 15 de Outubro de 2018, 13:14 »
Julgo que para ligar os dois ADC teria que fazer qq coisa deste estilo.

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 #39 em: 15 de Outubro de 2018, 15:29 »
Podes ligar ao mesmo tempo a uma entrada de ADC do Arduino. Evita fazer a conversão em simultâneo nos 2 ADCs. Não precisas de fazer buffering do sinal, a impedância (resistência) de entrada do ADC do Arduino é grande, para sinais "quietos" como tens na tua aplicação.

D2 não parece fazer muito sentido onde está. No contexto que foi falado lá atrás, era preciso teres tensões de alimentação negativas no teu circuito, mas não tens. Deita fora esse díodo. Se queres proteger contra inversão de polaridade, tens que o passar para a entrada de alimentação do circuito, e meter um fusível antes, tal como no exemplo do autorádio que o jm mostrou.
« Última modificação: 15 de Outubro de 2018, 15:32 por Njay »

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: leitura de voltagens com o analogRead(A0)
« Responder #40 em: 17 de Outubro de 2018, 11:48 »
Sim, o D2 ficou "esquecido", tinha feito assim de inicio com base na página sobre o 780x que tinha referido no inicio.

Experimentei ligar e funciona sem problemas, valores consistentes e como esperado um pouco diferentes.
Experimentei também ligar o ADC externo numa configuração diferencial, uma pata antes do Rt (resistencia desconhecida) e outra pata depois do Rt.
Achei que usando a Intensidade calculada com base na leitura do ADC do AVR e o voltage drop medido pelo ADC diferencial deveria ter um valor mais exacto, mas nem por isso, difere ainda mais do valor lido com o DMM que as contas feitas só com a medida do ADC do AVR. :-(
É claro que o DMM não é um Fluke nem nada que se pareça, é um Aneng Q1, mas tenho que usar alguma coisa como referência, só que assim fica difícil saber em que sentido é que tenho que remar. :-(

Quão confiáveis serão resistências (supostamente) de 1% compradas da China ? Podia usar para aferir o DMM, se confiasse nelas. :-(
Tenho uma caixinha destas https://www.ebay.com/itm/322561303898 que supostamente tb é feita com resistências de 1%, será mais confiável que as outras compradas por atacado ???

Pagar 2.30+5.09 USD por 1 (***UMA***) resistência de 0.1% vinda dos USA está completamente fora de questão.  :-P

EDIT: Depois de atualizar o esquema vejo que esta ligação diferencial não faz sentido uma vez que o Rt está ligado ao GND... wtf!!!

EDIT2: Mandei o DMM ás urtigas, e estou simplesmente a medir a caixa de resistências, está a fazer muito mais sentido... :-)
« Última modificação: 17 de Outubro de 2018, 23:37 por vasco »
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 #41 em: 28 de Outubro de 2018, 00:01 »
Sobre a função que lê o valor do Vcc, tenho uma duvida...
Pelo que percebo usa a referência de 1.1V (REFS0) para ler o valor do Vcc, mas será que isso não vai deixar o ADC nessa referência ? Não deveria guardar o valor da referência anterior e voltar a repor na saída ?

A função é esta, e funciona bem num arduino Nano, reporta 4.7V quando alimentado por USB e 5.1V quando alimentado pelo pino Vin.
Pelo que verifico depois, não me parece que o ADC fique na ref de 1.1V, só não consigo perceber porque é que não fica, eu diria que precisaria de um   ADMUX = _BV(REFS1) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); antes do return().
Mas experimentei colocar esse codigo, e nada se alterou, os valores que são lidos depois continuam a retornar os mesmos valores, não faz diferença nem deixa de fazer. mas não percebo porquê.

Código: [Seleccione]
long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1125300L / result; // Back-calculate AVcc in mV
  return(result);
}
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 #42 em: 28 de Outubro de 2018, 00:25 »
Tens de ler a secção do ADC na datasheet. Essa função usa Vref = AVcc e faz a leitura da entrada 1110b do (multiplexer analógico do) ADC, que corresponde à tensão de referência 1V1.

Se vires o diagrama no inicio da secção, vês que a "bandgap reference" também é uma entrada possível para o ADC. No diagrama pode ser confuso para quem está descontextualizado por causa de não usarem os mesmos nomes, mas no texto certamente está mais claro. A "bandgap reference" e a "INTERNAL 1.1V REFERENCE" são a mesma, isso podia estar melhor no diagrama.

"Bandgap" (https://en.wikipedia.org/wiki/Bandgap_voltage_reference) é o nome da topologia do circuito de geração da tensão de referência (acho que é o que se usa hoje em dia em todos os chips).
« Última modificação: 28 de Outubro de 2018, 00:42 por Njay »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: leitura de voltagens com o analogRead(A0)
« Responder #43 em: 28 de Outubro de 2018, 00:42 »
E se metes mais de 1.1v num pino com o Vref a 1.1v pode dar torresmos..

E a referência de 1.1v tem 20% de margem de erro, é tudo menos uma referência digna desse nome..
Avr fanboy

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: leitura de voltagens com o analogRead(A0)
« Responder #44 em: 28 de Outubro de 2018, 00:49 »
Entretanto alterei o meu post acima pois inicialmente não tinha percebido o que é que a função estava a fazer.

Acho que não há problema meter mais de 1.1V num pino de entrada de ADC se a Vref do ADC estiver a 1.1V, não me lembro de ver nada disso na datasheet. O que acontece é que a contagem é sempre o valor máximo.

Sim, a "precisão inicial" da referência interna do AVR é de 1 a 1.2V, portanto 1.1V +/- 10% (é mais habitual dizer +/-X% do que 2X%). A vantagem é que ela varia pouco (não tão pouco como a de alguns AVR mais antigos... é verdade que a referência interna dos AVR é um bocado uma anedota comparado com a de outros micros que há hoje em dia). O chip referência de tensão mais "top" do mercado, usado em multímetros de 6 dígitos e meio, tem 2% de precisão inicial.
« Última modificação: 28 de Outubro de 2018, 00:58 por Njay »