Определяемся как мерять, пиковое значение или RMS. Дальше определяемся с учетом реальной частоты или тупо возьмем 50Гц. Если RMS и с учетом реальной частоты, то бадяжим детектор перехода через 0, подаем этот сигнал на вход ICP1 таймера1. По прерыванию от этого счасться таймер сбрасываем, а значение регистра ICR1 делим на количество необходимых замеров за период или полупериод (зависит от схемы детектора перехода через 0). Это у нас получится значение для регистра сравнения этого-же таймера1. Потом по прерыванию по сравнению увеличиваем это значение на себя и запускаем АЦП преобразование. По прерыванию по завершению АЦП преобразования возводим в квадрад значение и складываем их. После 100 отсчетов (или сколько там нужно, для примера пусть будет 100) делим полученную цифру на 100 и вычисляем корень квадратный. Вродь так.Wanderer123 писал(а):...но как подружить трансформатор тока и АЦП МК...
В коде примерно так будет:
Спойлер
Код: Выделить всё
// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void Timer1_capt(void)
{
TCNT1 = 1;
CmpValA = ICR1/100;
OCR1A = CmpValA>>2; //для первого преобразования значение возьмем в 2-4 раза меньше
enCalc = 1;
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void Timer1_cmp_A(void)
{
ADMUX = 0x00;
ADCSRA |= 1<<ADSC;
OCR1A += CmpValA;
}
interrupt [ADC_INT] void ReadADC(void)
{
tmpVal += (long)ADCW * (long)ADCW;
}
//----------
void main(void)
{
// Global enable interrupts
#asm("sei")
while (1)
{
if (enCalc)
{
MsrVal = tmpVal;
tmpVal = 0;
Val = (unsigned int) lsqrt(MsrVal/100L);
enCalc = 0;
}
}
}
Ну вот как-то так, наверное можно и проще, но вродь и так не сильно сложно.
