Autor Tema: fuente digital con Pic 16F876a  (Leído 1443 veces)

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

Desconectado pic_877a

  • PIC16
  • ***
  • Mensajes: 172
fuente digital con Pic 16F876a
« en: 23 de Marzo de 2016, 17:20:06 »


hola compañeros del foro

ante todo un cordial saludo, bueno les comento una gran noticia la compañia Labcenter Proteus me ha Obsequiado Licencia para el programa proteus en formato original, y con 1 año de soporte Gratuito, asi que estoy empezando  estudiar todas la opciones de simular  y diseñar Pcb con la version 8.4.

para empezar me diseñe una fuente digital con Pic 16F876a, utilizando un Lcd y el conversor AD. y este el es programa realizado en ccs en version Demo.

#include <16f876A.h>                                    //LIBRERIA DEL PIC QUE SE VA A USAR
#fuses  XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT //FUSES DE AJUSTE PARA CRISTAL XT DE 4MHZ Y SIN PROTECCION
#device adc=10                                          //CONFIGURA EL CONVERSOR AD A 10 BITS
#use delay (clock = 4000000)                            //CRISTAL DE 4 MHZ         
#define use_portb_lcd TRUE                              //CONFIGURA EL PUERTO B PARA LA LCD
#include <LCD.C>                                        //LIBRERIA PARA LA LCD 2*16
#include <math.h>                                       //LIBRERIA PARA USO MATEMATICO
#use standard_io (All)                                  //CONFIGURA TODOS LOS PUERTOS Y AUTOMATICAMENTE LOR TRIS CON ESTANDARD IO
float t;                                                //VARIABLE DE TIPO FLOTANTE LLAMADA t 
float s;                                                //VARIABLE DE TIPO FLOTANTE LLAMADA s
void med_ir ()                                          //SE CREA LA FUNCION PARA MEDIR VOLTAJE
{                                                       //CORCHETE QUE ABRE EL INICIO DE LA FUNCION
  setup_adc_ports (AN0);                                //CONFIGURA EL PUERTO AN0 PIN 2 COMO CONVEROR ANALOGO DIGITAL
  setup_adc (ADC_CLOCK_DIV_32);                         //CONFIGURA EL RELOJ PARA LA CONVESION CON UN DIVISOR DE 32 DE LOS CILOS DEL RELOJ
  set_adc_channel (0); //habilitacion canal 0           //INICIA LA CONVERSION DEL CANAL 0 PIN 2
  delay_us (20);                                        //RETARDO PARA DAR TIEMPO A LA CONVERSION
  t = read_adc();                                       //LO QUE LEE EN EL CONVESROR AD LO GUARDA EN LA VARIABLE t         
  s= 5.0 *t / 1024;                                     //LO CONVIERTE A VOLTAJE 5V DE VOLTAJE DE REFERENCIA DIVIDIDO EN 2^10 QUE ES LA RESOLUCION DEL CONVERSOR
}                                                       //CIERRA EL CORCHETE Y TERNMINA LA FUNCION DE MEDIR

void publi_ca ()                                        //FUNCION DE PUBILAR EN EL DISPLAY LO MEDIDO                 
{                                                       //CORCHETE QUE INICIA LA FUNCION
        lcd_putc('\f');                                 //BORRA LA LCD YA DEBE ESTAR INICIALIZADA CUANDO LA LLAME
        lcd_gotoxy (1,1);                               //CORDENADAS DEL TEXTO EN RENGLON UNO CARACTER UNO                 
        printf (lcd_putc, "VOLTAJE AJUSTADO");          //DESPLIEGA EN LA PANTALLA LO QUE ESTA EN LAS COMILLAS
        lcd_gotoxy (6,2);                               //CORDENADAS DEL TEXTO EN RENGLON DOS CARACTER SEIS
        printf(lcd_putc, " +\%2.1f v",(s*7));           //DESPLIEGA EL CARACTER + Y LO QUE ESTA EN LA VARIABLE FLOTANTE CON DOS CARACTERES ENTEROS Y UN DECIMAL YLUEGO EL CARACTER v LA VARIABLE LA MULTIPLICA POR 7 
}                                                       //CIERRA EL CORCHETE Y TERNMINA LA FUNCION DE PUBLICAR   

