Трансиверы, передатчики, РПУ > Software Defined Radio (SDR)
Умный валкодер в радиостанции
ra0ahc:
Давно хотел сделать, точнее избавится от STEP перестройки частоты в радио. В icom это сделано. Чем мы хуже.
На эту мысль меня натолкнуло то, что приходится подстраивать кратно кГц и ли у меня 330 импульсов на оборот то это капец как сложно, а тыкать степ ...ну как-то уже не времена переменных кондеров, можно поизголятся на программным кодом.
Вижу так :
короткий стоп на 000 гц всего несколько импульсов (если идет плавная подстройка).
cw ssb разный стартовый шаг 1 гц и 5 гц
переменный степ по таймеру
пропуск импульсов при медленной настройке
...
пока все, что в голову пришло lol22
Игорь 2:
Если я правильно понял Вашу мысль, Вы хотите делать адаптивный шаг перестройки валкодера. В сущности это же давно применяется, к примеру, у меня в 80-х при самодельном валкодере с 32 по-моему, импульсами на оборот, стартовый шаг был 10 Гц, потом - 1 кГц, далее - 10 кГц. На валу сидел маховик, и всё было более-менее приемлемо.
Сейчас везде работают в качестве опоры синтезы от Андрея UR3ILF, четно говоря, особо не въезжал в алгоритм, но всё вполне себе приемлемо, шаг там тоже адаптивный, но маховиков на валкодере нет.
Начальный шаг - те же 10 Гц... 1yep dontt44 lol22
zenit:
Зачем пропускать импульсы при медленном вращении ручки?
Можно сделать умножение начального шага.
Такой алгоритм используют на AVR.
Таймер в режиме счёта запускается при любом изменении состояния валкода. Причём начальное число отсчёта до переполнения задаётся в установках и это число присваивается таймеру при каждом изменении состояния валкода. Непосредственно в обработчике валкода байт используемый для умножения шага всегда инкриминируется. А в прерывании по переполнению таймера наоборот декриминируется и если этот байт умножения равен 1 то таймер останавливается.
Работает так.
Первый заход в обработку байт умножения равен 1. Шаги перестройки не умножаются. Следом множитель шага+1 байт умножения = 2 и запускается таймер например с числа 25 а переполнение по 255. Время счёта до переполнения условно пусть для примера будет 50мс.
Если за это время переполнения таймера не было но произошла смена состояния валкодера то шаг перестройки х2 и на следующую обработку множитель инкриминировался и стал = 3 а таймер сбросился на 25.
Если между сменой состояния валкода было переполнение таймера то множитель -1 каждые условные 50мс пока множитель не станет равен 1 и таймер останавливается.
Такой алгоритм удобно по диапазону пробежаться за него не вылетая.
Можно сделать сравнение до сколько досчитал таймер между сменой состояния валкода и сделать таблицу выбирая шаг в зависимости сколько таймер насчитал. Удобнее считать и умножать байт так как код получается компактнее и быстрее работает на AVR. Потому что работать с байтом быстрее и проще чем с кучей сравнений.
ra0ahc:
--- Цитата: Игорь 2 от Сентябрь 20, 2021, 02:32:07 pm ---Начальный шаг - те же 10 Гц...
--- Конец цитаты ---
Не пойдет, для телеграфа нужен шаг меньше чем 1Гц . Увы, уходим во float частоту (раньше хранилась в int). Шаг должен быть меньше 1 иначе ...лично я задолбался эти 000 гц выставлять...пролетаю.
ra0ahc:
расчет степа
static float32_t getStep(int16_t df){
if(df==0) {
if(level>1.0f) {
if(level<10) level-=0.1f;
else level-=2.0f;
}
return 0;
}
df= abs(df);
if( trx.trx[trx.activRX][trx.nowBandNN[trx.activRX]][MODE] ==CW){
df/=2;
}
if(df==0) df=1;
if (level + (float32_t) df / 2 < 100.0f) level += (float32_t) df / 8;
return level;
}
Навигация
Перейти к полной версии