Jump to content

    
Sign in to follow this  
JohnKorsh

Трансивер SX1276

Recommended Posts

Добрый день! Работает ли кто с SX1276 от SemTech? Это LoRa трансивер. Если да, то как правильно скорректировать частоту приёма? Поясню, чего хочу: ФАПЧ там разомкнута. "Замыкать" её должен разработчик программного обеспечения. Процесс следующий: во время приёма преамбулы (в регистрах есть соответствующий флажок) я должен считать показания регистра ошибки по частоте (20 бит), посчитать численное значение корректировки по приведённой в DataSheet формуле, вычесть его из текущего значения регистра несущей и вписать его туда. При тщательном следовании DataSheet, после корректировки, частота приёма сдвигается настолько, что сам приём становится невозможным. Может кто сталкивался и решил задачу? (На SemTech написал, пока не ответили). Да, при этом Kit работает отлично, но коды в микроконтроллере прикрыты.

Share this post


Link to post
Share on other sites
показания регистра ошибки по частоте (20 бит), посчитать численное значение корректировки по приведённой в DataSheet формуле, вычесть его из текущего значения регистра несущей и вписать его туда.

1. корректировка разве пишется не в регистр коррекции ppm?

Вообще какая у Вас получилась ошибка? По крайней мере корректировка +- 5кГц при полосе 62.5 кГц мало влияет на прием, а если ошибка больше 5кГц, то подозрительно

Share this post


Link to post
Share on other sites

Она может влиять на время захвата ФАПЧ при приеме. Вернее при малом отклонении короткой преамбулы достаточно для вычисления коррекции и принятия пакета

Share this post


Link to post
Share on other sites

Спрошу в теме кто работал с подобными решениями от Semtech(в частности SX1278). Насколько я понял факт приема пакета критически зависит от длины преамбулы. Если приемник не увидит преамбулу все остальные улучшайзеры просто бесполезны. Как рассчитать режим приемника "Wake on...." чтобы он цеплял преамбулу в окне приема? Беглое чтение мануала четко не дало ответ на этот вопрос. Если в FSK все более и менее прозрачно то как это в LoRa?

Share this post


Link to post
Share on other sites
Спрошу в теме кто работал с подобными решениями от Semtech(в частности SX1278). Насколько я понял факт приема пакета критически зависит от длины преамбулы. Если приемник не увидит преамбулу все остальные улучшайзеры просто бесполезны. Как рассчитать режим приемника "Wake on...." чтобы он цеплял преамбулу в окне приема? Беглое чтение мануала четко не дало ответ на этот вопрос. Если в FSK все более и менее прозрачно то как это в LoRa?

Лично мне это далеко не так прозрачно в ФСК . А от Лоры не вижу прнципиального отличия, теже самые согласованные фильтры используются. Поскольку у них закрыто все что можно - то имхо - только опытным путем

Share this post


Link to post
Share on other sites

Но про "прозрачность" конечно не прав - скажем так "проприоретарная прозрачность". Просто ранее работали с техасом там по крайней мере достаточно много в документации и апнотах про это было расписано с формулами и примерами и в реальности это работало (конечно при необходимом SNR).

Share this post


Link to post
Share on other sites

Добрый день! Периодически возвращаюсь к LoRa (как у всех много текущей работы). Ответа пока не нашёл. На передачу отлично работает - видно по спектроанализатору. Вот мой исходник на приём, может, кто ткнёт носом в мою ошибку?

(И исоднике оставил суть. Принимает два-три пакета и "уходит" по частоте.)

 

В DataSheet приведена формула для корректировки частоты:

 

Ferr = (([0x28 (4 разр.), 0x29, 0x2A] * 2^24)/Fxtal) * (BW [KHz]/500)

 

Не понял её суть - откда такие коэффициенты? Но это просто любопытство. Хуже, что не принимает.

 

Посчитал по этой формуле коэффициенты для каждого из BW

//

// Frequency correction coefficients.

//

const double K_f [8] =

{

0.008192,

0.010923,

0.016384,

0.021845,

0.032768,

0.043691,

0.065536,

0.131072

};

 

