Hola a todos! Me gustaría que alguien me ayudara a terminar un ejercicio. Necesito hacer una medición del ancho de pulso de una señal.
Tengo dos señales de 5V y 60 Hz, pero la segunda esta desfasada 45°(es decir 2.08333 ms de desfase). Las dos señales las paso a través de una compuerta XOR, y asi obtengo el Ancho de Pulso del desfase que necesito medir. El problema es que no se si esta bueno, no se como corroborarlo, si alguien sabe me serviría mucho que me ayudaran, si tienen otras opciones de como resolverlo, mejor.
Adjunto el código del programa y la simulación:
#include <16f877a.h>
#use delay(clock=4M)
#fuses HS,NOWDT
#include <LCD420D.C>
int16 TFB; //Tiempo flanco de bajada
float PW; //Valor final del ancho de pulso
int1 nuevopulso=0; //Entra otro pulso
int1 cambio=0;
#INT_EXT
void funcion_ext_int()
{ //Funcion Interrupcion
if(cambio==0) //Flanco de subida
{
set_timer1(0); //Inicializa TMR1
ext_int_edge(0,H_TO_L); //Configura para flanco de bajada
cambio=1;
}
else{
TFB=get_timer1(); //Valor del Timer 1 para flanco de bajada
ext_int_edge(0,L_TO_H); //Configura para flanco de subida
cambio=0; //Control de cambio de flanco
if(nuevopulso==0) //Fin de pulso
{
nuevopulso=1; //Pulso a calcular
}
}
}
void main(void)
{
lcd_init();
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //Configuracion TIMER1
ext_int_edge(0,L_TO_H); //Configura para flanco de subida
cambio=0; //Control de cambio de flanco
enable_interrupts(int_ext); //Habilitacion interrupcion RB0
enable_interrupts(global); //Habilitacion general
do
{
if(nuevopulso==1) //Si ¿nuevo pulso?
{
PW=TFB*1.0; //Ancho de pulso en us de TIMER1 a 4MHZ el T=1us*Timer1
printf(lcd_putc,"\f");
printf(lcd_putc,"\n\n\tPulso=%6.1fus",PW); //Visualiza medida en LCD
delay_ms(1000);
}
nuevopulso=0; //Pulso medido
}
while(TRUE);
}