^ Retornar ao
topo
Iniciantes : Ajuda - Sinais analógicos no pic 
Responder ao Tópico
Autor Mensagem

Eduardo_bh

Level 0
272065 xp

Registrado em:
Feb 23, 2009

Local:
Belo Horizonte / MG



Mensagens:
7

MensagemEnviado: Ter Fev 24, 2009 11:06 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Olá amigos,

Sou novo neste forum, ja li muitos tópicos aqui existentes porém nenhum aproximou-se um pouco do que eu preciso.

sou iniciante em programação c com o pic, mas eu tenho um problema que preciso resolver e espero que me ajudem.

seguinte: eu preciso coletar dois sinais de 4 a 20mA na entrada analogica de um pic 16f877 e fazer uma comparação entre os dois sinais. O sinal de menor valor eu devo repassar para um bit em uma saída qualquer do pic. Isto deve ser ciclico.

Este projetinho é para o controle de demanda elétrica de fornos de tratamento térmico. 

Se alguem puder m ajudar, me ajude em linguagem C, que o que eu entendo melhor.

Brigadão!!

Abraços.

_________________
"Por pior que seja o buraco que você se encontra, sorria!...
...pois ainda não tem terra por cima!!!!"
Topo

Eduardo_bh

Level 0
272065 xp

Registrado em:
Feb 23, 2009

Local:
Belo Horizonte / MG



Mensagens:
7

MensagemEnviado: Ter Fev 24, 2009 11:47 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Ja estou comecando a entender;

este link ta me ajudano: http://www2.brazcubas.br/profe.....lo_PIC.pdf

porém eu quero fazer leituras independentes das duas portas, seria mais ou menos assim?

setup_adc_ports (ALL_ANALOG);// todas serão analogicas
value = read adc();// é aqui que eu me perco, desta forma eu leria o que na verdade????

eu quero ler a ANO separado da AN1
tem como????

_________________
"Por pior que seja o buraco que você se encontra, sorria!...
...pois ainda não tem terra por cima!!!!"
Topo

PauloChip

Level 26
26414056 xp

Registrado em:
Nov 23, 2006

Local:
Embu / SP

Equipe:
Proteus

Mensagens:
692

MensagemEnviado: Qua Fev 25, 2009 2:41 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Oi Eduardo...

Para ler mais de um canal analógico no PIC é necessário "chavear" a entrada analógica que se quer ler. Isso é feito alterando os registradores correspondentes.

Infelizmente não posso te ajudar em C.

O PIC precisa de um tempo para fazer a conversão AD, então vc precisa ler um canal, alterar a entrada, dar um tempo , ler seu resultado, voltar para o primeiro canal, dar um tempo....

_________________
PauloChip
Equipe Proteus
"Nenhuma certeza absoluta é mais inteligente do que uma simples dúvida (PC)."
Topo

Eduardo_bh

Level 0
272065 xp

Registrado em:
Feb 23, 2009

Local:
Belo Horizonte / MG



Mensagens:
7

MensagemEnviado: Qua Fev 25, 2009 11:09 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Olá Paulo chip,


Estou estudando bastante sobre este assunto, vc já me deu uma luz...

mas se fosse na linguagem que você prefere, qual seria, apenas, a parte de alternamento dos registradores de AN0 e AN1????

Desde já, muito obrigado pela ajuda

Abraço!!!

_________________
"Por pior que seja o buraco que você se encontra, sorria!...
...pois ainda não tem terra por cima!!!!"
Topo

PauloChip

Level 26
26414056 xp

Registrado em:
Nov 23, 2006

Local:
Embu / SP

Equipe:
Proteus

Mensagens:
692

MensagemEnviado: Qui Fev 26, 2009 4:48 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Eu trabalho em assembler... (coisa de velho teimoso Laughing )

Qual PIC vc está trabalhando ?

_________________
PauloChip
Equipe Proteus
"Nenhuma certeza absoluta é mais inteligente do que uma simples dúvida (PC)."
Topo

