Автор Тема: Умный валкодер в радиостанции  (Прочитано 14990 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Умный валкодер в радиостанции
« : Сентябрь 20, 2021, 01:30:31 pm »
Давно хотел сделать, точнее избавится от STEP перестройки частоты в радио. В icom это сделано. Чем мы хуже.
На эту мысль меня натолкнуло то, что приходится подстраивать кратно кГц и ли у меня 330 импульсов на оборот то это капец как сложно, а тыкать степ ...ну как-то уже не времена  переменных кондеров, можно поизголятся на программным кодом.

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

...
пока все, что в голову пришло  lol22
Да да, я знаю, у меня ничего не получится )))

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 20747
Re: Умный валкодер в радиостанции
« Ответ #1 : Сентябрь 20, 2021, 02:32:07 pm »
Если я правильно понял Вашу мысль, Вы хотите делать адаптивный шаг перестройки валкодера. В сущности это же давно применяется, к примеру, у меня в 80-х при самодельном валкодере с 32 по-моему, импульсами на оборот, стартовый шаг был 10 Гц, потом - 1 кГц, далее - 10 кГц. На валу сидел маховик, и всё было более-менее приемлемо.
Сейчас везде работают в качестве опоры синтезы от Андрея UR3ILF, четно говоря, особо не въезжал в алгоритм, но всё вполне себе приемлемо, шаг там тоже адаптивный, но маховиков на валкодере нет.
Начальный шаг - те же 10 Гц... 1yep dontt44 lol22
Ничего невозможного нет

Оффлайн zenit

  • Full Member
  • ***
  • Сообщений: 131
Re: Умный валкодер в радиостанции
« Ответ #2 : Сентябрь 20, 2021, 03:05:34 pm »
Зачем пропускать импульсы при медленном вращении ручки?
Можно сделать умножение начального шага.
Такой алгоритм используют на AVR.
Таймер в режиме счёта запускается при любом изменении состояния валкода. Причём начальное число отсчёта до переполнения задаётся в установках и это число присваивается таймеру при каждом изменении состояния валкода. Непосредственно в обработчике валкода  байт используемый для умножения шага всегда инкриминируется. А в прерывании по переполнению таймера наоборот декриминируется и если этот байт умножения равен 1 то таймер останавливается.
Работает так.
Первый заход в обработку байт умножения равен 1. Шаги перестройки не умножаются. Следом множитель шага+1 байт умножения = 2 и запускается таймер например с числа 25 а переполнение по 255. Время счёта  до переполнения условно пусть для примера будет 50мс.
Если за это время переполнения таймера не было но произошла смена состояния валкодера то шаг перестройки х2 и на следующую обработку множитель инкриминировался и стал = 3 а таймер сбросился на 25.
Если между сменой состояния валкода было переполнение таймера то множитель -1 каждые условные 50мс пока множитель не станет равен 1 и таймер останавливается.

Такой алгоритм  удобно по диапазону пробежаться за него не вылетая.
Можно  сделать сравнение до сколько досчитал таймер между сменой состояния валкода и сделать таблицу выбирая шаг в зависимости сколько таймер насчитал. Удобнее считать и умножать байт так как код получается компактнее и быстрее работает на AVR. Потому что работать с байтом быстрее и проще чем с кучей сравнений.

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #3 : Сентябрь 20, 2021, 03:45:30 pm »
Начальный шаг - те же 10 Гц...
Не пойдет, для телеграфа нужен шаг меньше чем 1Гц . Увы, уходим во float частоту (раньше хранилась в int). Шаг должен быть меньше 1 иначе ...лично я задолбался эти 000 гц выставлять...пролетаю.
 
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #4 : Сентябрь 20, 2021, 03:46:00 pm »
расчет степа

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;
}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #5 : Сентябрь 20, 2021, 03:47:51 pm »
Вот так нормально рыскать. Ручку если умеренно дергать то рысканье происходит в малых диапазонах. Если быстрее, то степ сам набрасывается. Но если остановится то степ постепенно сам вниз улетает до 0.5Гц.
Пока не пробовал ...станций еще нет в эфире.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #6 : Сентябрь 20, 2021, 03:50:18 pm »
Таймер в режиме счёта запускается при любом изменении состояния валкода. Причём начальное число отсчёта до переполнения задаётся в установках и это число присваивается таймеру при каждом изменении состояния валкода.
Это в стм сделано а HAL я просто считываю константу и там уже импульсы посчитаны (формат uint32_t)
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #7 : Сентябрь 20, 2021, 03:51:27 pm »
вот в принципе подпрограмма изменения частоты

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;


}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #8 : Сентябрь 20, 2021, 03:53:22 pm »
Первый заход в обработку байт умножения равен 1. Шаги перестройки не умножаются. Следом множитель шага+1 байт умножения = 2 и запускается таймер например с числа 25 а переполнение по 255. Время счёта  до переполнения условно пусть для примера будет 50мс.
ну что то подобное только без таймеров. Чисто на скорости вращения.
Да да, я знаю, у меня ничего не получится )))

Оффлайн zenit

  • Full Member
  • ***
  • Сообщений: 131
Re: Умный валкодер в радиостанции
« Ответ #9 : Сентябрь 20, 2021, 04:32:28 pm »
Чисто на скорости вращения.
Как без точного временного интервала узнать скорость вращения? И зачем шаг 0,5 герца? Перестройка шагом 1 герц тоже не слышна. 5 герц начальный шаг нормально. И даже 10. А чтоб последний ноль не ловить надо младший разряд индикации частоты убрать. 123123
А вообще настраиваться в ноли до седьмого знака это мода нынче такая. Я по привычке на слух настраиваюсь а сколько там на шкале ни на что кроме проблем в башке не влияет.
« Последнее редактирование: Сентябрь 20, 2021, 04:34:12 pm от zenit »

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #10 : Сентябрь 20, 2021, 04:51:21 pm »
И зачем шаг 0,5 герца? Перестройка шагом 1 герц тоже не слышна. 5 герц начальный шаг нормально. И даже 10.
Согласен, но у меня 360 импульсов на оборот. так что мне никак 10гц
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #11 : Сентябрь 20, 2021, 06:27:02 pm »
Все поменял после прослушивания эфира  lllol lllol

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;
}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #12 : Сентябрь 20, 2021, 06:29:01 pm »
Правда теперь, если оперативно перестраиваешься, то надо смотреть на панораму  nea33 можно пролететь.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #13 : Сентябрь 20, 2021, 07:19:50 pm »
Ввел задержку на начало ускорения и вроде нормуль. После остановки обнуляется все и восстанавливается задержка, тоже при реверсе. Вот так нормуль и можно крутить.
Осталось сделать на 000Гц остановочку.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: Умный валкодер в радиостанции
« Ответ #14 : Сентябрь 20, 2021, 08:02:16 pm »
А вообще, этот алгоритм должен созреть.
Пока у меня нет ручки, просто вал на энкодере и это не понятно.
Завтра попробую купить ручку для полного контакта. Тогда и продолжу алгоритм.
Да да, я знаю, у меня ничего не получится )))