//////////////////////////////////////////////// PRE-CODE ////////////////////////////////////////////////
// Initialize Variables
unsigned long preTime;
unsigned long postTime;
float f_signal_max = 1000; // max frequency of signal [Hz]
float del_t_sample = 10/f_signal_max; // required sample time [s]
float elapsedTime = 0; // initialize
int lastCount = 0; // initialize
long lastFreq = 0; // initialize
long frequency = 0; // initialize
long numCounts = 0; // intialize
static char outstr[15];
int count = 0; // initialize
int Q0 = 0; int Q1 = 0; int Q2 = 0; int Q3 = 0; // initialize
// Initialize Counter Pins
int Q0_pin = 2;
int Q1_pin = 3;
int Q2_pin = 4;
int Q3_pin = 5;
//////////////////////////////////////////////// SETUP ////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
// Initial Time
postTime = micros(); // initial time [us]
// Set Pin Modes
pinMode(Q0_pin,INPUT);
pinMode(Q1_pin,INPUT);
pinMode(Q2_pin,INPUT);
pinMode(Q3_pin,INPUT);
// Initialize Count
Q0 = digitalRead(Q0_pin);
Q1 = digitalRead(Q1_pin);
Q2 = digitalRead(Q2_pin);
Q3 = digitalRead(Q3_pin);
lastCount = 1Q0 + 2Q1 + 4Q2 + 8Q3; // number of pulses
}
//////////////////////////////////////////////// LOOP ////////////////////////////////////////////////
void loop() {
// Read counter values
preTime = postTime; // record time [us]
Q0 = digitalRead(Q0_pin);
Q1 = digitalRead(Q1_pin);
Q2 = digitalRead(Q2_pin);
Q3 = digitalRead(Q3_pin);
postTime = micros(); // record time [us]
// Update Calculations
count = 1Q0 + 2Q1 + 4Q2 + 8Q3; // number of pulses
elapsedTime = (postTime - preTime)/1e6; // time since last measurement [s]
numCounts = count - lastCount; // number of pulses since last measruement
if (numCounts < 0)
{numCounts += 16;}
// Update Frequency
if (numCounts == 0)
{frequency = lastFreq;} // if no additional pulses detected
else
//{frequency = numCounts / del_t_sample;} // Measured frequency of signal [Hz]
{frequency = numCounts / elapsedTime;} // Measured frequency of signal [Hz]
// Display Values
// Serial.print(Q3);
// Serial.print(Q2);
// Serial.print(Q1);
// Serial.println(Q0);
// Serial.print(count);
// Serial.print('\n');
// Serial.print(dtostrf(elapsedTime,10, 1, outstr));
// Print Information
// Serial.print('\n');
// Serial.print("Last Count: "); Serial.println(lastCount);
// Serial.print("Current Count: "); Serial.println(count);
// Serial.print("Number of Counts: "); Serial.println(numCounts);
// Serial.print("Sample Time: "); Serial.println(dtostrf(del_t_sample,5, 4, outstr));
// Serial.print("True Elapsed Time "); Serial.println(dtostrf(elapsedTime,10, 8, outstr));
Serial.print("Frequency: "); Serial.println(frequency);
// Update Parameters
//preTime = postTime;
lastCount = count;
lastFreq = frequency;
// Delay [ms]
//delay(del_t_sample*1000);
}