Eduardo_bh

Level 0
272065 xp

Registrado em:
Feb 23, 2009

Local:
Belo Horizonte / MG



Mensagens:
7

MensagemEnviado: Qui Fev 26, 2009 10:51 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Blz Paulo!

Estou trabalhando com o pic 16F877, acho que é o melhorzinho antes da série dos 18...

Assembler ja ta bom, o compilador CCS aceita algumas diretivas em assembler no meio de um programa em C.

Vlw,

Inté mais!!!!

_________________
"Por pior que seja o buraco que você se encontra, sorria!...
...pois ainda não tem terra por cima!!!!"
Topo

PauloChip

Level 26
26414056 xp

Registrado em:
Nov 23, 2006

Local:
Embu / SP

Equipe:
Proteus

Mensagens:
692

MensagemEnviado: Sex Fev 27, 2009 7:49 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Então o registrador em questão é o ADCON0...

Ele é responsável, entre outras coisas, de determinar qual canal AD está sendo lido no momento...

Veja a função de cada bit:

ADCON0 REGISTER (ADDRESS: 1Fh)

bit 7-6: ADCS1:ADCS0: A/D Conversion Clock Select bits
     00 = FOSC/2
     01 = FOSC/8
     10 = FOSC/32
     11 = FRC (clock derived from an RC oscillation)
bit 5,4,3: CHS2:CHS0: Analog Channel Select bits
     000 = channel 0, (RA0/AN0)
     001 = channel 1, (RA1/AN1)
     010 = channel 2, (RA2/AN2)
     011 = channel 3, (RA3/AN3)
     100 = channel 4, (RA5/AN4)
     101 = channel 5, (RE0/AN5)(1)
     110 = channel 6, (RE1/AN6)(1)
     111 = channel 7, (RE2/AN7)(1)
bit 2: GO/DONE: A/D Conversion Status bit
If ADON = 1
    1 = A/D conversion in progress (setting this bit starts the A/D conversion)
    0 = A/D conversion not in progress (This bit is automatically cleared by hardware when the A/D conversion is complete)
bit 1: Unimplemented: Read as '0'
bit 0: ADON: A/D On bit
    1 = A/D converter module is operating
    0 = A/D converter module is shutoff and consumes no operating current

Como vc pode ver os bits 3,4 e 5 são os responsáveis por selecionar o canal AD atual

_________________
PauloChip
Equipe Proteus
"Nenhuma certeza absoluta é mais inteligente do que uma simples dúvida (PC)."
Topo

Eduardo_bh

Level 0
272065 xp

Registrado em:
Feb 23, 2009

Local:
Belo Horizonte / MG



Mensagens:
7

MensagemEnviado: Sab Fev 28, 2009 12:32 am
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Brigadão cara..

pelo que eu entendi, em c, eu tenho que chamar um canal, ler e aguardar aprox.20ms, depois eu chamo outro canal diferente, leio e aguardo 20ms e apos estas duas leituras eu faço a comparação para repassa o sinal de menor valo....


vlw mesmo cara...

brigadão..
inte mais!!

_________________
"Por pior que seja o buraco que você se encontra, sorria!...
...pois ainda não tem terra por cima!!!!"
Topo

NeutralX86

Level 0
83591 xp

Registrado em:
Sep 05, 2007

Local:
Belém / PA



Mensagens:
2

MensagemEnviado: Sab Fev 28, 2009 5:43 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Olá Eduardo_BH

                 Pelo que entendi você quer realizar a aquisição de dados de sensores para um forno, me desculpe se entendi errado, mas acho que são sensores de temperatura certo? Você poderia especificar melhor quais são os sensores.

                 Bem você está falando em mA, o canal A/D do pic deve receber o sinal analógico em volts, o mínimo valor em volts que o canal A/D de um PIC consegue ler é de 5mV, logo se a saída do sensor tiver um sinal menor que isto, deve ser necessário o uso de um amplificador operacional.

                 Especifique melhor qual sensor você está usando para que possamos discutir um código aqui no Forum.

