TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ORE en 05 de Mayo de 2006, 18:29:04
-
Hola muy buenas,
Estoy intentando generar una señal de salida por la patita CCP2, de una frecuencia determinada, y un duty cicle determinado. El problema se encuentra en que primero, no puedo visualizar la señal generada a la salida, porque en mi lugar de trabajo no tengo un osciloscopio, y segundo como quiero actuar sobre un relé, para ver como va activandose más o menos dependiendo del duty cicle, la máxima salida que observo en el pin RC1 es de 0 a 500mV, imposible que pueda encenderme un led. Uso un PIC16F877 y compilo con CCS. No se si tengo un error de concepto o el programa que estoy realizando no actua sobre el relé tal y como le digo.
Me sería de gran ayuda conocer a que se debe este problema, y si es debido a un problema de soft, o por hardware, no puedo obtener 5V de salida por RC1, cuando actua como PWM.
Un saludo,
Muchas gracias
-
Seria conveniente que postees tu codigo, de todas formas no creo que usar un rele sea una buena idea ya que su capacidad de conmutacion es mucho menor que la frecuencia del pwm. Para ver el efecto del pwm puedes usar un led, si esta bien hecho apreciaras el efecto
-
Hola muy buenas,
El programa que he utilizado, es uno de los tantos ejemplos realizados por los colaboradores del foro, y que sirve de gran utilidad para ir aprendiendo a programar en C, y comprobar que tú aplicación es la correcta. Sobre el tema de los reles, dependiedo de la frecuencia, si sería posible realizarlo, aunque muchísimo mejor sobre un led, ya que tiene una capacidad de conmutación superior al relé. Posteo el programa:
#include "C:\15 - Program Files C\20060506_prueba_pwm_timer2.h"
#include<lcd.c>
#use fast_io(B)
#byte port_b=0X06
#use fast_io (D)
#byte port_d=0X08
#use fast_io (E)
#byte port_e=0X09
void main(void)
{
int i;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,100,1);
setup_ccp2(CCP_PWM);
for(;;)
{
for(i=1;i<=99;++i)
{
lcd_init();
lcd_gotoxy(1,2);
printf(lcd_putc,"%i",i);
set_pwm2_duty(i);
delay_ms(50);
}
for(i=99;i>=1;--i)
{
lcd_init();
lcd_gotoxy(1,2);
printf(lcd_putc,"%i",i);
set_pwm2_duty(i);
delay_ms(50);
}
}
}
El lcd, lo uso para comprobar como va creciendo y decreciendo la variable i
Un saludo y gracias
-
Supongo que aunque aqui no lo pones, especificas el dispostivo, los fuses y la frecuencia del reloj; yo tambien soy bastante nuevo en el ccs asi que no se si estas cuestiones las suple la primera linea #include "C:\15 - Program Files C\20060506_prueba_pwm_timer2.h", si es asi no puedo ayudarte.
Saludos
-
Hola muy buenas,
Si los fuses están incluidos, pero no los he colocado en el código ya que cuando compilo y abro todos los archivos del proyecto, si que me aparecen, en concreto son estos:
#include <16F877.h>
#device adc=8
#use delay(clock=10000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
Con lo que el programa quedaría de la siguiente forma:
#include "C:\15 - Program Files C\20060506_prueba_pwm_timer2.h"
#include <16F877.h>
#device adc=8
#use delay(clock=10000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#include<lcdpfc2.c>
#use fast_io(B)
#byte port_b=0X06
#use fast_io (D)
#byte port_d=0X08
#use fast_io (E)
#byte port_e=0X09
#use fast_io (C)
#byte port_c=0X07
void main(void)
{
int i;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,100,1);
setup_ccp2(CCP_PWM);
port_c=0;
set_tris_c(0x10);
for(;;)
{
for(i=1;i<=99;++i)
{
lcd_init();
lcd_gotoxy(1,2);
printf(lcd_putc,"%i",i);
set_pwm2_duty(i);
delay_ms(50);
}
for(i=99;i>=1;--i)
{
lcd_init();
lcd_gotoxy(1,2);
printf(lcd_putc,"%i",i);
set_pwm2_duty(i);
delay_ms(50);
}
}
}
Un saludo, espero me puedas audar, gracias
-
Hola MIra : no tengo tanta experiencia en programacion , por eso solo te hago esta sugerencia con respecto a tu carencia de instrumental. Usa el programa proteus 6.7 sp3 para simulacion con microcontroladores. aunque no es perfecta te permitira conocer mas de lo que estas haciendo o por lo menos te dara una idea mas paroximada.
Saludo
Desde Cordoba Argentina (Area Ingenieria) :)
-
Hola ORE,
Yo actualmente tambien trabajo con una señal pwm, me he leido tu mensaje y no entiendo muy bien que quieres hacer, para comenzar si puedes adjunta el circuito montado ya que no me cuadra eso de que tengas de 0 a 500 mV en la salida, debe ir de 0 a Vcc.
Por lo demás debes mirar la frecuencia del PWM a la que trabajas, ya que seguramente un rele no te servirá para ver el ciclo de trabajo. Expon que pretendes hacer y te ayudaré en todo lo que pueda.
Un saludo :-/ :-/
-
Hola,
Lo primero muchas gracias por las respuestas.
En un principio, contesto a quirogaareal, al no disponer del instrumental necesario para comprobar en casa las oscilaciones a través de la patita CCP2, que es homóloga a CCP1, no cuento con el programa Proteus. Ya se que lo puedo conseguir a través del eMule, pero bastante pelea tengo actualmente con los proramas que uso para compilacion (CCS), programación(WinPIc800) y simulación (Orcad PSpice), como diseño (Orcad Layout y Orcad Capture), ya no tengo más tiempo de pelearme con otro programa, te lo puedo asegurar, y mucho tiempo para comprender los dos últimos, ahora bien te puedo asegurar también que aprendes muchísimo. Gracias por el comentario, lo tendré en cuenta para siguientes aplicaciones.
Para maric, yo tampoco entiendo porque a la salida tengo esa tensión. Te adjunto el circuito, el cual dependiendo de la variable de entrada que tú coloques (entre 0-1V), mediante un regulador PID, actuo sobre el relé en modo PWM, para variar el duty cicle de la señal dependiendo del error que se comenta en la medida: error=set_point-consigna, pero eso es otro tema. Seguiré investigando porque me ocurre esto, y si no es debido a programación, creo que el hardware está, ya que lcd, pulsadores, reles y todos los dispositivos están bien.
En referencia a tu segundo parrafo, me han comentado que a frecuencias muy bajas es posible observar los duty cicle del relé sin problema, eso me han dicho.
Un saludo y gracias
Por cierto, publicaré la subrutina de atencion al MAX187, que es un conversor de 12 bits, sin necesidad de tensión de referencia.
-
Tienes dos SALIDA4 en el esquema, una en RB4 y otra en RC1 ¿está bien esto? huele a "corto"
-
Hola Pocher,
Efectivamente el error estaba en el hardware, ya que había leido que había que cortocircuitar la salida con el rele, !!!pero burro de mi no con la salida del PORTB!! Ahora puedo observar como el rele se activa y desactiva dependiendo del duty. Por lo que será válido poder seleccionar los diferentes % de la salida.
Muchísimas gracias por la ayuda.
Un saludo,