Регуль для бор-машинки: о фильтрации сигналов и т.п.

github.com/speedcontrols/ac_sc_grinder (точную ссылку на файл и строчки не даю, т.к. по окончании отладки будем чистить историю).

Практика показала, что сигнал на выходе АЦП имеет свойство прыгать, и поэтому есть смысл чистить резкие скачки. Делается это обычно медианным фильтром. К сожалению, мне не удалось найти готовых быстрых библиотек с учетом особенностей эмбедов, поэтому желающим советую смотреть тут (вариант от Ekstrom). Мне не очень понравилось, что над быстрой имплементацией надо “думать”, чтобы понять как она работает. Поэтому решил пойти другим путем - разобраться с truncated mean (или как его там). Кто забыл школьные лабораторки по физике, напомню:

  • Считаем дисперсию измерений (среднеквадратичное отклонение от среднего арифметического).
  • Отбрасываем все, что вылезло за пределы допустимого и усредняем еще раз.

У меня на глаз получилось что при 8 отсчетах и отклонении 1.1*sigma выходит вполне приличный результат. По затратам - 2 полных прохода по массиву данных (в данном случае - по кольцевому буферу). На первом проходе считается среднее арифметическое и дисперсия, на втором - отбрасывается лишнее и усредняется остаток. Итого:

  • Оптимизированное truncated mean чуть медленнее оптимизированной медианы (меньше чем в полтора раза), но код намного понятнее.
  • Есть “встроенный усреднятор”, который теоретически должен скакать меньше медианы. На самом деле не факт и вопрос филосовский.
  • Затраты на вычисления стабильные.
  • Если процессор с навороченными кешами - тут только чтение, запись вообще отсутствует.

Теперь про сами измерения. Есть нюансы с точностью измерения напряжения и тока, когда они переходят через ноль. С практической точки зрения, получилось так:

  • Симистор открывается слегка не симметрично на положительной и отрицательной полуволне. Надо мерять не только длину полуволны, но и длину полного периода, а потом смотреть расхождение и компенсировать разницу.
  • В новой схеме (в отличие от макетки) применили усилитель для токового шунта, а у него выход никогда не становится 0 (есть малюсенькое смещение, хоть операционник и специализированный). В коде напряжение можно сравнивать с 0, а ток - нет. Ну тоже примерно понятно как лечить.

Пока все. Победа близка 😃

  • 723
Comments
RW9UAO

tqfp.org/…/mediannyy-filtr-na-sluzhbe-razrabotchik…
пользуюсь этим и на 8мибитках и на кортексах.
глубину приходится подбирать экспериментально, часто хватает 3.

Vitaly

Там в начале автор сам пишет, что статья - практически дословный перевод той, на которую я дал ссылку.

RW9UAO

на русском более понятно =)