Autor Tema: Conversor AD pic16f88  (Leído 3356 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Conversor AD pic16f88
« en: 14 de Noviembre de 2014, 17:13:43 »
Hola muy buenas
Estoy comenzando a utilizar el módulo adc del pic 16f88.
Tomando parte del código de Carlos tengo el siguiente programa

Código: [Seleccionar]
'16F88 MODULO DESVIOS MASTER
'Prueba del adc
'que controla un disp de 4 entradas

Define CONF_WORD = 0x3f0a
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
ANSEL = 0x00  'todos los pines digitales

CMCON = 0x07
'Define SIMULATION_WAITMS_VALUE = 1  'solo para simulacion

'##############################
'definición de puertos

TRISA = %00100001
TRISB = %00000100
Symbol led = PORTA.1
led = 1
WaitMs 1000
led = 0


'##################################################################

'***********************************DEFINICION DE VARIABLES**************************************
'-------------------------------Variables del ADC y Rutina division------------------------------
Dim num_1 As Word  'valor del adc y retorna la parte entera
Dim num_2 As Word  'factor de la escala y retorna el primer decimal
Dim num_3 As Word  'segundo decimal
Dim num_4 As Word
Dim dvdo As Word  'dividendo operacion
Dim dvsor As Word  'divisor operacion
'--------------------------------------Variables Programa----------------------------------------
'------------------------------------------ASIGNACIONES------------------------------------------
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicion de las salidas---------------------
Define ADC_SAMPLEUS = 0  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00000001  'los pin I/O digitales y RA0 analogico
ADCON0 = %01000000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'--------------------------------------Main Programa-----------------------------------------------

Hseropen 4800




main:
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
If num_1 > 163 And num_1 < 168 Then
Toggle led
Endif
Hserout num_1
WaitMs 1000
Goto main

End                                               


'**************************************Subrrutinas**********************************************
'--------------------------------------Subrrutina lectura ADC, division y LCD
lee_adc:  '_______________________lee la entrada analogica
Adcin 0, num_1  'lee el valor de la entrada analogica y lo carga en num_1
num_2 = 205  'asigna factor de correccion, para 5V
num_3 = num_2 * num_1

Return                                       

Lee el valor del adc y lo envia al hiperterminal de proteus.
Quiero encender y apagar un led según el valor en voltios que aparece en un voltímetro conectado a la  entrada del ADC.
En este caso quiero encender y apagar un led si el valor leido en voltios es de 4,54
No sé muy bien como pasar este valor a esta condicion
If num_1 > 163 And num_1 < 168 Then
Toggle led
Endif
Que es la que controla el encendido y apagado del led.
¿Cómo sería?
Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Conversor AD pic16f88
« Respuesta #1 en: 14 de Noviembre de 2014, 23:49:37 »
No se basic, pero no es algo distinto de lo demas.

Supongo que se alimenta con 5V por la tension que das.
Tu ADC es de 10bits por lo tanto el maximo es de 1024, y ese valor se va a dar cuando llegue a Vref+ que por comodidad la mayoria lo pone a Vcc ( 5V )


Una forma:

4.54V serian:
4.54v/5v = 0.908
1024*0.908 = 929.792 , que como tiene que ser entero 930.

O si lo queres ver de otra forma:
Cada bit son:

5v/1024 = 4.88mV
4.54v/4.88mV = 929.792  ( Use todos los decimales )

( No recuerdo si se calculaba con 1024 o 1023 pero no hay mucho error xD, de tomar 1023 el resultado seria 929 y no 930 )


Tu codigo posee 2 limites para que cambie el estado de la salida cada vez que pase y el valor del ADC este entre 163 y 168.
Para tu caso se deberia prender cuando sea superior a 930. Ademas una ves que se mantenga por encima de 930 deberia quedarse prendido y no continuamente apagandose y prendiendose el led (si usas toggle).
Por eso pienso que deberia ser asi:

Código: [Seleccionar]
IF num_1 > 930  THEN
led = 1
ELSE
led = 0
ENDIF

Es decir, si num_1 es mayor a 930 pone en 1 a led, SI NO ( else ) se cumple y es menor pone a 0 led.
« Última modificación: 14 de Noviembre de 2014, 23:58:05 por KILLERJC »

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Conversor AD pic16f88
« Respuesta #2 en: 15 de Noviembre de 2014, 10:05:41 »
 :) :) :) :)Muchas gracias, ya funciona.
Me estaba equivocando en la conversión de voltios a bits.
Un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Conversor AD pic16f88
« Respuesta #3 en: 18 de Noviembre de 2014, 09:40:27 »
Hago una pequeña aclaración cuando se trabaja con el modulo ADC a 10Bit:

10Bit corresponden a 1024 puntos de resolución o si se prefiere el contador del ADC puede suministrar 1024 valores distintos, esto quiere decir que el ADC entregará valores comprendidos entre 0 y 1023. Por lo que Vref = Vdd = 5V = 1023, nunca será igual a 1024, ya que 1024 es un valor que no se da (se necesitarían 11Bit), sin embargo, para hacer el calculo de precisión si se utiliza 1024 porque se necesita el conjunto de valores que puede suministrar el modulo, esto es, de 0 a 1023 hay 1024 valores distintos.
Saludos desde Granada, España.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Conversor AD pic16f88
« Respuesta #4 en: 18 de Noviembre de 2014, 13:09:31 »
Gracias por la aclaracion, hace tanto que no los toco a los ADC que ya ni recordaba algo tan simple  :?