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

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

Барсик писал(а):Исходники прилагаю. Файл 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 мс.КРАМ писал(а):Ваши вопросы на эту тему бессмысленны без конкретных просчетов времен...
Барсик писал(а):Как мне представляется, ожидать чего-либо внутри прерывания - весьма хреновая практика.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 может сносно работать при оцифровке сигнала термопары и чего-либо подобного без всяких УВХ, для остальных вещей без УВХ , конечно, не уедешь ....
Барсик писал(а):...Как мне представляется, ожидать чего-либо внутри прерывания - весьма хреновая практика.
Барсик писал(а):Мне кажется, один хрен. Всё равно придётся запретить прерывания на время обработки...