Игорь 2
Трансиверы, передатчики, РПУ => Software Defined Radio (SDR) => Тема начата: ra0ahc от Сентябрь 20, 2021, 01:30:31 pm
-
Давно хотел сделать, точнее избавится от STEP перестройки частоты в радио. В icom это сделано. Чем мы хуже.
На эту мысль меня натолкнуло то, что приходится подстраивать кратно кГц и ли у меня 330 импульсов на оборот то это капец как сложно, а тыкать степ ...ну как-то уже не времена переменных кондеров, можно поизголятся на программным кодом.
Вижу так :
короткий стоп на 000 гц всего несколько импульсов (если идет плавная подстройка).
cw ssb разный стартовый шаг 1 гц и 5 гц
переменный степ по таймеру
пропуск импульсов при медленной настройке
...
пока все, что в голову пришло lol22
-
Если я правильно понял Вашу мысль, Вы хотите делать адаптивный шаг перестройки валкодера. В сущности это же давно применяется, к примеру, у меня в 80-х при самодельном валкодере с 32 по-моему, импульсами на оборот, стартовый шаг был 10 Гц, потом - 1 кГц, далее - 10 кГц. На валу сидел маховик, и всё было более-менее приемлемо.
Сейчас везде работают в качестве опоры синтезы от Андрея UR3ILF, четно говоря, особо не въезжал в алгоритм, но всё вполне себе приемлемо, шаг там тоже адаптивный, но маховиков на валкодере нет.
Начальный шаг - те же 10 Гц... 1yep dontt44 lol22
-
Зачем пропускать импульсы при медленном вращении ручки?
Можно сделать умножение начального шага.
Такой алгоритм используют на AVR.
Таймер в режиме счёта запускается при любом изменении состояния валкода. Причём начальное число отсчёта до переполнения задаётся в установках и это число присваивается таймеру при каждом изменении состояния валкода. Непосредственно в обработчике валкода байт используемый для умножения шага всегда инкриминируется. А в прерывании по переполнению таймера наоборот декриминируется и если этот байт умножения равен 1 то таймер останавливается.
Работает так.
Первый заход в обработку байт умножения равен 1. Шаги перестройки не умножаются. Следом множитель шага+1 байт умножения = 2 и запускается таймер например с числа 25 а переполнение по 255. Время счёта до переполнения условно пусть для примера будет 50мс.
Если за это время переполнения таймера не было но произошла смена состояния валкодера то шаг перестройки х2 и на следующую обработку множитель инкриминировался и стал = 3 а таймер сбросился на 25.
Если между сменой состояния валкода было переполнение таймера то множитель -1 каждые условные 50мс пока множитель не станет равен 1 и таймер останавливается.
Такой алгоритм удобно по диапазону пробежаться за него не вылетая.
Можно сделать сравнение до сколько досчитал таймер между сменой состояния валкода и сделать таблицу выбирая шаг в зависимости сколько таймер насчитал. Удобнее считать и умножать байт так как код получается компактнее и быстрее работает на AVR. Потому что работать с байтом быстрее и проще чем с кучей сравнений.
-
Начальный шаг - те же 10 Гц...
Не пойдет, для телеграфа нужен шаг меньше чем 1Гц . Увы, уходим во float частоту (раньше хранилась в int). Шаг должен быть меньше 1 иначе ...лично я задолбался эти 000 гц выставлять...пролетаю.
-
расчет степа
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;
}
-
Вот так нормально рыскать. Ручку если умеренно дергать то рысканье происходит в малых диапазонах. Если быстрее, то степ сам набрасывается. Но если остановится то степ постепенно сам вниз улетает до 0.5Гц.
Пока не пробовал ...станций еще нет в эфире.
-
Таймер в режиме счёта запускается при любом изменении состояния валкода. Причём начальное число отсчёта до переполнения задаётся в установках и это число присваивается таймеру при каждом изменении состояния валкода.
Это в стм сделано а HAL я просто считываю константу и там уже импульсы посчитаны (формат uint32_t)
-
вот в принципе подпрограмма изменения частоты
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;
}
-
Первый заход в обработку байт умножения равен 1. Шаги перестройки не умножаются. Следом множитель шага+1 байт умножения = 2 и запускается таймер например с числа 25 а переполнение по 255. Время счёта до переполнения условно пусть для примера будет 50мс.
ну что то подобное только без таймеров. Чисто на скорости вращения.
-
Чисто на скорости вращения.
Как без точного временного интервала узнать скорость вращения? И зачем шаг 0,5 герца? Перестройка шагом 1 герц тоже не слышна. 5 герц начальный шаг нормально. И даже 10. А чтоб последний ноль не ловить надо младший разряд индикации частоты убрать. 123123
А вообще настраиваться в ноли до седьмого знака это мода нынче такая. Я по привычке на слух настраиваюсь а сколько там на шкале ни на что кроме проблем в башке не влияет.
-
И зачем шаг 0,5 герца? Перестройка шагом 1 герц тоже не слышна. 5 герц начальный шаг нормально. И даже 10.
Согласен, но у меня 360 импульсов на оборот. так что мне никак 10гц
-
Все поменял после прослушивания эфира 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;
}
-
Правда теперь, если оперативно перестраиваешься, то надо смотреть на панораму nea33 можно пролететь.
-
Ввел задержку на начало ускорения и вроде нормуль. После остановки обнуляется все и восстанавливается задержка, тоже при реверсе. Вот так нормуль и можно крутить.
Осталось сделать на 000Гц остановочку.
-
А вообще, этот алгоритм должен созреть.
Пока у меня нет ручки, просто вал на энкодере и это не понятно.
Завтра попробую купить ручку для полного контакта. Тогда и продолжу алгоритм.
-
Только такой есть в нашем сельпо 44443
-
Ну после тестов adm алгоритм пошёл в помойку.
-
dontt44 cr123
С трудом понимаю, что там у Вас, но я со второй иттерации принял то, про что выше писал...
-
Пока пальцами крутил вал энкодера было одно , а когда Крутик поставил вообще все плохо стало ))) улетает капец куда и ускорение очень быстрое. Надо дорабатывать алгоритм.
-
Это ещё шишечка пустотелая, была бы увесистая…
-
У меня с маховиком была.... cr123
-
У меня с маховиком была.
Современные валкодеры в основном на подшипниках. Даже с обычной ручкой он чуть ли не минуту будет крутиться. У себя наоборот под ручку ваты напихал, что бы чуть притормаживало. И при перестройке внутри диапазона, при шаге 10 Гц, никакого умножения или пропуска шагов не требуется. А перегонять на другой диапазон валкодером, просто нет смысла. У меня 128 импульсов на оборот. Шаг и по фронту, и по тылу импульса. Почти 3 кГц на оборот. Собственно близко к этому у меня и на старом трансивере было. Увеличение шага перестройки при быстром вращении, в настройках предусмотрено. Но пользоваться этим не очень понравилось.
-
была бы увесистая
У меня такая же на дополнительной ручке настройки стоит. Так же пришлось принимать меры для притормаживания. Может у меня сами валкодеры чуть другие. Без подтормаживания, они по моему просто от дуновения воздуха крутиться будут.
-
На самом деле возможно так и есть… эта функция не нужна. К тому же у меня на экране если тыкать пальцем в край то перестройка на 40 кГц идёт и скорость нажатия любая. Если и нужно это делать то в небольших приделах… скажем … шаг максимум 10 гц (по умолчанию 5 для ссб) если у меня 360 импульсов на оборот то это 3600 на оборот … практически перестройка на следующую станцию )))
-
У вас валкодер на шариковых подшипниках, ход очень легкий. Я под шишечку тонкий войлок подкладывал чтобы убрать эффект маховика
-
Методы торможения разные )) можно смазку на жесткую в подшипниках поменять и тоже затормозится вал. Эти энкодеры сделаны для длительной работы на производственных линиях и они обязаны легко крутится.
Но тема не про это. На самом деле при 360 импульсах тяжко на 1 импульс повернуть вот поэтому и надо пропуски делать при малых изменениях или рысканиях туда сюда
-
Я делитель собирал.
-
Вот так получилось нормально. при ssb степ начинает с 5 гц и может достигать 100 гц на один импульс что равно 36кГц за один оборот. Причем, если на мгновение остановится и продолжить вращать, то скорость падает плавно или вообще не падает, зависит от "мгновения". На этом я запоролся в первых вариантах алгоритма и только сейчас исправил. Мягко работает, без скачков. Если меняется направление, то сразу степ скидывается по умолчанию.
при CW степ начинается от 1Гц
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;
delay = 30;
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 (delay)
delay--;
else {
if (df > 1 && df < 5) {
if (level + 0.5f < 100.0f) level += 0.5f;
} else if (df >= 5) {
if (level + 0.7f < 100.0f) level += 0.7f;
}
}
return level;
}
-
Пока непонятно как сделать короткий стоп на 000 частоте.
-
Вот так получилось нормально.
У Геннадия Завидовского примерно так сделано в его воробье. Просто сказка. 1999 На 1000-ке приходится привыкать кнопку FAST нажимать. dontt44
Пока непонятно как сделать короткий стоп на 000 частоте.
А оно надо?