Пишу здесь, так как ориентируюсь на AVR.
Хочу померять напряжение переменного тока (сети) без выпрямления.
Можно применить RMS, как мне посоветовали или другой способ -
в одном и том же полупериоде меряем наряжение 2 раза, с изветным углом сдвига
между ними. Зная угол и результаты измерений, можно посчитать
амплитуду.
Не вдаваясь в подробности - формула для расчета:
A = sqr( (x2 - (x1*cos(d))/sin(d))**2 + x1**2)
где
А - искомая амплитуда
х2 - семпл 2
х1 - семпл 1
d - известный угол между первым и вторым семплом
**2 - возведение в квадрат
sqr - корень квадратный
зарядил следующий код (в цикле):
double calc(double x1, double x2, double x3, double x4) {
double a1 = x1 * x3;
double a2 = x2 - a1;
double a3 = a2/x4;
double a4 = sq(a3);
double a5 = sq(x1);
double a6 = a4 + a5;
double a7 = sqrt(a6);
return a7;
}
проверил на симуляторах IAR/ARM7TDMI - результат примерно 20000 вычислений в секунду при
расчетной частоте 60 MHz.
HTech-MPLab (PIC16F870)- при 20 MHz - около 5.6 миллисек на операцию.
AVR Studio - gcc - при симуляции на 4 MHz - 2.5 millisec на операцию (Атмега 168)
на живом Атмега 168 (Ардуино) - 16 MHz получилось 20000 операций - 2.4 секунды