Abraço,

Chase.
Topo

Eduardo_bh

Level 0
272065 xp

Registrado em:
Feb 23, 2009

Local:
Belo Horizonte / MG



Mensagens:
7

MensagemEnviado: Dom Mar 01, 2009 12:52 am
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Neutralx86, é o seguinte:

Estamos trabalhando em um sistema de controle de demanda eletrica aqui na nossa empresa, onde se ultrapassarmos o valor de demanda que compramos da CEMIG, pagaremos uma multa alta para a mesma. Os fornos de tratamento térmico aqui são todos automatizados e os sensores são termopares tipo j, k e outros, porém estes sinais do termopar vão direto para o controlador do forno onde é feito todo o controle de atmosfera, temperatura, porcentagem de carbono e etc. 

O controlador de demanda, por obrigação deve desligar os equipamentos da empresa no horário de pico de demanda que é entre 16 e 21:00, (para não ultrapassar o valor de demanda que compramos da cemig) porém eu não posso "derrubar" o forno de uma vez, porque senão eu acabo com o tratamento.

O aquecimento do forno é feito por resistencia de alta potencia e estas resistencias são controladas por um equipamento que cria um PWM encima dessas resistencias aplicando mais tensão ou menos de acordo com os sinais de temperatura que são coletados do termopar e enviados ao controlador de temperatura. Este controlador de temperatura repassa estes sinais na facha de 4 a 20mA para o equipamento que cria o PWM.

Entendeu até agora?!?!?!?

Pois é o principal é o seguinte:

O pic entra aqui:

Então, o controlador de demanda emite sinais de 4 a 20mA e o controlador de temperatura emite também sinais de 4 a 20mA para o equipamento de PWM, dessa forma eu devo coletar estes dois sinais, compará-los e repassar o menor valor de comparação onde criarei uma lógica digital com os pinos das portas para repassar a um conversor D/A que irá jogar este valor para o equipamento de PWM para abaixar a temperatura até a demanda elétrica estabilizar. Eu posso abaixar a temperatura do forno e não desligá-la. OK!

Entendeu?!!??!?!?
Já consegui ler as portas independentes, porém não estou conseguindo compara-los, sou novo em pic, mas tenho esperanca de consegui.

Já fizeram até jogo de Xadrez com ele, porque que eu não vou conseguir fazer uma bobeirinha dessas.... heheheh...

O programa que estou trabalhando até agora é:
#include <16F877A.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=8000000)


#include "LCD_8B.c"

void main() {
  long adc1, adc2;  

   
  Setup_adc_ports(RA0_RA1_RA3_ANALOG);
  setup_adc( ADC_CLOCK_INTERNAL );
    
  lcd_ini();
    
  delay_ms(500);
   
  printf(lcd_escreve,"\f   Leitura AD   ");
  
  delay_ms(1000);
  
  printf(lcd_escreve,"\f");
  
      
  while(TRUE) {
               set_adc_channel(0);
               delay_us(15);
               adc1 = read_adc();
               lcd_pos_xy(1,1);
               printf(lcd_escreve,"ADC1 = %4lu",adc1);
               delay_ms(100);

               set_adc_channel(1);
               delay_us(15);
               adc2 = read_adc();
               printf(lcd_escreve,"\nADC2 = %4lu",adc2);
               delay_ms(100);
               
               }

}
Estou colocando o resultado apenas no display por enquanto.

Vlw cara...
inté mais!!!

_________________
"Por pior que seja o buraco que você se encontra, sorria!...
...pois ainda não tem terra por cima!!!!"
Topo

PauloChip

Level 26
26414056 xp

Registrado em:
Nov 23, 2006

Local:
Embu / SP

Equipe:
Proteus

Mensagens:
692

