МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus Prime для платы Марсоход3

Радиопередатчик с фазовой модуляцией

PM radio transmitter

После последнего проекта, где для точного измерения интервалов времени используется динамический сдвиг фазы тактовой частоты PLL в ПЛИС Альтеры, пришла в голову другая идея. А что если попытаться реализовать радиопередатчик с фазовой модуляцией?

Я однажды уже делал проект радиопередатчика частотной модуляцией. Тот проект был довольно сложным, пришлось поломать голову, чтобы он заработал. Теперь, когда я понял, как сдвигать фазу частоты PLL в FPGA, мне кажется, что уж фазовую модуляцию сделать довольно просто.

Правда тут есть одна тонкость. Обычное бытовое радиовещание ведется с частотной модуляцией, FM, то есть Frequency Modulation. Я же хочу попробовать передавать в эфир фазово-модулированный сигнал, а принимать его обычным FM-приемником, например, встроенным в мобильный телефон. Будет ли работать?

Между фазовой и частотной модуляцией несомненно есть связь. В момент изменения фазы сигнала одновременно тут же меняется и мгновенная частота сигнала. Я нашел понятное для меня описание фазовой и частотной модуляции и их связь в статье http://www.dsplib.ru/content/pmfm/pmfm.html

Там есть формула (3), которая показывает, что мгновенная частота радиосигнала - это производная от его полной фазы:

wt (3)

Далее в той же статье приведены формулы (6) и (9), которые описывают радиосигнал при фазовой и частотной модуляции:

pm s(6), фазовая модуляция

fm s(9), частотная модуляция

Здесь, w- несущая частота, sm (t) - модулирующий сигнал, m и w1 - индексы модуляции.

Рассматривая эти формулы, я подумал, что если модулирующий сигнал проинтегрировать и подать на фазовый модулятор, то на выходе я получу точно частотно-модулированный сигнал. С другой стороны, интеграл от синусоидального сигнала будет косинусоидальным сигналом. Исходя из этого нужно ли вообще предварительно интегрировать?

В общем, я не претендую на особую научность моих изысканий. Давайте просто попробуем и посмотрим, что получится.

Я делаю проект для ПЛИС MAX10 платы Марсоход3bis, но, поскольку проект простой, он может быть с легкостью перенесен на другие ПЛИС, главное, чтобы там имелся PLL и можно было бы динамически менять фазу тактовой частоты. Весь проект можно взять на github: https://github.com/marsohod4you/Fpga-PM-Radio

В моем проекте ПЛИС имеется PLL с двумя выходными частотами и обе 100МГц. На частоте c0 работает вся логика проекта, а вот частота c1 будет прямо выходить на цифровой выходной пин ПЛИС. Точнее даже на два выходных пина, прямой и инверсный. К этим двум пинам я подключу два куска провода по 0,75 метра. Таким образом я получу антенну в виде "полуволновый вибратор". В самом деле, при частоте 100МГц длина волны 3 метра. Два четвертьволновых вибратора - это примерно полтора метра.

Сразу прошу прощения у тех, кто считает, что перед антеной нужен полосовой фильтр на излучаемый диапазон. Да нужен, но в данный момент я не проектирую реальный передатчик, просто делаю эксперименты, да и сама антена уже является фильтром. Плюс ко всему мощность излучения очень мала - так, только поиграться.

Далее, проект для ПЛИС будет принимать выборки аудио сигнала из последовательного порта. Я буду посылать в плату не сжатый аудио файл в формате Моно, 8 бит/выборку, 22050 выборок в секунду. Скорость порта я выбираю стандартную 230400 бит в секунду. Поскольку при последовательной передаче каждый байт содержит старт бит, восемь бит данных, один или два стоп бита, то как раз на приемном конце и получится 230400/11=20945 выборок в секунду. Это конечно не стандартные 22050, но как-то примерно похоже. Ожидаемый тон аудио будет чуть ниже, чем должен быть, процентов на 5..

Еще в проекте ПЛИС имеется восьмибитное число определяющее "текущую фазу" на выходе PLL c1. Разница между значением текущей фазы и принятым значением выборки из последовательного порта - это сколько шагов сдвига фазы нужно сделать. Специальная машина состояний выполняет нужный сдвиг фазы PLL сразу после приема выборки аудио сигнала.

Вообще, весь модуль довольно прост и написан на Verilog HDL:


module top(
  input wire CLK100MHZ,
  input wire key0,
  input wire key1,
  input wire FTDI_BD0, //serial RX line
  output wire [19:0]io
);

wire wc0;
wire wc1;
wire wlocked;
wire wpdone;
wire up_down;
reg pstep;

wire scanclk; assign scanclk = wc0;

reg [7:0]cnt8;
always @( posedge scanclk )
  cnt8 <= cnt8 + 8'h01;

