Как правильно найти RMS на микроконтроллере ARM 7 LPC?

Я пытаюсь найти среднеквадратичное значение входной синусоиды, используя микроконтроллер ARM 7 LPC 2119. Я знаю теорию, лежащую в основе нахождения среднеквадратичного значения такой формы волны, но у меня возникают проблемы с реализацией этого в коде, особенно с выборкой на равном расстоянии друг от друга. Я также только что использовал прерывания таймера, чтобы найти частоту синусоидальной волны, используя входы захвата, поэтому я знаю об основных функциях с точки зрения программирования микроконтроллера ARM 7 LPC 2119.

введите описание изображения здесь

Я тестирую эту функцию, используя размах синусоиды 3 В с частотой 50 Гц. Я сместил сигнал вверх на 1,5 В, чтобы избежать попадания отрицательных значений на выводы АЦП микроконтроллера.

Для выборки через равные промежутки времени я использую прерывания по таймеру, очень похоже на этот пример здесь . Вместо включения светодиода я делаю преобразование АЦП.

Прежде чем использовать следующую формулу:

введите описание изображения здесь

Мне нужно убедиться, что я делаю выборку с заданными интервалами, и чтобы проверить это, я установил свои часы таймера, чтобы обеспечить задержку в 20 мс перед входом в функцию АЦП, сделав это следующим образом:

T0CTCR = 0x0; //Set Timer Mode
T0PR = 60000-1; //Increment T0TC at every 60000 clock cycles
//60000 clock cycles @60Mhz = 1 mS

T0MR0 = 21-1;   //Zero Indexed Count-hence subtracting 1
T0MCR = (1<<0) | (1<<1);//Set bit0 & bit1 to Interrupt & Reset TC on MR0  

Как только это будет сделано, я включу прерывание по таймеру:

  VICVectAddr0 = (unsigned )timer0ISR; //Pointer Interrupt Function (ISR)
  VICVectCntl0 = (1<<5) | 4; //(bit 5 = 1)->to enable Vectored IRQ slot 
  VICIntEnable = (1<<4); // Enable timer0 interrupt

Приведенный выше код дает задержку в 20 мс. При синусоиде с частотой 50 Гц это должно давать одно и то же значение при каждом считывании, поскольку период такой синусоиды также равен 20 мс. Однако это не так, и я не вижу видимой закономерности в своих результатах.

Функция АЦП, которую я использую, хорошо работает при напряжении постоянного тока, и я также могу подтвердить, что таймер действительно дает 20-мс задержку перед входом в функцию АЦП.

Я упускаю здесь что-то очевидное или могут быть какие-то другие переменные, которые я не принимаю во внимание? Любые идеи были бы хорошы.

Ответы (1)

Приведенный выше код дает задержку в 20 мс. При синусоиде с частотой 50 Гц это должно давать одно и то же значение при каждом считывании, поскольку период такой синусоиды также равен 20 мс. Однако это не так, и я не вижу видимой закономерности в своих результатах.

Хм...

Я упускаю здесь что-то очевидное или могут быть какие-то другие переменные, которые я не принимаю во внимание? Любые идеи были бы хорошы.

Время между выборками в 20 мс не годится для измерений с частотой 50 Гц, и да, поскольку частота переменного тока непостоянна (как и ваши часы), выполненные измерения могут дрейфовать в противофазе, казалось бы, случайным образом.

Посмотрите на эту синусоиду, полученную почти за тот же период:

введите описание изображения здесь

Это создает наложение, т. е. синий выходной сигнал должен быть постоянным, но небольшие различия в частоте дискретизации и синусоидальной волне вызывают колебания синего сигнала вверх и вниз на «разностной» частоте.

Если вы хотите правильно измерить среднеквадратичное значение с помощью дискретизации, вы должны выполнять дискретизацию на частоте около 1 кГц или выше, особенно если вы пытаетесь измерить среднеквадратичное значение переменного тока (гармонические искажения могут быть значительными).

Отличное описание... Я знаю, что должен делать выборку с гораздо большей частотой, но я думал, что первым шагом будет фактическое подтверждение того, что я могу делать выборку через определенные промежутки времени. Так вы предлагаете мне просто увеличить частоту дискретизации?
Не предлагает, а настаивает!
ТАК Я уменьшу задержку до 1 мс! Кроме того, какова будет ошибка для моего среднеквадратичного значения, если задержка таймера изменяется от 0,95 мс до 1,05 мс на протяжении всей выборки? Сильно ли это влияет на точность?
Это может привести к удивительно небольшим ошибкам, но лучший способ, который я нашел, — это использовать электронную таблицу для пробных сценариев. Вы также должны попробовать сценарии, в которых есть неточное количество выборок за цикл 50 Гц - это может привести к ошибкам, которые имеют тенденцию накапливаться, но могут, для расчета среднеквадратичного значения за цикл, выглядеть весьма ошибочно.