Updated sub stepping

Removed_REF_marker
erikkaashoek 5 years ago
parent faff36713b
commit 789216e3e7

@ -1134,7 +1134,7 @@ void SI4463_init_tx(void);
void set_R(int f); void set_R(int f);
void set_modulo(uint32_t f); void set_modulo(uint32_t f);
#ifdef __ADF4351__ #ifdef __ADF4351__
extern volatile uint32_t ADF4350_modulo; extern volatile int64_t ADF4350_modulo;
void ADF4351_Set(int channel); void ADF4351_Set(int channel);
void ADF4351_force_refresh(void); void ADF4351_force_refresh(void);
void ADF4351_mux(int R); void ADF4351_mux(int R);

@ -2055,12 +2055,12 @@ modulation_again:
int32_t error_f = 0; int32_t error_f = 0;
if (real_old_freq[ADF4351_LO] > target_f) { if (real_old_freq[ADF4351_LO] > target_f) {
error_f = real_old_freq[ADF4351_LO] - target_f; error_f = real_old_freq[ADF4351_LO] - target_f;
if (error_f > actual_rbw_x10 * 100) if (error_f > actual_rbw_x10 * 5) //RBW / 4
local_IF += error_f; local_IF += error_f;
} }
if (target_f > real_old_freq[ADF4351_LO]) { if ( real_old_freq[ADF4351_LO] < target_f) {
error_f = - (target_f - real_old_freq[ADF4351_LO]); error_f = real_old_freq[ADF4351_LO] - target_f;
if ( error_f < - actual_rbw_x10 * 100) if ( error_f < - actual_rbw_x10 * 5) //RBW / 4
local_IF += error_f; local_IF += error_f;
} }
#endif #endif

