uControl
Noviembre 29, 2014, 01:51:05 *
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  
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: ADC para 12f683 control cooler.  (Leído 3106 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: 5459



« 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
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.124 segundos con 27 consultas. (Pretty URLs adds 0.024s, 3q)