LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: buu em 18 de Janeiro de 2010, 23:43
-
Começei a umas semanas a mexer nos arduinos e claro começei nas coisas basicas, agora estou um pouco mais ambicioso e quero colocar num LCD 16x2 a voltagem, consumo e temperatura do meu circuito.
Por agora a voltagem esta limitada ao 5v para facilitar as ligações mas no futurovou actualizar para um divisor de voltagem, para usar a corrente de funcionamento do circuito 12v.
A parte da voltagem está controlada e a funcionar correctamente ( e o mais importante) precebo como se faz na teoria e consegui aplicar na pratica.
Agora relativo a leitura de mA do circuito estou a usar um sensor da Allegro ACS 754, retirado do datasheet (já tinha usado este tipo de sensor num PIC) ele funciona tem um vcc a 5v e 0 amperes corresponde a metade do vcc ( vvc/2) e a sensibilidade é 13.3 mv/A. (ele não é mto sensivel por tem uma capacidade 150A mas por agora serve, se preceber como este funciona facilmente consigo actualizar para outro)
Eu consigo colocar a leitua em steps no LCD (essa é basica) não consigo é encontrar a formula para esta função.
Aqui vai o meu codigo a funcionar só com steps na entrada analogica 3
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int voltPin = 1; // inicializa o pino anologico 1 com entrada de 5v
int ampPin = 3; // inicializa o pino anologico 3 como entrada de 2.5v = 0A (ACS754)
int amperes = 0;
void setup() {
lcd.begin(16, 2); // Configura o LCD 16x2
}
void loop() {
float volt = (analogRead(voltPin) + 1) * .00488; // 0v = 0,5v = 1023 (1024 steps) : .00488v = 1 step
lcd.setCursor(1,0);
lcd.print(volt);
lcd.setCursor(6,0);
lcd.print("Volt");
amperes = (analogRead(ampPin));
lcd.setCursor(3,1); //linha 2
lcd.print(amperes);
//lcd.setCursor(6,1);
//lcd.print("mA");
delay(200);
}
Espero que alguem me possa ajudar ;D
-
parece-me que estas a trocar linhas com colunas.
http://arduino.cc/en/Reference/LiquidCrystalSetCursor (http://arduino.cc/en/Reference/LiquidCrystalSetCursor)
de qualquer maneira não percebi bem qual era a duvida?
cumprimentos
-
Se bem me lembro o chip mede -150 a 150. A 0A está com 5V / 2 = 2.5V como disseste.
O ADC tal como está configurado pelo analogRead() lê de 0 a 5V em 1024 passos. Para converter o valor lido (chamemos-lhe ADC) em tensão (V), V = ADC * 5.0 / 1024 (tal como está na datasheet do ATmega)
A partir daqui, a corrente (I) calcula-se como I = (V - 2.5) * 150 / 2.5
Mas melhor ainda é removeres a dependência da tensão e fazer apenas uma fórmula puramente raciométrica:
I = (ADC - 512) * 150 / 512.0
Pode estar a falhar-me 1 LSB, nunca sei isto de cor sem pegar em lápis e papel.
-
parece-me que estas a trocar linhas com colunas.
http://arduino.cc/en/Reference/LiquidCrystalSetCursor (http://arduino.cc/en/Reference/LiquidCrystalSetCursor)
de qualquer maneira não percebi bem qual era a duvida?
cumprimentos
São 16 colunas por 2 filas, esta correcto! pelo menos funciona.
A minha dúvida é encontrar a formula para ler o sensor de corrente.
Pela explicação do Njay parece-me muito facil, bolas eu andava a fazer grandes formulas e a complicar... tive a fazer as contas e bate certo assim, vou testar a noite e dou novidades.
-
Onten ainda exprimentei mudar o codigo para ver se tinha uma leitura correcta, mas sem sucesso.
Eu sei na teoria o que quero fazer não consigo é meter em codigo!
Se 5.0v = 1024 steps , o sensor a 0A tem 2.5v = 512 steps
O output do sensor é 1A = 0.0133v (limite do sensor 150A)
Amp = (analogRead(A3Pin) - 512);
Assim fico com um valor de 0 steps, para 0A = 2.5v.
Se por cada 1A = 0.0133v (150 * 0.0133) = 1.995v (será o maximo que o sensor consegue ler a temperatura de 25º)
Para escalar os 1024 step (1024 / 1.995) = 0.0019 step por cada 0.0133V
Isto esta correcto?
Como e que eu meto isto em codigo?
-
Não te esqueças que o teu código tem que suportar números negativos.
Não penses em tensão, converte directamente da contagem do ADC para A.
512 = 0A, 511 ~ -0.293A, 513 ~ 0.293A, 514 ~ 0.586A, ... -> 1 contagem de ADC = 300A / 1024 = 150A / 512
int32_t ADC = ((int32_t)analogRead(A3Pin) - 512)
float I = (ADC - 512) * 150 / 512.0
O tipo int32_t é um tipo de 32 bits de tamanho e que suporta números negativos.
Como vês a resolução é pequena, portanto para conseguires ver o valor a sair do zero tens que medir uma corrente de pelo menos 300mA.
Actualização: alterado o tipo int16_t para int32_t, pois o resultado da multiplicação por 150 nem sempre cabe em 16 bits
-
parece-me que estas a trocar linhas com colunas.
http://arduino.cc/en/Reference/LiquidCrystalSetCursor (http://arduino.cc/en/Reference/LiquidCrystalSetCursor)
de qualquer maneira não percebi bem qual era a duvida?
cumprimentos
São 16 colunas por 2 filas, esta correcto! pelo menos funciona.
A minha dúvida é encontrar a formula para ler o sensor de corrente.
Pela explicação do Njay parece-me muito facil, bolas eu andava a fazer grandes formulas e a complicar... tive a fazer as contas e bate certo assim, vou testar a noite e dou novidades.
sim tens razão, o erro foi meu :D
-
Ois, desculpa mas tive que fazer uma alteração. Mudei o tipo da variável ADC de int16_t para int32_t, pois o resultado da multiplicação por 150 nem sempre cabe em 16 bits (por exmeplo quando ADC = 1024 ficamos com (1024 - 512) * 150 = 76800 que não cabe no máximo de 32767 de uma variável de 16 bits).
-
viva
apesar de nao estar a trabalhar com o arduino e sim com um PIC o meu sensor é parecido a este e para nao abrir outro topico, aproveito este para ver se me conseguem exclarecer uma duvida....
comprei este sensor na loja aqui da casa: http://www.sparkfun.com/datasheets/BreakoutBoards/0712.pdf (http://www.sparkfun.com/datasheets/BreakoutBoards/0712.pdf)
acontece que estou a tentar fazer um circuito para medir correntes na ordem de 100mA mas nao estou a ter sucesso...
metendo em serie com o sensor uma resistência de 100R e um potenciómetro de 470R a variação de tensão é mesmo mínima, de tal forma que não estou a conseguir ver alteração quase nenhuma na porta ADC.
sabem me dizer se ha forma de contornar este problema ou este sensor nao dá para este efeito?
Cumps
-
Essa datasheet é de vários sensores.... qual é a referência daquele que compraste?
De qualquer forma, na melhor das hipóteses tens cerca de 185mv/A, ou seja, medir 100mA dava-te um valor de 18.5mV. Num ADC de 10 bits com uma tensão de referência de 5V isto são quase 4LSBs (lês uma variação de "4" do ADC, em relação a 0A de corrente). Isto se o circuito eléctrico estiver bem concebido para não ter muito ruído (pelo menos bom desacoplamento da alimentação e tensão bem regulada) e fizeres a média de várias leituras do ADC para eliminar uma parte do ruído.
-
viva
o meu é o 05B-T precisamente o 185mv/A
entao pensar em fazer um amperímetro de 0 a 5Amp esta completamente fora de questao certo?
Cumps
-
E que tal juntar ai um op-amp ai com ganho de 10x para passar isso para 1,8v/A, com 5A daria mais de 5volts, mas podes usar um ganho de 5x ou 2x ou o que achares adequado, assim foges um bocado aos lsb do adc que são mais sensiveis a ruido que os mais significantes e assim deves ganhar um bom bocado na precisão, podes até usar um ganho multiplo de dois e depois para fazer a divisão basta um shift right com carry para não perderes precisão
-
viva
pois... realmente eu a pouco ante de vir aqui ler o teu comentario tinha pensado amplicar com um OPAMP a saida do sensor...
PS: a mais a cima disseram que o sensor media de -150 a 150 de que valor se trata? nao é corrente pois nao? :D mas ja agr so para ter a certesa o meu so mede de 0 a 5Amps certo?
Cumps
-
Na verdade até fiz mal as contas, fiz a pensar em 5A mas na verdade devia ter usado 10A (é -5 a 5), e portanto não são 4LSB para 100mA mas sim apenas 2LSB.
O teu, se é o 05x mede de -5A a 5A. E sim, outras variantes do mesmo modelo medem de -150A a 150A (tá tudo na datasheet!).
Alguns AVR têm um amplificador diferencial interno de até 20x antes do ADC, mas por acaso o ATmegax8x não tem.
-
e ja agr sabes se com o PIC18F252 é possivel fazer isso?
Cumps
-
Com PIC tem q se fazer a amplificação externamente.
Se as gamas a medir não forem de -5A a +5A, se forem 0 a +5A, então podem ajustar-se as VREF do ADC, e conseguir uma melhor gama dinâmica de conversão.
Ou seja, usar a largura de entrada do sinal toda do ADC do PIC, para medir o sinal com mais resolução.