mypll mypll_ (
  .areset( ~key0 ),
  .inclk0(CLK100MHZ),
  .phasecounterselect( 3'b011 ),
  .phasestep( pstep ),
  .phaseupdown( up_down ),
  .scanclk(scanclk),
  .c0(wc0),
  .c1(wc1),
  .locked(wlocked),
  .phasedone( wpdone )
);

wire [7:0]w_rx_byte;

wire w_byte_ready;
reg [1:0]byte_rdy;
always @( posedge wc0 )
  byte_rdy <= {byte_rdy[0],w_byte_ready};

serial receiver(
  .reset( ~wlocked ),
  .clk100( wc0 ), //100MHz
  .rx( FTDI_BD0 ),
  .sbyte( 8'h00 ),
  .send( 1'b0 ),
  .rx_byte( w_rx_byte ),
  .rbyte_ready( w_byte_ready ),
  .tx(),
  .busy(),
  .rb()
);

reg [7:0]current_pll_phase = 0;
wire [7:0]signal; assign signal = w_rx_byte[7:0];
assign up_down = signal>current_pll_phase;

reg [3:0]state = 0;
always @( negedge scanclk )
begin
  case(state)
  0: begin
       //wait recv byte
       if( byte_rdy ) state <= 1;
     end
  1: begin
       //do we really need to change phase?
       if( current_pll_phase==signal ) state <= 0;
       else state <= 2;
     end
  2: begin
       //wait phase done
       if( ~wpdone ) state <= 3;
     end
  3: begin
       state <= 4;
     end
  4: begin
       state <= 1;
     end
  endcase

  if( pstep && (~wpdone) )
   if( up_down )
    current_pll_phase <= current_pll_phase + 6'h1;
   else
    current_pll_phase <= current_pll_phase - 6'h1;

  if( ~wpdone )
    pstep <= 1'b0;
  else
  if( state==2 )
   pstep <= 1'b1;
end

assign io[17:0] = 0;
assign io[18] = wc1; //antenna pin0
assign io[19] = ~wc1; //antenna pin1

endmodule


В проекте используется PLL, в котором при настройке в мегавизарде установлен флажок "enable phase shift step resolution". При этом, внутренняя максимальная частота PLL, Fvco=1300MHz, а минимальный достижимый фазовый сдвиг частоты можно получить в 96,15 пикосекунд. Фазу выходной тактовой частоты PLL можно динамически сдвигать на один шаг (96ps) за цикл изменения фазы. Когда приходит новая выборка аудиофайла схема вычисляет, сколько нужно сделать шагов по изменению фазы и в какую сторону делать эти шаги, сдвигать фазу частоты вперед или назад. Потом делаются эти сдвиги и ожидается следующая выборка аудио.

Ну и конечно, вот видеодемонстрация, как работает передатчик с фазовой модуляцией:

Здесь видно, что пока проект не загружен в ПЛИС, то радиоприемник FM в мобильном телефоне довольно сильно шумит на частоте 100МГц. После загрузки проекта в ПЛИС шум в радиоприемнике смолкает, так как в эфире появляется несущая частота. Затем, я открываю программу терминала TeraTerm,  настраиваю последовательный порт и начинаю передачу аудио файла. Файл аудио подготовлен в формате 8 бит моно, 22050Гц в программе Audacity.

Я слушаю композицию "Podington Bear" с сайта http://freemusicarchive.org/music/Podington_Bear/

Во время передачи аудиофайла через последовательный порт в плату Марсоход3bis с проектом фазового модулятора в радиоприемнике слышна эта композиция.

ЗЫ: кстати, скоро, 7-го мая, мы отмечаем "День Радио". Думаю этот проект будет как раз кстати.

 

Комментарии  

0 #5 sim31 05.03.2018 00:07
Интегрировать не обязательно. Но желательно, синусоиды остаются синусоидами, но спектр изменяется, более высокочастотные увеличивают амплитуду. Да и просто же это, типа
x(t)=x(t)-x(t-1)
одна операция вычитания. Ну может с парой коэффициентов ))
0 #4 Leka 07.05.2017 19:29
Цитирую Masterix:
Цитирую alex_b:
Очень интересный проект. Ещё приёмник добавить и замечательный on-chip трансивер получится.

Наверное приемник сделать только на плис уже не получится.

НЧ усилитель можно попробовать сделать на LVDS компараторе и триггере с динамическим сдвигом фазы клока. На вход подаем сумму сигнала с пилой, и измеряем сдвиг фазы. А с ВЧ частью сложнее.
0 #3 Leka 07.05.2017 19:23
Спасибо за проект. Раньше думал, что сигнал из PLL нельзя напрямую выводить через произвольный пин, только через триггер или DDR блок. Теперь понятно, что можно и напрямую.
0 #2 Masterix 05.05.2017 18:42
Цитирую alex_b:
Очень интересный проект. Ещё приёмник добавить и замечательный on-chip трансивер получится.

Наверное приемник сделать только на плис уже не получится.
-1 #1 alex_b 05.05.2017 15:51
Очень интересный проект. Ещё приёмник добавить и замечательный on-chip трансивер получится.

Добавить комментарий



facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Проекты Проект Марсоход3 Радиопередатчик с фазовой модуляцией