Frequency meter can be made using a conventional digital ICs with a big size, and complicated circuit connection. A small 8-bit micro-controller could do this job using a low level Assembly language or even a higher level C language.
In this example, I use an 8-bit PIC16F84A micro-controller to count external TTL input pulse. The total count will update for every seconds.
Simulating Program |
I use RA4/T0CKI (Timer0 External Clock Input) pin to count external TTL pulse. Since Timer0 is only 8-bit wide the maximum counting is only 255 counts. So I add Timer0 Interrupt to increase the maximum counts. I use XC8 built-in delay function to create a precise 1000 ms (1 second) delay before the summation of external pulse is evaluated. A 16x2 character LCD is suitable for this example.
#include <stdio.h> #include <xc.h> #define _XTAL_FREQ 4000000UL #include "LCD4Bits.h" void tmr0Init(void){ PORTA=0; TRISA4=1; T0CS=1; T0SE=0; PSA=1; OPTION_REGbits.PS=0; T0IE=1; GIE=1; T0IF=0; } long TMR0H=0; void interrupt T0_ISR(void){ if(T0IF){ TMR0H+=1; T0IF=0; } } int main(void){ unsigned char freq[10]; uint32_t temp=0; PORTB=0; TRISB=0; lcdInit(); tmr0Init(); lcdXY(4,1); lcdString("PIC16F84A"); lcdXY(1,2); lcdString("Frequency Meter"); __delay_ms(1000); lcdCommand(CLEAR_SCREEN); __delay_ms(5); lcdXY(4,1); lcdString("Frequency:"); TMR0H=0; TMR0=0; while(1){ __delay_ms(1000); temp=(TMR0H<<8)+TMR0; lcdXY(6,2); sprintf(freq,"%uHz ",temp); lcdString(freq); TMR0H=0; TMR0=0; } return 0; }
I can not test it on bread-board because this chip was burn out. And I only have some newer PIC chips. So this program can only be tested using a simulator like Proteus. We can use another PIC chip like the PIC16F628A, and CCS PICC compiler.
Resource Usage |
This program require 69.5% of program memory, and 89.7% of data memory. Click here to download this example.
No comments:
Post a Comment