Ну да так она и нужна была. =)Вы подаете на вход функцию Дирака, а не реальный сигнал. В результате имеете не фильтрацию сигнала, а АЧХ..
а с шумом что не так ? белый до фильтра красный после.Та же бодяга с шумом.

Ну да так она и нужна была. =)Вы подаете на вход функцию Дирака, а не реальный сигнал. В результате имеете не фильтрацию сигнала, а АЧХ..
а с шумом что не так ? белый до фильтра красный после.Та же бодяга с шумом.

А я правильно понял -- он начинает считать с момента подачи питания ведь?!Барсик писал(а):Исходники прилагаю. Файл adc8.c - обработка с размером буфера 8.
У меня смутное подозрение, что Вам просто не с кем поговорить...pokk писал(а):Ну да так она и нужна была. =)Вы подаете на вход функцию Дирака, а не реальный сигнал. В результате имеете не фильтрацию сигнала, а АЧХ..а с шумом что не так ? белый до фильтра красный после.Та же бодяга с шумом.
Еще и не такие чудеса получите, когда будете мерять линейность АЦП...Барсик писал(а): Странные результаты получились, когда на входе строгий ноль.
У меня изначально было много вопросов не только как фильтровать.Какое отношение измерение АЧХ фильтра имеет к самой фильтрации?
Теперь я всё выяснил благодарю за помощь.Даже вот тут в самом начале, не как не могу понять каким образом буфер является фильтром. и как будет рассчитать его ачх и параметры
Да. АЦП молотит непрерывно. Запускается каждую миллисекунду. Где-то за 200 микросекунд рассчитывается среднее значение. Бедный контроллер - так долго торчит в прерывании... Т.е. каждую миллисекунду у Вас есть результат усреднения методом того самого скользящего среднего, которое так все любят. Но это усреднение по 8 значениям. 16 значений - уже непозволительная роскошь для ATtiny13 - компилятор начинает орать, что размер стека уменьшился до опасной величины.просто КОТ писал(а):он начинает считать с момента подачи питания ведь?!
Нельзя ли здесь подробнее. Я правильно Вас понял - линейность надо измерять вблизи нуля? Если да, то лучше это делать в каких пределах, если вся шкала АЦП это 1,1 вольта.КРАМ писал(а):Еще и не такие чудеса получите, когда будете мерять линейность АЦП...
Да, кстати. Может, посоветуете правильную схемотехнику? А я её испытаю?КРАМ писал(а):Даже и не берусь комментировать чудесатости такой схемотехники...
У Вас в программе неверный алгоритм запуска АЦП, занесения результата в массив и вычисления среднего.Барсик писал(а):...Странные результаты получились...
Код: Выделить всё
1.1 прерывание timer0_compa_isr(void) // каждую миллисекунду аппаратно запускается АЦП
1.2 дрыганье PORTB.3, PORTB.4
1.3 суммирование ВСЕХ элементов массива
1.4 вычисление среднегоКод: Выделить всё
2.1.adc_isr(void)
2.2 дрыганье PORTB.1
2.3 запись результата АЦП в массивКакой алгоритм КРАМ посоветовал, такой я туда и забил.bolek писал(а):У Вас в программе неверный алгоритм запуска АЦП, занесения результата в массив и вычисления среднего.
Очень даже зависимо. В атмелах сделано так, что пока обрабатывается одно из прерываний, остальные запрещены. И если бы даже это было не так, то прерывания всё равно разнесены по времени. Вычисления в начале миллисекунлы, а считывание АЦП через 0,7 мс после этого. Не зря же я выводил отладочные импульсы - всё смотрел осциллографом.bolek писал(а):Независимо от этого:
Никакой неопределённости нет. Я суммирую в другом прерывании, когда элементы массива измениться не могут, по причине, указанной выше.bolek писал(а):Получается неопределенность в момент суммирования массива:
Согласен. Но я сначала решил обкатать алгоритм от КРАМ-аbolek писал(а):Вы пропустили очень полезный совет от Ser60
Инициализация некоторых переменных есть - она сделана при их объявлении. А инициализировать массив смысла нет, поскольку всё равно через 8 миллисекунд он будет переписан новыми значениями.bolek писал(а):В main помимо peripheralInit не хватает VariablesInit (инициализации переменных), в частности указателя массива и обнуления элементов массива.
Как мне представляется, ожидать чего-либо внутри прерывания - весьма хреновая практика.bolek писал(а):- отказался от прерывания adc_isr, заменив его ожиданием готовности результата АЦП в timer0_compa_isr
Мне кажется, один хрен. Всё равно придётся запретить прерывания на время обработки...bolek писал(а):- вычисления среднего вынес в main, по появлению флажка ResReady.
А в чем тут вопросы? Если источник изначально низкоомный и требования по точности устраивают, то можно просто подать сигнал на вход. Или если нужно, обычный повторитель на ОУ для понижения сопротивления источника сигнала вполне подойдет. Можно применить и ОУ с ФНЧ низкого порядка для подавления зеркальной полосы пропускания цифрового фильтра и отчасти боковых лепестков основной. Но это по показаниям. Смотря какая полоса у входного сигнала, какая частота дискретизации, какие вычислительные ресурсы у МК...Барсик писал(а):Может, посоветуете правильную схемотехнику? А я её испытаю?
Вот конкретные времена. Запуск АЦП осуществляется каждую миллисекунду. Результат считывается через 0,7 мс.КРАМ писал(а):Ваши вопросы на эту тему бессмысленны без конкретных просчетов времен...
1. Вам правильно представляется. Ожидать готовности в прерывании бессмысленно, как и вообще устраивать прерывания по таймеру для решения этой задачи. Я уже Вам писАл - лучший способ - запуск АЦП АППАРАТНО по переполнению таймера и БЕЗ прерываний от этого таймера. Таким образом, семплирование сигнала будет определятся ТОЛЬКО АППАРАТНЫМИ интервалами и никакой латентности входа в прерывание не будет. Тогда АЧХ фильтра будет стабильной.Барсик писал(а):Как мне представляется, ожидать чего-либо внутри прерывания - весьма хреновая практика.bolek писал(а):- отказался от прерывания adc_isr, заменив его ожиданием готовности результата АЦП в timer0_compa_isr
Мне кажется, один хрен. Всё равно придётся запретить прерывания на время обработки...bolek писал(а):- вычисления среднего вынес в main, по появлению флажка ResReady.
Спасибо за замечания. Наконец-то я получил ответ по существу...
Входное сопротивление АЦП не имеет никакого значения. Все зависит от схемотехники УВХ. Основной момент - заряд семплирующего конденсатора. Если в АВР есть повторитель перед ним, то тогда входное сопротивление определится им, а если нет, то постоянной времени заряда емкости хранения УВХ.Барсик писал(а):Измеряю постоянное напряжение. С интервалом в 1 секунду. Выходное сопротивление источника примерно 3 кОм. Входное сопротивление АЦП от мегаома и выше. Я добавил ещё 10 кОм и конденсатор 47 мкф на вход АЦП, чтобы постоянная времени была где-то 0,5 секунды. И что такого "чудесатого" в этой схемотехнике?
Вот конкретные времена. Запуск АЦП осуществляется каждую миллисекунду. Результат считывается через 0,7 мс.КРАМ писал(а):Ваши вопросы на эту тему бессмысленны без конкретных просчетов времен...
А оно так и есть. Таймер работает в режиме CTC. Этот режим от переполнения отличается только лишь тем, что таймер считает не до 255, а до значения, записанного в регистр OCR0A, после чего перезапускается сам (аппаратно!). И в этот момент запускается АЦП (опять же, аппаратно!). А строго через 13 тактов, результат преобразования готов. А прерывания от таймера к запуску АЦП не имеют отношения. В них я не спеша считаю среднее (и в это время никаких изменений в массиве быть не может!) и формирую импульсы для вывода результата на частотомер. Так что с латентностью и обработкой всё в порядке.КРАМ писал(а):лучший способ - запуск АЦП АППАРАТНО по переполнению таймера и БЕЗ прерываний от этого таймера.
Ну, тут Богом дан ATtiny13...КРАМ писал(а):Самый лучший вариант - это применение МК с внутрицикловым ДМА.
Надо будет, конечно, ещё покурить даташит, но что-то мне кажется, что нет там (ATtiny13) никакого УВХ... Самый лучший УВХ - большой-пребольшой конденсаторКРАМ писал(а):Все зависит от схемотехники УВХ.
.. может, но частота входного сигнала не должна превышать нескольких Герц ( вспоминается "дремучий" кр572пв1КРАМ писал(а):АЦП последовательных приближений В ПРИНЦИПЕ не может работать без УВХ.
... кр572пв1 может сносно работать при оцифровке сигнала термопары и чего-либо подобного без всяких УВХ, для остальных вещей без УВХ , конечно, не уедешь ........Его можно включить без УВХ, которого в нем нет, но это еще не означает, что результат будет удовлетворительный.
Вы полагаете???ChipKiller писал(а): ... кр572пв1 может сносно работать при оцифровке сигнала термопары и чего-либо подобного без всяких УВХ, для остальных вещей без УВХ , конечно, не уедешь ....
Согласен, не самое элегантное решение. Однако Ваше решение с прерыванием от АЦП вряд ли лучше:Барсик писал(а):...Как мне представляется, ожидать чего-либо внутри прерывания - весьма хреновая практика.
Я не столь подкован в фильтрации как КРАМ, однако, если обработка данных не успевает за темпом их поступления, значит что-то спроектировано неправильно:Барсик писал(а):Мне кажется, один хрен. Всё равно придётся запретить прерывания на время обработки...