УДК 621.396.62
МИКРОПРОЦЕССОРНЫЕ СИНТЕЗАТОРЫ СЕТКИ ЧАСТОТ РАДИОПРИЕМНЫХ УСТРОЙСТВ МВ-ДКМ ДИАПАЗОНА. ПРОГРАММА РАСЧЕТА КОЭФФИЦИЕНТОВ ДЕЛЕНИЯ ПО АЛГОРИТМУ ЕВКЛИДА
© П.А. Федюнин, И.Т. Степаненко
Fedyunin Р.А., Stepanenko I.Т. Frequency net microprocessor synthesisers of metre- and decametre-range radio-receiving units. A programme for calculating coefficients of division using the Euclidus algorithm. The article contains a detailed account of the issue.
В настоящее время в радиоприемных устройствах радиостанций метрового и декаметрового диапазонов широкое применение находят многокольцевые синтезаторы косвенного (активного) синтеза. В таких схемах можно совместить малый шаг сетки, малую длительность переходных процессов в системе и высокие частоты выходных колебаний.
В многокольцевых синтезаторах, как и в синтезаторах с дополнительным преобразованием частоты в тракте анализа, появляются аналоговые элементы -смесители и полосовые фильтры. Это характерно для многих современных синтезаторов, т. к. проблему синтеза частот в широком диапазоне только цифровыми методами в настоящее время решить трудно. При построении синтезаторов применяются и цифровые, и аналоговые элементы на основе их рационального сочетания.
Решение противоречия между сокращением шага сетки частот и повышением быстродействия систем активного цифрового синтеза заключается в применении микропроцессоров в сочетании с некоторым допуском на отклонение синтезируемой частоты от ее номинального значения. Такой допуск позволяет использовать в кольце импульсно-фазовой автоматической подстройки (ИФАП) достаточно высокую частоту сравнения и этим обеспечить быстродействие. Но частота сравнения оказывается различной для различных синтезируемых частот, что создает сложную задачу ее выбора. Решить данную задачу можно путем применения микропроцессора.
Рассмотрим в качестве примера синтез частоты в диапазоне 12,8... 14,9999 МГц при частоте опорного
генератора/0 = 5 МГц с шагом сетки частот 10 Гц. Выберем из этой сетки случайную частоту /,ых1 =
N
= 129877430 Гц. Для схемы рис. 1 /иых = А/^т = — /0 .
т
При шаге сетки 10 Гц коэффициенты деления должны быть N = 1298743 и т = 500000. Частота сравнения в рассматриваемой схеме оказывается очень малой (10 Гц), а коэффициенты деления очень велики, так что делители получаются весьма сложными и длительность переходных процессов велика.
Поставленную задачу можно решить и по-другому, если заменить требуемое отношение коэффициентов И/т достаточно близким к нему другим. Например, если выбрать УУ= 9299, а т = 3580, то/ВЬ|Х1 = 129877430, 16759 Гц и отличается от требуемого значения всего на 0,16759 Гц. Относительная погрешность не превышает 1,29-10 8, т. е. имеет такой же порядок, как погрешность хорошего опорного генератора. В ряде случаев такая погрешность вполне допустима. При данном техническом решении требуется частота сравнения, приблизительно равная 1,396 кГц, а коэффициенты деления не превышают 10 000.
Если выбрать данную случайную величину из требуемого диапазона, например/ЬЪ1х2 = 13564570 Гц (/^Ь1х2 = 1356457
_ г ^ то дЛЯ нее с погрешностью не Оолее
500000
2,44-10~8 можно принять ^ых2:
5651
2083
fo = 13564570,33125
Гц. Частота сравнения теперь приблизительно равна 2,4 кГц, а коэффициенты деления опять не превышают 10000.
УГ
0Г
г л /о /-11 и
'"Ч./Т
ФИ ДПКД1 ИФД
Команды от внешних устройств на
формирование требуемой частоты
'•тт 'птах
ДПКД2
/
1
/■!
тіп ~1утах
Микропроцессор
ИФД1
а)
ДПКД1
Команды от внешних
устройств на _______„
формирование требуемой частоты
УГ2 ДПКД4
~Ъ\~
Г
ДЩЦЗ
Микропроцессор
б)
Рис. 2. Схема синтезатора с микропроцессором (активный цифровой синтез)
Частоты сравнения, необходимые для формирования /вых1 и /вых2> действительно оказываются неодинаковыми. Поэтому и между ОГ и ИФД должен быть включен ДПКД (рис. 2а). Выбор коэффициентов деления обоих делителей, необходимых для получения требуемых частот, сложен, и только использование микропроцессора позволит осуществить его достаточно быстро и без излишнего усложнения системы управления.
Принцип нахождения новых коэффициентов деления основан на использовании алгоритма Евклида, позволяющего представить любое рациональное число в виде конечной дроби. Такую дробь можно ограни-
668481 1356457
ственно нулевое, первое, второе и т. д. приближения для величины Ы/т. Например, для частоты/вых1
2 3 5 13 200 213 413 9299 19011 Т’ТТТ’ТГ’ 82 ’159’3580’ 7319 ’ 66332 85343.151675.1298743. 25537’32856’ 58393 ’ 500000 ’
для частоты/вых2
2 3 8 19,274 567.2542 5651.19495 7’ГЗ’ 7 ’10Г209’ 937 ’2083’ 7181 ’
246407 500000
В микропроцессор необходимо ввести данные о требуемом значении выходной частоты синтезатора и допустимых значениях N и т.
В ряде случаев рассмотренная простая схема цифрового синтезатора с микропроцессором (см. рис. 2а) не обеспечивает требуемой точности выходной частоты. Для устранения этого недостатка схему усложняют - используют два кольца ИФАП (рис. 26). Частота выходных колебаний в такой схеме
/ =— / J вых ■> о
пт
Микропроцессор и в этой схеме по команде от внешних устройств на формирование требуемой частоты /вых определяет оптимальные коэффициенты деления делителей ДПКД1 - ДПКД4 при допустимых значениях коэффициентов п, Ы,т,Ьц к.
Нами разработана программа расчета коэффициентов деления микропроцессорного синтезатора частот по алгоритму Евклида, позволяющая с заданной точностью рассчитать коэффициенты деления ДПКД микропроцессорного синтезатора сетки частот (прилож.1).
Поступила в редакцию 4 ноября 2004 г.
Приложение 1
Программа расчета коэффициентов деления микропроцессорного синтезатора частот
по алгоритму Евклида
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForml = class(TForm)
Buttonl: TButton;
Editl: TEdit;
Label3: TLabel;
ListBoxl: TListBox;
ListBox2: TListBox;
Button2: TButton;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Label1: TLabel;
Edit6: TEdit;
Label2: TLabel;
Li stBox3: TListBox;
ListBox4: TListBox;
procedure ButtonlClick(Sender: TObject); procedure Button2Click(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
Forml: TForml; implementation {$R *.DFM}
// Программа расчета коэффициентов деления микропроцессорного
// синтезатора частот по алгоритму Евклида
// Ермаков К.С. Авиационные системы связи. М.: Монино, 1992.
procedure TForml.ButtonlClick(Sender: TObject);
Var
A,B,F:Array[0..12] of Real; dF,Fmid,С,D:Array [0 . .12] of Real; i,j,n,k,m;integer;
FLAG:boolean; f_min, f_max, F0 : Real ;
FI,Ff,Dd:real;
new_freq,freq_srav:real;
a_l, b__l, d_l, dF_l, dF_dop : real;
begin
(Диапазон синтезируемых частот синтезатора}
f_min:= 1.5*1000000; f_max:=31.5*1000000;
FLAG:-False;
//FI:=2000000;
FI:= StrToFloat(editl.text);
If ((Fl<f_min) OR (Fl>f_max)) Then FLAG:=True;
If (FLAGoTrue) Then Begin
F0:=5000000; {Частота опорного генератора Гиацинт-М}
C[0]:=F1/F0; {Исходное отношение коэффициентов деления}
т? Гл1 . /т?г\\ .
с [_ и j ; = un*—i v с х / с v / ,
А [0] :=F[0] ;
В [0] : =1 ;
//
//
11
П
II
//
II
//
//
//
//
//
//
ListBoxl.Clear;
ListBox2.Clear;
ListBoxl.Items.Add('A'+FloatToStr(0) + ' = 1+FloatToStr (A [0] )) ;
ListBox2.Items.Add('В'+FloatToStr(0)+'=1+FloatToStr(B[0]));
For n:=1 to 12 do Begin
C[n] := (1/(C[n-1] -F[n-1] ) ) ;
F [n] : = Round (C [n] ) ;
If (nol) Then Begin
a_l : =A [n - 1 ] ; b_l:=B[n-l];
A [n] : =A [n-1] *F [n] + A [n-2] ;
B[n] :=B[n-l] *F[n] + В [n-2] ;
D[n] : =F1 -F0*A [n] /В [n] ;
Fmid [n] :=F1/A[n] ; dF [n] : =Abs (D [n] ) /FI ;
ListBoxl.Iterns.Add('A1+FloatToStr(n) + 1 = 1+FloatToStr(abs(A[n])));
ListBox2.Items.Add(1В'+FloatToStr(n) + 1 = 1+FloatToStr(abs(B [n] ) )) ;
ListBoxl.Items.Add(10П dF1+FloatToStr(n)+1='+FloatToStr(dF[n]));
ListBox2.Items.Add('0П dF1+FloatToStr(n)+'='+FloatToStr(dF[n])); writeln ( 1A' , n, 1 = 1 , abs (A [n] ) ) ; writeln('В',n,' = ',abs(B[n]));
writeln(1 Относительная погрешность dF',n, 1 = 1,dF[n] ) ;
if (Abs(D[n])<0.00001) Then FLAG:=True;
If (A[n]>9999) OR (B [n]>9999)Then FLAG:=True;
If (Abs(D[n] )<0 . 00001) Then FLAG:=True;
end;
If (FLAG=True) Then Break;
If (n=1) Then Begin
A [ 1 ] : =A [ 0 ] *F [1] + 1;
В [1] :=F [n] ;
Dd:= FI - F0 *A[1]/В[1] ; dF[1]:=Abs(Dd)/FI;
ListBoxl.Items.Add('A1+FloatToStr(1) + 1 = '+FloatToStr(abs(A[1]))) ;
ListBox2.Items.Add(1В 1+FloatToStr(1) + 1 = ’+FloatToStr(abs(B[1]))) ;
ListBoxl.Items.Add(10П dF1+FloatToStr(1)+1=’+FloatToStr(dF[1]));
ListBox2.Items.Add(10П dF1+FloatToStr(1)+1=’+FloatToStr(dF[1])); writeln(1 A1,1, ’ = 1,abs(A[1])) ; writeln ( ’ В 1 , 1, 1 = ’ , abs (B [1] ) ) ; writeln(1dF1,1,1 = 1,dF[1]); end;
end;
end;
If b_l<>0 Then d_l : =Fl-F0*a__l/b_l ; dF_l:=Abs(d_l)/FI;
edit2.text := 'a_l = ' +floattostr(a_l)+ ' b_l = ' +floattostr(b_l) +'dF_l= ' +floattostr(dF_l); edit3.text := 'Абс.погр.=' + floattostr(d_____1); {для определения знака погрешности}
dF_dop:=Fl*0.0000001;
edit4.text := 'Абс.погр.(доп)=1 + floattostr(dF_dop); {}
new_freq := FI + dF_dop;
edit5.Text:=floattostr(new_freq);
ВТОРОЕ КОЛЬЦО
Частота на выходе new_freq Частота сравнения freq_srav := new_f req*b_l/a_l ; edit6.Text:=floattostr(freq_srav);
FI := new_freq;
FI := freq_srav;
If ((Fl<f_min) OR (Fl>f_max)) Then FLAG:=True; FLAG:=False;
If (FLAG<>True; Then Begin
F0:=5000000; {Частота опорного генератора Гиацинт-М)
C[0]:=F1/F0; {Исходное отношение коэффициентов деления}
F[0] :=Round(F1/F0) ;
А[0] : =F [0] ;
В[0]:=1;
ListBox3.Clear;
ListBox4.Clear;
ListBox3.Items.Add(1 A1 +FloatToStr(0) + ' = '+FloatToStr(A[0])) ;
ListBox4.Items.Add(1В'+FloatToStr(0) + ' = 1+FloatToStr(B[0])) ;
For n:=l to 12 do Begin
C[n] :=(l/(C[n-l]-F[n-l]));
F [n] : =Round ( С [n] ) ;
If (nol) Then Begin
a_l : =A [n- 1 ] ; b_l:=B[n-l] ;
A [n] : =A[n-l] *F [n] + A[n-2);
В [n] : =B [n - 1] *F [n] + В [n - 2 ] ;
D [n] : =F1-F0*A [n] /В [n] ;
Fmid [n] : =F1/A [n] ; dF [n] : =Abs (D [n] ) /FI;
ListBox3.Items.Add(1 A'+FloatToStr(n) + ' = '+FloatToStr(abs(A [n] )) ) ;
ListBox4.Items.Add{'В'+FloatToStr(n)+'='+FloatToStr(abs(В[n])));
ListBox3.Items.Add('ОП dF'+FloatToStr(n)+'='+FloatToStr(dF[n]));
ListBox4.Items.Add('ОП dF'+FloatToStr(n)+1='+FloatToStr(dF[n]));
// writeln(1A1,n, 1 = ',abs(A[n])) ;
// writeln ('В 1 , n, 1 = ' , abs (B [n] ) ) ;
// writeln('Относительная погрешность dF',n,1 = ’,dF[n]);
II if (Abs(D [n])<0.00001) Then FLAG:=True;
If (A[n]>9999) OR (B[n]>9999)Then FLAG:=True;
If (Abs(D[n])<0.00001) Then FLAG:=True;
*
end;
If (FLAG=True) Then Break;
If (n=l) Then Begin
A [1] : =A [0] *F [1] + 1;
B[l] : =F [n] ;
Dd:=Fl - F0*A[1]/В [1] ; dF [1] : =Abs (Dd) /FI;
ListBox3.Items.Add('A1+FloatToStr(1) + 1 = 1+FloatToStr(abs(A[1]))) ;
ListBox4.Items.Add(1 В'+FloatToStr(1) + 1 = '+FloatToStr(abs(B[1]))) ;
ListBox3.Items.Add('0П dF'+FloatToStr(1)+'=1+FloatToStr(dF[1]));
ListBox4.Items.Add(10П dF1+FloatToStr(1)+1=1+FloatToStr(dF[1]));
// writeln('A1 ,1, ' = ',abs(A[1])) ;
// writeln('В1, ' = 1,abs(B [1]));
IJ writeln (' dF 1, 1 = 1 , dF [ 1 ] ) ;
end;
end;
end;
end;
procedure TForml.Button2Click(Sender: TObject); begin
close; end;
end.