Автор |
Сообщение |
|
Дата: 20 Фев 2018 19:05:20
#
Пока вот вычитал, что частота VCO будет вычисляться как
RF OUT= fPFD*(INT+ (FRAC/MOD)),
где fPFD– частота на входе частотнофазового детектора .(Я так понимаю, что в данном случае это частота F ref, равная частоте кварца при чипе R820T, либо деленная на 2 частота кварца. то есть 28 или 14 мгц)
INT-регистр целого, FRAC- регистр дробности, MOD- модуль
// INT -это наш регистр целого [0x14]
// FRAC- это по всей видимости, двухбайтовое слово из регистра дробности[0x15] и [0x16]
А вот где прячется таинственный MOD и чему он здесь равен, пока остается загадкой.. Но если узнать его, то, похоже, и всё, можно было бы уже вычислять.
|
|
Дата: 20 Фев 2018 19:09:48 · Поправил: killer258 (20 Фев 2018 19:27:08)
#
и номер октавы видимо тоже должен гдето прописываться, в R82xx .
там между выходом VCO и смесителем стоит ещё один настраиваемый делитель , который может делить сигнал VCO либо на 8, либо на 4, либо на 2 , это задается двумя битами в регистре 0х10. Вот наверное, это оно самое и есть
И этот же регистр еще одним битом определяет - делить частоту опорного кварца на два или не делить перед подачей на вход фазового детектора сравнения.
|
Реклама Google
|
|
|
Дата: 20 Фев 2018 19:50:19
#
killer258
Делим на MOD и получаем величину шага? Принимая в учет все остальное.
|
|
Дата: 21 Фев 2018 02:59:04 · Поправил: Burr Master (21 Фев 2018 03:08:34)
#
killer258
там между выходом VCO и смесителем стоит ещё один настраиваемый делитель ,
понятно, что этот делитель в расчете частоты играет самую наиключевую роль.
Вот только непонятно одно. На вход смесителя сигнал приходит уже деленным на 2 как минимум, для симметрирования и уменьшения гармоник. Диапазон чипа 42 to 1002 MHz .
Верхняя граница при делении на 4 будет 501мГц, на 8- 250,5 а нижняя при октавном ГУН - 125,25.
Как то не вяжется. Особо широкополосными такие ГУНы не делают, там 33В для варикапов нет, да и из шумовых соображений.
А может они туда ГУНов напхали штук 6 , и перекрытие больше октавы...
В генератор ADF4351 воткнули 3 переключаемых ГУНа на октаву, а в его аналог MAX2780 аж 4.
Для последнего я пару лет назад писал расчет регистров исходя из частоты, но он и документирован достаточно.
Много общего - СВЧ ГУНы, частота ФД миллион, а если хочется, то и 10, целый плюс дробный делитель.
|
|
Дата: 21 Фев 2018 07:15:17 · Поправил: killer258 (21 Фев 2018 16:04:21)
#
Диапазон чипа 42 to 1002 MHz .
Верхняя граница при делении на 4 будет 501мГц, на 8- 250,5 а нижняя при октавном ГУН - 125,25.
Как то не вяжется.
я тоже вчера мысленно по всякому прикидывал, как-то не совсем вяжется, даже если делать по их формулам, то не получается низких частот гереродина, необходимых для приёма, скажем, 24 мгц, поскольку опорная частота 28 мгц умножается на число, много большее единицы, настолько много, что даже если перед смесителем поделить на 8, всё равно много получается. тем более, что диапазон чипа ещё шире- от 24 до 1700 мгц.
Придётся экспериментально перехватить запись содержимого регистров 10, 14, 15 и 16 для ооочень большого числа всевоможных частот, тогда будет больше данных для анализа и проверки предположений
|
|
Дата: 21 Фев 2018 11:37:40
#
killer258
тем более, что диапазон чипа ещё шире- от 24 до 1700 мгц.
Диапазон привел из даташита R820T:
Typical figures
Frequency range: 42 to 1002 MHz
|
|
Дата: 21 Фев 2018 21:10:38
#
|
|
Дата: 21 Фев 2018 23:26:07 · Поправил: killer258 (22 Фев 2018 18:34:40)
#
Спасибо, камрад! Очень своевременно. Если бы это было здесь оставлено раньше, оно бы не помогло мне, так как я бы не сориентировался там. Но покурив последние дни даташит и возившись с регистрами 10,14,15,16, теперь стали понятными многие комментарии в исходнике и я добрался до того, что нужно.
vco_freq = (uint64_t)freq * (uint64_t)mix_div;
nint = vco_freq / (2 * pll_ref);
vco_fra = (vco_freq - 2 * pll_ref * nint) / 1000;
vco_freq = (uint64_t)freq * (uint64_t)mix_div;
// для требуемой частоты гетеродина требуемая частота VCO должна быть умножена на значение делителя перед смесителем, ну, это понятно, так как он там находится между ними и может иметь значение от 1:1 до 1:8
nint = vco_freq / (2 * pll_ref);
//целая часть , как я и предполагал,-это во сколько раз требуемая частота VCO окажется больше частоты опоры. Множитель "2" говорит о том, что видимо,делитель после опорного кварца всё-таки включен и делит на два, как говорится в даташите ,если кварц >24мгц, а у нас как раз такой. (То есть, частота сравнения =14.4 мгц)
vco_fra = (vco_freq - 2 * pll_ref * nint) / 1000;
//теперь по поводу дробной части, про тот самый недостающий кирпич в стене. На 1000 значит, оказывается, нужно делить эту разность, но это ещё далеко не N_sdm !
if (nint > ((128 / vco_power_ref) - 1)) {
fprintf(stderr, "[R82XX] No valid PLL values for %u Hz!\n", freq);
return -1;
}
ni = (nint - 13) / 4;
si = nint - 4 * ni - 13;
rc = r82xx_write_reg(priv, 0x14, ni + (si << 6));
// ну, тут собственно, после того, как получили целую часть nint, проверяется, не вылазит ли она за рамки, затем
её для чего-то разбивают на ni и si по уже встречавшейся формуле c вычитанием числа 13, затем эти два числа склеивают и загоняют в регистр 0x14. Не будем заморачиваться , почему именно такая формула, просто будем делать так же.
Для вычисления дробной части N_sdm (вписываемой затем в регистры 0х15 и 0х16), осталось раскурить вот этот кусок :
/* sdm calculator */
while (vco_fra > 1) {
if (vco_fra > (2 * pll_ref_khz / n_sdm)) {
sdm = sdm + 32768 / (n_sdm / 2);
vco_fra = vco_fra - 2 * pll_ref_khz / n_sdm;
if (n_sdm >= 0x8000)
break;
}
n_sdm <<= 1;
}
// Тут вроде выполняется в цикле какая-то итерационная процедура, повторяющаяся до выполнения определённого условия.
А дальше всё опять понятно. Это вычисленное число N_sdm разбивается на младший и старший байты и заносится в регистры 0х15 и 0х16.
Дальше тоже происходит всё в точности так же, как и в перехваченном трафике по I2C.
Происходит чтение нескольких первых регистров, содержимое одного из них сравнивается с 0х40 (один бит всего важен, судя по всему) и на основании результата сравнения делается заключение, есть захват в петле фапч или нет. В случае его отсутствия вначале повышают ток накачки, если и это не помогает, то выводтся сообщение "[R82XX] PLL not locked!\n"
Если захват фапч есть, дальше уже просто дописываются прочие регистры.
Вот вроде и всё прояснилось. Если поверить в то, что частота сравнения =14.4 мгц, а не 28.8 (несмотря на то, что бит 4 ргистра 0х10,равный нулю, и указывает на то, что Fref=F xtal !), то тогда вроде получается правдоподобно, хотя для частот порядка 24-27 мгц (которые чип на практике принимает, несмотря на заявленную в даташите минималку в 42 мгц)должно быть либо Nint очень маленьким, не больше 1 или 2, или делитель перед смесителем должен быть включен на максимум.(надо будет это проверить экспериментально на перехватах I2C траффика, что это действительно так)
Только осталось завтра собраться со свежей головой, понять, чем отличается sdm от N-sdm (что значит эта аббревиатура) и вкурить последний кусок, где вычисляется N_sdm и для чего там 32768 нужно, я же не могу в своей прошивке бездумно тупо повторять весь чужой код целиком, не разобравшись в смысле его отдельного куска. |
|
Дата: 22 Фев 2018 14:02:50 · Поправил: killer258 (22 Фев 2018 18:29:09)
#
Вот только непонятно одно. На вход смесителя сигнал приходит уже деленным на 2 как минимум, для симметрирования и уменьшения гармоник. Диапазон чипа 42 to 1002 MHz .
Верхняя граница при делении на 4 будет 501мГц, на 8- 250,5 а нижняя при октавном ГУН - 125,25.
Как то не вяжется. Особо широкополосными такие ГУНы не делают, там 33В для варикапов нет, да и из шумовых соображений.
А может они туда ГУНов напхали штук 6 , и перекрытие больше октавы...
Мне тут тоже непонятно . С одной стороны, в исходнике пишут:
uint32_t vco_min = 1770000;
uint32_t vco_max = vco_min * 2;
значит, VCO действительно всего лишь октавный,
а вот из этого
/* Calculate divider */
while (mix_div <= 64) {
if (((freq_khz * mix_div) >= vco_min) &&
((freq_khz * mix_div) < vco_max)) {
div_buf = mix_div;
while (div_buf > 2) {
div_buf = div_buf >> 1;
div_num++;
}
break;
}
mix_div = mix_div << 1;
}
следует, что коэф деления перед смесителем подбирают, исходя из того, чтоб требуемая частота VCO оставалась в допустимых пределах всё той же одной октавы, в которой он работает от VCOmax до VCOmin.
но как-то не получается имхо, у VCO с его одной октавой перекрытия и с выбором только четырёх вариантов 1:1, 1:2, 1:4 и 1:8, перекрыть такой большой диапазон.
А меж тем чип принимает запросто от 24 мгц до 1700 мгц
вызывает удивление вот это while (mix_div <= 64) (64?? недокументированные возможности делителя перед смесителем?)
|
|
Дата: 23 Фев 2018 02:18:02
#
killer258
вызывает удивление вот это while (mix_div <= 64) (64?? недокументированные возможности делителя перед смесителем?)
И это может быть.
|
|
Дата: 23 Фев 2018 16:08:53 · Поправил: killer258 (23 Фев 2018 16:16:21)
#
С шагом перестройки вообще происходят интересные вещи. Он не только на разных диапазонах другой, но он ещё и "плавает". Сегодня научное исследование было продолжено следующим образом: На HDSDR для начала была выставлена частота 27.570 000 мгц. Далее частота инкрементировалась, перехватывался обмен при этом ,декодировался, из полученного дампа находились значения регистров 0х10 (делители вне петли фапч), 0х14 (регистр целого), 0х15 (младш регистр дробной части), 0х16(старш.регистр дробной части).
Шаг перестройки по частоте был небольшой, десятки герц, было выставлено чуть больше сотни разных частот, соответственно столько же было записано дампов, диапазон перестройки был в пределах от 27.570000 до 27.571 728 (поледняя цифра- герцы)
Обнаружились следующие закономерности:
Содержимое регистров 0х10, 0х14, 0х16 в чипе не поменялось,([0х10]<-0xA4, [0x14]<-0x45,[[0x16]<-99,[0x15]<-0x4e) а младший регистр дробного 0х15 при инкременте частоты сначала стоял на месте, потом скачкообразно возрастал на 2 , потом стоял, потом ещё на 2 и тд. Интересным оказалось то, что изменение частоты настройки при этом не было величной постоянной при каждом увеличении регистра дробности на 2
При каждом последующем инкременте этого регистра на 2 разница в частоте настройки по сравненю с предыдущей получалась такой:
48гц,17гц,31гц,16 гц,
47гц,15гц,31гц,16гц,
47гц,16гц, 31гц,15гц,
47гц,16 гц, 31гц,16гц, и так далее с той же периодичностью.
На 433 мгц шаг помнится, минимальный шаг был другой, 125 гц, (уж не другой ли был коэфф деления перед смесителем?)и что самое главное, он там тоже, как я помню, не везде равен 125 гц при одном и том же инкременте младшей части регистра дробности на 2.
Пок что возникает больше вопросов, чем ответов, об синтезаторе этого чипа (наверное, "техника секретная, физики могли и не знать" , или сильно отстали от своих зарубежных коллег)
|
|
Дата: 23 Фев 2018 16:37:56 · Поправил: killer258 (24 Фев 2018 10:06:58)
#
Я предположил , что разница в шаге на 27 мгц и на 433 мгц могла быть вызвана разными значениями делителя между VCO и смесителем,не охваченного петлёй ФАПЧ (Регистр 0х10) он может назначаться по даташиту битами 7,6,5:
000-.> VCO/2
001-> VC0/4
010 -> VCO/8
011-> VCO подает сигнал в смеситель напрямую
Да действительно, для 433 мгц этот регистр оказался =0х44, биты7,6,5= "010", то есть VCO перед смесителем делится на 8.
Теперь смотрим, что вдувалось в этот регистр на 27 мгц. Вдувалось 0х44
Смотрим биты 7,6, 5 и получаем "110". А нет такого значения в даташите!!! Но на что-то сигнал VCO всё же делится, ведь 27 мгц свисток-то исправно принимает!
Хоть немного картина прорисовывается. Сейчас попробуем тогда выяснить, какие значения принимает этот делитель на разных частотах приёма и где границы,при пересечении которых этот делитель мняется.
То есть, определим октавные диапазоны для VCO cинтезатора. УФФ.. скоро диссертацию по этому чипу можно будет писать
PS:
Ну вот, готово. Интересная табличка вырисовывается (границы приведены примерно с точностью до 1 мгц,выявлять их точнее экспериментальным путём у меня не было желания, так как это очень много лишней работы, да и на этом этапе в такой точности установки границ нет острой необходимости) :
--------------------------------------------------------------------------------------------------------
поддиап. __ Мгц _______ регистр[0х10] __ биты 765 __ деление перед смес _____ Fref
--------------------------------------------------------------------------------------------------------
__1) ______ 24-51.7 __1010 0100 (A4h) ___ 101 _____ 1:? (нет в даташите) ___ =Xtall
__2) ______51.8-107 __1000 0100 (84h) ___ 100 _____ 1:?(нет в даташите) ___ =Xtall
__3) ______108-217 __0110 0100 (64h) ____011 _____ 1:1 ________________=Xtall
__4) ______218-438 __0100 0100 (44h) ____010 _____ 1:8 ________________=Xtall
__5) ______439-881 __0010 0100 (24h) ____001 _____ 1:4 ________________=Xtall
__6) _____882-1760___0000 0100 (04h) ___000 ______ 1:2________________=Xtall
Значит, что было замечено. Учитывая, что (из исходника) VCOmin=1700 мгц, а VCOmax=2*VCOmin, то есть 3400 мгц, видно , что для трех последних поддиапазонов вроде всё правильно:
делим на VCO на 2, и получаем самый верхний диапазон 850-1700, (а если не делить? есть ведь и такое сочетание битов, чтоб напрямую, интересно, что будет, неужели приём до 3.4 гигагерц?) ,делим на 4, получаем поддиапазон поменьше, 440-880, делим на 8, получаем 218-440мгц, тут всё правдоподобно, а вот для первых трёх поддиапазонов всё уже идёт вразрез с даташитом или что-то не документировано в нём.. А именно- биты 6, 7,5 , принимающие значения 101 и 100, отсутствующие в даташите. Особенно поддиапазон 3, где 001 означает 1:2, но ведь ясно,что не напрямую же там сигнал VCO идёт в смеситель, это для 100-200 мгц-то?
Но вот глядя на эту колонку цифр, а именно на то, как меняется регистр 0х10 при переходе с диапазона на диапазон (A4h,-->84h,-->64h,-->44h,-->24h,-->04h (cмотреть надо на старшую тетраду)) создаётся подозрение(или предположение), что что-то даташиит не договаривает, что где-то затаился ещё один не отражённый здесь ещё более старший бит управления делением, помимо заявленных даташитом битов 7,6, 5, и тогда при таком предположении всё вроде как встает на свои места ,
то есть для первых трёх диапазонов на самом деле делится ещё больше чем на 8, то есть на 64, 32, и 16.
И тогда сразу перестает вызывать удивление вот эта строчка исходника while (mix_div <= 64) , что косвенно подтверждает мою гипотезу. Чем дальше в лес, тем толще партизаны.
И , кстати, если принять эту гипотезу как верную, то тогда автоматически снимается моё прежнее недоумение по поводу того, как на нижних поддиапазонах при частоте сравнения 28 мгц и целочисленном значении N integer намного большем единицы, они ухитряются получать на входе смесителя то, что нужно. Например, если принимаем 24 мгц (нижняя граница возможного), то в смеситель должно поступить 24+3.57(ПЧ)= 27.57мгц, хотя значение регистра 0х14 равно 0x0C в данном случае, судя по содержимому соответствующего регистра.
Я сейчас посчитал, а ведь вроде сходится всё. Та ихняя формула, по которой из содежимого регистра получают коэфф деления: 4*Ni2c+Si2c+13
У нас содержимое регистра =0х0с , по таблице даташита получаем, чт Si2c равно нулю, Ni2c=0x0c, то бишь 12, умножаем на 4 и прибавляем, как они пишут, 13, и получаем Nint (целый коэффициент деления)=4*12+13=48+13=61
Вот что на самом деле является целым коэффициентом деления синтезатора, а не содержимое регистра 0х14 !
Теперь попробуем 61 помножить на опору 28.8 мгц, получаем 1756.8 мгц частоту VCO (что укладывается в рамки его октавы). Далее, если предположене о делении частоы VCO на 64 перед смесителем действительно имеет место, то тогда на меситель пойдёт 1756.8/64= 27.45 мгц. Вычитаем ПЧ(3.57), получаем принимаемую частоту 23.88 мгц . Всё сходится !! Небольшое расхождение из-за того, что мы пренебрегли дробной частью.
Ура, с целой частью разобрались. Теперь бы с дробной разобраться.
К |
|
Дата: 23 Фев 2018 19:44:52
#
Приветствую, давно не вытаскивал свой сдр свисток, ткните пожалуйста носом в последнюю версию СДР Шарпа,
плагины беру на http://rtl-sdr.ru |
|
Дата: 23 Фев 2018 20:24:48 · Поправил: Avtomatizator (23 Фев 2018 20:27:11)
#
Del...
|
|
Дата: 23 Фев 2018 20:26:45 · Поправил: Avtomatizator (23 Фев 2018 20:27:54)
#
TevatroN
Это официальный сайт SDR# SDRSharp |
|
Дата: 23 Фев 2018 21:08:22 · Поправил: killer258 (24 Фев 2018 00:05:41)
#
Кстати, я тут сейчас подумал между делом.. если присоединиться к 5-ой ножке R820T, (сигнал гетеродина) то мы получим очень широкополосный ВЧ генератор от 27 до 1700 мгц. Подобно тому, как подобный генератор был сделан кем-то в интернете из блочка телевизионного селектора KSH148, только это-то будет гораздо лучше, так как с возможностью стабилизации амплитуды. Хотел сказать, что получился бы и жучок "на любую частоту", но не стану , так как чип очень много жрёт :-) Но теперь у нашего свистка появился шанс стать не только приемным, но и передающим свистком, с разносом 3.57 мгц (впрочем, управляя частотой, можно его было бы заставить и в симплексе работать, без разноса).
А совместно с управляющей программой на компе (или микроконтроллере) , апериодическим вч усилителем и измерительным мостом он мог бы тогда стать антенным анализатором или АЧХ-метром ,с рисованием графика на экране монитора (или дисплее носимого гаджета)
Короче, получился бы аналог прибора Х1-50. Главное, это чтобы китайцы об этом не узнали, а то ведь ещё больше поднимут тогда цены на свои донглы, а наши учёные думаю, собственный USB DVB донгл смогут изобрести ещё очень нескоро
|
|
Дата: 23 Фев 2018 22:14:05
#
Это официальный сайт SDR# SDRSharp
Avtomatizator
Спасибо.
|
|
Дата: 24 Фев 2018 00:11:28 · Поправил: Burr Master (24 Фев 2018 00:13:01)
#
killer258
Тот генератор был на KSH132 у него раздельные синтезаторы и смесители, впрочем это несущественно.
Ценность свистка именно как преобразователя, я считаю, бо аналоги от аналога и максима имеют конский ценник да под них еще надо плату делать. И не в каждом ларьке продадут.
|
|
Дата: 24 Фев 2018 00:42:10
#
killer258
если присоединиться к 5-ой ножке R820T, (сигнал гетеродина) то мы получим очень широкополосный ВЧ генератор от 27 до 1700 мгц. - эту идею уже реализовали, где-то на страницах www.rtl-sdr.com есть ссылка на авторов реализации с подробным объяснением "кастомайзинга" свистка под эти цели. Правда, генератор у авторов не автономный прибор, а "приставка" к РС. Коим "свисток" и является в первоначальном своём виде :) Авторы просто не стали мудрить с автономностью. |
|
Дата: 24 Фев 2018 00:52:00 · Поправил: killer258 (24 Фев 2018 00:57:04)
#
Всё, я кажется вплотную приблизился к разгадке вычисления дробной части синтезатора. Завтра на свежую голову я с вероятностью 99% "добью" этот чип, и путь будет открыт.
Мне он тоже интересен именно как преобразователь. А та часть, которая с RTL2832, она мне не так интересна ввиду ее низкой динамики. Ну разве что только для обзора водопада. А у самого чипа R820T динамика довольно неплохая, если по даташиту.
Я уже упоминал, что там есть бит, отключающий IF фильтр. Это значит, я могу выбрать другую ПЧ и рассчитать частоту гетеродина с учетом ее. Например, взять очень хороший фильтр первой ПЧ (или даже целиком всё, что после него) от ВЧ блочка радиотелефона Sanyo CLT-55KM (кстати, очень хороший там приемник), этот фильтр имеет среднюю частоту 30.150 мгц. Соответственно, поскольку частота "гетеродина"=30 мгц в чипе достигается без проблем, как я это писал выше, то это значит, чтоприемник на этом чипе сможет принимать без всяких конвертеров частоты от нуля и выше (насколько пропустит RF фильтр, конечно. но можно наверное, катушечкой внешней поиграть, которая там у него наружная в RF фильтре)
|
|
Дата: 24 Фев 2018 09:44:38
#
От души поздравляю! Честно! Теперь, только осталось на Ali, купить ведро "свистков" из старых запасов. Всё, R820T2 - уже не производят, не говоря уже о R820T. Можно, конечно, ещё довольно долго закупаться чипами R820T2 в виде "рассыпухи", но, опять же - пайка этого чипа, занятие не для слабонервных :) Есть и другие "подводные камни" этого чипа, которые, нужно, внимательно погуглить, ведь, не просто так, чип не пошёл в массовые самоделки :) Много хороших идей, связанных с этими чипами, так и остались идеями, и это не спроста.
|
|
Дата: 24 Фев 2018 10:10:21 · Поправил: killer258 (24 Фев 2018 10:55:48)
#
Ну, вот, собственно, (благодаря помощи всех, кто помог мне здесь подсказками,даташитами и исходниками), мы уже пришли к финальной части этого научного исследования. Которое затянулось по нескольким причинам. Одной из которых была опечатка в даташите, в которую я вначале долго никак не мог поверить и она сбивала с толку (а мужики-то в Rafaelo и не знают об этом..) :
[imgs] [/imgs]
здесь соответствуют дейтвительности только cтрочки
000: mixer in = vco out/2
001: mixer in = vco out/4
010: mixer in = vco out/8
строчка
011: mixer in = vco out -это враньё (а жаль. так как в случае,если бы это и правда было так, то задействовав этот код, мы бы получили ещё один поддиапазон от 1700 мгц до 3500 мгц, да, да, все эти частоты, GSM1800, DECT,3G,4G и прочее)
и эту строчку на самом деле следует читать как
011: mixer in = vco out/16
а вот эти комбинации для 100 и 101 , полученные из перехватов обмена, они вообще не отражены в даташите, но с вероятностью 99.99% они
есть и означать должны были следующее(тогда схдится всё и исчезают все недоумения):
100: mixer in = vco out/32
101: mixer in = vco out/64
Итого, благодаря делителю (от 1:2 и до 1:64) перед смесителем после октавного VCO, работающего только в диапазоне от 1770 до 3540 мгц, мы получаем шесть описанных в предыдущем моем посте поддиапазонов.
Далее, про "опору". Тут я тоже долго был в нерешительности. хотя они там пишут, что
1-> fref=Xtal_freq/2 (for Xtal>24 Mhz),
сами они тем неменее используют везде здесь режим
0-> fref=xtal_freq
, хотя у нас Xtall на 28.8 мгц, то есть явно >24Mhz
То есть, частота сравнения у нас выбрана равной частоте опоры,то есть 28.8 мгц (я честно думал, что всё же 14.4, но тогда ничего не сходилось).
Это меня очень долго сбивало с толку.
И, наконец, третье мое заблуждение. по поводу регистров целого 0х14 и регистров дробного 0х16 и 0х15.
Оказывается, в них заносятся вовсе не целая и дробная части деления синтезатора, как я думал (и откуда были тоже ндоумения из-за того, почему с этими значениями ничего не сходилось) а некие числа, получаемые из них по формулам даташита, вот по этим вот :
Увеличить
Вот о них сейчас поговорим в следующем посте, чтоб всем здесь был понятен весь ход того, как я пришел к разгадке и решению. |
|
Дата: 24 Фев 2018 11:23:36 · Поправил: killer258 (24 Фев 2018 18:40:52)
#
Напомню на всякий случай вкратце известный в общм-то принцип дробного синтезатора частоты. Коэффициент деления дробного делителя состоит из дробной и целой частей (как он реализован там внутри аппаратно, можно не вникать, просто принять, что он делит вот на столько вот, и всё)
Например, у нас в свистке он должен быть равен 61.35 для какой-то частоты приема 24.ххх мгц .То есть, умножив этот коэффициент на опору 28.8 мгц, мы получим частоту VCO=61.35*28.8=1766.880 мгц, что укладывается в диапазон его работы (на самом нижнем краю,правда, но главное,что укладывается). Далее выбирается и включается нужный коэфф деления перед смесителем, равный в данном случае 64 (в исходнике это делается так: сначала считают его равным 2, пробуют умножить требуемую частоту гетеродина на 2, если результат попал в диапазон допустимых частот гуна 1770-3540, на этом останавливаются, если нет, в цикле while перебирают все другие 4,8,16,32,64, пока результат не попадёт в диапазон работы VCO. Можно наверное, было выбрать это и таблично, было бы быстрее, чем все эти операции умножения (хочется сканировать 200 каналов в секунду:-) ) ну да ладно, они сделали вот так, и оно работает)
1766.880мгц от VCO делим на наши выбранные 64 , получаем на входе смесителя чипа 27.6075 мгц. Вспоминая, что f ПЧ у нас 3.57мгц, вычитаем её, получаем частоту приёма 27.6075-3.57=24.0375 мгц. Правдоподобно? По-моему, да. По-моему, тоже :-) Всё сходится!
Если выключить фильтр ПЧ ( если бит 7 регистра 0х09 если= 1, то IF фильтр OFF, если я правильно понял этот пункт в переводе с их вражеского языка) то можно выбрать более высокую частоту ПЧ, скажем, около 27 мгц, и тогда будем принимать частоты от нуля и выше мгц (какое при этом будет чутье, это отдельный вопрос, можно обсудить позднее,я сейчас не буду отвлекаться)
Теперь перейду к содержимому регистров целого (0х14) и дробного (0х15 и 0х16, которые по смыслу надо рассматривать как одно 16-разрядно слово, где 0х16 это старший байт) и покажу,как они связаны с целой и дробной частью нашего дробного коэффициента деления.
|
|
Дата: 24 Фев 2018 12:03:16 · Поправил: killer258 (24 Фев 2018 18:55:37)
#
Значит, смотрим нижнюю картинку из предыдущего поста. Сначала посмотрим, как содержимое регистра 0х14 (который для каких-то понятных только разрабтчикам целей условно составлен из двух частей, числа Si- это его биты 7и 6, и числа Ni, это его биты 5:0) связано с целой частью делителя. А связано оно вот так:
N(целая часть) := 4*Ni+Si+13 (где Ni и Si рассматриваются как просто два отдльных числа. Не спрашивайте меня, почему прибавлять надо13, это уж так из ихнего даташита)
Проверяем это. Например, по перехватам для частоты приема 24 мгц (для гетеродина это 27.ххх мгц ) обнаруживаем в регистре 0х14 число 0х0С. то есть побитно для наглядности это 0000_1100 . Соответственно Si у нас =0, Ni у нас = 001100, то бишь =12. Помножаем его на 4, прибавляем Si и это непонятное 13
По ихней формуле это должно будет соответствовать целой части дробного делителя
N(целая часть)=0+4*12+13=61
Мы уже проверяли выше, что коэфф деления 61 с копейками как раз и должно получаться для данной требуемой частоты гетеродина. Ещё раз проверяем:
61*28.8 , и поделим на делитель перед смесителем 64, получаем 27 с копейками мгц, как и должно быть (минус пч это будет 24 с копейками)
Это всё хорошо, конечно, но нам-то ведь нужна обратная формула. Как из требуемого целого INT получить то, что должно будет быть вписано в 0х14регистр для этого, то есть числа Ni и Si. Немного математики(я её опускаю), и получается,что обратная формула будет такая :
Ni:=(INT-13)/4
Si:=INT-4*Ni-13
получили из требуемой целой части делителя (напомню, INT у меня -это вычисленная требуемая частота VCO, делённая на 28.8 и отбрасываем от результата деления дробную часть, получаем целое INT)
Склеить байт из Si и Ni банально просто. Si сдвигаем влево на 6 и приплюсовываем к Ni
Полученный байт кидаем в регистр целого 0х14. Всё.
Теперь поговорим о "копейках", то есть об отброшенной только что дробной части. и как она связана с содержимым регистров дробного 0х16 и 0х15 , рассматриваемых здесь на деле как один 16-тибитный регистр.
В предыдущей картинке всё написано об этом в даташите, но написано как-то крайне не по-русски :-) и в этом вся беда.
[imgs] [/imgs]
Эта строчка ввергла меня в ступор, честно. Хотя в общем-то, говорится в ней просто о том, что дробная часть синтезатора (для уже упоминавшегося мной примера , где N было =61.35 это будет 0.35) равна сумме шестнадцати дробей (о ужас!!) , в числителях которых стоят биты этого "16-тибитного" регистра [0х16]:[0х15], а в знаменателях стоят двойки в различных степенях, от 1 до 16. Ну, понятно, короче,там знаменатели будут такие:
1,2,4 ,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768 и 65536. Уфф.. :-)
Ну, когда я учился в школе, были советские времена, без ЕГЭ, так что математику я быстро вспомнил и понял, что надо привести все дроби к общему знаменателю. То есть к 65536.
В результате получаем уже не дурацкую сумму дробей,на которую жаль тратить время микроконтроллера на тяжёлые операции деления с плавающей запятой, который всё это будет считать, чай, Aтмега всё же не многоядерный пентиум, а получаем всего одну единственную дробь, в знаменателе которой 65536, а в числителе последовательность слагаемых 65536,32768 и тд до 1, помноженных на значения битов 16, 15, ...0 этого самого нашего 16-битного регистра, и тут я увидел, что этот, я не побоюсь этого слова, полином в числителе - это в общем-то есть просто лишь содержимое этого 16-битного регистра.
То есть, переводя всё это алгебраическое заумие на нормальный русский язык, это означает, что если содержимое X (пусть будет икс) вот этого самого 16-битного регистра , (которое может находиться в пределах от 0 до 65535) если его поделить на 65536 (кстати,вот он, тот самый MOD!), то это и есть та самая дробная часть, будет она находиться в пределах от 0 до 0.99998474121 , и которая например, в нашем примере была равна 0.35
И тогда если 0.35=X/65536 , то значит Х:= 0.35*65535. (ну, и округлить. Вот откуда "скакали" эти единицы и десятки герц шага при инкрменте Х!)
Вот так мы из дробной части и получаем то, что нужно будет вдуть в рег 0х16 и 0х15
Для нашего 0.35, помноженного на 65536, это будет 22937.6 Ну, 6 у них там или отбрасывается, или округляется последняя целая цифра (наверное, эти и обьясняется её минимальный инкремент через два?).
Ну, пусть будет 23938 :-) Я проверял, вроде не ошибся, получившаяся частота гереродина/приема сошлась с расчётной чуть ли не до герцев на 1-ом поддиапазоне.
(В исходнике этот двойной регистр считают как-то по-другому алгоритму, не так, как я сейчас написал, а в цикле с итерациями и проверками, но я, честно, уже устал и не стал разбираться в ихнем алгоритме вычисления Sdm-калькулятора, поскольку мой способ тоже работает, и делается быстрее для микроконтроллера. Они то писали для компа, им было всё равно, как подсчитывать)
Ну, вот вроде и всё. Даташит с трудом, но таки раскурен. Найдены опечатки в нём, мешавшие пониманию работы чипа. Ещё раз от меня благодарность всем, кто так или иначе помог в этом или даже просто поддерживал морально. Разум торжествует над материей :-))))))
Осталось только пойти отдохнуть проветриться, и потом отдельно написать в сжатом виде (без всех этих сопутствующих рассуждений и пояснений), как вычислять содержимое регистров, задающих частоту, и всё. Вдувайте и дерзайте.
Если найдутся желающие участвовать, создадим отдельную ветку и там продолжим, а то здесь редкая птица долетит до середины темы..
Беда в том, что я могу писать более менее только на ассемблере для пиков и на микропаскале для AVR, который мало кто пользует, так что продолжать наверное придётся вам, тем кто пишет на C на CodeVision AVR или чём-то подобном. Впрочем, тут и ардуинщики теперь смогут написать свои скетчи и будем всё это обсуждать и отлаживать код.
Надеюсь, что Капитан не заругает меня за то,что я здесь три поста подряд один за другим влепил, как будто это мой блог.. |
|
Дата: 24 Фев 2018 13:44:14
#
killer258
Полагаю, логично создать новую тему в раздел "Разработка, ремонт, схемы, модификации".
|
|
Дата: 24 Фев 2018 16:13:19
#
Заинтересовали вы меня идеей использования чипа в своих самоделках. Вывел ПЧ с R820T и подал на вход КВ трансивера. Послушал, NFM при сильных сигналах просто отлично, при слабых нормально, шума становиться больше. АМ послушал вроде тоже нормально, но сильных сигналов в АМ нет. Усиление регулируется, управлял с помощью HDSDR, минимальный шаг HDSDR не постоянный сегменте 1 кГц, и больше и меньше 100 гц.
|
|
Дата: 24 Фев 2018 17:38:28
#
Полагаю, логично создать новую тему в раздел "Разработка, ремонт, схемы, модификации".
Всё, создал тему в том разделе со ссылками сюда. В дальнейшем скопирую перенесу туда наиболее важную информацию отсюда .
|
|
Дата: 24 Фев 2018 17:43:41 · Поправил: killer258 (24 Фев 2018 18:17:47)
#
минимальный шаг HDSDR не постоянный сегменте 1 кГц, и больше и меньше 100 гц.
Он ещё зависит от того, в какой поддиапазон попадает выбранная частота, поскольку там независимо от принимаемой частоты , VCO работает все равно в одном и том же своём диапазоне от 1770 до 3540 мгц, а на смеситель его сигнал подается уже через делитель на 2, или на 4, или на 8, или на 16, или на 32 или на 64 , в зависимости от того, какой поддиапазн в данный момент нам нужен, и соответственно минимальный шаг из-за этого на нижних поддиапазонах получается мельче, а на последнем , шестом диапазоне он будет самый большой.
(не проверял, но думаю, что не меньше одного килогерца)
|
|
Дата: 24 Фев 2018 22:17:52 · Поправил: Avtomatizator (24 Фев 2018 22:28:18)
#
Delete.
|
|
Дата: 25 Фев 2018 08:39:52 · Поправил: killer258 (25 Фев 2018 09:37:34)
#
По поводу шага. Я тут вчера вывел, как задается частота . Небольшие приращения частоты задаются дробной частью синтезатора. У них там в ходе работы программы HDSDR по изменению частоты настройки получается, что регистр дробной части минимально инкрементируется на две единички. Не знаю, почему на две, а не на одну. То ли это просто алгоритм Sdm_calculator так у них написан вот этот вот, что все значения получаются только чётными (я не стал его пока раскуривать, так как в нем есть непонятые аббревиатуры)
/* sdm calculator */
while (vco_fra > 1) {
if (vco_fra > (2 * pll_ref_khz / n_sdm)) {
sdm = sdm + 32768 / (n_sdm / 2);
vco_fra = vco_fra - 2 * pll_ref_khz / n_sdm;
if (n_sdm >= 0x8000)
break;
}
n_sdm <<= 1;
}
, то ли действительно есть физические или математические причины, не рекомендующие шагать через каждую единичку.
Ну да ладно. Короче, если регистр дробного 0х16,0х15 меняется за раз не менее чем на 2 младших единички, то по установленной вчера формуле частота VCO должна при этом измениться на прибавку, равную :
минимальное_приращение_частоты VCO = 28.8*( 2/65536) =0.00087890625 мгц=0.87890625 кгц.
Учитывая, что с VCO на смеситель всё это дело подается через делитель от 2 до 64, то
получаем теоретичести минимальную прибавку по частоте гетеродина на шестом поддиапазоне 0.87890625/2=0.4394 кгц,
а на первом поддиапазоне 0.87890625/64=0,0137 кгц, то есть около 14 гц, что вчера экпериментально подтверждалось, хотя прибавка там скакала последовательностью 48 гц, 31 гц, 15 гц, и так далее снова так же.
При каждом последующем инкременте этого регистра на 2 разница в частоте настройки по сравненю с предыдущей получалась такой:
48гц,17гц,31гц,16 гц,
47гц,15гц,31гц,16гц,
47гц,16гц, 31гц,15гц,
47гц,16 гц, 31гц,16гц, и так далее с той же периодичностью. |
Реклама Google |
|