Ir ao conteúdo

Picos de tensão pic


keven.i3

Posts recomendados

Postado

Oi, estou programando um programa, que através de um sensor ligado a uma porta a-d realizo a leitura do mesmo(sensor de pressão), a questão é a seguinte:

Preciso saber a variação de pressão, e os picos máximos, exemplo:

Segundos Pressão

1 700mbar

2 710mbar

3 690mbar

4 700mbar

5 708mbar

6 701mbar

7 698mbar

8 699mbar

9 700mbar

10 715mbar

11 780mbar

12 710mbar

13 700mbar

14 690mbar

15 700mbar

Já fiz uma rotina que pega os valores minimo maximo( 690, 780 ), porém não consegui criar uma rotina para pegar os valores de variação fora de pico ( 690 - 710 )

tentei fazer o seguinte:

ler(); rotina para ler a pressao

temporario = pressao; ( transforma a variavel temporario com o mesmo valor da variavel pressao que foi obtida na rotina ler)

valorminimomaximo(); ( rotina para ler os valores minimo e maximo)

if((temporario>valorminimo) & (temporario<valormaximo))

{

temporariomid2=valorsemimaximo+5; ( transforma uma segunda variavel temporaria no valor obtido +5)

if((temporario>= valorsemimaximo) & (temporario<temporariomid2))

{

valorsemimaximo=temporario;

}

}

o que eu tentei fazer: pegar o valor lido, e verificar se é maior que o minimo, e verificar se é menor que o valor guardado +5, ou seja se variar mais do que 5 na leitura de pressão, ele não gravaria isso na variavel, funciona mal.

Se alguem tiver alguma opnião.. Agradeço antecipadamente

Postado

posta o codigo.

quando for colocar o codigo, coloque assim

 coloque o codigo aqui [/*code]    e retire o ( * )
Postado



#include <16f877a.h>
#device adc=10

#fuses NOWDT, HS, NOPUT, NOBROWNOUT, NOWRT , NOPROTECT
#use delay (clock=20M)
#define on output_high
#define off output_low
#define ms delay_ms
#define cleanlcd printf(lcd_putc, "\f")
#include <flex_lcd420a.c>

#define buto pin_c7
int avaria=0, resultados;
int16 q1, pressao;
float p, q2 ;
int16 temporario, valorminimo=1000, valormaximo;
int16 variacao, temporariomid, valorsemimaximo,temporariomid2;

void ler1(void)
{
set_adc_channel(0);
delay_us(40);
q1 = read_adc();
p = (q1 * 5)/1024.0;
q2 = p;

pressao= p * 200;
}




void valorminimomaximo(void)
{
if(temporario>valormaximo)
{
valormaximo=temporario;

}

if(temporario<valorminimo)
{
valorminimo=temporario;

}




}








void resultado(void)
{
/*
avaria 1 = motor em condiçoes perfeitas
avaria 2 = guia de valvula gastas
avaria 3 = entrada de ar falso
avaria 4 = verificar vedação dos aneis do pistao e oleo que esta sendo empregado
avaria 5 = valvulas presas
*/
if(( (valorminimo>=440) & ( valorminimo<=560) ) & ( (valormaximo<=560) & ( valormaximo >= 440) ) )
{
avaria=1;
}

if(( (valorminimo>=360) & (valorminimo<=490) ) & ( (valormaximo<=490) & (valormaximo>=360) ) )
{
avaria=2;
}

if(( (valorminimo>=40) & (valorminimo<=160) ) & ( (valormaximo<=160) & (valormaximo>=40) ) )
{
avaria=3;
}

if(( (valorminimo>=300) & (valorminimo<=430) ) & ( (valormaximo<=430) & (valormaximo>=300) ) )
{
avaria=4;
}

if(( (valorminimo>=415) & (valorminimo<=495) ) & ( (valormaximo<=495) & (valormaximo>=415) ) )
{
avaria=5;
}



cleanlcd;
}


void variacaos(void)
{
variacao=valormaximo-valorminimo;


}


