Autor Tema: Consulta PIC 16f628a comparar  (Leído 2360 veces)

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

Desconectado thekako

  • PIC10
  • *
  • Mensajes: 16
Consulta PIC 16f628a comparar
« en: 24 de Febrero de 2016, 11:36:48 »
Buenas, soy nuevo en los microcontroladores y tengo una consulta, estoy programando en c con ccs y estoy en un proyecto que solo puedo ocupar el pic 16f628a (no hay opción de ocupar ningún otro lamentablemente) y lo que necesito es que entren por el PIN A1 Y A2 voltajes.
Y si es que por el PIN A1 entran 12v y por el A2 un voltaje menor (10v), encender un led usando la energía del A1
en el caso de que entren 12v por el A1 y 12v por el A2, priorizar y ocupar la energia del A2

Me podría ayudar por favor que estoy algo perdido, y leí que el pic solo aguantaba un maximo de 5v ¿cómo se podría solucionar?
tienen algun codigo que me pueda ayudar, desde ya muchas gracias ,ojalá puedan ayudarme un poquito. Saludos.

Yo tengo esto por el momento pero creo que estoy mal :c



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7951
Re:Consulta PIC 16f628a comparar
« Respuesta #1 en: 24 de Febrero de 2016, 12:42:08 »
Lo mas simple seria de utilizar el ADC y crear un divisor resistivo para cada entrada de 12V.

5V / 12V = 0.41666
Debemos crear un divisor resistivo que lo reduzca a ese valor. ( Todo esto suponiendo que no le afectaria un par de mA consumidos desde esas fuentes y no necesitar capturar demasiado rapido la tension ).
La formula del divisor de tension



Selecciono Rbottom como 10K, Vout es 5V, Vin es 12V.

Rtop = 14K

El valor que mas se aproxima es de 15K, dejandote 4.8V a la salida cuando tenes 12V a la entrada. Si tenes un ADC de 10 bits ( 0 a 1023 ) en 980 tenes un aproximado a 12V, obviamente tratas de darle un margen. Cuando tengas 10V a la entrada el ADC deberia darte cerca de 819, Asi que podes tomar un intermedio.

Y luego es lo mas simple... comparar, tomas el valor de AN2 ( RA2 )  y te fijas si la tension es mayor a lo que esperas, supongamos que esperas que sea mayor a 11V ( 900 ), Si es mayor activaras una salida que dara paso a esa fuente a alimentar lo que quieras. Si es menor preguntaras por la otra fuente ( AN1 ) y actuaras segun el valor.

Con comparadores lo podes hacer tambien, vas a tener que hacer el divisor resistivo pero ademas ahora vas a tener que tener una fuente de referencia.
« Última modificación: 24 de Febrero de 2016, 12:44:13 por KILLERJC »

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Consulta PIC 16f628a comparar
« Respuesta #2 en: 24 de Febrero de 2016, 12:52:40 »
Ese micro no tiene conversor AD... Tendrás que utilizar los comparadores analógicos. No te queda otra.

Desconectado lmtreser

  • PIC16
  • ***
  • Mensajes: 129
    • Automatismos Mar del Plata
Re:Consulta PIC 16f628a comparar
« Respuesta #3 en: 24 de Febrero de 2016, 12:54:09 »
Lamentablemente el 628A no tiene ADC. Podrías reemplazarlo por un PIC16F88. Lee las hojas de datos para ver si es posible el reemplazo. Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7951
Re:Consulta PIC 16f628a comparar
« Respuesta #4 en: 24 de Febrero de 2016, 14:36:26 »
Uff vi los ANx y pense que tenia.

Entonces es igual....
1ro - configura la referencia de voltaje al valor correspondiente.
2do - Crea el divisor resistivo para cada entrada ajustados al nuevo valor del voltaje
3ero - mira las salidas de comparacion
4to - ??????
5to - profit

Configurar la referencia de voltaje:

When V RR = 1: V REF = (VR < 3:0 >/ 24) * V DD

Donde Vr es de 0 a 15. Usaremos el rango bajo ( Vrr = 1 )

Cuando Vr = 15, tenemos que Vref = 3.125V

Calcular la resistencias

Vamos a suponer que ese valor que nos va a dar debe ser la tension umbral, es decir a la salida de divisor resistivo nos debe dar 3.125V para supongamos 11.4V
Reemplazamos y calculamos nuevamente

Vout = 3.125V
Vin = 11.4V
Rbottom = 10K

