Как стать автором
Обновить

Комментарии 23

Усреднять конечно хорошо, но простое усреднение влоб — ниочем, цифры будут все так же прыгать. Лучше всего это усреднение по методу подвижного окна, когда усредняются не тысячи каких-то отсчетов, а N последних. В результате получаем достаточно быструю и плавную цифру. Выбрав значение N пропорционально степени двойки можно ещё отказаться от операции деления заменив на сдвиг.
Если внедрять этот алгоритм в ваш готовый код, то проще всего это сделать с окном в 16 элементов на вход которого подаются ваши усреднённые значения. делал такое для измерения тока зарядки, шевеление на единицу было в 4-м знаке для 10 бит, а без него прыгали два последних знака.

Подавление дребезга сделано не очень… безусловные задержки в основном потоке — великое зло, ибо контроллер останавливается на это время и не реагирует ни на что(кроме прерываний). Гораздо надёжнее и проще — фиксировать реальное состояние кнопок в таймере с периодом опроса 50мс это гарантирует отсутствие влияния дребезга пока он меньше 50мс(у нормальных кнопок он меньше 10мс, у герконовых — порядка 1мс). Главное делать это ОДИН раз за цикл опроса. Там же можно считать количество циклов и определять «короткое нажатие», «длинное нажатие» реализовать автоповтор и т.д. устанавливать признак соответствующего нажатия в глобальной переменной а сбрасывать его только в программе в основном цикле.
Спасибо, буду иметь в виду. Тут проект крохотный, небольшие задержки и точность измерения в нем мне были не особо критичны.
Метод скользящего среднего имеет смысл когда частота измерений соизмерима с частотой изменения сигнала. Если же частота измерений намного превышает частоту изменения сигнала, то обычное усреднение прекрасно работает. Хотя в данном случае 2500 это перебор, особенно с учетом использования внутреннего источника опорного напряжения. Достаточно нескольких десятков.
Нет не работает. Цифры всё так же будут прыгать, усреднение сгладит только пиковые отклонения и то не до конца а основной шум на выход проходит без изменений. Скользящее среднее — это есть не что иное как самый настоящий ФНЧ, который сглаживает измеряемую величину и результат получается достаточно гладким.
Куда прыгать? Какой шум куда проходит?
Если мы имеем постоянную измеряемую величину на которую накладывается случайный шум, то ошибка измерения при обычном усреднении обратно пропорциональна корню от числа измерений. Таким образом чем больше число измерений, тем меньше «будет прыгать».
В случае если кол-во измерений больше нескольких десятков, то точность можно повысить путем отбрасывания измерений которые отличаются от среднего больше чем на 3 «сигмы», где «сигма» — среднеквадратическое отклонение.
Все вышеописанное относится и к квазипостоянному сигналу, когда частота измерений на несколько порядков выше частоты измеряемого сигнала.

В реальности же идеального случайного шума не бывает, и при простом усреднении без истории получается прыгающая фигня. А скользящее среднее справляется с задачей лучше, особенно в задаче визуализации измеренной величины для человека.
Вобщем-то, даже для скользящего и окна бывают разные, и фильтрация отклонений тоже актуальна.

А в чем заключается настройка антенны? Вы же вроде только герконом переключаете две антенны.


Подключение линии вход для цифрового сигнала от трансивера и тюнера

Не нашёл в тексте этого момента более подробно. Вы все четыре ноги через ADC мониторите?

Антенну настраивает тюнер MFJ-993 сам автоматически. У него есть разъем для пульта дистанционного управления, через который с ним общается моё устройство. Через этот разъём на пульт выдаются два сигнала: о том, что идёт автоматическая настройка и о том, что настройка прошла успешно. Эти сигналы в фирменном пульте просто подключаются к светодиодам красного и зеленого цвета. Я в своей конструкции вместо светодиодов подключаю оптроны и сигнал с них подаю на МК. Герконовое реле эмулирует кнопку переключения антенн на пульте дистанционного управления. Если вы хотите понять как этот пульт работает посмотрите документацию на пульт и тюнер MFJ.

