Benutzer:Don 1414
Hello Everyone , I am new to programming in IDE. I am using built-in timer of arduino.I am using TDR method to capture reflection from fault location in cable and for that I am using timer.Timer should start as soon as output is send and stop at reflection. I have a reference code for it but I dont able to understand it, so if anyone know about it , it would be great.
void setup() {
pinMode(stepPin, OUTPUT); pinMode(refPin, OUTPUT); pinMode(shutdownPin, OUTPUT); TCCR1A = 0; TCCR1B = (1 << ICNC1); // input capture noise canceller enabled, capture on falling edge TIMSK1 = 0; // timer 1 interrupts disabled ACSR = 0; // input capture from ICP1 pin TCCR2B = (1 << CS20); // change timer 2 PWM frequency to 31.25kHz because we're using pin 11 as a DAC Serial.begin(19200);
}
struct Step {
unsigned int time; unsigned int amplitude;
};
// Take a single measurement, using either a positive or negative edge from the comparator. // The comparator reference voltage must have been set up and allowed to stablise before calling this. unsigned int takeMeasurement(bool posEdge) {
byte reg1b = (posEdge) ? 0 : (1 << ICES1); // input capture noise canceller csdisabled, set up input capture polarity, stop timer reg1b |= (1 << CS10); TCCR1B = reg1b; TCNT1H = 0; TCNT1L = 0; // clear timer unsigned int capture = 0; unsigned long start = micros(); // get the time cli(); TCNT1H = 0; TCNT1L = 0; // clear timer TIFR1 = (1 << ICF1); // clear timer 1 input capture bit PORTD |= (1 << 4); // set output high sei();
do
{
if ((TIFR1 & (1 << ICF1)) && capture == 0)
{
byte temp = ICR1L;
capture = (ICR1H << 8) | temp;
}
} while (micros() - start < 100);
PORTD &= ~(1 << 4); // set output low
return capture;
}
size_t findSteps(bool positive, struct Step *results, size_t maxResults) {
byte amplitude = (positive) ? 5 : 250; analogWrite(refPin, amplitude); delay(100); // wait 100ms for the output to stabilise unsigned int lastReading = 0; size_t numResults = 0; unsigned int stepSize = 0; // 0 means not in a step
- ifdef DEBUG
Serial.print((positive) ? "pos " : "neg ");
- endif
for (int i = 0; i < 50; ++i)
{
analogWrite(refPin, amplitude);
delay(10);
unsigned int currentReading = takeMeasurement(positive);
unsigned int currentDiff = currentReading - lastReading; // diff since start of possible step
if (stepSize == 0)
{
// Not currently in a step
if (i != 0 && currentReading != 0 && currentDiff == 0)
{
// Found the start of a possible step
++stepSize;
}
lastReading = currentReading;
}
else
{
if (currentDiff > 2 || i + 1 == 50)
{
// Step has endeed, so record it if it is big enough
if (stepSize >= 2)
{
results->time = lastReading;
results->amplitude = amplitude - 5;
++results;
++numResults;
if (numResults == maxResults) break;
}
stepSize = 0;
lastReading = currentReading;
}
else if (currentDiff == 0)
{
++stepSize;
}
}
- ifdef DEBUG
if (i != 0) Serial.write(',');
Serial.print(currentReading);
- endif
if (positive)
{
amplitude += 5;
}
else
{
amplitude -= 5;
}
}
- ifdef DEBUG
Serial.println();
- endif
return numResults;
}
// Convert a number of clocks delay to a cable length in metres float clocksToMetres(unsigned int clocks) {
float delayTime = (float)clocks/(float)F_CPU; // delay in seconds
float distance in metres= (delayTime * 3.0e8 * propagationFactor)/2.0;
Serial.print("distance in metres: ");
return (distance in metres);