SI4432 - вопрос по возможностям железяки и библиотеки

kost82
Offline
Зарегистрирован: 30.11.2015
Добрый день!
Собираю устройство, сканирующее выбранный диапазон частот с настраиваемым шагом сканирования.
Использую Arduino + SI4432 и библиотеку RF22 от RadioHead
Для установки частоты использую функцию setFrequency() которая принимает два параметра:
Цитата:
[in] centre Frequency in MHz. 240.0 to 960.0. Caution, some versions of RH_RF22 and derivatives implemented more restricted frequency ranges.
[in] afcPullInRange Sets the AF Pull In Range in MHz. Defaults to 0.05MHz (50kHz). Range is 0.0 to 0.159375 for frequencies 240.0 to 480MHz, and 0.0 to 0.318750MHz for frequencies 480.0 to 960MHz,
Может кто-то подсказать, что это за второй параметр afcPullInRange? На что он влияет?
И второй вопрос: с какой точностью SI4432 может устанавливать частоту? Ну то есть сколько знаков после запятой имеет смысл передавать в первый параметр?
У меня задача отловить пики RSSI при сканировании, но создается впечатление, что для нее +/-100кГц не имеют значения. Либо частота выбирается из какого-то заданного ряда частот и при выполнении setFrequency() просто устанавливается ближайшая из этого ряда.
 
kf4vbb
Offline
Зарегистрирован: 02.07.2020

afcPullInRange можно не трогать (лучше AFC отключить)

 
важнее подстраивать channel RBW (50-600kHz) чтобы не перескочить  сигнал 
 
быстро сканировать  перебором каналов(REG 0X79)   а не установкой базовой частоты (REG.0X75-77)    
kost82
Offline
Зарегистрирован: 30.11.2015

Спасибо, а может подскажете примерный алгоритм работы. Допустим мне надо просканировать диапазон 430-345 МГц с шагом, например 50кГц. Когда частоту лучше переключать установкой центральной частоты, а когда подгонять каналами? И как вычислить итоговую частоту при переключении каналов?

kost82
Offline
Зарегистрирован: 30.11.2015

Как можно узнать какому каналу SI4432 какая соответствует частота? Я загуглил список каналов, например для частоты 433 МГц, получил таблицу типа вот этой http://www.viva-telecom.ru/SHOP/DOPINFO/FREQ/lpd.php Таблица довольно странная (для меня), например первый канал 433.075МГц, и далее идет с шагом 0.025МГц. Непонятно куда делись частоты 433.025 и 433.050. Дальше смотрим канал 38 - это уже 434 МГц.
Как тогда можно организовать перебор частот и каналов в цикле? Например если бы было известно, что каждый канал это 0.025МГц, то было бы просто: встал на частоту 433 и листаешь все каналы (40 штук), затем переключился на 434 и снова листаешь 40 каналов. Тут же без таблицы не разобраться. То есть нужен массив частот и массивы частот каналов.

И второй вопрос: соответствуют ли каналы si4432 этим каналам из таблички. И как узнать что значит "канал" для этого устройства? То есть проблема в том, что листая каналы - нужно знать какая частота им соответствует. У меня с этим "затык".

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

kost82 пишет:
Непонятно куда делись частоты 433.025 и 433.050
Ответ здесь.

На остальные вопросы найдешь ответы здесь.

kost82
Offline
Зарегистрирован: 30.11.2015

Благодарю всех откликнувшихся, похоже я немного начинаю понимать принцип.

Andy пишет:

Ответ здесь.

На остальные вопросы найдешь ответы здесь.

По частотам понял, значит все дело в нашем законодательстве, а не в железках.
По каналам тоже примерно начал понимать. Нашел на странице 55 даташита формулу несущей частоты
fcarrier = (fb+24+(fc+fo)/64000) x 10000 x (hbsel+1) + (fhch x fhs x 10) [kHz]

kf4vbb пишет:

важнее подстраивать channel RBW (50-600kHz) чтобы не перескочить  сигнал

быстро сканировать  перебором каналов(REG 0X79)   а не установкой базовой частоты (REG.0X75-77)    