void testeestabilidade(void)
{
cleanlcd;
ler1();

ms(1);
valorsemimaximo=valorminimo;
variacaos();
if(variacao>25)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"teste entrou em 25");
ms(500);
while(true)
{

ler1();
ms(70);
temporario=pressao;
valorminimomaximo();
temporariomid=pressao;

if( (temporariomid>valorminimo) & (temporariomid<valormaximo) )
{
temporariomid2=valorsemimaximo+6;
if((temporariomid>=valorsemimaximo) & (temporariomid<temporariomid2))
{
valorsemimaximo=temporariomid;
}
}

if(input(buto))
{
ms(50);
if(input(buto))
{
break;
}
}

}

}
if(variacao<25)
{
resultados=1; // bom
}

}


void leitura(void)
{
cleanlcd;
valorminimo=1000;
valormaximo=0;
ler1();
ms(10);
temporario=pressao;
while(true)
{
ler1();
temporario=pressao;
valorminimomaximo();
if(input(buto))
{
ms(50);
if(input(buto))
{
testeestabilidade();
ms(10);
break;
}

}
}
}


void tela(void)
{
switch(avaria)
{
case 0:
{break;}
case 1:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"Condicoes ideais",);
break;
}
case 2:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"Guia valv gasta");
break;

}
case 3:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"entrada ar falso");
break;

}case 4:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"ma vedacao ");
break;

}
case 5:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"valvulas presas ");
break;

}






}



}


void main(void)
{
set_tris_a(0b11111111);
set_tris_c(0b11111111);
lcd_init();
ms(100);
lcd_init();
ms(100);

setup_adc_ports(all_analog);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(20);

while(true)
{
ler1();

lcd_gotoxy(1,1);
printf(lcd_putc,"%2.3f V", q2);
lcd_gotoxy(1,2);
printf(lcd_putc,"%lu mBAR,", pressao);
lcd_gotoxy(11,2);
printf(lcd_putc,"var %lu, ",variacao);
// grafico();
delay_ms (200);
if(input(buto))
{
ms(100);
if(input(buto))
{
ms(1000);
leitura();
}
}
resultado();
lcd_gotoxy(1,3);
printf(lcd_putc,"min %lu,max %lu ",valorminimo, valormaximo);
tela();
lcd_gotoxy(9,1);
printf(lcd_putc,"med %lu, ",valorsemimaximo);


}



}



OBS: este código é somente para testes, então, no main, aparece os valores obtidos e tal obrigado

OBS2: coloquei um delay de 70 ms, entre um loop e outro e TCHARAM ele está fazendo o que eu queria... porém se achar uma forma menos "primitiva" de fazer, por favor , fique a vontade a falar obrigado.

Postado

Colega keven.i3, sabe por que o colega arh solicitou que você colocasse seu código entre as tag de

? Foi no intuito de facilitar nossa leitura do seu código. Mas não deu muito certo.

Tente utilizar a indentação ou seu código fica impossível de ler. Veja:

http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o

e

http://en.wikipedia.org/wiki/Indent_style

Outra dica. Veja como você cria suas variáveis:

valorsemimaximo

Muitos programadores gostam de criar variáveis do assim:

ValorSeMiMaximo

Viu a diferença? fica mais fácil de ler. Mas particularmente não gosto desse tipo pois muitos compiladores são case-sensitive, ou seja, eles diferenciam maiúscula de minuscula. Sendo assim, prefiro criar assim:

valor_se_mi_maximo

O CCS não diferencia maiúscula de minuscula.....

O código do jeito que foi postado fica difícil de ler. perde-se muito tempo tentando descobrir onde cada loop ou bloco de instruções começam e terminam.

Postado

vou fazer as correções e posto novamente, por enquanto, obrigado pelos toques..


#include <16f877a.h>
#device adc=10

#fuses NOWDT, HS, NOPUT, NOBROWNOUT, NOWRT , NOPROTECT
#use delay (clock=20M)
#define on output_high
#define off output_low
#define ms delay_ms
#define cleanlcd printf(lcd_putc, "\f")
#include <flex_lcd420a.c>

#define buto pin_c7
int avaria=0, resultados;
int16 q1, pressao;
float p, q2 ;
int16 temporario, valor_minimo=1000, valor_maximo;
int16 variacao, temporariomid, valor_semi_maximo,temporariomid2;

