^ Retornar ao
topo
Técnicas : Entrada analógica no PIC 
Responder ao TópicoIr para página 1, 2  Next
Autor Mensagem

HP

Level 6
6198786 xp

Registrado em:
Aug 09, 2006

Local:
Curitiba / PR

Equipe:
Guaxinim Furioso

Mensagens:
137

MensagemEnviado: Seg Nov 09, 2009 3:42 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Pessoal tem alguns tópico aqui que falam da entrada analógica do PIC.

Eu mesmo já respondi algumas perguntas falando para utilizar a entrada analógica do PIC na aplicação, por saber a sua utilidade e o que ela é capaz de fazer, mas nunca implementei nada.

Agora eu penso em utilizar esta funcionalidade do PIC e gostaria de um 'Ponta Pé' pra iniciar.

Minha aplicação funciona assim: Eu tenho um sensor que vai estar na entrada analógica do PIC. Este sensor manda níveis de tensão entre 3.5 e 0.5 V. Se o sensor mandar um valor de 0.5 a 3 V para esta entrada eu quero sair com nível lógico 1 em qualquer outro pino do PIC, senão fica em 0.

Encontrei alguma coisa na Internet, porem o código sempre é feito em Assembly. E eu programo em C.

Será que alguém tem um programa em C utilizando uma entrada analógica do PIC pra eu me basear no desenvolvimento do meu projeto?

[]s

_________________
Tombo ai vamos nós...

Técnico em Mecatrônica - Senai PR
Engenharia Eletrônica - UTP PR
Topo

laerciovp

Level 3
3265887 xp

Registrado em:
Jun 26, 2006

Local:
Cascavel / PR

Equipe:
LVP Labs

Mensagens:
52

MensagemEnviado: Ter Nov 10, 2009 12:42 am
   Assunto: Entrada analógica no PIC
Responder com citações

para Vref = 5 volts e AD de 8 bits, para a faixa de 0.5 a 3 volts:

unsigned int sensor; (variável global)
sensor = read_adc();
if (sensor > 25 && sensor < 153) output_high(pin_xx);
else output_low(pin_xx);

para vref = 5 volts e AD de 10 bits, para a faixa de 0.5 a 3 volts:

unsigned int16 sensor; (variável global)
sensor = read_adc();
if (sensor > 102 && sensor < 614) output_high(pin_xx);
else output_low(pin_xx);
Topo

HP

Level 6
6198786 xp

Registrado em:
Aug 09, 2006

Local:
Curitiba / PR

Equipe:
Guaxinim Furioso

Mensagens:
137

MensagemEnviado: Ter Nov 10, 2009 10:17 am
   Assunto: Entrada analógica no PIC
Responder com citações

Obrigado laerciovp, era isso ai mesmo.

Eu só tenho o PIC16F84 aqui comigo e pelo que vi este CI não tem ADC. Sad  Sad  Sad 

Alguém poderia me indicar um PIC simples que tenha entrada ADC?

[]s

_________________
Tombo ai vamos nós...

Técnico em Mecatrônica - Senai PR
Engenharia Eletrônica - UTP PR
Topo

Lokasso

Level 3
3410390 xp

Registrado em:
Jun 26, 2006

Local:
Campinas/Araraquara / SP

Equipe:
Equipe Phoenix

Mensagens:
81

MensagemEnviado: Ter Nov 10, 2009 12:10 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Tem, por exemplo, o PIC16F628A. É relativamente comum e barato.

_________________
Felipe Lopasso Rodrigues
Equipe Phoenix - Unicamp
www.fem.unicamp.br/~phoenix
Topo

Lokasso

Level 3
3410390 xp

Registrado em:
Jun 26, 2006

Local:
Campinas/Araraquara / SP

Equipe:
Equipe Phoenix

Mensagens:
81

MensagemEnviado: Ter Nov 10, 2009 12:14 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Ops, desculpe, o 16F628A se não me engano tem comparador analógico. O 16F877A é certeza que tem AD, mas é um pouco mais caro, e talvez meio grande demais dependendo da aplicação.

_________________
Felipe Lopasso Rodrigues
Equipe Phoenix - Unicamp
www.fem.unicamp.br/~phoenix
Topo

HP

Level 6
6198786 xp

Registrado em:
Aug 09, 2006

Local:
Curitiba / PR

Equipe:
Guaxinim Furioso

Mensagens:
137

MensagemEnviado: Ter Nov 10, 2009 12:22 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Então Lokasso, eu vou utilizar o PIC12F675.

Me parece ser bem simples e esta muito barato aqui em Curitiba, R$4,00

Vou tentar codificar o que o laerciovp me passou e posto aqui se funcionou  Cool,  ou não  Sad 

[]s

_________________
Tombo ai vamos nós...

Técnico em Mecatrônica - Senai PR
Engenharia Eletrônica - UTP PR
Topo

Lokasso

Level 3
3410390 xp

