Mihail66> Это все более-менение понятно. Но нет ответа на вопрос, почему не работает расширение 12, даже в широкой полосе 62,5КГц?
Как я упоминал ранее, чтобы получить максимальную от LoRa чипов/модулей, необходимо выполнить некоторые процедуры калибровки. В этом сообщении я подробно опишу, что нужно сделать.
Некоторое введение...
Из предыдущего поста, как я там объяснил всегда есть начальная неточность и дрейф. Дрейф можно компенсировать с помощью автоматического определения смещения частоты в SX127х. Однако для этого нужно, чтобы пакет был успешно получен и декодирован. Но SX127x LoRa модуляция допускать максимальное смещение от 25% между приемником и передатчиком! Поэтому нам нужна первоначальная калибровка, чтобы разрешить прием первого пакета, а затем автоматическая калибровка смещения и коррекция могут быть применены к каждому приему пакета, чтобы позволить приемнику следовать и корректировать дрейф в любом из обоих устройств (передатчик и приемник). Поскольку относительный дрейф между двумя приемами редко превышает 25%, этот механизм значительно повышает стабильность канала и позволяет использовать меньшую полосу пропускания и более высокие коэффициенты расширения.
I. Калибровка неточности начальной частоты - частота в SX127x задается как 3-байтовое целое число, например 8638066 (то есть 428.3708 МГц при использовании 26 МГц кристалла/TCXO).
Передатчик:
- Начинаем передачу одного пакета на центральной частоте, а затем каждый последующий пакет будет передаваться со сдвигом частоты вверх и вниз на 10. Тоесть начинаем с 8638066, потом 8638076, 8638056, 8638086, 8638046 и т.д.
- В каждый пакет включают в качестве информации это значение (например 8638076), которое представляет текущую частоту передачи, остальная часть пакета должна быть случайной или меняющейся величиной и не одинаковой.
Приемник:
- Начинает слушать на той же начальной частоте и в тех же условиях, как и передатчик.
- Как только пакет успешно получен и декодирован, приемник извлекает информацию о включенном коде частоты, на которой он был отправлен и сообщает об этом только в том случае, если отношение сигнал/шум пакета выше 1 (важно).
- В зависимости от начального сдвига может пройти некоторое время, прежде чем увидим успешный прием.
- Количество пакетов, которые могут быть получены, поскольку разрыв в частоте постоянно увеличивается, зависит от полосы пропускания.
- Когда увидим прием пакета, а затем он останавливается, это означает, что мы перекрыли полосу пропускания и можем продолжить расчетыми.
Расчеты:
Мы делаем среднее значение полученных частотных кодов и из него вычитаем начальный центральный код — это дает нам начальный сдвиг.
Реальный пример:
коэффициенты расширения: 12
полосу пропускания: 20.8 кГц
код центральной частоте: 8638066
коды полученные от передатчика: 8638136, 8638146, 8638156, 8638166, 8638176, 8638186, 8638196, 8638206, 8638216, 8638226, 8638236, 8638246, 8638256, 8638266, 8638276, 8638286, 8638296
среднее значение полученного кода: 8638216
сдвиг между приемником и передатчиком: 8638216 - 8638066 = 150
Таким образом, чтобы быть на той же частоте, что и приемник, наш передатчик должен передавать на код частоты 8638066+150=8638216
II. Процедура автоматической калибровки относительного смещения. Поскольку наш передатчик и приемник уже были настроены на одну и ту же частоту относительно друг друга, это позволит нам получить по крайней мере один пакет и оттуда автоматическая коррекция частотных ошибок может начать настройку после каждого пакета, таким образом следуя за дрейфом.
- После приема каждого пакета считывается текущая разница частот между передатчиком и приемником из регистров: RegFeiMsb(0x28),RegFeiMid(0x29),RegFeiLsb(0x2A) - Это 20-битное значение дополнительный код. Это мы называем LFV (LoRaFeiValue)
- Делаем расчеты так:
LFV = LoRaFeiValue из регистров RegFeiMsb(0x28),RegFeiMid(0x29),RegFeiLsb(0x2A)
BW = полосу пропускания в КГц
Fosc = частота кристалла/TCXO в МГц
Fold = код текущей частоты
Fnew = новый частотный код
Offset = поправка на смещение - ето 8-битное значение дополнительный код
- Записываем значение Offset в регистр PpmCorrection(0x27)
- Записываем новое значение частотного кода Fnew в регистр RegFrMsb(0x06), RegFrMid(0x07), RegFrLsb(0x08)
- Fold получает значение Fnew
- после приема нового пакета делаем ту же процедуру и вычисляем новые значения для Offset и Fnew
Реальный пример для проверки:
BW = 20.8 кГц
Fosc = 26
LFV = 30222
Fold = 8638066
Fnew = 8638050
Offset = 1