Доброго времени суток уважаемые Коты!
В программировании не силен так что прошу сильно не пинать)
У меня есть следующая задача- нужно мерять среднее значение переменного напряжения.теоретически я понимаю как это должно быть: 1. Получить через равные промежутки N отсчетов АЦП в течение одного периода измеряемого напряжения.
2. Возвести результаты в квадрат и просуммировать.
3. Извлечь квадратный корень из полученной суммы.
4. Умножить полученный результат на масштабирующий коэффициент и вывести результат на индикатор.
А практически долбусь уже второй день ниче не получается.Прошу Вашей помощи
А вы не пробывали использовать схему прецизионного выпрямителя на ОУ, с последующей подачей сигнала на АЦП МК.
ИтМХО только так, а всё программные уловки - пустая трата времени
1 int i; должна быть статик или volatile, кстати, где обнуление суммы результата измерения long int r, когда i=0 ?
2. Зачем там массив, так и не понял.
3. все долгоиграющие процессы выполнять в основном цикле, в прерывании ставится флаг готовности, который в этом же цикле и анализируется. У Вас же в основном цикле идет вывод непонятно чего. Вывод должен идти после того, как все посчитано.
4. Выражение long int r; с точки зрения си правильное, но зачем там знак, у Вас же только положительные числа.
Просто пишите unsigned long r , кстати, оно тоже volatile http://www.pic24.ru/doku.php/osa/articl ... r_chainiks
5. Приведение типов - "m+=ADCW*ADCW;//возводим в квадрат и записуем в массив"
Посмотрите отладчиком, что будет, если 1000 умножить на 1000 - удивитесь наверняка. Может, и нет - я плохо знаю кодевижин. Пробуйте приводить числа к разрядности результата -(unsigned long)ADCW*(unsigned long)ADCW
6. Где извлечение квадратного корня, деление на количество градаций и умножение на младший разряд, тоже не увидел.
7. Данный вариант подходит для измерения выпрямленного переменного напряжения, для не выпрямленного чуть по-другому.
8.Слово реле пишется с одним л , простите за занудство.
Это что в глаза бросилось, детально не анализировал.
--------------------------------------------------------------------------------------------
С праздником 23 февраля, мужики !!!!
urry писал(а):
7. Данный вариант подходит для измерения выпрямленного переменного напряжения, для не выпрямленного чуть по-другому.
А именно : вычисляется среднее арифметическое N отсчетов, и в квадрат возводится разность Ui - Uср. Тут уж массив как бы и нужен. Или разве что использовать среднее от предыдущих N отсчетов.
И еще важно взять целое число периодов, иначе результат будет значительно "прыгать" либо выборку придется выполнять на огромных интервалах.
И кстати, это не СРЕДНЕЕ значение, а СРЕДНЕКВАДРАТИЧНОЕ. Все же, понятия сильно отличаются.
Среднее значение синусоидального переменного напряжения равно нулю, среднеквадратичное - корень из двух помноженный на амплитуду.
Кстати, если сигнал строгой синусоидальной формы, достаточно измерять амплитуду(ищем максимальное значение среди выборок на интервале равном 2-м периодам исследуемого сигнала) и умножить на корень из двух...
Alexeyslav писал(а):достаточно измерять амплитуду.... и умножить на корень из двух..
Поделить..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]