Перейти к содержанию

    

Трансивер SX1276

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый же вопрос - зачем Вам это надо? Сообщите конкретные параметры канала

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверно связано с корректировкой частоты канала при изменении внешней температуры и уходом кварца!?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
показания регистра ошибки по частоте (20 бит), посчитать численное значение корректировки по приведённой в DataSheet формуле, вычесть его из текущего значения регистра несущей и вписать его туда.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Периодически возвращаюсь к 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);

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Добрый день! Периодически возвращаюсь к 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);
                    }
                }

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

Код, приведённый выше не работает. Кто работал с 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, приношу извинения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация