Форум Радиолюбителей

Умный валкодер в радиостанции

45569 просмотров, 30 ответов — стр. 1 из 2

ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 01:30#1
Давно хотел сделать, точнее избавится от STEP перестройки частоты в радио. В icom это сделано. Чем мы хуже.
На эту мысль меня натолкнуло то, что приходится подстраивать кратно кГц и ли у меня 330 импульсов на оборот то это капец как сложно, а тыкать степ ...ну как-то уже не времена переменных кондеров, можно поизголятся на программным кодом.

Вижу так :
короткий стоп на 000 гц всего несколько импульсов (если идет плавная подстройка).
cw ssb разный стартовый шаг 1 гц и 5 гц
переменный степ по таймеру
пропуск импульсов при медленной настройке

...
пока все, что в голову пришло
Игорь 2
Сообщений: 21288
20 сентября 2021 г. в 02:32#2
Если я правильно понял Вашу мысль, Вы хотите делать адаптивный шаг перестройки валкодера. В сущности это же давно применяется, к примеру, у меня в 80-х при самодельном валкодере с 32 по-моему, импульсами на оборот, стартовый шаг был 10 Гц, потом - 1 кГц, далее - 10 кГц. На валу сидел маховик, и всё было более-менее приемлемо.
Сейчас везде работают в качестве опоры синтезы от Андрея UR3ILF, четно говоря, особо не въезжал в алгоритм, но всё вполне себе приемлемо, шаг там тоже адаптивный, но маховиков на валкодере нет.
Начальный шаг - те же 10 Гц...
zenit
Сообщений: 130
20 сентября 2021 г. в 03:05#3
Зачем пропускать импульсы при медленном вращении ручки?
Можно сделать умножение начального шага.
Такой алгоритм используют на AVR.
Таймер в режиме счёта запускается при любом изменении состояния валкода. Причём начальное число отсчёта до переполнения задаётся в установках и это число присваивается таймеру при каждом изменении состояния валкода. Непосредственно в обработчике валкода байт используемый для умножения шага всегда инкриминируется. А в прерывании по переполнению таймера наоборот декриминируется и если этот байт умножения равен 1 то таймер останавливается.
Работает так.
Первый заход в обработку байт умножения равен 1. Шаги перестройки не умножаются. Следом множитель шага+1 байт умножения = 2 и запускается таймер например с числа 25 а переполнение по 255. Время счёта до переполнения условно пусть для примера будет 50мс.
Если за это время переполнения таймера не было но произошла смена состояния валкодера то шаг перестройки х2 и на следующую обработку множитель инкриминировался и стал = 3 а таймер сбросился на 25.
Если между сменой состояния валкода было переполнение таймера то множитель -1 каждые условные 50мс пока множитель не станет равен 1 и таймер останавливается.

Такой алгоритм удобно по диапазону пробежаться за него не вылетая.
Можно сделать сравнение до сколько досчитал таймер между сменой состояния валкода и сделать таблицу выбирая шаг в зависимости сколько таймер насчитал. Удобнее считать и умножать байт так как код получается компактнее и быстрее работает на AVR. Потому что работать с байтом быстрее и проще чем с кучей сравнений.
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 03:45#4
Цитата: Игорь
Начальный шаг - те же 10 Гц...

Не пойдет, для телеграфа нужен шаг меньше чем 1Гц . Увы, уходим во float частоту (раньше хранилась в int). Шаг должен быть меньше 1 иначе ...лично я задолбался эти 000 гц выставлять...пролетаю.
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 03:46#5
расчет степа

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;
}
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 03:47#6
Вот так нормально рыскать. Ручку если умеренно дергать то рысканье происходит в малых диапазонах. Если быстрее, то степ сам набрасывается. Но если остановится то степ постепенно сам вниз улетает до 0.5Гц.
Пока не пробовал ...станций еще нет в эфире.
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 03:50#7
Таймер в режиме счёта запускается при любом изменении состояния валкода. Причём начальное число отсчёта до переполнения задаётся в установках и это число присваивается таймеру при каждом изменении состояния валкода.
Это в стм сделано а HAL я просто считываю константу и там уже импульсы посчитаны (формат uint32_t)
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 03:51#8
вот в принципе подпрограмма изменения частоты

