А Вы обычным вольтметром/осциллографом выход датчика смотрели? Может сам датчик подвирает... Или там помехи какие-то лезут, которые проще фильтром порезать, а не гасить их жутким кол-вом итераций.
Я токовым трансом переменку на ATMega16 мерял, мне и полсекунды (25 периодов) хватило. Частоту дискретизации, кажется 10кГц была... Фильтров никаких я не ставил. Осциллом глядел - синусоида абсолютно чистая идёт. Только операционник для смещения синусоиды на полдиапазона вверх и диодный ограничитель на входе АЦП. Но Вам этого вроде не надо, датчик всё это сам делает.
Вы проверяли, какая часть Вашего алгоритма самая прожорливая по времени?
И сколько времени выполняется Ваш код?
Цикл Ваш какой-то странный. А именно проверки условий.. И возведение в квадрат мне не нравится.. Не раз натыкался на чисто компиляторные глюки, когда простые с виду конструкции неправильно работают, потому что их компилятор как-то не так их уразумел.
Попробуйте так:
Код
while(TIM3->CNT<5550) //один период
{
ADC1->CR2 |=0x00400000; //запуск преобразования
while ( !((ADC1->SR)&0x0002) );
temp = ADC1->DR-3070;
rms1 += temp*temp;
c1++; //счётчик числа преобразований
}
Только переменную temp объявите.
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда