Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

28/11/2014 #1


Tengo problemas con el programa
Buenas, tengo un proyecto que me gustaria me ayudaran, el cual es un medidor de parametros electricos en motores DC y AC, pero tengo problemas con el programa para el pic, usare un 16F877A, cuando compilo tengo muchos problema, espero puedan guiarme en este tema.

Aca les dejo el programa para los que puedan ayudarme y el circuito electronico
28/11/2014 #2

Avatar de aguevara

Ayudaria mucho si indicas que problemas tienes al compilar.
29/11/2014 #3


Me da error en la libreria de la lcd, pero me parece extrano pues yo sigo la sintaxis del lenguaje C.

Necesito tambien medir corriente, pero los transductores no los tengo, que otra opcion puedo tomar???

He leido y me dicen que haga un divisor de tension, pero la sintaxis de eso me tiene totalmente enredado. La otra opcion es inyectarle una corriente a la resistencia a medir y aplicar ley de Ohm, tambien estoy enredado con esa sintaxis

Si pueden drme una mano con eso???
29/11/2014 #4

Avatar de juanma2468

Posiblemente tengas algun error en la ultima parte del programa donde calculas el valor de los RPM dentro de la instruccion printf(lcd_putc,"MPM=%3.0f RPS=%3.1f \nRPM=%3.1f",((fHz*16)/100)*60,fhz,(60*fhz));

Tal ves esa intruccion no soporte la aplicacion de formulas como argumento. Trata de probar de sacar a fuera la formula y de colocar solo el resultado, saludos.
29/11/2014 #5
Moderador

Avatar de D@rkbytes

pedrojr14 dijo: Ver Mensaje
tengo problemas con el programa para el pic, usaré un 16F877A
Cuando compilo tengo muchos problema, espero puedan guiarme en este tema.
Tienes bastantes errores en todo el programa, desde el inicio hasta el final.
Muchas de las partes en la cabecera del programa no deben llevar ; (Punto y coma)

Tienes esto:
#include <16f877a.h>; //Libreria de PIC a usar
Y sería de esta forma:
#include <16f877a.h> //Libreria de PIC a usar
Sin el punto y coma al final, y este error lo tienes en casi toda la cabecera del programa.
Las definiciones tampoco deben llevar un ; al final.
Dejaste varias definiciones a pines sin completar:
Sólo dejaste partes así: #define SWV pin_

Algunas instrucciones de retardo no están bien escritas.
Las escribiste así: delay ms(1000); y deben ser así: delay_ms(1000);


En fin, el código tiene muchos errores más, y debes corregirlo.
Es mejor que estudies primero sobre lenguaje C y también veas los muchos ejemplos que existen en el Foro.


Suerte.
29/11/2014 #6


Si, tengo errores porque me falta, de hecho, he cambiado el programa, quiero que se vea como en el archivo que adjunte.

Adjunto un archivo .docx donde muestro pantallas y programa, me queda cambiar el proteus
Archivos Adjuntos
Tipo de Archivo: doc Propuesta 2.doc (33,5 KB (Kilobytes), 12 visitas)
30/11/2014 #7
Moderador

Avatar de D@rkbytes

pedrojr14 dijo: Ver Mensaje
Si, tengo errores porque me falta, de hecho, he cambiado el programa, quiero que se vea como en el archivo que adjunte.
Pues sigues teniendo algunos errores.
Pero mira, lo que tienes que hacer es algo así:
Código PHP:
#include <16f877a.h>
#device  adc = 10
#fuses   NOBROWNOUT
#use     delay(crystal = 4MHz)
#include <lcd.c>

