受信器の検討

はじめに

400MHz付近で使えるRFICを調査している. 10kHz幅電力を測定出来れば良いのだが1ppmの周波数精度(誤差4kHz以内程)で測りたい. 今は1ppm局発と急峻なアナログLPFを使う方式か,アナログは簡素にして10sps以上のADCとDigital Filterで10kHz切り出すか どちらかにする予定で検討している

RFIC

VHF/UHFダイレクトコンバージョンIC SL6609

SL6609は 470MHzまでのダイレクトコンバージョン FSK復調器として利用できるIC.

SL6609を使ってみた方が少しいるようで21MHz CW受信はできているようです. SL6609

400MHz付近で使ってみたく,またGtrator Filterの幅が気になる所.
400MHz局発を入手次第,pin1 / pin15の周波数特性を測ってみたい.

R820T

R820TのSpecを載せる.

特徴として下記がある.
・ESD(Electic static discharge)保護機能付きノッチフィルタ
・20MHz程度のオシレータで動作
・Fc4MHz 6~8MHz幅のLow-IF FIlterを備える

Low-IF FIlterのFcとBW

RTLSDR RTL2832U V3

RTLSDR V3は0.5M-24MHzまでDIRECT SAMPLING出来たり,Expansion PORTSがあるので拡張ができそうだ.

RFM22B

源振や設定変更すれば400MHzで使えそうな感じがするのでとりあえず購入して試してみる. https://www.sparkfun.com/datasheets/Wireless/General/RFM22B.pdf

アンチエリアシングフィルタ

 LPFも検討中.ArduinoやESP32のADCが数10kHz出せるなら良いが...

 8次スイッチトキャパシタフィルタ MAX294

ESP32 ADC Speed

ESP32 ADC Speed | LabFruits によると 27.1739spsは達成できている.

ソースコードを拝借し貼り付けておく.

28
#include <chrono>
#include <Arduino.h>
#include <driver/adc.h>
 
void setup() {
  Serial.begin(115200);
  adc1_config_width(ADC_WIDTH_BIT_12);
  adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);
}
 
void loop() {
  const uint16_t samples = 10000;
 
  auto t1 = std::chrono::system_clock::now();
 
  for (uint32_t i=0; i<samples; i++) {
    adc1_get_raw(ADC1_CHANNEL_4); // GPIO32
  }
 
  auto t2 = std::chrono::system_clock::now();
 
  std::chrono::duration<double> diff = t2 - t1;
  auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(diff).count();
 
  Serial.printf("Samples: %u\n", samples);
  Serial.printf("Duration: %llums\n", ms);
  Serial.printf("KSPS: %0.4f", static_cast<double>(samples) / ms);
}