По простому,если надо менять ТОЛЬКО вых. частоту, можно сделать так:
собственно сама функция, вх частота в МГц. (с шагом 5 МГц от 100 МГц до 2555 МГц)
CODE
bool setFreq(int outputFreq)
{
int freqStep = 5; // шаг выходной частоты, в МГц
int pfdFreq = 32000; // частота опоры, в кГц, ставим своё!
int vcoDivider, INT, MOD, FRAC, temp;
char syntReg[24];
// заполняем массив регистров, которые будут грузиться в синтезатор.
// начинаем с 5 регистра, т.к. грузить будем с него.
// Значения должны быть взяты из программы Adf435x.
// В той программе рассчитываем регистры на
// одну частоту (напр 150МГц), проверяем что всё работает,
// копируем их сюда. В этой функции в этих насчитанных регистрах
// будут меняться только те данные, которые отвечают за смену частоты.
// Те значения что приведены тут в качестве примера, скорее всего не рабочие!
// Reg5
syntReg[0] = 0x00;
syntReg[1] = 0x40;
syntReg[2] = 0x00;
syntReg[3] = 0x05;
// Reg4
syntReg[4] = 0x00;
syntReg[5] = 0xac;
syntReg[6] = 0x00;
syntReg[7] = 0x3c;
// Reg3
syntReg[8] = 0x00;
syntReg[9] = 0x00;
syntReg[10] = 0x04;
syntReg[11] = 0xb3;
// Reg2
syntReg[12] = 0x18;
syntReg[13] = 0x00;
syntReg[14] = 0xde;
syntReg[15] = 0xc2;
// Reg1
syntReg[16] = 0x08;
syntReg[17] = 0x00;
syntReg[18] = 0x99;
syntReg[19] = 0x01;
// Reg0
syntReg[20] = 0x00;
syntReg[21] = 0x36;
syntReg[22] = 0x13;
syntReg[23] = 0x78;
// Проверяем, что частота попадает в шаг
if ((outputFreq%freqStep)!=0)
return false;
// В зависимости от частоты выбираем значение выходного делителя частоты VCO,
// Заодно проверим, что частоты из нужного диапазона.
if ((outputFreq<=2555)&&(outputFreq>2200))
vcoDivider = 1;
else if ((outputFreq<=2200)&&(outputFreq>1100))
vcoDivider = 2;
else if ((outputFreq<=1100)&&(outputFreq>550))
vcoDivider = 4;
else if ((outputFreq<=550)&&(outputFreq>255))
vcoDivider = 8;
else if ((outputFreq<=255)&&(outputFreq>=130))
vcoDivider = 16;
else if ((outputFreq<=130)&&(outputFreq>=100))
vcoDivider = 32;
else
return false;
// Частота рассчитывается по формуле (см в pdf раздел RF SYNTHESIZER—A WORKED EXAMPLE):
// outputFreq = (INT + (FRAC/MOD)) * (pfdFreq/vcoDivider)
// Из неё рассчитываем INT, MOD, FRAC.
MOD= (pfdFreq/(vcoDivider*freqStep));
INT= vcoDivider*outputFreq/pfdFreq; // Вычисляем нужные для установки частоты переменные
temp=(10*vcoDivider*MOD)/pfdFreq; // промежуточное вычисление из-за размерности в кГц
FRAC= ((outputFreq*temp)/10) - (INT*MOD);
// Формируем нужные регистры
// R4
syntReg[5] = (syntReg[5] & 0x8F) | (vcoDivider << 4); // меняем vcoDivider
// R1
syntReg[18] = (syntReg[18] & 0x80) | (MOD >> 5); // меняем MOD
syntReg[19] = (syntReg[19] & 0x07) | (MOD << 3);
// R0
syntReg[20] = 0x00 | (INT >>9); // меняем INT
syntReg[21] = 0x00 | (INT >>1);
syntReg[22] = 0x00 | (INT <<7)|(FRAC >>5); // меняем FRAC
syntReg[23] = 0x00 | (FRAC <<3);
// Вызываем функцию загрузки регистров
return loadSyntReg(syntReg); // загрузили в порядке R5 R4 R3 R2 R1 R0
}
Сообщение отредактировал arhiv6 - Aug 14 2014, 09:40