Aproximadamente 27K es Rtop ( 26,4K ). Lo cual nos deja una relacion Vout/Vin de 0.2741
Es decir para cuando tengamos 3.125V de salida, a la entrada va a ser de 11.4V. ( 3.125 / 0.2741)

Listo ya tenemos una entrada a los comparadores que es Vref, y la otra entrada a los comparadores que es (RA0 o RA3) y (RA1 o RA2), lo cual vas a tener que cambiar los pines de acuerdo a tu circuito.

Luego usar CV1OUT y CV2OUT.
Eso si, en CCS no tengo la menor idea como se hace. Eso ya vas a tener que espera que otro te lo diga. Pero por la parte del HW eso seria todo.

Lo feo de esto es que se usan 4 pines, en el modo de comparador: Four Inputs Multiplexed to Two Comparators , ya que toma a los 4 como analogicos
Sino la otra solucion es tener 3 pines  en el modo: Two Common Reference Comparators , 3 analogicos para referencia y 2 entradas + 1 digital ( RA3 )

Pero esta ves Vref, es ves de ser una conexion interna, lo vas a tener que aplicar a RA2 (desde el modulo tiene salida a RA2) y obviamente no conectarle nada a ese pin.
Sino introducir una referencia externa ( 3.125V si queres seguir con los mismos numeros ) por RA2 en caso que lo anterior no funcione.
« Última modificación: 24 de Febrero de 2016, 14:46:10 por KILLERJC »

Desconectado thekako

  • PIC10
  • *
  • Mensajes: 16
Re:Consulta PIC 16f628a comparar
« Respuesta #5 en: 24 de Febrero de 2016, 16:47:30 »
Muchas gracias a todos por la info y guiarme ya estoy pensando que hacer :)

Otra consulta aparte, como puedo saber u obtener el voltaje que está entrando por RA1? Para poder tomar decisiones dependiendo de cuanto entra? gracias nuevamente!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7951
Re:Consulta PIC 16f628a comparar
« Respuesta #6 en: 24 de Febrero de 2016, 17:19:49 »
El comparador te va a dar una salida de SI o NO, según supere o no el valor de la otra entrada del comparador.  Es decir una entrada a 3V y la otra es de tu interes, podes tener un 1 si es mayor la entrada a ver, o un 0 si es menor ( o podes invertirlo ).

Si quisieras realmente cuantificar es decir saber cuanto voltaje posee una entrada, entonces lo mas simple es un ADC. Y para eso tendrias que buscar otro micro. Como dijo lmtreser.

Imagino que es eso lo que preguntabas.

Desconectado thekako

  • PIC10
  • *
  • Mensajes: 16
Re:Consulta PIC 16f628a comparar
« Respuesta #7 en: 25 de Febrero de 2016, 11:50:52 »
No puedo saber cuando el RA1 se encuentre en su maximo voltaje solamente con este pic? es decir cuando ya este recibiendo 5v?

Es que el problema es que en mi programa ahora, por RA1 tengo una bateria que cuando baja a 3v se cambia la salida a RB2 que seria un transformador de 5v que alimentaria a "otra cosa", para que asi la bateria se empieze a cargar y suba a 5v para ocupar la bateria e ir intercambiando, por eso quisiera reconocer la manera en que por RA1 entre el maximo voltaje, dado que como lo tengo ahora tengo:

uso bateria cuando este llena y va bajando hasta que llega a los 3v y cambia a transformador, entonces al momento sube la bateria a 3.1v e inmediatamente se cambia por estar sobre el voltaje de referencia a la bateria y no me deja cargarla completa.. no se si se entiende lo que tengo que hacer :p muchas gracias nuevamente


« Última modificación: 25 de Febrero de 2016, 11:54:10 por thekako »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7951
Re:Consulta PIC 16f628a comparar
« Respuesta #8 en: 25 de Febrero de 2016, 13:04:36 »
Tendras que usar otro comparador para que puedas detectar cuando llego a los 5V ( o proximo a este ). Recorda que posees 2 comparadores

Desconectado thekako

  • PIC10
  • *
  • Mensajes: 16
Re:Consulta PIC 16f628a comparar
« Respuesta #9 en: 25 de Febrero de 2016, 19:53:05 »
Muchas gracias amigo, me has/han sido de gran ayuda :3
Creo haberlo terminado dado que me funciona, quisiera por ultimo saber si es que el código que cree es óptimo o debiese hacer algunos cambios:



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7951
Re:Consulta PIC 16f628a comparar
« Respuesta #10 en: 25 de Febrero de 2016, 22:26:54 »
No creo que tengas problemas. Por ahi me preguntaria si es necesario los 3 valores dentro del if. Como por ejemplo:

