МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА: Радиоприемник на ПЛИС

Радиоприемник на ПЛИС 3 года 4 мес. назад #6191

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

Ynicky пишет: Тогда как производить настройку, какой нужен дисплей?

Настройку аналоговой части делаю по встроенному стробоскопическому осциллографу 900Мвыб/сек, 900*512 точек, вывод на VGA. Оцифрованные данные вывожу также по одностороннему(только Tx-пара в комп, без Rx-пары от компа) 100Мбит/сек ethernet, UDP.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Радиоприемник на ПЛИС 3 года 4 мес. назад #6192

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Мой расчет фильтров в Октаве, конкретно этот - полосовой, смысл в "hs" и "hc" - см предыдущий пост.
Можно менять "M" "N" "K". В качестве обычного полосового фильтра можно взять "hc", в качестве ФНЧ - "h".
Синтез фильтра - методом частотной выборки, значения в переходной зоне "b" и "c" вычислены аналитически :silly:
pkg load signal;
clear;

M=1500; % порядок=2*M+1
N=6; % центр=N+1
K=3; % ширина=2*K

B=2*K+1;
a=1;
b=3/4-1/B; 
c=1/4-1/B; 

s=zeros(2*M+1,1);
for m=1:K-1;
	s(m)=1;
end 
s(K)=a;
s(K+1)=b;
s(K+2)=c;
s(2*M-K)=c;
s(2*M-K+1)=b;
s(2*M-K+2)=a;
for m=2*M-K+3:2*M+1;
	s(m)=1;
end 
S=fft(s);
h=real(fftshift(S));
hm=h(M+1);

hc=[];
hs=[];
for m=1:2*M+1;
	hc=[hc,h(m)*cos(2*pi*(m-(M+1))*N/(2*M+1))];
	hs=[hs,h(m)*sin(2*pi*(m-(M+1))*N/(2*M+1))];
end
hc=hc';
hs=hs';

A=2**15-1;

h=round(h/hm*A);
hc=round(hc/hm*A);
hs=round(hs/hm*A);
hm=A;

%save "hc3000.txt" hc;
%save "hs3000.txt" hs;


Z=25;
w = 0:pi/(M+1)/Z:pi;

Hc=abs(freqz(hc,1,w));
Hs=abs(freqz(hs,1,w));

Hm=Hc(N*Z);
figure(2);
subplot(2,1,1);
plot(h/hm,"color","g");
hold on;
plot(hc/hm,"color","r");
plot(hs/hm,"color","b");
hold off;
grid on;
subplot(2,1,2);
plot(20*log10(Hc/Hm),"color","r");
hold on;
plot(20*log10(Hs/Hm),"color","b");
hold off;
grid on;
clear;

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Радиоприемник на ПЛИС 3 года 4 мес. назад #6200

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

Leka пишет: Передатчик: 1м заземленный штырь, пока подключен напрямую к 3.3В выходу ПЛИС. Куплю детали, сделаю выходной LC контур на 28МГц.

Для умощнения выхода объединил впараллель несколько пинов. Надо-бы переменную индуктивность ~3мкГн для подстройки выходного контура в резонанс, подходящую не нашел, намотал на "бинокле"(что было под рукой). Резонанс ищу, перемещая передатчик относительно арматуры и тп. Не думал, что будет так чувствительно к положению, +/-полметра, и резонанс пропадает (к корпусу прикрутил микроамперметр с диодом, по нему и смотрю).
Завтра вынесу приемник(занимает ~450 ЛЕ и 8 блоков памяти) "в поле", погляжу, как сигнал ловить будет...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Радиоприемник на ПЛИС 3 года 4 мес. назад #6201

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
150м - сигнал ловится (уже слабо), приемник с короткой антенной (25см) и без заземления (таскал в сумке).
Спасибо сказали: SOVA

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Радиоприемник на ПЛИС 3 года 4 мес. назад #6202

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Cхема приемника и передатчика (в прямоугольниках - внутренние элементы ПЛИС).

Номиналы зависят от паразитных емкостей и тп, можно менять. Варикап любой ВЧ, с емкостью ~20пФ при малых напряжениях смещения(0..1В) (сам использовал не тот, что на схеме указан, а другой с похожими параметрами).

