они использовали модуль Software Debonce
Ну конечно, это программный устранитель дребезга контактов. Работает только с бинарными сигналами и с АЦП конечно работать не будет.
А это уже гораздо интереснее. Как спектр измеряли и чем?
а только в "узких" местах.
Я ранее писал о пораженных точках. Когда они возникают? Вот смотрите - два десятиразрядных числа:
0b1000000000 и 0b0111111111 Они отличаются на 1 в младшем бите. Мизер, правильно? Округляем оба числа до старшего разряда. Получаем 0b1000000000 и 0b0000000000. И они уже отличаются на 1 в старшем бите. А это уже огого! А мы всего лишь округлили числа. Понимаете? И интеграторы и фильтры тут не помогают. Да, они могут уменьшать количество пораженных точек, сводя их к минимуму, но не устраняют их совсем в силу специфики двоичного исчисления!
Тем не менее фильтр как-то работает. Да. Хоть некорректно, но как-то на пользу. Я тоже это заметил. Но после него тоже должны быть пораженные точки. И то, что мы их не чувствуем, может быть по двум причинам. Первая - за счет задержки в регулировке (а он должен ее давать, частота среза достаточно низкая). Ручку крутим туда-сюда, и все время их проскакиваем. Вторая - несовпадение этих точек с индексами переменных табличного массива.
Теперь про какой гистерезис я говорил... Смотрите объясняю алгоритм на пальцах. Допустим, зададимся гистерезисом в 4 единицы отсчета. Производим периодическое считывание АЦП с фиксированным периодом (поллинг). Объявляем переменную, в которой храним флаг знака регулировки. Сравниваем текущее значение АЦП с предыдущим. Если флаг положительный и текущее больше предыдущего, запоминаем текущее. Следущее текущее сравниваем с запомненным. Если оно больше и флаг положительный, записываем его в запомненное. И т. д. Если текущее меньше запомненного при положительном флаге, смотрим, насколько меньше. Если разница меньше гистерезиса - ничего не записываем. Смотрим следующий отсчет. Если опять меньше гистерезиса -опять ничего не делаем. И только если текущее становится меньше запомненного на величину гистерезиса или больше, записываем это значение и при этом перекидываем флаг знака регулировки в минус. Далее все тоже самое, только с изменеными знаками. Может сумбурно объяснил, но как-то так. В коде - проще! Немного похоже на способ устранения шумов квантования в старинных дельта или сигма-дельта модуляторах. Так называемое устранение шума незанятого канала. Сейчас такое наверное не применяется, наверное, но когда-то было актуально. Я когда-то занимался речевыми кодеками, но было это очень давно. Еще до вокодеров.
Можно привести механический аналог такого гистерезиса. Представьте себе обычный регулятор громкости, но ручка его имеет большой люфт, а у вас трясучка в руках (не про вас конечно, а чисто виртуально). Рука трясется (за рамки люфта трясучка не заходит) резистор стоит на месте. И только если осознанно начинам вращать, резистор крутится. Остановили. Резистор может еще повернуться чуть-чуть за счет тремора в руке. Но дальше будет работать люфт в ручке, защищающий резистор от поворота.
А вот спектрами вашими я очень заинтересовался! Очень странно, как регулировка может так влиять на спектр? Ну очень интересно! Конечно мы не знаем, на каком клоке работает эта управляющая билеберда. Или знаем? Наверняка в прерываниях по таймеру... Или под это у них там отдельное низкоскоростное ядро? Честно, я не изучал проц до такой степени. Чего изучать, если повлиять на все это все равно не можешь...
Времени, к сожалению, совершенно нет этим заниматься. А очень хочется.
Вот кусок кода гистерезиса:
C:
while (1)
{
U_inst = 0;
for (x=0;x<8;x++) U_inst += read_adc(0x01);
U_inst = U_inst >> 4;
delta_u = U_inst - U_curr;
if (Flag_direct == UP)
{
if (delta_u > 0)
{
U_curr = U_inst;
MA12070P_write(0x40, U_curr);
}
if (delta_u < -U_HIST)
{
Flag_direct = DOWN;
}
}
if (Flag_direct == DOWN)
{
if (delta_u < 0)
{
U_curr = U_inst;
MA12070P_write(0x40, U_curr + U_HIST);
}
if (delta_u > U_HIST)
{
Flag_direct = UP;
}
}
Это для регулировки MA12070P по I2C. С русской кодировкой нелады, но я не стал править... Ну это так, для примера...