( C1OUT && C2OUT && x==0 )

C1OUT corresponde a los 5 V, C2OUT corresponde a los 3V, si quisiera activar la salida de la bateria solo necesitaria saber si es que C2OUT se cumple. ( ya poseo x quien me dice que esta descargandose / cargandose )

Entonces tengo distintas situaciones:

- Cuando la bateria esta llena, pasar a la bateria si o si y comenzar a descargarla
- Si la bateria esta en un valor intermedio y estamos en "descarga" entonces seguimos alimentando con la bateria
- Si la bateria esta "agotada" y estabamos en "descarga" pasamos a un estado de "Carga" y alimentamos desde el cargador. Ese estado de "carga" va a evitar que se cambie hasta que no este llena la bateria.
- Si la bateria esta en estado de "carga" y tiene un valor intermedio seguiriamos con el cargador.

La ultima opcion es compleja que suceda, por que estamos asegurandonos al comienzo del programa que inicie en modo "descarga", en ese estado ocurririan las 3 primeras opciones que di , entonces opino que con 3 preguntas estaria el programa realizado. Esta bien que le falta un par de instrucciones ( como lo de activar RB3 o RB2 ).

Código: C
  1. // Solo para darle nombres a los valores.
  2.  
  3. enum estado {
  4.         DESCARGA,
  5.         CARGA
  6. };
  7.  
  8.  
  9.  
  10. void main(void)
  11. {
  12.  
  13.         // Aca la configuracion de pines / comparadores, etc
  14.  
  15.         enum estado x;
  16.         x = DESCARGA;           // Comienzo como "DESCARGA"
  17.  
  18.  
  19.         while(1)
  20.         {
  21.  
  22.  
  23.                 if ( C1OUT == 1 )
  24.                 {
  25.                         // Bateria 5V
  26.                         // Uso bateria, apenas llegue el voltaje de la bateria al correcto cambio
  27.  
  28.                         x = DESCARGA;           // Descarga
  29.                 }
  30.                 else if ( C2OUT == 1 && x == DESCARGA )
  31.                 {
  32.                         // Bateria por encima de los 3V
  33.                         // Uso bateria, supongo que estoy en regimen de descarga por eso el x==0
  34.                         // Aca no modifico x, solo se modifica en los extremos
  35.                 }
  36.                 else if ( C2OUT == 0 && x == DESCARGA )
  37.                 {
  38.                         // Bateria agotada del regimen de descarga
  39.                         // Activo Cargador, modifico x, ya que es un extremo del valor de la bateria
  40.  
  41.                         x = CARGA;              // Carga
  42.                 }
  43.         }
  44. }

En fin, si lo tuyo funciona dale para adelante, que no le veo nada malo.

Una pregunta mas.
Esto es unicamente para indicar de donde esta cargando ? o pensas activar algo para que aliemente entre uno u otro. Lo pregunto por esto:

Código: C
  1. output_high(PIN_Bx);
  2. output_low(PIN_Bx);

Al ejecutarse la primera instruccion, hasta que no se ejecute la segunda vas a tener las 2 salidas en 1, es decir PIN_B2 y PIN_B3 en 1 (no es mucho a 20Mhz estamos hablando de 200ns). Dependiendo que quieras hacer por ahi te conviene desactivar primero y luego activar la otra, es decir cambiarle el orden a las instrucciones de arriba:

Código: C
  1. output_low(PIN_Bx);
  2. output_high(PIN_Bx);

PD: Sobre el foro, codigos, etc

Para poner un codigo, copias y pegas el codigo, luego seleccionas unicamente el codigo, y donde tenes para insertar imagenes, negritas,etc a la derecha de todo tenes un menu desplegable que dice Codigo, si haces click ahi te aparecen los distintos lenguajes, seleccionas C y todo lo que tenias seleccionado queda encerrado en algo parecido a esto (code = c ) ( / code ) , donde los parentesis en realidad son corchetes, pero lo puse asi para que no me los transforme el foro.

« Última modificación: 25 de Febrero de 2016, 22:31:40 por KILLERJC »

Desconectado thekako

  • PIC10
  • *
  • Mensajes: 16
Re:Consulta PIC 16f628a comparar
« Respuesta #11 en: 29 de Febrero de 2016, 10:44:49 »
Ya amigo muchas gracias por todo, y asi es, necesitaba saber de quien esta tomando energia viendo las salidas que tiene :)


 

anything