@ -904,11 +904,11 @@ double RFout, //Output freq in MHz
Chrystal[6] = {XTAL,XTAL,XTAL,10.0,10.0,10.0}, Chrystal[6] = {XTAL,XTAL,XTAL,10.0,10.0,10.0},
FRACF; // Temp FRACF; // Temp
volatile unsigned int long RFint, // Output freq/10Hz volatile int64_t
INTA, // Temp INTA, // Temp
RFcalc, //UI
ADF4350_modulo = 3125, //Temp ADF4350_modulo = 3125, //Temp
MOD, MOD,
target_freq,
FRAC; //Temp FRAC; //Temp
uint8_t OutputDivider; // Temp uint8_t OutputDivider; // Temp
@ -996,14 +996,14 @@ void ADF4351_force_refresh(void) {
prev_actual_freq = 0; prev_actual_freq = 0;
} }
uint32_t ADF4351_set_frequency(int channel, uint32_t freq) // freq / 10Hz uint64_t ADF4351_set_frequency(int channel, uint64_t freq) // freq / 10Hz
{ {
// freq -= 71000; // freq -= 71000;
// SI4463_set_gpio(3,GPIO_HIGH); // SI4463_set_gpio(3,GPIO_HIGH);
// uint32_t offs = ((freq / 1000)* ( 0) )/ 1000; // uint32_t offs = ((freq / 1000)* ( 0) )/ 1000;
uint32_t offs = 0; uint32_t offs = 0;
uint32_t actual_freq = ADF4351_prep_frequency(channel,freq + offs); uint64_t actual_freq = ADF4351_prep_frequency(channel,freq + offs);
// SI4463_set_gpio(3,GPIO_LOW); // SI4463_set_gpio(3,GPIO_LOW);
if (actual_freq != prev_actual_freq) { if (actual_freq != prev_actual_freq) {
//START_PROFILE; //START_PROFILE;
@ -1094,8 +1094,9 @@ static uint32_t gcd(uint32_t x, uint32_t y)
return x; return x;
} }
uint32_t ADF4351_prep_frequency(int channel, unsigned long freq) // freq / 10Hz uint64_t ADF4351_prep_frequency(int channel, uint64_t freq) // freq / 10Hz
{ {
target_freq = freq;
if (freq >= 2200000000) { if (freq >= 2200000000) {
OutputDivider = 1; OutputDivider = 1;
bitWrite (registers[4], 22, 0); bitWrite (registers[4], 22, 0);
@ -1126,7 +1127,11 @@ uint32_t ADF4351_prep_frequency(int channel, unsigned long freq) // freq / 10Hz
volatile uint64_t PFDR = (int) (PFDRFout[channel]*1000000); volatile uint64_t PFDR = (int) (PFDRFout[channel]*1000000);
INTA = (((uint64_t)freq) * OutputDivider) / PFDR; INTA = (((uint64_t)freq) * OutputDivider) / PFDR;
MOD = ADF4350_modulo; MOD = ADF4350_modulo;
FRAC = ((((uint64_t)freq) * OutputDivider) - INTA * PFDR) * (uint64_t) MOD /PFDR; FRAC = ((((uint64_t)freq) * OutputDivider) - INTA * PFDR + (PFDR / MOD / 2)) * (uint64_t) MOD /PFDR;
if (FRAC >= MOD) {
FRAC -= MOD;
INTA++;
}
#if 0 #if 0
while (FRAC > 4095 || MOD > 4095) { while (FRAC > 4095 || MOD > 4095) {
FRAC = FRAC >> 1; FRAC = FRAC >> 1;
@ -1135,18 +1140,25 @@ uint32_t ADF4351_prep_frequency(int channel, unsigned long freq) // freq / 10Hz
} }
#endif #endif
uint32_t reduce = gcd(MOD, FRAC); uint32_t reduce = gcd(MOD, FRAC);
if (reduce) { #if 0
if (reduce>1) {
FRAC /= reduce; FRAC /= reduce;
MOD /= reduce; MOD /= reduce;
if (MOD == 1) if (MOD == 1)
MOD=2; MOD=2;
} }
uint32_t actual_freq = PFDR *(INTA * MOD +FRAC)/OutputDivider / MOD; #endif
uint64_t actual_freq = PFDR *(INTA * MOD +FRAC)/OutputDivider / MOD;
volatile int max_delta = 1000000 * PFDRFout[channel]/OutputDivider/MOD; volatile int max_delta = 1000000 * PFDRFout[channel]/OutputDivider/MOD;
if (actual_freq < freq - max_delta || actual_freq > freq + max_delta ){ if (actual_freq < freq - max_delta || actual_freq > freq + max_delta ){
while(1) while(1)
my_microsecond_delay(10); my_microsecond_delay(10);
} }
max_delta = freq - actual_freq;
if (max_delta > 50000 || max_delta < -50000 || freq == 0) {
while(1)
my_microsecond_delay(10);
}
if (FRAC >= MOD ){ if (FRAC >= MOD ){
while(1) while(1)
my_microsecond_delay(10); my_microsecond_delay(10);
@ -2122,7 +2134,8 @@ void SI4463_set_freq(uint32_t freq)
int64_t MOD = 524288; int64_t MOD = 524288;
int32_t F = ((freq * SI4463_outdiv*MOD) / (Npresc ? 2*freq_xco : 4*freq_xco)) - R*MOD; int32_t F = ((freq * SI4463_outdiv*MOD) / (Npresc ? 2*freq_xco : 4*freq_xco)) - R*MOD;
uint32_t actual_freq = (R*MOD + F) * (Npresc ? 2*freq_xco : 4*freq_xco)/ SI4463_outdiv/MOD; uint32_t actual_freq = (R*MOD + F) * (Npresc ? 2*freq_xco : 4*freq_xco)/ SI4463_outdiv/MOD;
if (actual_freq < freq - 100 || actual_freq > freq + 100 ){ int delta = freq - actual_freq;
if (delta < -100 || delta > 100 ){
while(1) while(1)
my_microsecond_delay(10); my_microsecond_delay(10);
} }

@ -160,8 +160,8 @@ void ADF4351_Setup(void);
void ADF4351_WriteRegister32(int channel, const uint32_t value); void ADF4351_WriteRegister32(int channel, const uint32_t value);
uint32_t ADF4351_set_frequency(int channel, uint32_t freq); uint64_t ADF4351_set_frequency(int channel, uint64_t freq);
uint32_t ADF4351_prep_frequency(int channel, uint32_t freq); uint64_t ADF4351_prep_frequency(int channel, uint64_t freq);
//int ADF4351_set_frequency_with_offset(uint32_t freq, int offset, uint8_t drive_strength); //int ADF4351_set_frequency_with_offset(uint32_t freq, int offset, uint8_t drive_strength);
void ADF4351_Set(int channel); void ADF4351_Set(int channel);
void ADF4351_spur_mode(int S); void ADF4351_spur_mode(int S);

Loading…
Cancel
Save

Powered by TurnKey Linux.