He estado tratando de encontrar una solución para medir una frecuencia relativamente lenta con el PIC18F4520. El rango de frecuencia que estoy intentando medir está en el rango de .5 a 20Hz. Necesito tener una resolución de 1 decimal.
El código que he estado intentando usar no está dando resultados. Cuando uso la variable 'período' entero sin signo, obtengo todos los ceros. Si intento usar la variable 'resultado' flotante, recibo datos erróneos. Soy relativamente nuevo en el uso de PCC pero debido a la frecuencia lenta, sentí que esta sería la mejor solución.
¿Cómo puedo medir una frecuencia relativamente lenta de 0.5 a 20Hz con una resolución de 0.1 Hz con los temporizadores PIC?
//PIC18F4520
//Using CX8 ver 1.40
#include<stdio.h>
#include”lcd.h”
#pragma config OSC = XT // XTAL = 4MHZ External
#pragma config WDT = OFF
void InitGPIO()
{
DelayMS(10); // POWER UP DELAY
TRISCbits.TRISC2 = 1; // CCP1 : CONFIGURE AS INPUT PIN
ADCON1 = 0x0F ;
TRISD = 0x00;
TRISE = 0x00;
}
void CCPInit()
{
T3CON = 0X81;
CCP1IE = 0;
CCP1IF = 0;
T1CON = 0X81;
CCP1CON = 0x05;
}
void main()
{
unsigned char string[10];
unsigned int start,end,period;
float result,Frequency ;
InitGPIO();
InitLCD();
CCPInit();
LCDString((char *)”Frequency Period”);
while(1)
{
while(!(CCP1IF)); // Wait First Rising Edge
CCP1IF = 0; // Clear Flag Not Next Round
start = CCPR1; // Save Value of First Rising Edge
while(!(CCP1IF)); // Wait Second Rising Edge
CCP1CON = 0x00 ; // Disable CCP1 Capture Module
end = CCPR1; // Save Value of Second Rising Edge
period = end-start; // Subtract end – Start
period = (float)period;
//Also attempted
//results = end-start;
//results = (float)results;
//Frequency = (1/results );
Frequency = (1/period );
LCDGotoxy(1,0);
sprintf(string,”%.3gKHz”,Frequency);
LCDString(string);
sprintf(string,”%.3gms”,period);
LCDGotoxy(1,10);
LCDString(string);
}
while(1);
}