MensagemEnviado: Dom Mar 01, 2009 10:08 am
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Vc entendeu...

Para facilitar o entendimento basta imaginar q na entrada de cada canal analógico do PIC há um capacitor chaveado pelo ADCON0.

Quando vc configura uma determinada entrada AD o capacitor (q está descarregado) deve se carregar com o valor de tensão presente no pino... isso leva um tempo.... q no caso deste pic deve ser de 20mS (isso depende do clock e do PIC, mas 20ms é suficiente).

Depois q o capacitor está carregado com o valor desejado vc pode ler o AD.

Ao invés de ficar esperando este tempo vc pode monitorar o bit GO/DONE do registrador ADCON0. Quando vc dispara uma conversão ele vai p 1 e quando a conversão acaba ele vai p 0.

A lógica de comparação é o mais simples a se fazer... em assembler eu subtrairia um valor pelo outro e verificaria se houve "empresta 1" (borow).

Boa sorte
------------------------------------
Yes... Wee...Kend !

_________________
PauloChip
Equipe Proteus
"Nenhuma certeza absoluta é mais inteligente do que uma simples dúvida (PC)."
Topo

NeutralX86

Level 0
83591 xp

Registrado em:
Sep 05, 2007

Local:
Belém / PA



Mensagens:
2

MensagemEnviado: Dom Mar 01, 2009 4:47 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Vamos lá, o código e o entendimento já está okay, acredito que agora seja um problema de escala, ou seja, a conversão está sendo feita corretamente, falta agora termos valores dentro da nossa compreenssão, alterei pouca coisa no código, adicionando as variaveis "val_adc1" e "val_adc2" visto abaixo:

#include <16F877A.h> 
#device ADC=10 
#use delay(clock=8000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP 
 


#include "LCD_8B.c" 

void main() 
{
 long adc1, adc2,val_adc1,val_adc2; 

 setup_adc(ADC_CLOCK_INTERNAL); 
 setup_adc_ports(RA0_RA1_RA3_ANALOG); 
 enable_interrupts(GLOBAL); 

 lcd_ini(); 

 delay_ms(500); 

 printf(lcd_escreve,"\f Leitura AD "); 

 delay_ms(1000); 

 printf(lcd_escreve,"\f"); 


 while(TRUE) 
    {
     set_adc_channel(0); 
     delay_us(15); 
     adc1 = read_adc(); 
     val_adc1=5*adc1*100/1023;   
     lcd_pos_xy(1,1);
     printf(lcd_escreve,"ADC1 = %4lu mA",val_adc1); 
     delay_ms(100); 

     set_adc_channel(1); 
     delay_us(15); 
     adc2 = read_adc();
     val_adc2=5*adc2*100/1023;
     printf(lcd_escreve,"\nADC2 = %4lu mA",val_adc2); 
     delay_ms(100); 

    } 

} 

Pode observar que ambas recebem o valor da conversão dentro de uma equação, a equação se explica da seguinte forma:

valor_convertido=VS*valor_conversão*ESCALA / 2 elevado ao n° de bits do conversor A/D

VS= Tensão de alimentação do PIC e do sensor que é de 5V, caso o sinal do sensor tenha
        uma saída menor que 0 volts e maior que 5 volts teras que usar o -VREF e o +VREF 
        do PIC.

valor_conversão= A leitura realizada pelo conversor A/D sem o tratamento orientado a 
                          tensão da leitura e ao n° de bits do conversor, na realidade este é
                         um valor discreto, a partir da equação estarás pondo este valor 
                          discreto dentro do seu equivalente digital.

ESCALA = como os sinais estão na faixa dos milis, esta escala colocará eles dentro da
                 faixa de 4 a 20 que é o teu equivalente em mA.


2^10 do conversor A/D = É o número de bits do teu conversor A/D, batendo em 1024,
                                    porém como a contagem é feita a partir de 0, este
                                    denominador será 1023, do total de 1024 contagens.