void ler1(void)
{
set_adc_channel(0);
delay_us(40);
q1 = read_adc();
p = (q1 * 5)/1024.0;
q2 = p;
pressao= p * 200;
}



void valorminimomaximo(void)
{
if(temporario>valor_maximo)
{
valor_maximo=temporario;
}

if(temporario<valor_minimo)
{
valor_minimo=temporario;
}

}


void resultado(void)
{
/*
avaria 1 = motor em condiçoes perfeitas
avaria 2 = guia de valvula gastas
avaria 3 = entrada de ar falso
avaria 4 = verificar vedação dos aneis do pistao e oleo que esta sendo empregado
avaria 5 = valvulas presas
*/
if(((valor_minimo>=440) & ( valor_minimo<=560)) & ((valor_maximo<=560) & (valor_maximo >= 440)) )
{
avaria=1;
}

if(((valor_minimo>=360) & (valor_minimo<=490)) & ((valor_maximo<=490) & (valor_maximo>=360)) )
{
avaria=2;
}

if(((valor_minimo>=40) & (valor_minimo<=160)) & ((valor_maximo<=160) & (valor_maximo>=40)) )
{
avaria=3;
}

if(((valor_minimo>=300) & (valor_minimo<=430)) & ((valor_maximo<=430) & (valor_maximo>=300)) )
{
avaria=4;
}

if(((valor_minimo>=415) & (valor_minimo<=495)) & ((valor_maximo<=495) & (valor_maximo>=415)) )
{
avaria=5;
}



cleanlcd;
}


void variacaos(void)
{
variacao=valor_maximo-valor_minimo;


}


void testeestabilidade(void)
{
cleanlcd;
ler1();
ms(1);
valor_semi_maximo=valor_minimo;
variacaos();
if(variacao>25)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"teste entrou em 25");
ms(500);
while(true)
{

ler1();
ms(70);
temporario=pressao;
valorminimomaximo();
temporariomid=pressao;

if( (temporariomid>valor_minimo) & (temporariomid<valor_maximo))
{
temporariomid2=valor_semi_maximo+6;
if((temporariomid>=valor_semi_maximo) & (temporariomid<temporariomid2))
{
valor_semi_maximo=temporariomid;
}
}

if(input(buto))
{
ms(50);
if(input(buto))
{
break;
}
}

}

}
if(variacao<25)
{
resultados=1; // bom
}

}


void leitura(void)
{
cleanlcd;
valor_minimo=1000;
valor_maximo=0;
ler1();
ms(10);
temporario=pressao;
while(true)
{
ler1();
temporario=pressao;
valorminimomaximo();
if(input(buto))
{
ms(50);
if(input(buto))
{
testeestabilidade();
ms(10);
break;
}

}
}
}


void tela(void)
{
switch(avaria)
{
case 0:
{break;}
case 1:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"Condicoes ideais",);
break;
}
case 2:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"Guia valv gasta");
break;

}
case 3:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"entrada ar falso");
break;

}

case 4:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"ma vedacao ");
break;

}
case 5:
{
lcd_gotoxy(1,4);
printf(lcd_putc,"valvulas presas ");
break;

}

}

}


void main(void)
{
set_tris_a(0b11111111);
set_tris_c(0b11111111);
lcd_init();
ms(100);
lcd_init();
ms(100);

setup_adc_ports(all_analog);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(20);

while(true)
{
ler1();

lcd_gotoxy(1,1);
printf(lcd_putc,"%2.3f V", q2);
lcd_gotoxy(1,2);
printf(lcd_putc,"%lu mBAR,", pressao);
lcd_gotoxy(11,2);
printf(lcd_putc,"var %lu, ",variacao);

delay_ms (200);
if(input(buto))
{
ms(100);
if(input(buto))
{
ms(1000);
leitura();
}
}
resultado();
lcd_gotoxy(1,3);
printf(lcd_putc,"min %lu,max %lu ",valor_minimo, valor_maximo);
tela();
lcd_gotoxy(9,1);
printf(lcd_putc,"med %lu, ",valor_semi_maximo);


}



}

ta ai, ve se é isso amigo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!