void main ()                                           //FUNCION PRINCIPAL ,PROGAMA PRICIPAL
{                                                      //CORCHETE QUE INICIA LA FUNCION
       lcd_init();                                     //INICIALIZA LA LDC
       lcd_gotoxy (4,1);                               //CORDENADAS DEL TEXTO EN RENGLON UNO CARACTER CUATRO                 
       printf (lcd_putc, "FUENTE DE");                 //DESPLIEGA EN LA PANTALLA LO QUE ESTA EN LAS COMILLAS
       lcd_gotoxy (5,2);                               //CORDENADAS DEL TEXTO EN RENGLON DOS CARACTER CINCO
       printf (lcd_putc, "VOLTAJE");                   //DESPLIEGA EN LA PANTALLA LO QUE ESTA EN LAS COMILLAS
       delay_ms (2200);                                //RETARDO DE 2.2 SEGUNDOS PARA QUE SE VEA EL AVISO
       lcd_putc('\f');                                 // BORRA LCD
       lcd_gotoxy (2,1);                               //CORDENADAS DEL TEXTO EN RENGLON UNO CARACTER DOS
       printf (lcd_putc, "CON INDICADOR");             //DESPLIEGA EN LA PANTALLA LO QUE ESTA EN LAS COMILLAS
       lcd_gotoxy (5,2);                               //CORDENADAS DEL TEXTO EN RENGLON DOS CARACTER CINCO
       printf (lcd_putc, "DIGITAL");                   //DESPLIEGA EN LA PANTALLA LO QUE ESTA EN LAS COMILLAS
       delay_ms (2200);                                //RETARDO DE 2.2 SEGUNDOS PARA QUE SE VEA EL AVISO
       lcd_putc('\f');                                 // BORRA LCD
       lcd_gotoxy (1,1);                               //CORDENADAS DEL TEXTO EN RENGLON UNO CARACTER UNO
       printf (lcd_putc, "Jose Luis Comas ");         //DESPLIEGA EN LA PANTALLA LO QUE ESTA EN LAS COMILLAS
       lcd_gotoxy (1,2);                               //CORDENADAS DEL TEXTO EN RENGLON DOS CARACTER CINCO
       printf (lcd_putc, " Est Electronica ");        //DESPLIEGA EN LA PANTALLA LO QUE ESTA EN LAS COMILLAS
       delay_ms (2200);                                //RETARDO DE 2.2 SEGUNDOS PARA QUE SE VEA EL AVISO
       
while (true)                                           //CONDICION VERDADERA PARA HACER UN BUCLE SIN FIN
{                                                      //CORCHETE QUE INICIA LA FUNCION
 med_ir ();                                            //LLAMA LA FUNCION DE MEDIR QUEDA EN L AVARIABLE S EL VALOR MEDIDO
 publi_ca ();                                          //DESPLIEGA EN PANTALLA MO MEDIDO QUE ESTA EN LA VARIABLE FLOTANTE s
 delay_ms (100);                                       //RETARDO  DE 100ms TIEMPO EN QUE REFRESCA DESPLIEGUE Y HACE MEDICION
}                                                      //CIERRA CORCHETE DEL BUCLE SIN FIN
}                                 

este es un programa muy sencillo, bueno la simulacion es perfecta, y me visualiza el voltaje deseado en forma digital.

compañeros les quiero pedir una ayuda, con el programa que hice y   lo que deseo es que el programa me permita visualizar el voltaje negativo.

quiero utilizar el puerto AN1 del Pic 16F876a, mediante  divisor de tension con resistor 20k, poten de 10k y un Zener 1n4733, cuando diseñe la parte negativa de la fuente utilizando el Lm337 y su salida de tension despues de regulado lo pueda utilizar en el puerto An1 del Pic mediante un divisor de tension, pero se que que en el codigo hay que realizar la configuracion, pero lo he intentado, pero me da errores, ya llevos muchas horas intentandolos, pero no he podido realizarlo, el programa ya esta realizado, lo que unico que hace falta es una configuracion para que me pueda leer el voltaje negativo.

espero que me puedan ayudar

gracias

jose luis

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:fuente digital con Pic 16F876a
« Respuesta #1 en: 23 de Marzo de 2016, 19:09:32 »
Te estas equivocando, con ningun A/D podrias leer el valor de entrada negativas asi nomas.

Lo maximo que puede entrar al ADC es un voltaje VSS-0.3 a Vref+0.3.
Busca en el datasheet , pagina 194 sobre le ADC

Lo que podes hacer es con un amplificador operacional invertir la polaridad de la tension negativa y recien ahi medirlo. Otra no se me ocurre.

Desconectado pic_877a

  • PIC16
  • ***
  • Mensajes: 172
Re:fuente digital con Pic 16F876a
« Respuesta #2 en: 23 de Marzo de 2016, 19:17:00 »



hay muchas gracias por ayudarme, bueno lo intentare

gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:fuente digital con Pic 16F876a
« Respuesta #3 en: 23 de Marzo de 2016, 23:47:37 »
Bueno luego de pensar un rato tambien es posible el uso de un divisor resistivo. Y la conexion seria asi:


* Captura de pantalla de 2016-03-23 23:39:52.png
(2.74 kB, 353x323 - visto 386 veces)


Hay algunas ventajas/desventajas a usar el circuito con un AO, la primera es que tenes una corriente que va desde los 5V a la tension negativa. Mientras que con el AO puede tener una impedancia muy alta de entrada y no cargar el circuito. La eleccion de las resistencias debe ser tal que sea grande para que no exista mucha corriente sobre estas y lo suficientemente pequeña para que el tiempo de adquisicion del ADC cumpla con tu diseño. Si pones resistencias muy grandes tu ADC va a necesitar mucho tiempo desde que seleccionas el canal hasta que podes iniciar la lectura como para tener un valor correcto. Y si necesitas medir rapido la salida es un problema.

Para algo mas exacto por ahi resistencias de 1% de precision o una de estas resistencias que sea compuesta por una resistencia en serie mas un trimpot para poder calibrarlo al valor correcto, tambien lo ideal es que la tension de 5V jamas varie, ya que no solo dependes de la tension negativa, sino que si varai de 5 a 5.1V y la tension negativa se mantiene constante, vas a notar un cambio en la entrada del ADC.

Otro ejemplo que vi es la de usar un diodo zener en ves de una resistencia ( me refiero a la resistencia de abajo ). Lo mismo aplica todo lo de la resistencia.

Vos veras cual es el correcto para tu caso, y que decidis aplicar, lo del divisor resistivo es lo mas barato y simple. Pero con esas limitaciones. Sino vas por el AO en modo inversor.
« Última modificación: 23 de Marzo de 2016, 23:52:15 por KILLERJC »