void FREQ_encoderMain(void) {
if (TIM3->CNT == 0x7fff) {
getStep(0);
return;
}

f.deltafreqAndEnc = TIM3->CNT - 0x7fff;
TIM3->CNT = 0x7fff;//обнулим чтобы потом только дельту смотреть

int32_t a = (int32_t)((float32_t)f.deltafreqAndEnc * getStep(f.deltafreqAndEnc));// f.step;
if (trx.activRX) {
if (f.rx2 + a < 30000001 && f.rx2 + a > 500000) {
f.rx2 += a;//2
trx.trx[RX2][trx.nowBandNN[RX2]][FREQ] = f.rx2;
}
} else {
if (f.rx1 + a < 450000000 && f.rx1 + a > 500000) f.rx1 += a;//1
trx.trx[RX1][trx.nowBandNN[RX1]][FREQ] = f.rx1;
}
f.needToDraw = f.saveFPGA = YES;

}
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 03:53#9
Первый заход в обработку байт умножения равен 1. Шаги перестройки не умножаются. Следом множитель шага+1 байт умножения = 2 и запускается таймер например с числа 25 а переполнение по 255. Время счёта до переполнения условно пусть для примера будет 50мс.
ну что то подобное только без таймеров. Чисто на скорости вращения.
zenit
Сообщений: 130
20 сентября 2021 г. в 04:32#10
Чисто на скорости вращения.
Как без точного временного интервала узнать скорость вращения? И зачем шаг 0,5 герца? Перестройка шагом 1 герц тоже не слышна. 5 герц начальный шаг нормально. И даже 10. А чтоб последний ноль не ловить надо младший разряд индикации частоты убрать.
А вообще настраиваться в ноли до седьмого знака это мода нынче такая. Я по привычке на слух настраиваюсь а сколько там на шкале ни на что кроме проблем в башке не влияет.
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 04:51#11
И зачем шаг 0,5 герца? Перестройка шагом 1 герц тоже не слышна. 5 герц начальный шаг нормально. И даже 10.
Согласен, но у меня 360 импульсов на оборот. так что мне никак 10гц
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 06:27#12
Все поменял после прослушивания эфира

static float32_t getStep(int16_t df) {
float32_t def_level;
if (trx.trx[trx.activRX][trx.nowBandNN[trx.activRX]][MODE] == CW)
def_level = 1.0f;
else
def_level = 5.0f;

if (df == 0) {
level = def_level;
return 0;
}
if (direction && df < 0) {
direction = 0;
level = def_level;
}
if (!direction && df > 0) {
direction = 1;
level = def_level;
}

df = abs(df);
if (trx.trx[trx.activRX][trx.nowBandNN[trx.activRX]][MODE] == CW) {
df /= 2;
}
if (df == 0) df = 1;

if (df > 1 && df < 5) {
if (level + 0.5f < 100.0f) level += 0.5f;//(float32_t) df / 10;
} else if (df >= 5) {
if (level + 0.7f < 100.0f) level += 0.7f;//(float32_t) df / 10;
}
return level;
}
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 06:29#13
Правда теперь, если оперативно перестраиваешься, то надо смотреть на панораму можно пролететь.
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 07:19#14
Ввел задержку на начало ускорения и вроде нормуль. После остановки обнуляется все и восстанавливается задержка, тоже при реверсе. Вот так нормуль и можно крутить.
Осталось сделать на 000Гц остановочку.
ra0ahcra0ahc
Сообщений: 4868
20 сентября 2021 г. в 08:02#15
А вообще, этот алгоритм должен созреть.
Пока у меня нет ручки, просто вал на энкодере и это не понятно.
Завтра попробую купить ручку для полного контакта. Тогда и продолжу алгоритм.