mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
84 lines
1.5 KiB
C++
84 lines
1.5 KiB
C++
//
|
|
// FILE: pulse_measure.ino
|
|
// AUTHOR: Rob Tillaart
|
|
// PURPOSE: measure pulselength
|
|
// DATE: 2020-08-07
|
|
//
|
|
// TEST
|
|
// generate with one Arduino a pulse of 1000 ms
|
|
// measure it with this sketch to determine the correction percentage
|
|
|
|
|
|
#include "Arduino.h"
|
|
|
|
// measure pin = A5 on UNO
|
|
uint8_t pin = 19;
|
|
|
|
|
|
// record pulses in units of 10 milliseconds
|
|
// an a minimum duration of 20 miiliseconds.
|
|
uint16_t minDuration = 20;
|
|
uint16_t units = 10;
|
|
|
|
|
|
// to calc the average
|
|
uint32_t count = 0;
|
|
uint32_t sum = 0;
|
|
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
Serial.println(__FILE__);
|
|
|
|
// wait for pulse edge to start
|
|
recordPulse(pin, units, minDuration);
|
|
}
|
|
|
|
|
|
void loop()
|
|
{
|
|
uint32_t duration = recordPulse(pin, units, minDuration);
|
|
sum += duration;
|
|
count++;
|
|
Serial.print(duration);
|
|
Serial.print("\t");
|
|
Serial.println(sum / count);
|
|
}
|
|
|
|
|
|
uint32_t recordPulse(uint8_t pin, uint16_t unit, uint16_t minperiod)
|
|
{
|
|
static uint8_t state;
|
|
static uint32_t start;
|
|
static bool first = true;
|
|
if (first)
|
|
{
|
|
first = false;
|
|
pinMode(pin, INPUT_PULLUP);
|
|
state = digitalRead(pin);
|
|
start = millis();
|
|
}
|
|
|
|
uint8_t newState = state;
|
|
// wait minimal amount of time
|
|
while ((millis() - start) < minperiod - unit);
|
|
|
|
uint32_t now = millis();
|
|
while (newState == state)
|
|
{
|
|
// have fixed units
|
|
while (millis() - now < unit);
|
|
now = millis();
|
|
newState = digitalRead(pin);
|
|
}
|
|
state = newState;
|
|
uint32_t duration = ((now - start + unit - 1) / unit) * unit;
|
|
start = now;
|
|
return duration;
|
|
}
|
|
|
|
|
|
// -- END OF FILE --
|
|
|