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

@ -243,6 +243,7 @@ void update_frequencies(void);
void set_sweep_frequency(int type, freq_t frequency); void set_sweep_frequency(int type, freq_t frequency);
freq_t get_sweep_frequency(int type); freq_t get_sweep_frequency(int type);
void my_microsecond_delay(int t); void my_microsecond_delay(int t);
void my_veryfast_delay(int t);
float my_atof(const char *p); float my_atof(const char *p);
freq_t my_atoui(const char *p); freq_t my_atoui(const char *p);
int shell_printf(const char *fmt, ...); int shell_printf(const char *fmt, ...);
@ -720,6 +721,7 @@ typedef struct config {
uint32_t _serial_speed; uint32_t _serial_speed;
uint16_t dac_value; uint16_t dac_value;
uint16_t vbat_offset; uint16_t vbat_offset;
int16_t cor_am;
float low_level_offset; float low_level_offset;
float high_level_offset; float high_level_offset;
float low_level_output_offset; float low_level_output_offset;
@ -765,7 +767,6 @@ typedef struct config {
#endif #endif
uint8_t is_calibrated; uint8_t is_calibrated;
uint8_t _mode; uint8_t _mode;
int8_t cor_am;
int8_t cor_wfm; int8_t cor_wfm;
int8_t cor_nfm; int8_t cor_nfm;
#ifdef TINYSA4 #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 #ifdef TINYSA4 // Calculate FM modulation
if (setting.modulation == MO_AM) { if (setting.modulation == MO_AM) {
int sinus_index = 1; 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 = 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; sinus_index <<= 1;
modulation_steps >>= 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]; fm_modulation[modulation_steps - i] = fm_modulation[modulation_steps/2 + i];
} }
for (int i=0; i < modulation_steps; 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) if (fm_modulation[i] < -63)
fm_modulation[i] = -63; fm_modulation[i] = -63;
} }
} }
if (setting.modulation == MO_WFM) { if (setting.modulation == MO_WFM) {
int sinus_index = 1; 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 = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency
//modulation_steps = 8; // <-----------------TEMP!!!!! //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; sinus_index <<= 1;
modulation_steps >>= 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; // modulation_delay = 0;
// } else // } else
if (setting.modulation == MO_AM) { // -14 default 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; modulation_delay += config.cor_am;
#ifdef TINYSA4 #ifdef TINYSA4
// modulation_steps = 8; // modulation_steps = 8;
#endif #endif
} else { // Must be FM } 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 #ifdef TINYSA4
switch(setting.modulation){ switch(setting.modulation){
case MO_NFM: case MO_NFM:
@ -3713,23 +3713,23 @@ modulation_again:
if (modulation_counter >= modulation_steps) { if (modulation_counter >= modulation_steps) {
modulation_counter = 0; modulation_counter = 0;
cycle_counter++; 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 if (chVTGetSystemTimeX() - start_of_sweep_timestamp > 1000) { // 100 ms, System tick 10000 per second
start_of_sweep_timestamp = chVTGetSystemTimeX(); start_of_sweep_timestamp = chVTGetSystemTimeX();
modulation_delay -= config.cor_am; 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; config.cor_am += modulation_delay - actual_delay;
if (config.cor_am >0) if (config.cor_am >0)
config.cor_am = 0; config.cor_am = 0;
modulation_delay += config.cor_am; modulation_delay += config.cor_am;
cycle_counter = 0; cycle_counter = 0;
} }
my_microsecond_delay(modulation_delay); my_veryfast_delay(modulation_delay);
} }
else else
my_microsecond_delay(modulation_delay); my_veryfast_delay(modulation_delay);
} else } else
my_microsecond_delay(modulation_delay); my_veryfast_delay(modulation_delay);
} }
// -------------------------------- Acquisition loop for one requested frequency covering spur avoidance and vbwsteps ------------------------ // -------------------------------- Acquisition loop for one requested frequency covering spur avoidance and vbwsteps ------------------------
pureRSSI_t RSSI = float_TO_PURE_RSSI(-150); pureRSSI_t RSSI = float_TO_PURE_RSSI(-150);

Loading…
Cancel
Save

Powered by TurnKey Linux.