Registrado em:
Jun 26, 2006

Local:
Campinas/Araraquara / SP

Equipe:
Equipe Phoenix

Mensagens:
81

MensagemEnviado: Ter Nov 10, 2009 12:26 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Poxa, não sabia que tinha PIC tão barato assim com AD ! Legal !

 Mal aí pela informação "furada", mas é que faz um tempinho já que não uso PIC. Depois que comecei a usar AVR nem quis mais saber deles...

_________________
Felipe Lopasso Rodrigues
Equipe Phoenix - Unicamp
www.fem.unicamp.br/~phoenix
Topo

HP

Level 6
6198786 xp

Registrado em:
Aug 09, 2006

Local:
Curitiba / PR

Equipe:
Guaxinim Furioso

Mensagens:
137

MensagemEnviado: Ter Nov 10, 2009 12:31 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Que é isso cara, não da nada não, eu ate tinha visto este PIC que vc me passou, mas como este que eu falei tava muito barato, nem fui atraz de outro  Cool 

[]s

_________________
Tombo ai vamos nós...

Técnico em Mecatrônica - Senai PR
Engenharia Eletrônica - UTP PR
Topo

HP

Level 6
6198786 xp

Registrado em:
Aug 09, 2006

Local:
Curitiba / PR

Equipe:
Guaxinim Furioso

Mensagens:
137

MensagemEnviado: Sab Nov 14, 2009 9:39 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Pessoal, eu coloquei o seguinte programa no micro-controlador:
Código:
Como vocês podem ver, estou utilizando o clock interno deste micro-controlador e estou com o seguinte problema. Quando ligo o microcontrolador, o programa funciona perfeitamente durante um tempo, mas depois a saída A1 fica sempre em nivel lógico 1. Alguem tem ideia do que pode estar acontecendo? O que eu posso fazer pra tentar resolver este problema? * Eu já tentei utilizar clock esterno e o erro eh o mesmo. []s

_________________
Tombo ai vamos nós...

Técnico em Mecatrônica - Senai PR
Engenharia Eletrônica - UTP PR
Topo

laerciovp

Level 3
3265887 xp

Registrado em:
Jun 26, 2006

Local:
Cascavel / PR

Equipe:
LVP Labs

Mensagens:
52

MensagemEnviado: Sab Nov 14, 2009 10:11 pm
   Assunto: Entrada analógica no PIC
Responder com citações

HP
faça as mudanças a seguir e teste novamente:

1. Mesmo usando o oscilador interno, você precisa declarar a freqüência de clock:

      #use(clock=4000000)

2. Evite ao extremo declarar variável tipo float. Aliás, é um enorme desperdício alocar um valor de 10 bits numa variável com 32 bits. Use:

      unsigned int16 sensor;

3. Declare a variável fora do while(true). Deixe declarada entre o #fuse NOMCLR e o void(main);

4. Introduza um delay dentro do while(true), pode ser de 1 mili segundo:

     delay_ms(1);

Referente ao software, acho que é isso. Quanto ao hardware:

1. Certifique que a alimentação não tem ripple. Use dois capacitores em paralelo, próximos aos pinos de vcc e gnd do pic, de 100nF e 10uF.

2. Verifique se o sensor não está com histerese.

3. Consulte o datasheet do sensor na seção do "Typical application", geralmente o fabricante indica a aplicação típica do sensor, onde ele funcionará de acordo com a especificação.

Poste os resultados para acompanharmos o funcionamento. Boa sorte!
Topo

HP

Level 6
6198786 xp

Registrado em:
Aug 09, 2006

Local:
Curitiba / PR

Equipe:
Guaxinim Furioso

Mensagens:
137

MensagemEnviado: Dom Nov 22, 2009 8:28 am
   Assunto: Entrada analógica no PIC
Responder com citações

Pessoal, desculpa a demora pra responder...

Então, da forma com que o laerciovp falou funcionou.

No código que eu passei a única coisa que estava diferente era realmente a variável float que eu já estava utilizando int16.

O que eu tive que fazer para funcionar foi somente colocar a declaração da variável sensor fora do while, e colocar um delay de 10ms.

O código ficou assim:

Código:
[]s

_________________
Tombo ai vamos nós...

Técnico em Mecatrônica - Senai PR
Engenharia Eletrônica - UTP PR
Topo

DanielMA

Level 0
0 xp

Registrado em:
Nov 02, 2010

Local:
salvador / BA



Mensagens:
1

MensagemEnviado: Ter Nov 02, 2010 8:29 pm
   Assunto: Entrada analógica no PIC
Responder com citações

O código do amigo está correto, funciona certo. Mas tenho uma dúvida, como faço pra usar em vez de 1, 2 sensores?
Topo

gastaoc

Level 0
204485 xp

Registrado em:
Nov 01, 2010

Local:
Petropolis / RJ



Mensagens:
6

MensagemEnviado: Qua Nov 03, 2010 1:00 pm
   Assunto: Entrada analógica no PIC