void main (void)
{
   
unsigned int16 voltaje,temperatura,corriente,potencia;
   
   
setup_adc(ADC_CLOCK_INTERNAL);
   
setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   
   
lcd_init();

   while(
true)
   {
      
/*********************Lectura del canal 0 (Voltaje)**********************/
      
set_adc_channel(0);
      
delay_us(50);
      
float adc_voltaje read_adc();
      
voltaje = (adc_voltaje 200 1023);  // Conversión para obtener el voltaje. (Hasta 200V.)
      
      /*********************Lectura del canal 1 (Temperatura)******************/
      
set_adc_channel(1);
      
delay_us(50);
      
int16 adc_lm35 read_adc();
      
temperatura = (adc_lm35 150 308);  // Conversión para obtener la temperatura. (0 a 150 °C)
      
      /*********************Lectura del canal 2 (Corriente)********************/
      
set_adc_channel(2);
      
delay_us(50);
      
int16 adc_corriente read_adc();
      
corriente = ("Mi fórmula para corriente, usando adc_corriente");  // Conversión para obtener la corriente.
      
      /*********************Lectura del canal 3 (Potencia)*********************/
      
set_adc_channel(3);
      
delay_us(50);
      
int16 adc_potencia read_adc();
      
potencia = ("Mi fórmula para potencia, usando adc_potencia");  // Conversión para obtener la potencia.
      
      // Mostrar el resultado en pantalla.
      
lcd_gotoxy(1,1);
      
printf(lcd_putc,"V=%03lu V T=%03lu %cC ",voltaje,temperatura,0xDF);
      
printf(lcd_putc,"\nI=%03lu A P=%03lu W ",corriente,potencia);
      
      
delay_ms(100); // Retardo de X tiempo.
   
}

De esta forma y con las instrucciones de la parte "Mostrar el resultado en pantalla", se vería algo así:


Las fórmulas para obtener el voltaje y la temperatura con el LM35, son válidas y las puedes usar, pero las fórmulas para obtener la corriente y potencia, las tendrás que realizar dependiendo del tipo de circuito que uses.

Si te das cuenta, el código está casi completo y lo pongo sólo para que te des cuenta de las instrucciones que estás usando mal.

Suerte.
Imágenes Adjuntas
Tipo de Archivo: jpg Display.jpg (5,8 KB (Kilobytes), 156 visitas)
30/11/2014 #8


Muchísimas gracias D@rkbytes. Aclaraste bastantes dudas mías, aún así, quedo con otras:

1.- Yo necesito mostrar también otra pantalla donde vea los parámetros de torque y velocidad.
¿Es mejor colocar otro display lcd o puedo hacerlo con la misma pantalla y que según un botón se muestre un grupo de parámetros?

2.- En cuanto a la velocidad, podrás ver que tengo un botón conectado al pin 5, lo que me permite realizar un contador.
Lo que he pensado es hacer un contador y multiplicarlo por la relación de transformación.
Ahora, según esto, ¿mi sintaxis está bien hecha?

3.- Para medir el torque, necesito los parámetros de potencia y velocidad.
¿Cómo hago para cargar el valor de la potencia para la otra pantalla?

4.- Cuando te refieres a "Mi fórmula para potencia" y "Mi fórmula para corriente", ¿a que te refieres?
Debo ingresar las formulas matemáticas en el compilador.
Yo mañana voy a comprar un transductor de corriente para medirlo, por medio de él, es que podré llenar eso.

Ajunto la simulación en proteus para que revises si tengo algo malo.

Me gustaría comunicarme contigo directamente para poder tener mejor comunicación, mi correo es: políticas@delforo.com

---------- Actualizado después de 34 minutos ----------

D@rkbytes, estoy simulando lo que me diste y no me muestra nada.
Archivos Adjuntos
Tipo de Archivo: rar Proyecto.rar (24,3 KB (Kilobytes), 13 visitas)
30/11/2014 #9
Moderador

Avatar de D@rkbytes

pedrojr14 dijo: Ver Mensaje
Muchísimas gracias D@rkbytes. Aclaraste bastantes dudas mías, aún así, quedo con otras:

1.- Yo necesito mostrar también otra pantalla donde vea los parámetros de torque y velocidad.
¿Es mejor colocar otro display lcd o puedo hacerlo con la misma pantalla y que según un botón se muestre un grupo de parámetros?
Usando la librería "LCD.C" para controlar la pantalla, no se pueden usar 2 o más pantallas con el mismo PIC.
pedrojr14 dijo: Ver Mensaje
2.- En cuanto a la velocidad, podrás ver que tengo un botón conectado al pin 5, lo que me permite realizar un contador.
Lo que he pensado es hacer un contador y multiplicarlo por la relación de transformación.
Ahora, según esto, ¿mi sintaxis está bien hecha?
Mirando el código del post #1 y aunque tenga errores, parece que si, aunque por un detalle, no.
Si vas a utilizar el Timer1 para realizar el conteo, debes crear una rutina de interrupción y ahí realizar los cálculos.
Establecer que el Timer1 sea sincronizado externamente e ingresar los pulsos por el pin T1OSI, no por el pin T1OSO, que usaste en el esquema del post #8
T1OSI = Timer1 Oscillator Input
T1OSO = Timer1 Oscillator Output
pedrojr14 dijo: Ver Mensaje
3.- Para medir el torque, necesito los parámetros de potencia y velocidad.
¿Cómo hago para cargar el valor de la potencia para la otra pantalla?
Ya te mencioné que no puedes usar dos pantallas y controlarlas con la librería.
Lo que si puedes hacer, es mostrar los resultados simultáneamente, es decir, muestras primero unos, esperas un tiempo y muestras los siguientes, o puedes usar una pantalla 4x20.
También puedes usar dos IC PCF8574 para controlar las pantallas por I2C.
Mira este ejemplo: LCD 16x2 controlado con un PCF8574
pedrojr14 dijo: Ver Mensaje
4.- Cuando te refieres a "Mi fórmula para potencia" y "Mi fórmula para corriente", ¿a que te refieres?
Debo ingresar las formulas matemáticas en el compilador.
Yo mañana voy a comprar un transductor de corriente para medirlo, por medio de él, es que podré llenar eso.
A que ahí coloques la fórmula correspondiente para realizar la conversión.
pedrojr14 dijo: Ver Mensaje
Ajunto la simulación en proteus para que revises si tengo algo malo.

Me gustaría comunicarme contigo directamente para poder tener mejor comunicación, mi correo es: políticas@delforo.com
Lo que desees saber, lo tienes que preguntar sobre este tema, así, lo que se logre sobre el tema en cuestión, le podrá servir a otras personas.
Por favor, lee las normas del Foro.
Reglas generales de uso del foro
Normas de Participación
pedrojr14 dijo: Ver Mensaje
D@rkbytes, estoy simulando lo que me diste y no me muestra nada.
Siempre revisa muy bien las conexiones, porque a muchos les pasa que algo no les funciona y realizan su consulta, se les dan muchas causas posibles, y terminan diciendo que tenían algo mal conectado.
30/11/2014 #10


D@rkbytes, muchísimas gracias por aclarar todas mis dudas, seguiré haciendo cambios y preguntando cualquier duda que me aparezca.

---------- Actualizado ----------


D@rkbytes de verdad agradezco muchísimo tu ayuda, pero realmente he hecho modificaciones al programa que me mandaste y lo que hago es dañarlo.
¿Podrías ayudarme en lo siguiente?

1.- Agregar un contador al programa, que pueda modificar a que sea el velocímetro

2.- Agregar la medición de torque, siendo torque=Potencia/Velocidad

3.- Hacer que la pantalla muestre esos parámetros faltantes tiempo después de haber puesto esa primera pantalla.

De antemano muchísimas gracias, realmente me siento muy apenado pues no logro dar con la sintaxis correcta.
01/12/2014 #11
Moderador

Avatar de D@rkbytes

pedrojr14 dijo: Ver Mensaje
D@rkbytes de verdad agradezco muchísimo tu ayuda, pero realmente he hecho modificaciones al programa que me mandaste y lo que hago es dañarlo.
¿Podrías ayudarme en lo siguiente?

1.- Agregar un contador al programa, que pueda modificar a que sea el velocímetro

2.- Agregar la medición de torque, siendo torque=Potencia/Velocidad

3.- Hacer que la pantalla muestre esos parámetros faltantes tiempo después de haber puesto esa primera pantalla.

De antemano muchísimas gracias, realmente me siento muy apenado pues no logro dar con la sintaxis correcta.
Eso que pides es realizar tu programa, debes intentarlo por ti mismo para que puedas aprender.
Ya se te expuso un ejemplo sobre la forma en cómo lo puedes hacer de forma sencilla y para que te dieras cuenta de los errores que estabas cometiendo al escribir tu programa.
Ahora te corresponde a ti realizar lo que le falte a tu programa.

Anteriormente te mencioné que estudiaras sobre lenguaje C y que vieras los ejemplos que existen en el Foro.
Puedes empezar por aquí: Curso de programación en C para microcontroladores PIC
Utiliza el Buscador de Foro y encontrarás algunos ejemplos o datos que te pueden servir.

Con la información que obtengas y la que ya tienes, realiza tu programa, y cuando no puedas con algo, entonces adjuntas tu proyecto completo, para que las personas que se interesen y tengan conocimientos, te puedan brindar colaboración.

El Foro trabaja de ésta forma y existen reglas que debes cumplir.
Si no eres tú quien de los primeros pasos en la realización de su proyecto, se cae en el mínimo esfuerzo y el tema se cierra.
01/12/2014 #12


Gracias D@rkbytes... Hoy monto nuevamente lo que haga del proyecto
01/12/2014 #13


Adjunto modificaciones hechas tanto a programa, como al circuito, aun no logro que me aparezca mensaje, he verificado las conexiones pero no entiendo que es lo que esta pasando que no me muestra, de todas maneras voy a seguir verificando, aun no tengo el transductor de corriente, por lo que no coloco la formula de corriente.

Lo que puedan revisar agradecería de todo corazón.

---------- Actualizado después de 1 hora----------

Ya resolví el problema en la simulación, aún así me quedan detalles:

1.- No me sensa el voltaje, yo supongo que la configuración del transformador la tengo mal.
Estoy buscando esa información.

2.- Que la fórmula del torque se muestre en la pantalla, más no se muestra el resultado.

3.- El contador no me funciona

Estoy trabajando sobre eso, en un momento doy informacion

---------- Actualizado después de 38 minutos ----------

Ya resolví el problema con la parte de la medición del voltaje, la temperatura también está correcta, sólo esos 2 parámetros son los que he simulado.

No he vuelto a publicar el programa ni la simulación debido a que mis errores han sido muy estúpidos:
A las fuentes no les había puesto valores.

Aún estoy con el problema del contador.
El que pueda ayudarme, lo agradecería.
Archivos Adjuntos
Tipo de Archivo: doc Poyecto.doc (26,0 KB (Kilobytes), 7 visitas)
Tipo de Archivo: rar Proyecto.rar (23,4 KB (Kilobytes), 6 visitas)
02/12/2014 #14
Moderador

Avatar de D@rkbytes

pedrojr14 dijo: Ver Mensaje
Aún estoy con el problema del contador.
El que pueda ayudarme, lo agradecería.
Si te refieres al contador de revoluciones de tu código, esa no es la forma correcta de hacerlo.
Ahí únicamente estás incrementando una variable de 8 bits "Velocidad" y desbordará cuando llegue a 255.

Mira este ejemplo, es sencillo y puede contar hasta 60000 RPM.
Se utiliza el Timer1 para establecer un periodo de conteo y el Timer0 como contador de pulsos externos. (T0CKI)
Código:
unsigned int16 conteo_tmr0 = 0;

// Servicio de interrupción por desborde del Timer 1
#int_timer1
void sdi_timer1 (void)
{
   conteo_tmr0 = get_timer0();      // Obtener el conteo del TMR0
   conteo_tmr0 *= 4*60;             // Convertir el conteo a revoluciones por minuto.
   set_timer0(0);                   // Resetear el Timer0
   set_timer1(3036);                // Recargar TMR1H y TMR1L
}

void main (void)
{
   lcd_init();                      // Inicializar la pantalla.
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Configuración del Timer1
   setup_timer_0(T0_EXT_H_TO_L | T0_DIV_2);  // Configuración del Timer0
   
   enable_interrupts(INT_TIMER1);   // Habilitar la interrupción del Timer1
   enable_interrupts(GLOBAL);       // Habilitar las interrupciones.
   set_timer1(3036);                // Cargar el Timer1 con 3036 (500Ms. @ 4MHz.)
   set_timer0(0);                   // Limpiar el Timer0
   
 
   while(true)
   {
      lcd_gotoxy(1,1);  // Direccionar escritura en la posición 1, línea 1
      // Mostrar las revoluciones por minuto.
      printf(lcd_putc,"%05lu RPM",conteo_tmr0);
   }
}
Si te sirve, podrás adaptar este código a tu programa.

Suerte.
02/12/2014 #15


Ya lo adapto y reenvio para correcciones
02/12/2014 #16


Buenas noches, ya adapte el programa, pero aun tengo el problema de que no cuenta la velocidad, el switch esta bien, pues esta conectado en el pin TOCKI, pero no entiendo que pasa

Adjunto programa y simulacion, esta todo en el archivo .rar

Cualquier ayuda que puedan brindarme la agradezco, yo sigo trabajando en el programa a ver que esta pasando

Aparece en mi una pregunta: Si yo quiero mostrar en pantalla la multiplicacion del voltaje por la corriente, haciendo asi la potencia, donde coloco la formula??? En la lectura adc_potencia o cuando imprimo en la pantalla??? He modificado en ambos lugares, pero no se que me da error.

He intendado:
1.-Linea 57: int16 adc_potencia = adc_corriente * adc_voltaje ; <- Esta opcion me da errores
2.-Linea 58: potencia = ("adc_corriente * adc_voltaje, usando adc_potencia"); <- Esta opcion se acerca a la realidad
3.-Linea 77: printf(lcd_putc,"\nI=%03 A P=%adc_corriente*adc_voltaje W ",corriente,potencia); <- Esta opcion me presenta la formula en la pantalla
Pero ninguna me funciona
Archivos Adjuntos
Tipo de Archivo: rar Proyecto.rar (24,9 KB (Kilobytes), 4 visitas)
02/12/2014 #17
Moderador

Avatar de D@rkbytes

pedrojr14 dijo: Ver Mensaje
Buenas noches, ya adapte el programa, pero aún tengo el problema de que no cuenta la velocidad, el switch esta bien, pues esta conectado en el pin TOCKI, pero no entiendo qué pasa.
Es que de la forma como lo estás haciendo no va a contar nada.
Coloca un generador de pulsos. En Generators, selecciona el DCLOCK, y con ese reemplaza el generador de tensión continua que usaste.
En la configuración del DCLOCK, puedes usar una frecuencia desde 0 hasta 1KHz. porque sólo se pueden contar hasta 60000 RPM.

Y una recomendación:
En vez de usar retardos para mostrar la información, sería mejor que al presionar un botón, se mostraran los otros datos.

Como por ahora estás realizando el proyecto bajo simulación, es conveniente que trabajes con señales digitales en vez de usar transformadores y componentes análogos.
Así podrás obtener una mejor simulación y sin sobrecargar el CPU.
Si usas el DCLOCK, conéctalo directamente, no uses resistencias.
Para las fuentes de voltaje variable, puedes usar el POT-HG. El PIC trabaja con voltajes de 0 a 5V. Así que no es necesario que compliques el diseño de simulación.
Las simulaciones son sólo eso, no es necesario que realices el esquema que usarás y ese mismo lo simules.
02/12/2014 #18


Correcto, ya realice los cambios, ahora el circuito me trabaja muchísimo mejor.

Ahora, si yo le conecto al puerto RA2 un generador de seno me va a medir la ADC del transductor??? En el físico, claro esta. Porque simulo colocando un generador para medir la corriente y no me imprime valores en pantalla

Quedo aun con la duda, las formulas de potencia y torque, donde las escribo??? Porque he intentado en 3 lugares diferentes y no me da los valores que deberian ser
Archivos Adjuntos
Tipo de Archivo: rar Proyecto.rar (49,4 KB (Kilobytes), 5 visitas)
03/12/2014 #19
Moderador

Avatar de D@rkbytes

pedrojr14 dijo: Ver Mensaje
Ahora, ¿si yo le conecto al puerto RA2 un generador de seno me va a medir la ADC del transductor? En el físico, claro está.
Porque simulo colocando un generador para medir la corriente y no me imprime valores en pantalla.
Pues nop, eso no se puede, ya te mencioné que el PIC sólo puede medir tensión continua. (0 a 5V. Máx.)
Debes rectificar y amplificar la tensión antes de ingresarla al microcontrolador.
Por lo tanto, deberás utilizar un amplificador operacional que entregue 5 voltios cuando midas la máxima corriente.
pedrojr14 dijo: Ver Mensaje
Quedo aún con la duda, las fórmulas de potencia y torque, ¿dónde las escribo?
Porque he intentado en 3 lugares diferentes y no me da los valores que deberían ser.
Puedes seguir una secuencia dentro del bucle del programa para ir realizando las operaciones, o crear funciones que retornen un valor, pero el programa por ahora es muy sencillo y así como te he explicado debe ir bien.

No sé para qué creaste otro bucle para mostrar los resultados, pero aquí te adjunto el proyecto con las correcciones y también con las fórmulas para medir voltaje, corriente, potencia, RPM y el torque. (Según tu fórmula)

Espero que con esto ya puedas tener una mejor idea de cómo tienes que realizar un programa en C.
También adjunto la simulación en versiones de proteus 7.10 y 8.1
Vi tu archivo de simulación pero no debo realizar cambios sobre él y luego subirlo, ésto es porque tengo una versión superior de proteus 8, y si realizo cambios posiblemente no podrás abrirlo.
Si no puedes abrir el proyecto de la versión 8.1 SP1, si podrás abrir el de la versión 7.10.

Mira el programa y realiza los cambios que creas convenientes. (Sobre todo a la fórmula del torque.)
También mira el modo de trabajar con una simulación como te mencioné anteriormente.

Suerte
Archivos Adjuntos
Tipo de Archivo: rar 16F877A Proyecto pedrojr14 III.rar (55,9 KB (Kilobytes), 22 visitas)
03/12/2014 #20


D@rkbytes dijo: Ver Mensaje
Pues nop, eso no se puede, ya te mencioné que el PIC sólo puede medir tensión continua. (0 a 5V. Máx.)
Debes rectificar y amplificar la tensión antes de ingresarla al microcontrolador.
Por lo tanto, deberás utilizar un amplificador operacional que entregue 5 voltios cuando midas la máxima corriente.
Si, eso lo sé, y justamente pregunto por curiosidad, por que me puse a probar haciéndolo y tampoco me daba resultados.

Muchas gracias, hoy reviso y monto resultados en la tarde.

Miercoles, 3 de diciembre del 2014. 9pm
Buenas noches, no he podido montar avances porque no he podido abrir la simulacion, ahorita estoy descargando proteus 8.1 para poder visualizar, apenas tenga algo lo monto

Miercoles, 3 de diciembre del 2014. 11pm
Agradecido de todo corazón D@rkbytes, unas preguntas: RV4 ira en serie con la carga que yo coloque???.

Cuando dices: "Voltaje de salida del Amplificador Operacional del Shunt para medir corriente", es solamente que haga un circuito con un amplificador o que es la salida del transductor???
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.