Код: Виділити все
const double halfRoot2 = sqrt(0.5);
// sin α= 0.70710678
// cos α= 0.70710678
// Massage the results to eliminate sensitivity to the 3rd harmonic, and divide by 200
double bin0 = (averages[0] + halfRoot2 * (averages[1] - averages[3]))/f;
double bin1 = (averages[1] + halfRoot2 * (averages[0] + averages[2]))/f;
double bin2 = (averages[2] + halfRoot2 * (averages[1] + averages[3]))/f;
double bin3 = (averages[3] + halfRoot2 * (averages[2] - averages[0]))/f;
sampleReady = false; // we've finished reading the averages, so the ISR is free to overwrite them again
Під час розрахунку результат ділиться на константу const double f = 200.0;, але я не знайшов у коді накопичення сигналу - не уважнийThis gives us 16 ADC clock cycles for each ADC conversion (it actually takes 13.5 cycles), and we take 8 samples per cycle of the coil drive voltage.
The ADC implements four phase-sensitive detectors at 45 degree intervals. Using 4 instead of just 2 allows us to cancel the third harmonic of the coil frequency.
... ми беремо 8 вимірювань за цикл. Реалізовано чотири фазочутливі детектори з інтервалом 45 градусів. Використання 4 вимірювань замість 2 дає змогу відфільтрувати третю гармоніку робочої частоти. (переклад довільний)
PS. Цей код дає змогу фідвільтрувати 3-тю гармоніку при використанні широкосмугового вхідного підсилювача.