uControl
Octubre 25, 2014, 09:14:40 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  

La gente de Niple nos ofrece un descuento especial para usuarios de uControl.
Entérate de como puedes aprovechar esta oferta haciendo click aqui.

Súmate, y ayuda a uControl con tu participación en esta interesante oportunidad que nos oferece Niple.

Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: ADC para 12f683 control cooler.  (Leído 3046 veces)
0 Usuarios y 1 Visitante están viendo este tema.
RGW
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 11


« : Junio 09, 2010, 02:15:43 »

Hola a todos.
Estuve buscando un control para un ventilador de 12V 2W que va en una pc, ya que los que tengo hacen mucho ruido. Pero no encontré uno a medida. Empecé a buscando alguno en este foro pero no encontré, y me dedique a intentar hacer uno. Use un pic 12f683, un lm35 (al pin 7)  y para control del ventilador un bc337 (al pin 3).
El código es el siguiente.

#include <12F683.h>
#device adc=10
#fuses INTRC_IO,NOWDT,NOPROTECT,PUT,NOMCLR
#use delay(clock=4000000)
#include <math.h>

#ZERO_RAM

#use standard_io(A)

void main()
{
float readadc,formula;

   setup_adc_ports(AN0_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_4MHZ);

while(TRUE)
    {

      set_adc_channel(0);
      delay_us(20);
      readadc=read_adc();
      formula=readadc;//*(Huh?Huh??); acá es mi problema
      delay_ms(500);

   if (formula>90)
      output_high(PIN_A4);
      else
      output_low(PIN_A4);
      delay_ms(500);
     }
}

Acá viene mi problema probando en proteus a los 29º ya se prende el ventilador, no soy bueno en esto del C pero ¿como hago que se encienda a los 90º? ¿Esta bien el codigo?

Cualquier ayuda o explicación, por favor se lo agradecere.
En línea
ricber
PIC10F
*
Desconectado Desconectado

Mensajes: 8


« Respuesta #1 : Junio 10, 2010, 12:22:13 »

Debes cambiar el valor 90 en "if (formula>90)" , por el valor que leera el A/D cuando el sensor mida los 90º de temperatura.
El LM35 entrega 10mv/ºc osea que a 90º entrega una tension de 0.9v, si la referencia del A/D son 5v y la resolucion es de 10bits, el valor seria 184, deberias cambiar el 90 por el 184.
En línea
RGW
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 11


« Respuesta #2 : Junio 10, 2010, 11:03:40 »

Gracias ricber, pero sigue sin funcionar en la simulación en proteus, encendiendo a los 29º y apaga a los 28º segun el LM35, incluso le cambio los valores de la función if(formula>45 o 30 u otros) sigue encendiendo a los 29º y apagando a los 28º. ¿Que sera? Insultos.
Me podrias explicar la formula por la cual te dio 184. Y esos 184 se pueden transformar para que 90º en el LM35 sean 90º en el if(formula)
« Última modificación: Junio 10, 2010, 11:06:40 por RGW » En línea
Fernando Sarramian
PIC12F
**
Desconectado Desconectado

Mensajes: 174


« Respuesta #3 : Junio 10, 2010, 11:40:05 »

Permiso, perdón que me meta...

2 10 = 1024

O sea, el conversor analógico digital puede representan 1024 valores distintos . Los 5v corresconde al valor 1024. Si dividimos 5 por 1024 , nos da el mínimo valor de tensión que se puede representar ( el cual coincide con la "resolucion", que es el salto entre dos valores a representar.Creo que también se lo llama paso).

5V/1024= 0,00488V
Para saber que valor binario representa los 0.9v que te da el sensor :
0,9V/0,00488v= 184,32

por lo tanto, el valor 184 representa los 0.9v

No te la quiero hacer más larga. Si algo no quedo claro, por favor volve a escribir.
Saludos.
Fer.

Edito: HJ tenes razón, conte mal. Gracias por la aclaración.
« Última modificación: Junio 11, 2010, 12:23:41 por Fernando Sarramian » En línea

Banneado por mal educado, por insultar a otros usuarios y no acatar las Reglas del Foro
HJ
Moderador
dsPIC
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5448



« Respuesta #4 : Junio 10, 2010, 11:54:41 »

O sea, el conversor analógico digital puede representan 1024 valores distintos (en realidad son 1025 contando el cero )
Si mal no tengo entendido
0 A 1023 --> 1024 valores distintos

así como:
0 a 255 --> 256 valores distintos

Saludos
En línea

"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]
RGW
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 11


« Respuesta #5 : Junio 11, 2010, 02:18:08 »

Gracias a todos por meterse y darme una mano.
Mirando un poco lo que comentaron y observando otros ejemplos de este foro (más horas sentado en la silla) probé lo siguiente:

      set_adc_channel(0);
      delay_us(20);
      readadc=read_adc();
      formula=5.00*readadc*100.00/1023.00;//*(0.48875) o *184;
      delay_ms(500);

y ahora si se apaga al valor que ponga en el “if”

  if (formula>90)
      output_high(PIN_A4);
      else
      output_low(PIN_A4);
      delay_ms(500);

pero no me quiero quedar con esto solamente. ¿Cómo puedo hacer lo siguiente?

Si llega a 60 que el cooler encienda despacio, pero si sigue subiendo hasta 90, que prenda a toda velocidad. Y dios no quiera suba a 95 se encienda una chicharra en otra pata.

¿Uso el if?. Entiendan que soy nuevo en C, pero le meto horas para aprender porque me gusta.
GRACIAS

« Última modificación: Junio 11, 2010, 02:19:58 por RGW » En línea

La gente de Niple nos ofrece un descuento especial para usuarios de uControl.
Entérate de como puedes aprovechar esta oferta haciendo click aqui.

Súmate, y ayuda a uControl con tu participación en esta interesante oportunidad que nos oferece Niple.

Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.20 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.085 segundos con 29 consultas. (Pretty URLs adds 0.032s, 3q)