Fórum sobre desenvolvimento de sistemas embarcados: Hardware e Software, Tecnologias: Eletrônica digital e analógica, Microcontroladoras, Microprocessadores, Sistemas *NIX (Linux, BSD), Software embarcado Baremetal. Sem fins lucrativos.
Esqueci de dizer que a tensao retificada de 180vcc (220vca passando pela ponte de diodo), com esses resistores acima citados e problema na certa, não suportariam temperatura. A formula nesse caso para a potencia especifica seria P= V² / R. Calcule para 220vca e vera que é em torno de 3w.
Sugiro que aprendas a:
1 - Calcular as tensões em resistores com divisores resistivos. 2 - Calcular a potência dos resistores.
Depois calcule as potências nos resistores com os valores que eu forneci. Você vai concluir que encontram-se dentro do valor especificado.
Melhor ainda!!! Monte apenas o divisor resistivo que eu mencionei e teste quanto a temperatura. Se queimar, só vai custar o preço de dois resistores. Algo em torno de R$ 0,30.
Em tempo: 220Vca passando pela ponte de diodos não fornece 180Vcc!!!
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke. "Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
O circuito do projeto é baseado no livro mede fase rms com pic da cerne tecnologia.
Em conversas com o autor recebi as formulas relacionadas anteriormente.
Ja com os resistores estou achando que comprei gato por lebre ou seja me venderam um resistor de 2w em vez de 3w (aqueles resistores com fundo marrom). Eu que não sei ainda como se posta um foto aqui senão voce veria o que estou falando.
Com relação a tensão com 220Vca na entrada da ponte ele fornece sim 180VCC aproximandamente (pode testar no proteus que vai ver esse mesmo resultado) pois logo apos a ponte não tem capacitor de filtragem, somente apos os divisores resistivos tem capacitor de filtro para um tensão abaixo de 5vcc.
Aldss mandei mensagem particular com os dados pedidos.
Sobre o acs712 é em linguagem c ccs e na net ainda não achei um programa especifico com trabalho neste componente. Achei em micro c que neste caso não ajuda por ser mais dificil de entende-lo.
Acho que você está querendo dar um passo maior que a sua perna, por isso está encontrando tanta dificuldade. Se continuar assim, daqui há uns 3 anos ainda vai estar tentando fazer esse projeto. A não ser que o que você esteja pedindo seja um circuito pronto com o programa comentado.
Perguntei se você já tinha usado o conversor A/D do PIC e você não respondeu. Sem saber qual o teu conhecimento de programação e de hardware fica difícil ajudar. Coloque um potenciômetro na entrada RA0 daquele circuito que postei e tente apresentar os valores de tensão de 0 a 5 volts no display conforme gira o potenciômetro pra direita ou esquerda. Depois disso será fácil mudar para o ACS712.
ACS712_CKT-550x452.png
Aqui você tem a informação de como usar o conversor A/D no PIC em CCS. Quando você for pesquisar sobre algum projeto no google não limite suas buscas a encontrar tudo mastigado exatamente como você gostaria de fazer. Procure resolver por partes e vá adaptando ao seu projeto. Como disse anteriormente, me parece que o seu principal problema é não saber usar o A/D do PIC, então aprenda primeiro isso. Um passo de cada vez!!
carlucio escreveu:Sobre o acs712 é em linguagem c ccs e na net ainda não achei um programa especifico com trabalho neste componente. Achei em micro c que neste caso não ajuda por ser mais dificil de entende-lo.
Você não está autorizado a ver ou baixar esse anexo.
Evandro pic, tem um pouco de razão que não sei utilizar muito bem o a/d do pic principalmente no que se refere a varredura de leitura que utilize interrupção. Tem um conhecimento basico de pic, não de iniciante e a respeito do codigo não quero pronto, quero aprender a fazer. Com relação a pesquisa nunca a gente acha o que precisa mastigado, sempre buscando fazer adaptações. Mas se for procurar sobre o componte acs712 95 a 99% dos programas são voltados para arduino.
Vou tentar o que me pediu anteriormente so que o pic referido no projeto não tenho possuo aqui, tenho somente os pic16f876a / 877a e 870 com a/d. Tenho que adaptar, por isso o codigo que vem no projeto indicado, esta em micro c e eu teria que instalar o compilador especifico. Mas valeu pelas dicas
NÃO DISSE PRA VOCÊ USAR AQUELE PIC... DISSE PRA VOCÊ COLOCAR UM POTENCIÔMETRO NA ENTRADA ANALÓGICA RA0 DO PIC QUE VOCÊ VAI USAR. DEPOIS DE FAZER FUNCIONAR COM O POTENCIÔMETRO, VOCÊ FAZ COM O ACS712. ISSO É ADAPTAR AO SEU PROJETO ALGO QUE ESTÁ DISPONÍVEL AOS MONTES NA INTERNET!!!
OS VÍDEOS ESTÃO ENSINANDO A USAR O CONVERSOR ANALÓGICO/DIGITAL DO PIC 16F877A E 16F876A COM O COMPILADOR CCS. VEJA PELO MENOS O PRIMEIRO VÌDEO!!
Evandro pic, tem um pouco de razão que não sei utilizar muito bem o a/d do pic principalmente no que se refere a varredura de leitura que utilize interrupção. Tem um conhecimento basico de pic, não de iniciante e a respeito do codigo não quero pronto, quero aprender a fazer. Com relação a pesquisa nunca a gente acha o que precisa mastigado, sempre buscando fazer adaptações. Mas se for procurar sobre o componte acs712 95 a 99% dos programas são voltados para arduino.
Vou tentar o que me pediu anteriormente so que o pic referido no projeto não tenho possuo aqui, tenho somente os pic16f876a / 877a e 870 com a/d. Tenho que adaptar, por isso o codigo que vem no projeto indicado, esta em micro c e eu teria que instalar o compilador especifico. Mas valeu pelas dicas
Neste momento estou tentando agora ver se consigo montar uma tabela de linearilidade para usar no codigo do pic (para medir e apresentar no lcd a tensao da rede).
O circuito utilizado para fazer a linearização da tensao
esquema elétrico.jpg
Abaixo assim que conseguir pelo menos apresentar o valor real no display, tentarei apresentar o valor correto atraves de comparações para tambem usar um fator de multiplicação para fazer a devida correção em descrepancias.
O problema e que estou esbarrando na maneira correta de fazer o codigo para representar isto no display. Na maneira citado abaixo esta acontecendo que quando utilizo a esta equação o display fica indicando valores como 249, 409, 363, etc... Não esta ficando marcando o valor original que neste caso deveria ser em torno de 212 "volts", fica oscilando e longe do real.
O trecho do codigo a parte da conversao usado abaixo.
//----- Leitura e Conversão do Sensor de tensão ----------------- leituraTensao = analogRead(sensorTensaoPin); // Lê entrada analógica do sensor de tensão
if ((leituraTensao < 172)){ // leitura menor que 49V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM1; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 172) && (leituraTensao < 241)){ // leitura entre 49 e 67V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM1; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 241) && (leituraTensao < 309)){ // leitura entre 67 e 84V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM2; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 309) && (leituraTensao < 384)){ // leitura entre 84 e 103V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM3; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 384) && (leituraTensao < 459)){ // leitura entre 103 e 122V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM4; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 459) && (leituraTensao < 503)){ // leitura entre 122 e 129V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM5; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 503) && (leituraTensao < 547)){ // leitura entre 129 e 135V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM6; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 547) && (leituraTensao < 644)){ // leitura entre 135 e 161V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM7; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 644) && (leituraTensao < 741)){ // leitura entre 161 e 186V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM8; // Converte a leitura para volts e aplica "fator de multiplicação" } if ((leituraTensao >= 741)){ // leitura igual ou maior que 186V leituraTensaoConv = (leituraTensao * Vcc / 1024.0) * FM9; // Converte a leitura para volts e aplica "fator de multiplicação" } //---------------------------------------------------------------
Sera que alguem me ajuda a montar a equação correta para fazer a tabela de linearização?
A tabela ficara quase igual a essa abaixo
tabela3.jpg
E essa com o fator de multiplicação que necessariamente não sera esse
tabela2.JPG
Aguardando alguma orientação.
Você não está autorizado a ver ou baixar esse anexo.
A dica que dou nesse ponto, é que meça com um multimetro ou osciloscopio pra confirmar se a saída DC do circuito acima está realmente com um ripple alto devido á alguma retificação mal feita. Outro ponto, é que provavelmente possa estar havendo algum problema com a conversão float no printf. Minha dica é voce /*comentar*/ as partes que manipulam float no código acima e passa a usar char ou int. Caso prefira uma alternativa ainda melhor, coloca uma saída serial aí pra enviar os dados lidos pela UART e ir debugando também pela serial.
Quanto á abordagem da tabela, é por aí mesmo, tem de medir ponto á ponto e depois converter dentro do PIC, com o que se chama de acesso á look-up table, mas a idéia não é converter por cálculo no PIC, mas apresentar o próprio valor, eximindo o PIC de quaisquer contas que envolvam operação de divisão, que são muito custosas para o processamento de um uC de 8 bits.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
amigo ao deixar o mc fazer a conta pra converter do jeito que vc fez ele vai dar saltos mesmo. Imagine se 241 ele multiplica por FM1, se 242, por FM2. Aqui tem um pulinho considerável. O verdadeiro pulo do gato é vc fazer como o amigo andré disse e capturar os dados direto da tabela, sem fazer contas algo como
De fato nem sei se precisa tabela pra linearizar. Tenta ir aumentando a corrente por steps, meça com multimetro e anote e ao lado anote também o resultado do ad in natura. Depois divida um pelo outro pra ver o resultado. Umas 10 medições devem ser suficientes. Claro que pra isso o hw tem que estar filé. abç
Conforme orientado pelo andre e o ze fiz algumas modificações no circuito, mas agora o mesmo não esta mostrando o valor da tensao lida e convertida no display.
a mensagem no display que fica é esta e não altera independente da tensao de entrada alterar :
Não sei onde errei e porque não esta aparecendo o valor no display, sera que alguem consegue ver o problema o codigo esta abaixo.
Com a ajuda do variac fiz a tabela de conversão utilizando um transformador de 12 + 12 / 400ma ( a corrente / potencia influencia nas medidas para criar a tabela) e montei a tabela da tensao lida e a conversão para o ad do pic utilizando o circuito abaixo:
inicializa_lcd(); //Chama função de inicialização lcd
setup_adc(ADC_CLOCK_DIV_8); // Configura clock da conversão setup_adc_ports(RA0_ANALOG); // Configura A/D set_adc_channel(0); // Lê a entrada 0
while(1) { leitura_tensao=read_adc();
if((leitura_tensao >=563)){ // tensao maior que 220v leitura_tensao_conv = ((leitura_tensao * 0.393));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=562)&& (leitura_tensao<=561)) // tensao maior ou igual 220v e menor ou igual a 210v leitura_tensao_conv = ((leitura_tensao * 0.393));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=560)&& (leitura_tensao<=544)){ // tensao maior ou igual 210v e menor ou igual a 200v leitura_tensao_conv = ((leitura_tensao * 0.386));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=543)&& (leitura_tensao<=526)){ // tensao maior ou igual 200v e menor ou igual a 190v leitura_tensao_conv = ((leitura_tensao * 0.380));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=525)&& (leitura_tensao<=509)){ // tensao maior ou igual 190v e menor ou igual a 180v leitura_tensao_conv = ((leitura_tensao * 0.373));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=508)&& (leitura_tensao<=487)){ // tensao maior ou igual 180v e menor ou igual a 170v leitura_tensao_conv = ((leitura_tensao * 0.370));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=486)&& (leitura_tensao<=464)){ // tensao maior ou igual 170v e menor ou igual a 160v leitura_tensao_conv = ((leitura_tensao * 0.366));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=463)&& (leitura_tensao<=438)){ // tensao maior ou igual 160v e menor ou igual a 150v leitura_tensao_conv = ((leitura_tensao * 0.366));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=437)&& (leitura_tensao<=411)){ // tensao maior ou igual 150v e menor ou igual a 140v leitura_tensao_conv = ((leitura_tensao * 0.365));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=410)&& (leitura_tensao<=385)){ // tensao maior ou igual 140v e menor ou igual a 130v leitura_tensao_conv = ((leitura_tensao * 0.364));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=384)&& (leitura_tensao<=359)){ // tensao maior ou igual 130v e menor ou igual a 120v leitura_tensao_conv = ((leitura_tensao * 0.362));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=358)&& (leitura_tensao<=329)){ // tensao maior ou igual 120v e menor ou igual a 110v leitura_tensao_conv = ((leitura_tensao * 0.365));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=328)&& (leitura_tensao<=301)){ // tensao maior ou igual 110v e menor ou igual a 100v leitura_tensao_conv = ((leitura_tensao * 0.365));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=300)&& (leitura_tensao<=272)){ // tensao maior ou igual 100v e menor ou igual a 90v leitura_tensao_conv = ((leitura_tensao * 0.368));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao <=272)){ leitura_tensao_conv = ((leitura_tensao * 0.362)); // tensao menor que 90v
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
inicializa_lcd(); //Chama função de inicialização lcd
setup_adc(ADC_CLOCK_DIV_8); // Configura clock da conversão setup_adc_ports(RA0_ANALOG); // Configura A/D set_adc_channel(0); // Lê a entrada 0
while(1) { leitura_tensao=read_adc();
if((leitura_tensao >=563)){ // tensao maior que 220v leitura_tensao_conv = ((leitura_tensao * 0.393));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=562)&& (leitura_tensao<=561)) // tensao maior ou igual 220v e menor ou igual a 210v leitura_tensao_conv = ((leitura_tensao * 0.393));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=560)&& (leitura_tensao<=544)){ // tensao maior ou igual 210v e menor ou igual a 200v leitura_tensao_conv = ((leitura_tensao * 0.386));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=543)&& (leitura_tensao<=526)){ // tensao maior ou igual 200v e menor ou igual a 190v leitura_tensao_conv = ((leitura_tensao * 0.380));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=525)&& (leitura_tensao<=509)){ // tensao maior ou igual 190v e menor ou igual a 180v leitura_tensao_conv = ((leitura_tensao * 0.373));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=508)&& (leitura_tensao<=487)){ // tensao maior ou igual 180v e menor ou igual a 170v leitura_tensao_conv = ((leitura_tensao * 0.370));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=486)&& (leitura_tensao<=464)){ // tensao maior ou igual 170v e menor ou igual a 160v leitura_tensao_conv = ((leitura_tensao * 0.366));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=463)&& (leitura_tensao<=438)){ // tensao maior ou igual 160v e menor ou igual a 150v leitura_tensao_conv = ((leitura_tensao * 0.366));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=437)&& (leitura_tensao<=411)){ // tensao maior ou igual 150v e menor ou igual a 140v leitura_tensao_conv = ((leitura_tensao * 0.365));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=410)&& (leitura_tensao<=385)){ // tensao maior ou igual 140v e menor ou igual a 130v leitura_tensao_conv = ((leitura_tensao * 0.364));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=384)&& (leitura_tensao<=359)){ // tensao maior ou igual 130v e menor ou igual a 120v leitura_tensao_conv = ((leitura_tensao * 0.362));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=358)&& (leitura_tensao<=329)){ // tensao maior ou igual 120v e menor ou igual a 110v leitura_tensao_conv = ((leitura_tensao * 0.365));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=328)&& (leitura_tensao<=301)){ // tensao maior ou igual 110v e menor ou igual a 100v leitura_tensao_conv = ((leitura_tensao * 0.365));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=300)&& (leitura_tensao<=272)){ // tensao maior ou igual 100v e menor ou igual a 90v leitura_tensao_conv = ((leitura_tensao * 0.368));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao <=272)){ leitura_tensao_conv = ((leitura_tensao * 0.362)); // tensao menor que 90v
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
Sera que alguem esclarece meu erro? Com float no lugar do int na declaração das variaveis o compilador xiou dizendo a mensagem : " out of rom". Existe outra forma de apresentar os dados?
Aquele resistor R2 = 100k está muito estranho. Principalmente depois com um resistor de 330 ohms em série. MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke. "Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
o circuito conversor funciona muito bem e é deste projeto abaixo no link. Com relação a ele, funciona perfeitamente. O problema creio eu esta no codigo que eu não sei porque nao apresenta o valor da leitura.
if((leitura_tensao >=563)){ // tensao maior que 220v leitura_tensao_conv = ((leitura_tensao * 0.393));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=562)&& (leitura_tensao<=561)) // tensao maior ou igual 220v e menor ou igual a 210v leitura_tensao_conv = ((leitura_tensao * 0.393));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
if((leitura_tensao >=560)&& (leitura_tensao<=544)){ // tensao maior ou igual 210v e menor ou igual a 200v leitura_tensao_conv = ((leitura_tensao * 0.386));
delay_ms(3000); lcd_locate(1,0); printf(lcd_dado,"V="); lcd_locate(1,2); //Posiciona o cursor na segunda linha printf(lcd_dado,"%3u",leitura_tensao_conv); //Mostra a tensão medida
Há muitos anos quando eu brincava com essas coisas, usava números inteiros...
Por exemplo em vez de você usar 0.393 como fator de multiplicação, eu usaria 393. Depois, antes de colocar no display, fazia o ajuste decimal, colocando a virgula no local desejado.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Amigo pra deixar mais estável, coloque + 1 capacitor chute 10uF em paralelo com o zener. Out of rom provavelmente não está cabendo na memória. Float & mc 8 bits = não têm afinidade. Tente algo como o kraft disse. Esquece o valor do trafo. Foque no ac e ad. tipo assim.. 220 = ad 561 e quero 220. p.ex multiplicando valor ad por 50 561*50=28500 cabe dentro de um unsigned int. /220 =127.5 que cabe até num unsigned char Portanto para mostrar 220 faça (ad*50)/127 e esqueça float. (o bom mesmo é operações com base 2. 2,4,8,16,32,64. Pro mc é como se pra nós fosse base 10) Bom esta foi só a essência. Tem como melhorar, claro. Teste mais valores com teu variac. Pode ser que fique linearzinho. Coloque os dados do ad no excel e crie um gráfico pra ver se formam uma reta. Também pode colocar os do multímetro De fato nem trafo precisa. Pode ligar direto na rede ac. A ideia: 2 resistores 2M2 um em cada fase na entrada de um amp diferencial + retificador ideal com ampop e .. esquece isso nesta sua fase. Dx pra mais tarde... abç
Embora ainda não tenhamos determinado o motivo do problema, a formatação float pode ser uma fonte pra dor de cabeça, pois é dificil de debugar já que não é um formato natural para o microcontrolador, e algum arredondamento ou casting pode estar sendo feito a partir de algum valor sem percebermos.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."