WatchCat писал(а):Вроде у нее внутренний генератор на 1мгц работает?
С завода - 1, перешить можно на 2, 4, 8
WatchCat писал(а):И действительно - коэффициент заполнения ШИМа это не совсем то, что действующее значение.
Ну да, к-т заполнения это фактически среднее значение, а действующее - среднеквадратичное, корень_квадратный_из(суммы_квадратов, делённой на число_точек).
Проблема в том, что если длительности меняются мало, то как не крути - будет тяжело.
WatchCat писал(а):Пробовал делать ФНЧ на двух ОУ. Постоянную времени сделал максимально возможную по условиям чувствительности к изменениям сигнала.
ФНЧ даст среднее значение, а не действующее. Хотя, думаю, нужно всё же среднее, врядли в исполнительном устройстве стоял true-rms детектор.
WatchCat писал(а):Все равно имеет место значительная пульсация выходного напряжения и показания АЦП прыгают на 5-7 единиц, что меня не устраивает.
А дофильтровывать сигнал с АЦП с той же постоянной времени 0,1с?
WatchCat писал(а):Надо бы найти методику измерения среднего значения методом аналого-цифрового преобразования и последующих вычислений площади под кривой. Ну и рассматривать вход контроллера как однобитный АЦП - почему бы и нет собственно...
Так для этого достаточно длительностей импульса и паузы, сигнал-то однобитный

.
Т.е. если есть N точек амплитудой 1, то площадь всяко будет 1*N.
Так что задача всё равно сводится к измерению времён.
500Гц частота небольшая. Даже на 1МГц тактирования должно легко всё получиться.
Используем ICP таймера1 и прерывания от него.
Таймер настраиваем на такое тактирование, что самый длинный возможный период входного сигнала гарантированно меньше периода переполнения таймера, но чтобы была достаточная точность. При тактовой 1МГц и прескалере clk/1 для 500Гц период будет 2000 тактов, импульс 400-500 тактов. Віглядит неплохо, но вопрос в том, насколько меняютя эти длительности - хватит ли точности измерения
изменения. Ради этого может быть нужно поднять частоту тактирования контроллера до 8МГц и иметь 16000 тактов на период, 3200-4000 тактов на импульс.
Код: Выделить всё
uint16_t prev_icr; // глобальная переменная
В прерывании от ICP инвертируем бит ICES1 в регистре TCCR1B, чтобы в следующий раз отреагировать по другому перепаду (прерывания по обеим перепадам у меги8 просто нет).
Код: Выделить всё
uint16_t new_icr = ICR1;
uint16_t delta = new_icr - prev_icr;
prev_icr = new_icr;
delta - это длительность предыдущего состояния, в зависимости от того, какое значение у бита ICES1 - длительность 0 или 1.
Видимо, это то, что написано в той апноте.
Если у нас есть две длины - len0 дя нулей и len1 для единиц, то среднее значение за период будет len1/(len0+len1), среднеквадратичное (aka действующее, эффективное) - sqrt( len1*len1/(len0+len1) );
Чтобы не уходить на плавающую точку, надо смасштабировать для вычислений с фиксированной точкой. Квадратный корень из целого числа вычисляется за время, немногим большее одного целочисленного деления соответствующей разрядности.
Я так понимаю, что проблема в дрожании, дающем шумовой эффект.
Сейчас я чайку заварю...
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.