Я правильно понял, что изменяя регистры 79h и  7Ah можно сделать шаг частоты, кратный, например 50 или 100 кГц и "плавненько" сканировать диапазон?
Ну например я устанавливаю базовую частоту 433 МГц и подстраивая параметры fhch и fhs могу получить корректный RSSI на всех этих частотах. Затем устанавливаю базовую, например, 434МГц и снова оперирую правой скобкой в этой формуле. Все верно?

kf4vbb
Offline
Зарегистрирован: 02.07.2020
если  нужен шаг 25khz то  перебираем нечетные каналы установив базовую частоту +25
 
потом четные с 0 offset (как телевизор показывает полукадры)
 
правда при минимальной  CH. RBW 50kHz разрешение улучшится совсем немного.
 
 У меня получается сканировать 1000 ch/s,  экранчик 240x320 обновляется 4раза в секунду
kost82
Offline
Зарегистрирован: 30.11.2015

Прошу прощения, я немного не понял несколько моментов:

kf4vbb пишет:

если  нужен шаг 25khz то  перебираем нечетные каналы установив базовую частоту +25

 

Это значит, что устанавливаем, например, 433.025 и листаем каналы 1..3..5, но ведь каналы просто дают смещение от базовой частоты. Или я неправильно понял "базовую частоту +25"?

kf4vbb пишет:

потом четные с 0 offset

Разъясните пожалуйста что это значит "с 0 offset". Опять непонятно.

И еще непонятно: могу я установить сразу базовый частоты с нужным шагом не переключая каналы? 433.025...433.050 и т.д. Если не думать про скорость сканирования. Допустим, что меня устраивают паузы между переключением базовых частот.

kf4vbb пишет:

У меня получается сканировать 1000 ch/s,  экранчик 240x320 обновляется 4раза в секунду

Ваше устройство где-то описано? Можете ссылочку скинуть, если не трудно. Интересно посмотреть как у других реализовано.

kf4vbb
Offline
Зарегистрирован: 02.07.2020
две несущие (+50кГц),  SI4432 почти не различает 2 канала

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

https://www.youtube.com/watch?v=f0O7nw0VF2M

kost82
Offline
Зарегистрирован: 30.11.2015

И все-таки, может кто-то объяснить, почему листать каналы быстрее и точнее, чем изменять частоты? Вроде все должно быть так же: меняем регистры, считываем показания... Или установка частоты невозможно с точностью до 25-50 кГц?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

kf4vbb пишет:

две несущие (+50кГц),  SI4432 почти не различает 2 канала

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

https://www.youtube.com/watch?v=f0O7nw0VF2M

хорошая реализация

kf4vbb
Offline
Зарегистрирован: 02.07.2020

kost82:  что быстрее -вычислять базовую частоту и писать 6 байт в регистры

или инкримент канал и передать 2 байта ?

 
установив оффсет можно без потери скорости  обновлять 2 si4432  (приемник и TG)

https://www.youtube.com/watch?v=QQ-WbklLRqg

https://youtu.be/eD7MLr27BTY

 

kost82
Offline
Зарегистрирован: 30.11.2015

Но ведь вычислять полученную частоту все равно надо. Чтобы строить график зависимости RSSI от частоты.
Два байта конечно быстрее передать, чем шесть.

Может есть другая возможность спросить у si4432 на какой частоте она по факту работает в данный момент, кроме как чтение регистров и вычисления по ним частоты? 

kost82
Offline
Зарегистрирован: 30.11.2015

Задам более конкретный вопрос

#include <RH_RF22.h>

double frequencyStart = 430.500; //MHz
double frequencyStop = 450.500; //MHz
double frequencyStep = 0.005;//MHz
uint8_t RSSI_level = 0;

RH_RF22 rf22;


void setup() {
  Serial.begin(9600);
  Serial.setTimeout(50);//Сокращаем время таймаута порта.
  Serial.println("Arduino OK");//Вывод тестового сообщения.
  
  if (!rf22.init()) {
  Serial.println("init failed");//Инициализация радиомодуля не прошла.
  }
  else {
    Serial.println("Init Si4432 OK");//Инициализация радиомодуля прошла корректно.
  }

  //Коммутируем на ПРИЕМ пины управления ключом GPIO1 to 0, GPIO2 to 1:
  rf22.spiWrite(RH_RF22_REG_0B_GPIO_CONFIGURATION0, 0x1F); //Set GPIO0 to 0. Устанавливаем пин 7 сишки в 0.
  rf22.spiWrite(RH_RF22_REG_0C_GPIO_CONFIGURATION1, 0x1D); //Set GPIO1 to 1. Устанавливаем пин 8 сишки в 1.
  //
  rf22.setModeIdle();
  rf22.setModeRx();//Устанавливаем режим приема.
  delay(10);
  RSSI_level = rf22.rssiRead(); //Считываем значение уровня сигнала.
}