Com isto a leitura do teu conversor será muito mais compreenssível para você
e para a lógica de controle do programa, neste caso do forno poderia usar
futuramente um controlador Proporcional Integral, ou uma pequena lógica fuzzy.

Espero termos contribuido, mande um feedback dos testes.

Abraço,

Chase.
Topo

Eduardo_bh

Level 0
272065 xp

Registrado em:
Feb 23, 2009

Local:
Belo Horizonte / MG



Mensagens:
7

MensagemEnviado: Seg Mar 02, 2009 8:45 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Olá pessoal.
Seguindo as sujestões foi elaborado o programa e feito o teste do mesmo. Está ficando muito bom.

#include <16F877A.h>
#device ADC=10
#use delay(clock=8000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP



#include "LCD_8B.c"

void main()
{
long adc1, adc2,val_adc1,val_adc2;

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(RA0_RA1_RA3_ANALOG);
enable_interrupts(GLOBAL);

lcd_ini();

delay_ms(500);

printf(lcd_escreve,"\f Leitura AD ");

delay_ms(1000);

printf(lcd_escreve,"\f");


while(TRUE)
{
set_adc_channel(0);
delay_us(15);
adc1 = read_adc();
val_adc1=5*adc1*100/1023;
delay_ms(100);

set_adc_channel(1);
delay_us(15);
adc2 = read_adc();
val_adc2=5*adc2*100/1023;
delay_ms(100);

if( adc1 > adc2)
{   printf(lcd_escreve,"\f");
    printf(lcd_escreve,"AD1>AD2 = %4lu mA",val_adc2);
}
else if( adc2 > adc1)
{   printf(lcd_escreve,"\f");
    printf(lcd_escreve,"AD2>AD1 = %4lu mA",val_adc1);
}
else
{   printf(lcd_escreve,"\f");
    printf(lcd_escreve,"A1=A2 = %4lu mA",val_adc1);
}

}

}

Por enquanto, os valores estão sendo impressos no display. Agora basta elabora a lógica para repassar o valor para um D/A.

Obrigado a todos pela contribicao / sujestão.
Abraços.

_________________
"Por pior que seja o buraco que você se encontra, sorria!...
...pois ainda não tem terra por cima!!!!"
Topo

rogercp

Level 0
40154 xp

Registrado em:
Nov 04, 2010

Local:
São Paulo / SP



Mensagens:
1

MensagemEnviado: Sex Mar 04, 2011 6:37 pm
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Boa tarde Eduardo, sera que vc poderia me enviar esta biblioteca "Biblioteca LCD_8B.c", pois meu ccs não possui esta biblioteca.


Obrigado
Topo

fpower_manaus

Level 0
20000 xp

Registrado em:
May 19, 2013





Mensagens:
1

MensagemEnviado: Dom Mai 19, 2013 10:15 am
   Assunto: Ajuda - Sinais analógicos no pic
Responder com citações

Meus amigos, bom dia.
Graças a este tópico pude solucionar meu problema que era idêntico ao do Eduardo_bh. 
Também estava "penando"  Mad  para poder ler duas entradas analógicas, só sabia ler uma...rsrss..
No meu caso, quero monitorar um LDR e um LM35.


Abraço amigos, conto com futuras ajudas de vocês.  Wink [/i]
Topo
Mostrar mensagens desde a última:
Responder ao Tópico Todos os horários são GMT - 3 Horas
ROBOCORE Índice -> Iniciantes
Página 1 de 1


Ir para:  
Você não tem permissão para escrever novas mensagens
v não tem permissão para responder às mensagens
Você não tem permissão para editar suas mensagens
Você não tem permissão para deletar suas mensagens
Você não tem permissão para classificar tópicos
Você não tem permissão para classificar mensagens
Você não tem permissão para votar em enquetes
Anexar downloads : Proibido
Fazer Download de Arquivos: Permitido
Powered by phpBB © 2001 phpBB Group