Я пытаюсь найти среднеквадратичное значение входной синусоиды, используя микроконтроллер 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-мс задержку перед входом в функцию АЦП.
Я упускаю здесь что-то очевидное или могут быть какие-то другие переменные, которые я не принимаю во внимание? Любые идеи были бы хорошы.
Приведенный выше код дает задержку в 20 мс. При синусоиде с частотой 50 Гц это должно давать одно и то же значение при каждом считывании, поскольку период такой синусоиды также равен 20 мс. Однако это не так, и я не вижу видимой закономерности в своих результатах.
Хм...
Я упускаю здесь что-то очевидное или могут быть какие-то другие переменные, которые я не принимаю во внимание? Любые идеи были бы хорошы.
Время между выборками в 20 мс не годится для измерений с частотой 50 Гц, и да, поскольку частота переменного тока непостоянна (как и ваши часы), выполненные измерения могут дрейфовать в противофазе, казалось бы, случайным образом.
Посмотрите на эту синусоиду, полученную почти за тот же период:
Это создает наложение, т. е. синий выходной сигнал должен быть постоянным, но небольшие различия в частоте дискретизации и синусоидальной волне вызывают колебания синего сигнала вверх и вниз на «разностной» частоте.
Если вы хотите правильно измерить среднеквадратичное значение с помощью дискретизации, вы должны выполнять дискретизацию на частоте около 1 кГц или выше, особенно если вы пытаетесь измерить среднеквадратичное значение переменного тока (гармонические искажения могут быть значительными).
ррз0
Энди ака
ррз0
Энди ака