void loop() {
  delay(500);
  for (double i = frequencyStart; i <= frequencyStop; i += frequencyStep) {
    rf22.setFrequency(i);//Устанавливаем частоту (в МГц).
    delay(20);
    RSSI_level = rf22.rssiRead(); //Считываем значение уровня сигнала.
    Serial.print("Freq = ");
    Serial.print(i);//Выводим значение частоты в МГц.
    Serial.println(" MHz");
    Serial.print("RSSI_level = ");
    Serial.println(RSSI_level);//Вывод значения мощности.
  }
  Serial.println("//============================//");
}

Ссылка на библиотеку RF22 в первом сообщении топика.
Сканируем устройство с несущей частотой 433,92, а максимум RSSI получается на частоте 433,95 то есть погрешность как минимум 30 кГц. 
Если заглянуть в библиотеку, то метод setFrequency выглядит так:

bool RH_RF22::setFrequency(float centre, float afcPullInRange)
{
    uint8_t fbsel = RH_RF22_SBSEL;
    uint8_t afclimiter;
    if (centre < 240.0 || centre > 960.0) // 930.0 for early silicon
	return false;
    if (centre >= 480.0)
    {
	if (afcPullInRange < 0.0 || afcPullInRange > 0.318750)
	    return false;
	centre /= 2;
	fbsel |= RH_RF22_HBSEL;
	afclimiter = afcPullInRange * 1000000.0 / 1250.0;
    }
    else
    {
	if (afcPullInRange < 0.0 || afcPullInRange > 0.159375)
	    return false;
	afclimiter = afcPullInRange * 1000000.0 / 625.0;
    }
    centre /= 10.0;
    float integerPart = floor(centre);
    float fractionalPart = centre - integerPart;

    uint8_t fb = (uint8_t)integerPart - 24; // Range 0 to 23
    fbsel |= fb;
    uint16_t fc = fractionalPart * 64000;
    spiWrite(RH_RF22_REG_73_FREQUENCY_OFFSET1, 0);  // REVISIT
    spiWrite(RH_RF22_REG_74_FREQUENCY_OFFSET2, 0);
    spiWrite(RH_RF22_REG_75_FREQUENCY_BAND_SELECT, fbsel);
    spiWrite(RH_RF22_REG_76_NOMINAL_CARRIER_FREQUENCY1, fc >> 8);
    spiWrite(RH_RF22_REG_77_NOMINAL_CARRIER_FREQUENCY0, fc & 0xff);
    spiWrite(RH_RF22_REG_2A_AFC_LIMITER, afclimiter);
    return !(statusRead() & RH_RF22_FREQERR);
}

Вроде похоже на описание в доках: частота устанавливается через регистры 76 и 77, никаких дополнительных смещений нет. Не пойму почему такая точность низкая? Вопрос сейчас именно в точности сканирования, а не в скорости. Я ожидаю точность в пределах 5 кГц, возможно ли ее достигнуть?

 

kost82
Offline
Зарегистрирован: 30.11.2015

https://www.sparkfun.com/datasheets/Wireless/General/RFM22.PDF
Нашел тут на 22 странице описание магии настройки несущей частоты. Там реально без пузыря не разобраться.
Оказывается весь диапазон 240-930МГц разделен на два: 240-479,9 и 480-930. Диапазон задаётся битом hbsel регистра 75h (0 - первый диапазон, 1 - второй).
Дальше каждый диапазон делится на 24 поддиапазона (по 10 МГц). Поддиапазоны
задаются пятью битами fb того же регистра 75h.
То есть регистр 75h оперирует отрезками по 10МГц. Это называется integerPart в доках и библиотеке.
Регистры 76h и 77h (в сумме 16 бит) "добивают" частоту до нужной. Это назвали fractional part (F).