Responder com citações

Caro HP,

Como diria Jack vamos por partes.

1) Verifique se o PIC utilizado tem conversor AD. Parece ridículo mais é um erro comum.

Os PICs tem alguns pinos que podem ser configurados como entradas analógicas e um único conversor.

2) Ajuste o clock do conversor para que seja respeitado o tempo mínimo de conversão que é de 1,6uS para PICs das familias 16F e 18F.

3) Defina quais as tensões que serão utilizadas como referência, ou seja, qual a menor e a maior tensão do sinal de entrada.

Lembre de utilizar tensões de referência estáveis e isentas de ruídos.

Para aplicações mais simples podemos definir que o sinal esteja compreeendido na alimentação do PIC, ou seja, usar como referência o VDD e o VSS de alimentação.
  
4) Selecione a entrada a ler (na verdade este comando vai controlar o multiplex analógico da entrada do conversor).

5) Aguarde o tempo de acomodação do sinal de entrada no capacitor de amostragem.

Atenção para definir este tempo é muito importante saber qual a impedância do sinal a ser medido. Tente que a impedância seja igual ou menor que 2500 ohms.
Para esta impedância o tempo mínimo é de 20uS. 

6) Dê o comando de conversão.

Badabim foi pra conta, ou seja, a variável recebeu o valor correspondente a conversão.


Todas as informações são encontradas no Data Sheet do PIC.


Vamos agora dar um exemplo em C para compilador CCS :

PIC18F877A
Clock 20 MHz
Sinal de entrada de 0 até 5 volts ligado no pino AN0 ( Pino 2 )
conversão de 8 bits (valor default)

#device adc=8

#FUSES NOWDT
#FUSES HS
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT

#use delay(clock=20000000)

void main(void)
  {
  int leitura;
  setup_adc_ports(AN0);
  setup_adc(ADC_CLOCK_DIV_16);  // 20M/4/16=312500Hz -> 3,2uS

  // Se escolher (CLOCK_DIV_8) fica muito no limite

  while(true)
    {
    set_adc_channel(0);
    delay_us(20);
    leitura=read_adc();
    }
  //end while(true)
  }
//end void main(void)


Espero ter ajudado,
Gastão.
Topo

caio_azb

Level 22
22929829 xp

Registrado em:
Jun 01, 2009

Local:
Campinas / SP



Mensagens:
532

MensagemEnviado: Qui Nov 04, 2010 4:55 pm
   Assunto: Entrada analógica no PIC
Responder com citações

HP, só uma dúvida =D.

Como você sabe qual o valor que cada voltagem vai ter depois de lida pelo canal AD?

Tenho uma idéia, mas acho que está errada, então gostaria de uma explicação mais completa, por favor.

Valeu, Caio

_________________
Fazendo USP - Engenharia Aeronáutica
Topo

evristow
Moderator
Level 109
109660606 xp

Registrado em:
Apr 25, 2006

Local:
Rio de Janeiro / RJ

Equipe:
ODDBotz

Mensagens:
3937

MensagemEnviado: Dom Dez 26, 2010 3:26 pm
   Assunto: Entrada analógica no PIC
Responder com citações

PIC não é muito a minha área, mas basta você ver quantos bits tem a váriável usada no sensor, converter isso para o respectivo valor numérico e aplicar uma regra de 3.

Usando o exemplo do tópico:

laerciovp Escreveu:
para Vref = 5 volts e AD de 8 bits, para a faixa de 0.5 a 3 volts: unsigned int sensor; (variável global) sensor = read_adc(); if (sensor > 25 && sensor < 153) output_high(pin_xx); else output_low(pin_xx);
"unsigned int" é uma váriável de 8 bits, assim consegue representar valores numéricos de 0 a 255 (256 valores). Como Vref é 5V, o valor por Volt será 51.2. Daí basta multiplicar pelas tensões desejadas: 0.5V x 51.2 = 25.6 3.0V x 51.2 = 153.6 Claro que os valores normalmente não ficam redondinhos no desejado, contudo cabe ao projetista/programador adequar a sensibilidade do programa a precisão desejada com o sensor. Para isso basta usar variáveis com maior capacidade de armazenamento, como long int / int16 (16bits), int32 (32bits) ou mesmo float (32bits e ponto flutuante). De qualquer forma variáveis maiores implicam em programas mais pesados, logo é um trade off. Se interessar, segue uma fonte para consulta: http://www.swarthmore.edu/NatS.....Intro.html Abraços, Dudu

_________________
1 - Leia as Regras de Conduta do Forum!
2 - Não respondo dúvidas por mensagem privada. Poste-as no fórum! Sério!
3 - Só crie uma equipe se for competir!
Topo
Mostrar mensagens desde a última:
Responder ao Tópico Todos os horários são GMT - 3 Horas
Ir para página 1, 2  Next
ROBOCORE Índice -> Técnicas
Página 1 de 2


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