Автор |
Сообщение |
|
Дата: 07 Мар 2018 19:23:22
#
В этом нет смысла, программная коррекция эффективней в целом и проще для конечного пользователя.
Т.к. любая аналоговая добавка к КГ ухудшит итоговую термостабильность.
|
|
Дата: 07 Мар 2018 21:47:39 · Поправил: killer258 (08 Мар 2018 09:53:40)
#
а этот ppm сколько должен дать коррекции?
Я сегодня набросал обратную программку. То есть, которая наоборот, по имеющимся уже значениям регистров 0х10, 0х14, 0х16 и 0х15 вычисляет, на какой частоте получился бы приём (при пч=3.57)
Это для того, чтобы узнать, на какие частоты свисток несколько раз настраивается при запуске HDSDR и шарпа.
Так вот, при нулевом ползунке PPM и "неправильных" , как я считал ранее, (чисто теоретических, получавшихся у меня без поправки 0х66 и0х66 вместо HDSDR-овских 0х66 и 0х12 при ppm=34 на его шкале )значениях регистров 0х16 и 0х15 частота получилась в этом случае "правильной", когда в формулы расчёта вместо 28.800 я подставил 28.801
Видимо, именно такая частота на самом деле у кварца моего экземпляра свистка. Не знаю, как это перевести в значения PPM Но есть у меня и свисток, где требуется коррекция и побольше раза в два.
|
Реклама Google
|
|
|
Дата: 08 Мар 2018 15:11:34 · Поправил: killer258 (08 Мар 2018 19:39:45)
#
Еле хватило терпения расписать по нотам последовательность инициализации чипа шарпом
[img] [/img][imgs] [/imgs][imgs] [/imgs][imgs] [/imgs]
[imgs] [/imgs]
// там, где адреса 0х00..0х04 , - это байты, прочтённые драйвером для проверки состояния.
А по остальным адресам показано то, что шарп туда вписывал во время своего запуска. Похоже, что он несколько раз выполнял примерно одинаковую последовательность, только с разными значениями .
при этом чип настраивался софтом шарпа при его запуске на следующие частоты:
258.339 мгц (определяется значениями соответствующих регистров из дефолтного массива исходника драйвера),
затем на недефолтные частоты 52.43195 мгц, затем на 105.5038 мгц, затем на дефолтную258.339,затем снова на 52.43195, затем снова на дефолтную , затем опять на 105.5038,затем на 105.4929, затем на 52.4264 мгц, затем на 63.9706 мгц
Для сравнения, HDSDR при запуске сначала тоже устанавливает свисток по дефолту 258.339 мгц приёма, затем
52.43195, потом две каких-то нереальных частоты,(абсолютно не вписываются в рабочий диапазон VCO либо я чего-то ещё не знаю об этом чипе) затем настраивается на 50.000 мгц и на этом заканчивает. |
|
Дата: 08 Мар 2018 18:42:15 · Поправил: killer258 (08 Мар 2018 20:02:18)
#
во время этого процесса регистр состояния 0х02, именуемый в даташите итнтригующим словосочетанием "VCO Indicator", принимал значения чаще всего 0хС2, и 0хDE , но иногда было 0хFC и даже 0х2А .
Знать бы, о чем это сигнализировало.. Может, не зря обе проги это всё проделывают, время от времени читая регистр состояния? Похоже, в чипе столько секретов, то их наверное, хватило бы для работы целого НИИ по изучению работы чипа R820T.
Но я уже начинаю подумывать, что может, надо уже забить на это и приступать к практике. Попробовать просто хотя бы вдуть туда дефолтный массив, и свои значения задающих частоту регистров, и посмотреть, что получится. Вдруг и так "прокатит" ? Если не прокатит, тогда просто воспроизведу в чип по I2C запись этой "сессии" один в один, как это делали эти проги при своем запуске. не знаю, насколько это окажется корректным, но если для того же самого экземпляра свистка, то очень надеюсь, что прокатит.
|
|
Дата: 08 Мар 2018 20:38:41 · Поправил: killer258 (08 Мар 2018 21:51:19)
#
Раз уж я заинтересовался регистрами состояния, то только что пришла в голову ьпосмотреть, какие там вообще устанавливаются значения . Для этого я отснифферил сейчас поток I2C не во время запуска HDSDR, а во время его работы при устиановке всевозможных частот от24 до 1700 мгц. Все возможные частоты я конечно не перепробовал, но пару десятков из них выборочно проглядел.
Оказалось, что регистр 0х01, о котором в описании его битов стоят одни лишь прочерки, принимал значения
00h,40h,80h, и E0h
А регистр "VCO Indicator" много какие значения оказывается может принимать. Например, было:
A2h,CEh,12h,7Ah,0A,36h,62h,26h,8eh,54h,5eh,52h,4Ah,9Ah,BAh16h,...
Может, он отображает остаточную фазовую ошибку в петле ФАПЧ после захвата частоты ?
Хотелось бы загнать PLL в "незахват" и посмотреть, а что в этом случае будет в регистре 0х02.
Даташит об этом молчит, как партизан :-)
PS: сейчас удосужился наконец прочитать, что означает этот страшный вражеский термин "ppm" . Оказывается, ничего сложного- это просто миллионная доля чего-нибудь. Например, вот у меня в HDSDR правильная шкала становится при положении ползунка в 34 ppm, а
34 миллионные доли от 28.8 мгц равны 950 гц. И я вчера как раз и убедился в том, что если в расчеты вместо 28.8 мгц подставляешь 28.801 мгц, то всё расчётное сразу и начинает совпадать с реальным результатом у этого свистка.
|
|
Дата: 11 Мар 2018 16:31:15 · Поправил: killer258 (11 Мар 2018 18:00:00)
#
======================================================================
Ну, вот наконец, я перешёл к практике. И первый успешный опыт, проведённый со вдуванием в свисток настроек атмегой , привел чип в такое же состояние, в каком он работает под HDSDR.
УРА, товарищи!!!! Чипом можно управлять
======================================================================
Значит, дело было так. Я исходил из гипотезы о том, что данный чип не является так называемой "системой с последействием", то есть текущее состояние чипа определяется самыми последними значениями его регистров, независимо от того, что в них вдувалось до этого. Похоже, что это так. Или почти так. Во всяком случае, для одного и того же экземпляра свистка это прокатило.
Сначала я запустил HDSDR, заснифферил обмен, записал для себя самые последние вдувания в каждый из регистров. Потом я настроил приём на 63.750 мгц, тоже заснифферил весь обмен, но выбрал только те значения, которые были занесены в регистры в последний раз.
Значения тех регистров, которые не получили в этой сессии назначения, я взял из предыдущей (в момент запуска HDSDR)
Далее я в программе создал массив из 28 байтов, подал питание на свисток, и вдул по I2C этот массив. Сделал это так, как делали это ребята в SDR SHARP-е, то есть четырьмя пачками по 7 байтов.
пачка 1 имела вид :
// вдувание в адреса 0х05 -0х0B
START_IIC;
set_byte_I2c (0x34 ,ACK); // адрес нашего слэйва, + "Write"
set_byte_I2c (0x05 ,ACK); // начиная с адреса 0х05
set_byte_I2c (0x1B ,ACK); // по адресу 0х05 вдули 0х1B
set_byte_I2c (0x12 ,ACK); // по адресу 0х06 вдули 0х12
set_byte_I2c (0x6B ,ACK); // по адресу 0х07 вдули 0х6B
set_byte_I2c (0xC0 ,ACK); // ну, и так далее
set_byte_I2c (0x40 ,ACK);
set_byte_I2c (0xD2 ,ACK);
set_byte_I2c (0x6B ,ACK); //по адресу 0х0B вдули 0х6B
STOP_IIC;
delay_us(200);
И следом за ней и остальные три пачки вдул туда же, после чего закрыл сессию.
И , о чудо! в присоединенном к выходу чипа R820T приёмнике PCR-1000 , на частоте 3.57 мгц зазвучала та самая пресловутая релейка на 63.750 мгц ! Без вских компов и SDR шарпов
PS: тут параллельно занимался ещё одним синтезатором LC72131 от ВЧ блочка домашнего кинотеатра, запустил наконец управление, всё работает и на FM и на AM . Причём на АМ синтезатор программируется аж до 40 мгц,
то есть этот бы приемник на короткие волны бы, да в советские времена.. это вообще был бы немыслимый подарок "диссиденту"- фиксированные настройки на КВ ! (Голос Америки, Свобода, Немецкая волна и тд. выбирались бы одним нажатем кнопки, а не поиском на слух , крутя ручку по всему диапазону. Беспоисковое и бесподстроечное вхождение в связь, это была мечта для меня в то время. У меня даже был сделан в те времена приёмник с закварцованным гетеродином на одну единственнную частоту приема - 9520 кГц . Включил,- и сразу звучит. (если есть прохождение, конечно).
|
|
Дата: 11 Мар 2018 16:39:17 · Поправил: killer258 (11 Мар 2018 21:54:06)
#
Короче говоря, все эти регистры можно для удобства поделить на две группы.
Первая группа , это 0х10, 0х12, 014, 0х15, 0х16 , и , конечно же, 0х1а == те самые, которые вычисляем и прописываем мы, для установки частоты гетеродина и фильтров на нужную частоту.
Для этого ранее мнною описывалась процедура по вычислению этих регистров для нужного значения частоты приёма, там на момент написания были некоторые неточности, которые сейас невозможно отредактировать, но я соберусь с мыслями и напишу эту процедуру в окончательном виде сначала как алгоритм, а потом со временем и как "сишную"функцию Set_Freq_R820T
Вторая группа- сюда я отношу биты включения питания многочисленных внутренних модулей чипа и всякие оставшиеся регистры, назначение которых можно будет в далььнейшем изучать , меняя их содержимое, а пока я просто подглядел, какими они были поставлены HDSDR и тупо вписываю эту группу в таком же виде.
Не ручаюсь, что всё будет максимально оптимально в этом случае, но уже есть с чего начать.
Есть массив из 28 байтов, заменяешь байты частоты на свои, остальное вписываешь как есть, всё, и приём есть.
А далее можно ради эксперимента прямо на ходу во время приёма станции уже изменять отдельно состояние любого регистра и смотреть, как что поменяется. И тогда может, удастся что-то оптимизировать даже.
Массив этот такой : (отличается от массива в начале исходника. Такими регистры становятся в конце процедуры запуска HDSDR, когда все необходимые для работы внутренние узлы уже переведены в положение PWR ON)
0x1B, 0x12, 0x6B, /* 05 to 07 */
0xc0, 0x40, 0xd2, 0x6B, /* 08 to 0b */
0xf0, 0x53, 0x75, 0x68, /* 0c to 0f */
0x84, 0xBB, 0x80, 0x31, /* 10 to 13 */
0x06, 0x12, 0x66, 0x38, /* 14 to 17 . (эти рег. естественно ,заменяете на свои значения !) */
0x48, 0xEC, 0x2A, 0x69, /* 18 to 1b */
0x24, 0xDD, 0x6E, 0xCO /* 1c to 1f */
ТОЛЬКО замените значения в регистрах 0х10, 0х14, 0х15, 0х16, 0х1А на ваши для вашей частоты приема. И всё.
Да, и ещё можете задать своё положение ползунка регулировки усиления. (это регистры 0х05 и 0х07, их табличку я давал страницей ранее). Если не будете менять ничего, то меня там поставлено 40.2 дб при этих значениях.
Разум торжествует над материей! В журнал "Радио" написать что-ли статью в рубрику "наши конструкции" (или какие уж там рубрики в нём сегодня, я давно этот журнал не читал, поди рекламой одной он напичкан теперь) ? :-)
To be continued.
|
|
Дата: 11 Мар 2018 20:33:30 · Поправил: electronic man (11 Мар 2018 21:01:13)
#
|
|
Дата: 11 Мар 2018 21:35:18 · Поправил: killer258 (12 Мар 2018 08:56:31)
#
Я и не знал, что такая An R820T2 Breakout Board печатная плата существует. А ведь удобно сделано, если экспериментировать. В качестве контроллера, управляющего этой платкой, я смотрю, STM32 использована. Это я тут, как динозавр, с пиками да атмегами занимаюсь. Даа, ARM-ы давно бы уже надо было начинать осваивать..
Выход ПЧ уже сделан на разьёме, на входе антенном какой-то бинокль имеется, вход, выход и управление по I2C выведено на контактные площадки куда более приемлемых размеров , чем те места, к которым я сейчас подпаивался..
Увеличить
По поводу исходников конечно, интересно. Пробежался сейчас галопом- видно, что чуть более подробные комментарии (ещё кусочек знания может, откусим), процедура SDM калькулятора вроде по-другому написана, в общем, надо будет потратить время на вкуривание. Пригодятся ссылки. |
|
Дата: 11 Мар 2018 22:07:08 · Поправил: electronic man (11 Мар 2018 22:58:05)
#
killer258 бинокль там как раз на выходе ПЧ, чтобы из дифф. сигнала сделать single-ended и передать его через SMA. А на плате АЦП - опять из 50 Ом -> дифф. сигнал... в угоду модульности, в общем... Можно всё на одну плату с полностью дифф. трактом ПЧ; когда дело дойдёт до проектирования "железа", - напомните, у меня вариант схемы + платки (в PCAD2006, не живьём) в загашниках есть...
Ещё раз извиняйте за забегание вперёд паровоза.
|
|
Дата: 11 Мар 2018 22:44:20 · Поправил: killer258 (11 Мар 2018 22:46:49)
#
чтобы из дифф. сигнала сделать single-ended и передать его через SMA. А на плате АЦП - опять из 50 Ом -> дифф. сигнал.
Я так понял, что у вас платы эти есть. не могли бы вы провести эксперимент, насколько хорошо всё это будет работать в смысле помех и шумов, если эту плату соединить с платой АЦП не через коротенький кабелишко, а через, скажем пятидесятиметровую бухту кабеля? В общем-то, там сигнал ПЧ довольно большой идёт при задранном до упора ползунке усиления, запас есть. (я время от времени подумываю всё о том же, о размещении этого чипа на крыше, впритык к антенне)
|
|
Дата: 11 Мар 2018 22:55:05 · Поправил: electronic man (11 Мар 2018 22:55:50)
#
плат этих у меня нет, к сожалению...
|
|
Дата: 12 Мар 2018 12:59:17
#
killer258
Развязать ПЧ по кабелю не должно быть никаких проблем, чтобы уже железобетонно - поставить балуны (трансформаторы 1 к 1 с раздельными обмотками) с двух сторон кабеля. Для частоты 3.57 или даже раза в два больше - это нет есть проблема.
Цифровую шину управления тоже бы пустить через что-то вроде рс-485. Вообще можно замахнуться всё через UTP кабель один, включая подачу питания 7-9В с дополнительным стабилизатором сверху...
|
|
Дата: 12 Мар 2018 14:10:48
#
А если витую пару попробовать в экране для ПЧ ?
|
|
Дата: 12 Мар 2018 15:27:00
#
|
|
Дата: 12 Мар 2018 22:59:33 · Поправил: killer258 (13 Мар 2018 12:42:46)
#
Поскольку смысл PPM стал ясен, я выбросил придуманную мною ранее процедуру коррекции, и просто стал принимать поправку в ppm, а далее, зная, что 1 ppm для нашего кварца равен 28.8 гц, программа к значению опоры 28800 кгц прибавляет 28.8гц, помноженное на число введенных пользователем PPM-ов.
Правда, столкнулся с небольшой проблемой. Чтобы оперировать с такой точностью, пришлось бы в программе 28.8 мгц вводить в герцах, то есть 28800000. и соответстьвенно при расчетах должна быть в герцах и частота VCO, но при моих паскалевских переменных типа Long Integer длиной в 4 байта это приводит к выходу за пределы разрядной сетки при умножении.
Пришлось ограничиться не единицами герц, а десятками, убрав там и там по одному нолику. Это позволило избежать переполнения, но немного снизило точность. Расхождение вычисляемого значения регистра 0x15 по сравнению с "ихним" значением , я проверял получается от 0 до 2-4 единичек (это по приблизительным прикидкам герц 50-100. На укв я думаю, приемлемо. ) Не знаю, как в Си, там наверное, и до герцев можно всё просчитать, если беззнаковые integer использовать.. В драйвере по крайней мере, это так. К счастью, в MikroPascal есть тип Dword, 4 байта без знака.
Если кто хочет попробовать на компе вычисление регистров R820T для заданной частоты, может попробовать мой
"калькулятор" этих регистров:
http://transfiles.ru/h6fj8
( это собственно, прообраз будущей функции Set_freq_R820t)
Под DOS ,Windows98 и даже под ХР он работает (увы, только под DOS могу писать для компа, на турбо-паскале). Под теперешними "семёрками", "восьмёрками" и "десяткой"- не проверял по причине не пользования ими, будет ли запускаться досовская программа, не знаю, скорее всего будет отказано в запуске.
Начал писать аналог алгоритма этой комповой проги, но уже для атмеги. В составе той проги, которая у меня до этого успешно вдула массив настроек в чип. Для проверки правильности вычислений при отладке буду пользоваться этим самым "калькулятором" регистров, он вчера был проверен и работает 100% |
|
Дата: 14 Мар 2018 08:16:47 · Поправил: killer258 (14 Мар 2018 10:11:22)
#
Ну, вот, написал я для атмеги обе процедуры , Init_R82x и Set_Freq_R82x
Теперь надо будет проверить , правильно ли вычисляются все эти вещи теперь и в железе , (так что вторую функцию сейчас правильнее пока назвать Calc_Freq_R82x, а потом допишу и "set", то есть то, для чего она и нужна- прописывание тем, чем нужно , шести регистров) и тогда можно будет выложить тексты после этой проверки, а то здесь редактирование постов возможно только два дня, а потом уже фиг чего поправишь. И надо будет прикупить ещё несколько свистков для этих опытов.
PS: тут кто-то писал, что есть надежда на то, что может быть, удастся программно посильнее "подзажать" выходной IF фильтр. Судя по тому, что вдувает в регистры HDSDR и SHARP, там уже выбрано самое минимальное из трёх возможных значений ширины полосы.
Регистр 0х0B. Значение 0х6B- ширина фильтра IF="narrowest" (самая узкая из трёх вариантов)
|
|
Дата: 14 Мар 2018 12:48:57 · Поправил: electronic man (14 Мар 2018 22:31:58)
#
killer258
а можно ли в вычисления ввести возможность задавать частоту кварца/генератора ?
у меня, например, есть генераторы 20.000 МГц с неплохими ppm и фазовым шумом...
|
|
Дата: 14 Мар 2018 13:13:30 · Поправил: killer258 (15 Мар 2018 12:29:22)
#
Да, такая возможность есть. У меня в этой программе переменной F_ref изначально присваивается начальное значение константа = 28800000, а затем прибавляется вводимая поправка в PPM.
Так что если потребуется, при желании можно легко в программе поменять эту константу на 20000000, либо вообще предусмотреть отдельный её ввод.
Единственное, что нужно, на мой взгляд, при этом учесть, что при понижении частоты опорного кварца будет расти требуемая целочисленная часть коэф. деления ФАПЧ, а она задаётся всего навсего одним байтом, и есть возможность его переполнения с переносом "в никуда" на верхней границе каждого из поддиапазонов. Такое может наступить при частоте кварца, как я прикидывал, меньшей чем 16 мгц.
А ещё там, я вспомнил, в исходнике упоминается про условие, что Nint не должно получаться больше 63 , если чип == R820T и, кажется, 127 для R828T
|
|
Дата: 14 Мар 2018 21:55:12
#
electronic man
Дело не в том, какие генераторы есть в наличии, ноне эта позиция доставабельна на любые частоты и в массе недорога.
Вот именно, что в массе. Необходимы генераторы с низким Ррм.
Иначе частота приема не встанет в сетку и вдобавок будет плыть.
|
|
Дата: 14 Мар 2018 22:28:46 · Поправил: electronic man (14 Мар 2018 22:36:00)
#
Burr Master
Вы правы. Виноват, сначала не указал, что за генераторы и для чего их брал...
Я, когда их выбирал и покупал, понимал, что важны не только ppm, но и фазовый шум...
вот такие генераторы у меня, брал для этого проекта, который недоразработан и до сего момента в силу разных причин пребывает в стадии "ремиссии"... И АЦП-шки ADC14L020CIVY завалялись (избыток продаю, кстати, цену сообщу в личку по запросу), у них ENOB 12 бит и они как раз максимум 20 МГц CLK "переваривают", поэтому и решил не ставить в одно устройство несколько разночастотных генераторов, чтобы не плодить кучу комбинационных помех и т.д... |
|
Дата: 14 Мар 2018 22:38:34
#
electronic man
поэтому и решил не ставить в одно устройство несколько разночастотных генераторов, чтобы не плодить кучу комбинационных помех и т.д...
Тоже придерживаюсь такого подхода, по возможности. И экранировать цифру, максимально.
|
|
Дата: 15 Мар 2018 18:23:42 · Поправил: killer258 (16 Мар 2018 07:02:09)
#
Закончил я испытания калькулятора регистров на амеге, всё сверял результаты с требуемыми. На компе всё работает чётко, а на атмеге то же самое ну тоже вроде работает, но потом обнаружилось,что не работает при вводе некоторых частот. Одна из них- это 24.500 мгц. На других всё было норм. А на компе и на этих частотах долго проверял- всё нормально. Два дня возился, искал причину, так и не нашел, хотя установил, что атмега при этом зависала при вычислениях в "SDM-calculator". Глюк исчез, когда все переменные я обьявил четырёхбайтовыми, и даже те, для которых хватало байта или 16-битного слова (после чего собственно, как ни странно, зависание и прекратилось). Хотя на компе работало и так. Это я к тому, что подводные грабли тут есть везде.
Поскольку основная функция Set_Freq_R820T уже работает, то уже сейчас считаю, можно выложить её здесь (потом будет время, перепишу её в "Сишном" варианте, хотя и по этой всё довольно понятно. Там практически всё почти так же будет. Постарался щедро сдобрить комментариями , где мог.
(понятно, конечно, что это несколько упрощенный вариант. В ихнем исходнике там ещё упоминалось про какое-то fine tune, про токи накачки и что-то ещё. но в целом, и это работает, для начала сгодится хотя бы так. Чтоб хоть с этого начать. А если сканировать 200 каналов в секунду, там конечно придётся и состояние читать, и токи накачки менять , полосу захвата в регистре 0х1А менять туда-сюда для ускорения захвата)
Строчки вида "portA:=reg10; // ======TEST=======" применялись здесь для отладки. после отладки должны быть заремлены и заменены вызовом процедуры отправки данного байта не в порт, а по I2C прямо в соответствующий регистр чипа.
Итак, лёд тронулся. Вот она, самая важная функция. Остальное всё уже на её основе можно написать ,у кого на что фантазии хватит. (клавиатура, ЖКИ, валкодеры, RS232/485, АТ-команды, ИК-пульт, фиксированные настройки, банки частот, режимы сканирования и прочее).
Я не стал прямо в этой процедуре расписывать работу с отправкой байтов по I2C в регистры чипа, а вызываю внешнюю процедуру, поскольку всё равно этими операциями будет необходимо заниматься также и процедуре инициализации чипа, а также основной программе пользователя, если будет необходимость на ходу менять содержимое отдельных регистров чипа,например, чтобы выставить другое значение усиления..
//========================================================================
procedure Set_freq_R820T(f_pr:dword; ppm:longint; var error : byte );
//========================================================================
// процедура вычисляет значения регистров,задающих частоту настройки
//для заданных частоты приема и PPM и передаёт их по шине I2C другой процедурой
// (SEND_byte_to_reg_R820t) в регистры 0х10,0х12,0х14,0х16,0х15,0х1a
// error=0 всё в порядке, error=1 - ошибка
// входные переменные :
// f_pr - целевая частота приёма в кгц (можно попробовать в герцах?)
// ppm- задать отклонение опорного кварца в PPM
//========================================================================
label m1,exit;
VAR Fget : dword; // частота гетеродина (f_pr + 3570 кгц) То, что поступает на смеситель после DivMix
var div_mix:byte; // коэффициент деления делителя VCO перед смесителем (от 2 до 64)
var f_vco: dword; // частота VCO (сначала в килогерцах, а потом в герцах)
var f_ref: dword; // частота опорного кварца ( в герцах)
var del_int:dword; // челая часть делителя ФАПЧ VCO (не должна превышать 63 если чип==R820T)
var si,ni: byte; // вспомогательные переменные при вычислении заначения регистра целого 0x14
var vco_fra: dword; // разница между частотй VCO , какой она получилась бы при использовании
// только целой части коэфф деления , и требуемой частотой VCO
var sdm : dword; // результат работы SDM калькулятора (для заполнения регистров дробности 0х16 и 0х15)
var n_sdm: dword; // одна из итерационных переменных цикла SDM-калькулятора (BYTE не годится!!!)
var reg10,reg12,reg14,reg15,reg16,reg1a, reg1a_fast: byte; // вычисляемые значения для регистров R820T
begin
error:=0 ;// изначально считаем, что ошибки нет
f_ref:=28800*1000; {чтобы до единиц герц}
fget:=f_pr+3570;
div_mix:=64; // начальное значение
// определение требуемого значения делителя между смесителем и VCO
//(работающим только на 1770-3500 мгц)
if( (fget> 22656)and (fget < 55312)) then begin div_mix:= 64; reg10:=0xA4;end;
if( (fget>= 55312)and (fget < 110625)) then begin div_mix:= 32; reg10:=0x84;end;
if( (fget>=110625)and (fget < 221225)) then begin div_mix:= 16; reg10:=0x64;end;
if( (fget>=221225)and (fget < 442450)) then begin div_mix:= 8; reg10:=0x44;end;
if( (fget>=442450)and (fget < 884900)) then begin div_mix:= 4; reg10:=0x24;end;
if( (fget>=884900)and (fget < 1770000)) then begin div_mix:= 2; reg10:=0x04;end;
if( (fget<= 22656) or (fget > 1770000)) then
begin error:=1; goto exit; end; // проверка валидности водимой частоты
portA:=reg10; // ======TEST======= (после отладки убрать!)
f_ref:=f_ref+ppm*29; // учёт поправки ppm (28.8 гц на один ppm)
f_vco:=div_mix*fget; // какой нужна будет частота VCO
f_vco:=f_vco*1000; { килогерцы -> в герцы}
del_int:=f_vco div (f_ref*2) ; // Целая часть коэфф деления в петле ФАПЧ (д.б. <63 для 820т!!!)
ni:=(del_int-13) div 4; si:= del_int-4*ni-13; // вспомогательные переменные
reg14:=ni+si*64; // вычислили регистр "целого" (по формулам даташита)
portB:=reg14; // ======TEST=======
vco_fra:=f_vco-del_int*(f_ref*2); // аргумент для SDM калькулятора
if (vco_fra=0)then reg12:=0x88 else reg12:=0x80; //нет дробной части- отключаем блок SDM
portC:= reg12; // ======TEST=======
{--------- sdm calculator----------- }
// (вычисление регистров дробного. как работает этот заимствованный алгоритм -непонятно, но он работает)
sdm:=0; n_sdm:=2;
while vco_fra > 1 do begin
if( vco_fra > ((2*f_ref) div n_sdm) ) then begin
sdm:= sdm + 32768 div (n_sdm div 2); vco_fra:=vco_fra - (2*f_ref) div n_sdm;
if(n_sdm >= 32768) then goto M1;
end;
n_sdm:=n_sdm*2;
end;
m1:
// sdm подсчитан. ( "дробное" для синтезатора )
{-----------------------------------------------------------}
reg16:= sdm div 256; // выделение старшего байта из SDM
reg15:=sdm-256*(sdm div 256); // выделение младшего байта SDM
portD:= reg16; // ======TEST=======
portE:= reg15; // ======TEST=======
// настройки RF фильтра, (рег 0х1А) зависящие от частоты
if((f_pr>24000) and (f_pr<306400)) then begin reg1A:= 0x2a ; reg1a_fast:= 0x22; end;
if((f_pr>=306400) and (f_pr<584450)) then begin reg1A:= 0x69 ; reg1a_fast:= 0x61; end;
if (f_pr>=584450) then begin reg1A:= 0x68 ; reg1a_fast:= 0x60; end;
portF:= reg1a;// ======TEST=======
// reg1a_fast-это для быстрого захвата ФАПЧ
// применим вычисленные настройки
SEND_byte_to_reg_R820t(0x10, reg10); // рег 0х10 задает коэфф деления VCO перед смеситедем
SEND_byte_to_reg_R820t(0x12, reg12); // рег 0х12 задает вкл/выкл SDM узла
SEND_byte_to_reg_R820t(0x14, reg14); // рег 0х14 задает целую часть коэф дел в петле ФАПЧ
SEND_byte_to_reg_R820t(0x16, reg16); // рег 0х16 задает старший байт дробной части коэф дел ФАПЧ
SEND_byte_to_reg_R820t(0x15, reg15); // рег 0х15 задает младший байт дробной части коэф дел ФАПЧ
SEND_byte_to_reg_R820t(0x1A, reg1a); // рег 0х1A перестраивает частоту входного RF фильтра и ещё чтото
// итого , 6 вдуваний в регистры произведено для перестройки частоты
// в этом месте по идее, можно было не только передать в чип по I2C процедурой
//SEND_byte_to_reg_R820t(address,date)
// вычисленные регистры reg10,reg12,reg14,reg15,reg16,reg1a
// но еще и проверить статус PLL lock/unlock, но это когда-нибудь потом. Обычно он и так всегда Lock.
exit:
end; // proc Set_Freq_R820T;
//=======================================================================
|
|
Дата: 15 Мар 2018 22:14:48 · Поправил: killer258 (16 Мар 2018 08:22:48)
#
А это процедура инициализации чипа:
//=======================================================================
procedure Init_R820T(); // заполняет все регистры чипа начальными значениями,(группами по 7 байтов за один раз)
// при которых все его внутр. модули будут включены,(300 миллиампер!), усиление = 40.2 дб,
// а чип начнет принимать на дефолтной частоте. Для смены частоты приёма на желаемую потребуется
// только поменять содержимое шести регистров ( 0х10, 0х12, 0х14, 0ч16, 0х15, 0х1А )
//=======================================================================
begin
// прописываем адреса 0х05 - 0х0B
START_IIC;
set_byte_I2c (0x34 ,ACK); // slave адрес чипа R820T, режим:запись
set_byte_I2c (0x05 ,ACK); // адрес регистра, начиная с которого,будем прописывать
set_byte_I2c (0x1B ,ACK); // содержимое регистра 0х05 (установка усиления)
set_byte_I2c (0x12 ,ACK); // "lna power control" близко к максимальному
set_byte_I2c (0x6B ,ACK); // рег 0х07. (вместе с рег 0х05) выставлено усил. 40.2дб
set_byte_I2c (0xC0 ,ACK); // рег 0х08. PWD_amp и PW0_amp включены
set_byte_I2c (0x40 ,ACK); // рег 0х09. if filter power=ON, low IF Filter current
set_byte_I2c (0xD2 ,ACK); // рег 0х0A. channel filter ON, полоса фильтра "fine tune" узкая
set_byte_I2c (0x6B ,ACK); //рег 0х0B. ширина фильтра IF="narrowest" (самая узкая из 3 вариантов)
STOP_IIC;
delay_us(200);
// прописываем адреса 0х0С-0х12
START_IIC;
set_byte_I2c (0x34 ,ACK);
set_byte_I2c (0x0C ,ACK);
set_byte_I2c (0xF0 ,ACK); // рег 0х0С vga_power on, IF VGA controlled by vagc pin,
//IF VGA manual gain=-12db
set_byte_I2c (0x53 ,ACK); // 0х0D power детекторы
set_byte_I2c (0x75 ,ACK); // 0x0E power детекторы
set_byte_I2c (0x68 ,ACK);//0x0f clk pin output вкл,internal agc clock вкл
set_byte_I2c (0x84 ,ACK); //REG10 mix_div= 32
set_byte_I2c (0xBB ,ACK); // reg 0x11 PLL analog drop out regulator=1.9v
set_byte_I2c (0x80 ,ACK); // reg 0x12 блок SDM (участвует в дробности) включен
STOP_IIC;
delay_us(200);
// прописываем адреса 0х13 - 0х19
START_IIC;
set_byte_I2c (0x34 ,ACK);
set_byte_I2c (0x13 ,ACK);
set_byte_I2c (0x31 ,ACK); // ----
set_byte_I2c (0x06 ,ACK); // REG14 уст частоты
set_byte_I2c (0x12 ,ACK); //REG 15 уст частоты
set_byte_I2c (0x66 ,ACK); //REG16 уст частоты
set_byte_I2c (0x38 ,ACK);
set_byte_I2c (0x48 ,ACK);
set_byte_I2c (0xEC ,ACK); //
STOP_IIC;
delay_us(200);
// прописываем адреса 0х1a -0хF0
START_IIC;
set_byte_I2c (0x34 ,ACK);
set_byte_I2c (0x1A ,ACK);
set_byte_I2c (0x2A ,ACK); // 1A!!
set_byte_I2c (0x69 ,ACK);
set_byte_I2c (0x24 ,ACK);
set_byte_I2c (0xDD ,ACK);
set_byte_I2c (0x6E ,ACK);
set_byte_I2c (0xC0 ,ACK); // filter extension under weak signal enable,pwd timing-среднее
set_byte_I2c (0x00 ,ACK); //-------
STOP_IIC;
delay_us(200);
end; //proc init_R820T
//======================================================================
Запускаем сначала её, потом Set_Freq_R820T и на выходе ПЧ имеем то, что надо.
|
|
Дата: 15 Мар 2018 22:31:50 · Поправил: killer258 (16 Мар 2018 08:32:25)
#
Упоминавшаяся ранее процедура одиночной записи байта в нужный регистр чипа выглядит так
//========================================================================
procedure SEND_byte_to_reg_R820t(address:byte; date:byte);
// (производит одиночную запись байта date в регистр чипа с адресом address)
//=======================================================================
begin
START_IIC;
set_byte_I2c (0x34 ,ACK); // slave адрес чипа R820T, режим:запись
set_byte_I2c (address ,ACK); // адрес регистра чипа, куда пишем
set_byte_I2c (date ,ACK); // то, что пишем
STOP_IIC;
end; //proc SEND_byte_to_reg_R820t
//=========================================================================
// все остальные операции с I2C низкого уровня - set_byte_I2c (byte,ACK) , ставящая байт на шину I2C и мелкие процедурки START_IIC; STOP_IIC;- тут собственно, всё делается по-книжному, стандартным образом, ничего интересного.
|
|
Дата: 16 Мар 2018 00:42:32
#
killer258
Любо-дорого посмотреть.
|
|
Дата: 16 Мар 2018 02:04:14
#
killer258
Круто!
|
|
Дата: 16 Мар 2018 08:50:52 · Поправил: killer258 (16 Мар 2018 09:32:34)
#
Надо будет замерить время выполнения функции Set_Freq_R820T для оценки ограничения возможной скорости перебора каналов при сканировании, а также при использовании чипа R820T в качестве ВЧ генератора для создания ачх-метра или антенного анализатора. (27-1700 мгц)
Я имею в виду вот такое использование чипа http://www.steila.com/sdr/RFgenmod/index_v09.html
Очень уж заманчиво сделать аналог измерителя АЧХ Х1-50 ,но с несколько меньшим весом и габаритами, в виде гаджета размером с пачку сигарет и графическим ЖКИ, и с более точным измерением, так как частотные метки можно будет на экране ставить не только 10 и 1 мгц, но и более подробно, и шкала будет точнее. |
|
Дата: 16 Мар 2018 12:54:00 · Поправил: killer258 (16 Мар 2018 14:20:11)
#
Просмотрел я сейчас в симуляторе, короче, вычисление функции Set_Freq_R820T без отправки по I2C (то есть чистая "математика") происходит за 1.19 миллисекунды на атмеге с кварцем на 16 мгц
С отправкой всех шести регистров по I2C c длительностью положительного уровня импульса СLK 10 мксек (50 кгц?) всё вместе это заняло 5.15 миллисек.
то есть, на 400 кгц I2C по приблизительным прикидкам, на всё про всё около 2 миллисекунд должно получиться. Имхо.
|
|
Дата: 16 Мар 2018 13:45:44 · Поправил: ZayaTCCC (16 Мар 2018 13:57:37)
#
Оформите теперь все в виде подключаемого файла .h и файла с примером использования и можно на github выкладывать...
А с управлением усилением не разбирались ещё и с полосой фильтра ПЧ?
Похожий проект, только чип T2: Управление R820T2 |
Реклама Google |
|