Тк в проекте использовался стробоскопический осциллограф (для настройки), который раньше был написан на "Си как HDL", то и остальной код был написан на нем-же. Для "полевых" тестов использовался упрощенный код (который заливался после настройки) - без осциллографа и ethernet (тк батарейное питание, и помех меньше). Если кто-то захочет попробовать повторить проект, этот упрощенный код могу перевести в верилог (на перевод осциллографа пока нет времени).
Но настройка непростая. И надо учитывать, что через встроенные диоды текут токи, поэтому 100% гарантии, что ПЛИС не сгорит, нет (у меня DE0-nano и для приемника, и для передатчика).
Топ-модуль приемника на "Си как HDL", в v.zip используемые верилоговские модули PLL, ROM, RAM, *.mif (sig4clk2 использовался для осциллографа 900Мвыб/сек, для приемника это не нужно, но не стал сильно менять код).
//-----------------------------------------------------------------------------
ext [1] CLOCK_50;
ext [2] AMP_CMP;
bit  [2] AMP_SW; 
bit  [1] AMP_GEN; 
bit  [8] LED;
top(){

	bit [1] clk450, clk225; 
	pll2(9,1,2)(CLOCK_50, clk450, clk225); 
	
	bit [2][4] sig4clk2; 
	rx4clk2(clk450, AMP_CMP[0], sig4clk2[0]);		
	rx4clk2(clk450, AMP_CMP[1], sig4clk2[1]);			
	
	bit [2] sigOR;
	rx4(clk225, sigOR[0], sig4clk2[0]);
	rx4(clk225, sigOR[1], sig4clk2[1]);
		
	bit [1] data, ready;
	amp(clk225, data, ready, sigOR, AMP_GEN, AMP_SW);	
	
	filtled(clk225, data, ready, LED);
}
//-----------------------------------------------------------------------------
ext [1] data, rdy;
bit  [8] LED;
filtled(){

	bit [16] hs; rom("hsin.mif")(ah, hs);
	bit [16] hc; rom("hcos.mif")(ah, hc);
		
	bit [11] ah;
	bit [12] ar, aw;
	bit [1] isin;
	bit [1] re, we;
	agen(ah, ar, aw, isin, re, we, rdy);
	
	bit [1] qw, qr;
	mem(12,1)(qw, data, aw, we, qr, 0, ar, 0);
	
	filt(LED, qr, we, re, isin, hs, hc);
}
//-----------------------------------------------------------------------------
reg [11] ah;
reg [12] ar, aw;
reg [1] isin;
reg [1] re, we;
ext  [1] rdy;
agen(){
	reg [11] step; isin=step[10];
	reg [1] rdy0, we0, clr; 
	rdy0=rdy;
	we0=we;
	we=rdy0&~rdy;
	re=we0&~we;
	
	ah=ah+step;
	if(ah==1495) step=-1;	
	if(ah==0) step=0;	
	if(re){ ah=1; step=1; }

	ar=ar+1; 
	if(ar==2990) ar=0;
	if(re) ar=aw;
	
	if(we){ 
		aw=aw+1;
		if(aw==2990) aw=0;
	}
}
//-----------------------------------------------------------------------------
reg [8] LED;
ext [1] qr, we, re, isin;
ext [16] hs16, hc16;
filt(){
	reg [32] hs, hc;
	hs={{16{hs16[15]}},hs16};
	hc={{16{hc16[15]}},hc16};
	reg [32] sadd, ssub, cadd, csub;
	reg [32] m, mc, ms, ac, as;
	if(qr^isin) ssub=ssub+hs; if(~qr^isin) sadd=sadd+hs;
	if(qr) csub=csub+hc; if(~qr) cadd=cadd+hc;
	if(re){
		mc=cadd-csub;
		ms=sadd-ssub;
		ac=mc[31]?~mc:mc;  
		as=ms[31]?~ms:ms;  
		m=ac+as;		
		LED[7:2]=m[24:19];
		LED[0]=qr;	
		LED[1]=~qr;	
		ssub=0; sadd=0; 
		csub=0; cadd=0; 
	}
}
//-----------------------------------------------------------------------------
reg [1] sig;
ext [4] sig4clk2;
rx4(){ sig = |sig4clk2; }
//-----------------------------------------------------------------------------
reg [1] data, ready;
ext [2] ampcmp;
reg [1] AMP_GEN; 
reg [2] AMP_SW; 
amp(){ 
	reg [2][8] delay;
	reg [2][8] code1; 
	reg [2][8] code0; 
	reg enagen;
	
	ready=0; 
	delay=delay+1; 
		
	if(delay==0){ enagen=1; AMP_GEN=0; }		

	if(enagen){
		if(delay[0][1:0]==1) AMP_GEN=1; 
		if((delay[0][1:0]==2)&(|ampcmp)&(code0==0)){ code0=delay; code1=ampcmp; }		
		if(delay[0][1:0]==3) AMP_GEN=0;  
	}
	
	if(delay==2046) enagen=0; 
	if(delay==2048) data=code0[0][2]^code1[0][0];
	if(delay==2050) ready=1; 	
	if(delay==2127){ AMP_GEN=0; code0=0; code1=0; }													
	if(delay==2143) AMP_SW=0x0; 			
	if(delay==2600) AMP_SW=0xz; 			
	if(delay==2999) delay=0; 	
}
//-----------------------------------------------------------------------------
Вложения:
Спасибо сказали: SOVA

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Радиоприемник на ПЛИС 3 года 4 мес. назад #6203

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Удалось "обмануть" Квартус, и соединить ключ со входом компаратора внутри ПЛИС, убрав лишний пин. Это важно, тк емкость одного пина с разводкой не менее 15пФ, на ВЧ это существенно. Для этого пины компаратора объявляются, как "INOUT", и стандарт "BUS LVDS".

Проверено, работает. Кстати, вообще без приемной антенны сигнал ловится на расстоянии 50м, это странно. Это означает неэффективность текущего варианта приемной антенны, и наличие какой-то паразитной "антенны". Но антенна не должна нарушать балансировку плеч усилителя...
Вложения:
Спасибо сказали: SOVA

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.
Время создания страницы: 0.884 секунд

ВКонтакте  facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Вопросы о плате Марсоход Радиоприемник на ПЛИС