От трансивера идут сигналы по линиям BAND DATA, они постоянно мониторятся в МК. Они логические 0\5В, считываются напрямую, а не через ADC.
НЛО прилетело и опубликовало эту надпись здесь
Видимо, по тексту не ясно, что герконовое реле не ВЧ сигнал коммутирует, а просто эмулирует кнопку на пульте дистанционного управления. Сама коммутация антенн идёт внутри тюнера MFJ. Таким образом, в пульте ВЧ никак не присутствует. По всем линиям с тюнером гальваническая развязка (кроме земли) через оптроны и реле. По цепям питания дроссели стоят и ферритовыми кольцами все шлейфы увешаны. Но это не тема данной статьи, я писал про программную часть.

Да, именно это не ясно, уже написал комментарий, хорошо, что не отправил.
А что с родным пультом случилось, почему вы его решили заменить?

С родным все хорошо. Но там надо кнопку руками нажимать при смене диапазона. А тут всё автоматом делается. Это и стало поводом для разработки устройства.
что герконовое реле не ВЧ сигнал коммутирует

Ок, с этим понятно. Недочитал…
Но это не тема данной статьи

Код кодом, а описываете наверно устройство, его и обсуждаем. Хорошо бы экранировать все это дело в обязательном порядке. Сколько было случаев, когда сгорали электронные CW ключи, секвенсоры на МК и т.д. И тут вариантов всего два: либо не использовать МК в полях антенн, либо тщательно бороться с различными наводками не только ферритами.
Я вот не понимаю смысла публикации…
«Чуваки, я знаю AVR» и куски кода. Ни схемы, ни кода ни прошивки. Где польза?
Забирать показания ALC с входа «ALC IN», это что то новое. Всегда думал что «ALC IN» (исходя из названия) это вход для указания трансиверу от усилителя, что нагрузка не оптимальна и стоит снизить мощность.

При всем уважении, для переключения антен обычно используют переключатель. Да, вот так тупо и просто — обычный едри его в корень механический переключатель. А AVR вообще читерский микроконтроллер. Он как плевок в душу всем кодерам на z80,i51,x86,pic. 32 регистра. Команда за такт. Да нихрена себе, если б мне такое в школе показали, я бы щаз тоже double'ми в прошивках сыпал.

Механическим переключателем можно спалить выход усилителя, который может оказаться не способен работать без антенны случайно задев переключатель во время передачи.
> UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );

Чего люди только не делают, лишь бы не использовать битовые поля и нормальные называния.
А какое преимущество даст испоьзование битового поля?
Читаемость и поддерживаемость кода? Этого вам недостаточно?

Можете привести пример реализации этого с помощью битового поля?

Быстро в браузере по памяти и быстрым гуглением набросал:

typedef struct {
      uint8_t registerSelect : 1;
      uint8_t modeSelect : 1;
      uint8_t parityMode : 2;
      uint8_t stopBitSelect : 1;
      uint8_t characterSize : 3;
      uint8_t clockPolarity : 1;
} UCSRC_t;

#define USART_CHAR_SIZE_8BIT 3;

#define USART (*(volatile UCSRC_t*)_SFR_MEM_ADDR(UCSRC))

# сам код
USART.registerSelect = 1;
USART.characterSize = USART_CHAR_SIZE_8BIT;
Интересно посмотреть во что это оттранслируется. Есть у меня подозрение, что из-за того что USART у нас volatile это приведет к тому, что в место одной записи в регистр, как было в оригинальном коде, будет будет 2 чтения, 2 NOT, 2 OR и 2 записи обратно. Что для мелких контроллеров достаточно рессурсоемко как с точки зрения размера бинарника (флеша там кот наплакал) так и по скорости выполнения.
Зависит от оптимизаций компилятора — некоторые умеют оптимизировать в одну инструкцию, некоторые нет.

С другой стороны это код изначальной инициализации — он выполняется один раз, кол-во инструкций не так и важно. Плюс если действительно нужна оптимизация по тактам — это тоже несложно организовать.

Но почему-то в большинстве кода который я встречал под микроконтроллеры — люди совсем не задумываются о качестве кода, при этом оправдывают это якобы большим кол-вом инструкций/тактов не смотря на то что это лимитирующим фактором не является — преждевременная оптимизация как она есть.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации