Improved timing accuracy

pull/34/head
erikkaashoek 3 years ago
parent a2081cc82c
commit b15dba9553

@ -2442,7 +2442,7 @@ THD_FUNCTION(myshellThread, p)
#pragma GCC pop_options
static const GPTConfig gpt4cfg = {
1000000, // 1 MHz timer clock.
8000000, // 8 MHz timer clock.
NULL, // No callback
0, 0
};
@ -2450,9 +2450,18 @@ static const GPTConfig gpt4cfg = {
void my_microsecond_delay(int t)
{
#ifdef TINYSA4
if (t>1) gptPolledDelay(&GPTD4, t); // t us delay
if (t>1) gptPolledDelay(&GPTD4, t<<3); // t us delay
#else
if (t>1) gptPolledDelay(&GPTD14, t); // t us delay
if (t>1) gptPolledDelay(&GPTD14, t<<3); // t us delay
#endif
}
void my_veryfast_delay(int t) // In 8MHz ticks
{
#ifdef TINYSA4
if (t>0) gptPolledDelay(&GPTD4, t);
#else
if (t>0) gptPolledDelay(&GPTD14, t);
#endif
}
@ -2480,10 +2489,10 @@ int main(void)
*/
#ifdef TINYSA4
gptStart(&GPTD4, &gpt4cfg);
gptPolledDelay(&GPTD4, 10); // 10 us delay
gptPolledDelay(&GPTD4, 80); // 10 us delay
#else
gptStart(&GPTD14, &gpt4cfg);
gptPolledDelay(&GPTD14, 10); // 10 us delay
gptPolledDelay(&GPTD14, 80); // 10 us delay
#endif
PULSE
@ -2588,10 +2597,10 @@ int main(void)
*/
#ifdef TINYSA4
gptStart(&GPTD4, &gpt4cfg);
gptPolledDelay(&GPTD4, 10); // 10 us delay
gptPolledDelay(&GPTD4, 80); // 10 us delay
#else
gptStart(&GPTD14, &gpt4cfg);
gptPolledDelay(&GPTD14, 10); // 10 us delay
gptPolledDelay(&GPTD14, 80); // 10 us delay
#endif
/* restore config */

@ -243,6 +243,7 @@ void update_frequencies(void);
void set_sweep_frequency(int type, freq_t frequency);
freq_t get_sweep_frequency(int type);
void my_microsecond_delay(int t);
void my_veryfast_delay(int t);
float my_atof(const char *p);
freq_t my_atoui(const char *p);
int shell_printf(const char *fmt, ...);
@ -720,6 +721,7 @@ typedef struct config {
uint32_t _serial_speed;
uint16_t dac_value;
uint16_t vbat_offset;
int16_t cor_am;
float low_level_offset;
float high_level_offset;
float low_level_output_offset;
@ -765,7 +767,6 @@ typedef struct config {
#endif
uint8_t is_calibrated;
uint8_t _mode;
int8_t cor_am;
int8_t cor_wfm;
int8_t cor_nfm;
#ifdef TINYSA4

@ -3377,9 +3377,9 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
#ifdef TINYSA4 // Calculate FM modulation
if (setting.modulation == MO_AM) {
int sinus_index = 1;
config.cor_am = -18; // Initialize with some spare
config.cor_am = -180; // Initialize with some spare
modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency
while ( (modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) {
while ( (modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) {
sinus_index <<= 1;
modulation_steps >>= 1;
}
@ -3391,17 +3391,17 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
fm_modulation[modulation_steps - i] = fm_modulation[modulation_steps/2 + i];
}
for (int i=0; i < modulation_steps; i++) {
fm_modulation[i] = 10.0*logf(fm_modulation[i]*fm_modulation[i]/(694.0*694.0));
fm_modulation[i] = roundf(10.0*logf(fm_modulation[i]*fm_modulation[i]/(694.0*694.0)));
if (fm_modulation[i] < -63)
fm_modulation[i] = -63;
}
}
if (setting.modulation == MO_WFM) {
int sinus_index = 1;
config.cor_am = -18; // Initialize with some spare
config.cor_am = -180; // Initialize with some spare
modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency
//modulation_steps = 8; // <-----------------TEMP!!!!!
while ( (modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) {
while ( (modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) {
sinus_index <<= 1;
modulation_steps >>= 1;
}
@ -3638,13 +3638,13 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
// modulation_delay = 0;
// } else
if (setting.modulation == MO_AM) { // -14 default
modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 1MHz/8
modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 8MHz/8
modulation_delay += config.cor_am;
#ifdef TINYSA4
// modulation_steps = 8;
#endif
} else { // Must be FM
modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 1MHz/8
modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 8MHz/8
#ifdef TINYSA4
switch(setting.modulation){
case MO_NFM:
@ -3713,23 +3713,23 @@ modulation_again:
if (modulation_counter >= modulation_steps) {
modulation_counter = 0;
cycle_counter++;
if (config.cor_am == -18) {
if (config.cor_am == -180) {
if (chVTGetSystemTimeX() - start_of_sweep_timestamp > 1000) { // 100 ms, System tick 10000 per second
start_of_sweep_timestamp = chVTGetSystemTimeX();
modulation_delay -= config.cor_am;
int actual_delay = 100000 / cycle_counter / modulation_steps; // In units of 1 microsecond
int actual_delay = 800000 / cycle_counter / modulation_steps; // In units of 1/8 microsecond
config.cor_am += modulation_delay - actual_delay;
if (config.cor_am >0)
config.cor_am = 0;
modulation_delay += config.cor_am;
cycle_counter = 0;
}
my_microsecond_delay(modulation_delay);
my_veryfast_delay(modulation_delay);
}
else
my_microsecond_delay(modulation_delay);
my_veryfast_delay(modulation_delay);
} else
my_microsecond_delay(modulation_delay);
my_veryfast_delay(modulation_delay);
}
// -------------------------------- Acquisition loop for one requested frequency covering spur avoidance and vbwsteps ------------------------
pureRSSI_t RSSI = float_TO_PURE_RSSI(-150);

Loading…
Cancel
Save

Powered by TurnKey Linux.