Вот мой исходный код на приём. Пробовал долго и продолжаю пробовать - видны следы попыток.

//

// Search for the received packet. The process lasts for 100 * Wait mS.

//**************************************************************************

//

unsigned char Srch_Rec (unsigned char Wait)

{

unsigned char i = 0; // Счётчик циклов приёма.

unsigned long Cnt = 0; // Используется для индикации процесса приёма, к сути не имеет отношения.

unsigned char R_Stat = 0; // Считанный статус приёмника.

unsigned char Work = 0; // Рабочая переменная для считывания 'длинных' данных по шине SPI.

unsigned long Frq = 0; // Считаннное значение текущей частоты.

unsigned long F_Err = 0; // Считанное значение корректировки частоты.

unsigned long F_Cor = 0; // Перессчитанное по формуле значение корректировки частоты.

unsigned char Mod_Stat = 0; // Считанный статус Модема.

 

// (Можно сократить число переменных, но так удобнее отслеживать процесс).

 

//

//--------------------------------------------------------------------------

//

 

if (Wait == 0) // Корректирую, сколько ждать пакет, не 0, а то слишком долго.

{

Wait = 1;

}

 

// Wait of the packet receive.

 

i = 0; // Обнуляю счётчик циклов приёма.

do

{

 

Mod_Stat = RFM_Rd_Data (0x18); // Читаю состояние модема, чтобы убедиться.

// что он принимает преамбулу, так как только тогда

// корректировочные данные в регистре 0x2A, 0x29, 0x28 верны.

 

// Read of the Frequency Error only in preamble receiving modem status.

 

if ((Mod_Stat & 0x01) == 0x01)

{

Work = RFM_Rd_Data (0x28); // Читаю и 'собираю' корректироввочные значения.

F_Err = Work;

F_Err = F_Err << 8;

Work = RFM_Rd_Data (0x29);

F_Err = F_Err | Work;

F_Err = F_Err << 8;

Work = RFM_Rd_Data (0x2A);

F_Err = F_Err | Work;

 

// Frequency coorection.

 

if (F_Err != 0)

{

Ind_Hex (235, 58, F_Err, WHITE, BLACK); // Индицирую корректировку.

 

Work = RFM_Rd_Data (0x06); // Читаю текущее значение частоты.

Frq = Work;

Frq = Frq << 8;

Work = RFM_Rd_Data (0x07);

Frq = Frq | Work;

Frq = Frq << 8;

Work = RFM_Rd_Data (0x08);

Frq = Frq | Work;

 

 

if ((F_Err & 0x80000) == 0x0) // Корректировочное значение положительно (используется только 4 разряда в старшем байте)?

{

F_Cor = ceil (K_f[RFM95_Regime] * F_Err); // Вычисляю по указанной формуле смещение частоты.

Frq = Frq - F_Cor; // Вычитаю корректировку из значения несущей.

}

else

{

F_Err = ((F_Err ^ 0xFFFFF) & 0xFFFFF); // Если отрицательно, то перевожу в абсолютное значение.

F_Cor = ceil (K_f[RFM95_Regime] * F_Err); // Вычисляю по указанной формуле смещение частоты.

Frq = Frq + F_Cor; // Добавляю корректировку к значению несущей.

}

 

RFM_Set_Frq (((Frq >> 16) & 0xFF), ((Frq >> 8) & 0xFF), (Frq & 0xFF)); // Выставляю скорректированное значение частоты.

 

Work = RFM_Rd_Data (0x06); // На всякий случай, читаю и индицирую, что получилось.

Frq = Work;

Frq = Frq << 8;

Work = RFM_Rd_Data (0x07);

Frq = Frq | Work;

Frq = Frq << 8;

Work = RFM_Rd_Data (0x08);

Frq = Frq | Work;

Ind_Hex (235, 45, Frq, GREEN, BLACK);

}

}

Share this post


Link to post
Share on other sites
Добрый день! Периодически возвращаюсь к LoRa (как у всех много текущей работы). Ответа пока не нашёл. На передачу отлично работает - видно по спектроанализатору. Вот мой исходник на приём, может, кто ткнёт носом в мою ошибку?

(И исоднике оставил суть. Принимает два-три пакета и "уходит" по частоте.)

 

разбираться в Вашем коде лень, делаю так:

                {
                float tf;
                const int32_t bwErrCoef[] = {122, 92, 61, 46, 31, 23, 15, 8, 2};

                // get freq offset
                readBuf(LORARegFeiMsb, lrTempBuf, 3);
                freqOffset = 0x10000*(uint32_t)lrTempBuf[0] + 0x100*(uint32_t)lrTempBuf[1] + (uint32_t)lrTempBuf[2];
                if (freqOffset & (1<<19))
                    freqOffset |= 0xFFF00000;
                freqError = (int32_t)freqOffset/bwErrCoef[(int)pRfm->loraBW];
                tf = ((float)freqError)/(float)pRfm->freq;
                tf *= 1000000.0;
                    if (pRfm->corrPpm != (int8_t)tf)
                    {
                        pRfm->corrPpm = (int8_t)tf;
                        if (pRfm->corrPpm < 100.0 && pRfm->corrPpm > -100.0)
                            writeReg(LORARegPpmCorrection, pRfm->corrPpm);
                    }
                }

естественно это все при успешно принятом пакете

 

 

Share this post


Link to post
Share on other sites

Коллеги, купил из разных партий BSFrance Lora32u4 HDP13 (sx1276).

Не мог понять, почему друг друга не слышат, включил ФМ приёмник на 868мгц и слышу, что несущая частота у них отличается : у одного экземпляра вместо заданной мной 868 вообще 866.7..

 

SX1276 как-то калибруется?

Share this post


Link to post
Share on other sites

Добрый день!

Код, приведённый выше не работает. Кто работал с SX1276-79, гляньте, пожалуйста, может поправите меня?

Результат уж больно крамольный - ошибка в DataSheet.

Отвечу на вопросы выше - корректировка нужна, в основном, при работе в узкой полосе - 7,8 КГц. и около - чутьё максимальное, но, для такой полосы надо либо

TCXo с bpm, либо подстраивать, как указано в DataSheet. При кварцевых резонаторах видно на спектроанализаторе значительное различие несущих.

При более широких полосах ppm кварцевого генератора вполне достаточно.

В 8-битный регистр коррекции ppm пишется отклонения тактовой частоты в ppm, а не корректировка несущей.

Повторюсь, в SX1276-SX1278 не замкнута петля ФАПЧ по несущей частоте. Это должен делать программист, считывая после

принятия преамбулы, значение разницы частот приёмника и передатчика и самостоятельно добавляя (или вычитая)

это число из текущей установки частоты. Предварительно умножив на коэффициент, зависящий от установленной полосы.

Второй раз такое встречаю и именно в трансивере с ЛЧМ (первый раз - Nanotron).

Попутный вопрос - не объяснит ли кто, почему так, то есть, что стоит фирме сделать это на аппаратном уровне,

чтобы пользователь и не знал?

 

Формула для расчёта коэффициента пропорциональности между отсчётом и требуемой корректировкой из DataSheet:

Ferr = (([Value]*2^24)/Fxtal) * (BW [KHz]/500) (1)

где:

Value – число, считанное из регистров коррекции частоты [28,29,2A];

Fxtal – частота опорного кварца (32 000 000 Гц);

BW – диапазон в КГц.

Ferr – число, которое нужно добавлять (вычитать) к значениям регистров, задающих частоту [6,7,8].

 

По DataShet приёмник допускает отклонения +/- 25% от ширины полосы приёмника (стр. 37).

При использовании формулы (1) сдвиг частоты намного превышает +/-25% от ширины полосы приёмника.

Вне зависимости от режимов работы трансивера шаг подстройки синтезатора остаётся постоянным и

равным 61 Гц. Следовательно, можно подсчитать требуемый коэффициент пропорциональности.

Длина регистра отсчётов коррекции частоты 20 бит, включая знаковый бит - диапазон изменения

отсчётов +/-2^19 = +/-524288. Из этого можно вывести коэффициент пропорциональности между

отсчётом регистра коррекции частоты [28,29,2A] и требуемым значением корректировки частоты,

которое нужно добавлять (или вычитать) из текущего значения [6,7,8]:

 

Для диапазона 7,8 КГц вот что получается:

7,8 КГц * 0,25 = 1,95 КГц

Шаг синтезатора 61 Гц, следовательно, показания отсчёта корректировки не должны быть больше

1,95/61=31,96, приблизительно, 32.

Следовательно, корректировочный коэффициент должен быть

524288/32=0,000061035, а по формуле (1) это 0,008179. Это в 134 раза больше.

 

Расчёты проведены для всех режимов работы - и всегда данные по формуле (1) надо делить на 134, то есть формула должна

иметь вид:

Ferr = (([Value]*2^24)/Fxtal) * (BW [KHz]/67000) (2)

Если частота передатчика ниже частоты приёмника, то отсчёт положительный – в старшем разряде 0.

Число из [28,29,2A], после умножения на коэффициент, надо вычитать из содержимого регистров, определяющих частоту.

Если частота передатчика выше частоты приёмника, то отсчёт отрицательный – в старшем разряде 1.

Полученное число, после умножения на коэффициент, надо добавлять к содержимому регистров, определяющих частоту,

предварительно отбросив знаковый разряд и преобразовав результат из дополнительного кода.

Проверил на практике - работает (если по формуле - приём разваливается после первой же корректировки частоты).

Хотелось бы, чтобы кто-то поправил - как то не верится в ошибку в DataSheet.

 

 

 

Да, конечное, 32/524288, а не 524288/32, приношу извинения.

Share this post


Link to post
Share on other sites

Коллеги, кто разобрася с корректировкой частоты в Sx1276, sx1272? Не получается скорректировать частоту. В даташите треборание на кварц ±30ppm, но в реали с таким кварцем без корректировки lora не работает.

Что сделал: Собрал модуль, частота резонатора 32МГц. Задал частоту приёма/передачи 868 МГц. Смотрю анализатором - передача ровно на частоте 868 МГц. Пакеты ходят без ошибок.

Ставлю менее точный кварц. запускаю передачу - анализатор показывает 868,050 МГц. Хорошо.... в регистры частоты записываю меньшую частоту, в результате передача становиться ровно на 868МГц, но данные все с ошибкой. 

понятно что кодировка (битрэйт) съехал. Из даташита

image.thumb.png.758a04676649d8e22d94c9ecafaee9c9.png

у меня уход несущей на 50 кГц, т.е. 57 ppm. 0.95*57 = 54. Записываю 54 в регистр PpmCorrection - не помогает. Заношу минус 54, не помогает. Сделал отправку раз в сек, при каждом пакете значение регистра PpmCorrection инкриминирую на 1 - нет ни одного пакета без ошибки. PpmCorrection  крутил долго, несколько раз от 0 до 255 прошел - ни одно принятого пакета без ошибки. Причем, когда меняю регистр PpmCorrection, то частота передачи стоит на месте, т.е. PpmCorrection корректирует ppm кварца, от которого работает несущая, но несущая от PpmCorrection  не меняется. В связи с этим вопросы:

1) какой правильный алгоритм корректировки частоты?

2)на что и как влияет PpmCorrection?

Edited by razrab83

Share this post


Link to post
Share on other sites

Кварцы, даже из одной партии, могут отличаться на несущей на 3...5 килогерц!
При 32 МГц, это составит десятки килогерц на 900 МГц. Что, естественно, даст выбег за полосу пропускания, вплоть до полной потери сигнала.
Так что первое, что посоветую сделать при узкополосной ЧМ - без всякой АПЧ проконтролировать частоты опорника. 
Лично я их подгоняю до десятков герц расхождения. 
И только потом играться с АПЧ.
Да и то, если оба девайса работают на резонаторах и трансиверах из одной партии, и при одинаковых температурах -  нет никакого смысла этого делать.
Либо с умом, учитывая что температура от пакета к пакету не меняется. И поправку достаточно уточнять раз в несколько секунд/минут. В специально отведённое для этого время. Опять же, информацию о температуре можно брать с самого трансивера, и опять же уйти от АПЧ, способной загнать частоту куда угодно.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this