Для определения RMS делал так - рассчитал количество преобразований за период:
N=Fcpu/prescaler/Nadc*tпериод
Fcpu=4000000 Hz
Prescaler=32 – предделитель ADC
Nadc=20 тактов (т.к. преобразование ADC происходит за 13 тактов плюс несколько тактов на
запись данных ADC в RAM)
tпериод=0,02 - время на период при частоте 50 Гц
N=4000000/32/20*0.02=125 – преобразований.
Далее я сохранял 125 последовательных преобразований ADC в массив, а затем рассчитываю RMS=sqrt((x1^2+x2^2+…+xn^2)/N).
Конечно расчет количества преобразований (N) за период приблизительный, но тем не менее я считал если ошибка будет грубой, то варьируя этим значением (N) в небольших пределах можно подогнать истинное. В протеусе отслеживал значения RMS передаваемые в терминал. При синусоидальном сигнале, амплитудой 5В, его RMS=5*sqrt(2)=3.54В - в теории , но на практики результаты сильно отличаются. Например при расчетной N=125 в терминал попадает 0x279 = 633 = 633*5/1023 = 3.09В. И увеличивая, уменьшая это значение (N) скорректировать результат не получается.
Возможно, я кардинально не правильно пытаюсь решить задачу, или такой вариант решения тоже имеет право быть, но тогда что не так, откуда такая погрешность?
- Вложения
-
- Исход.png
- (73.78 КБ) 806 скачиваний
-
- протеус.png
- (34.43 КБ) 735 скачиваний



