Improved RSID with new si filter profile, leave some time for si startup

master
Richard Meadows 2015-07-11 20:07:30 +01:00
rodzic a518ed92f9
commit 5aea2ccd50
7 zmienionych plików z 630 dodań i 35 usunięć

Wyświetl plik

@ -31,6 +31,7 @@ enum rf_tests {
RF_TEST_APRS_HIGH_FM_TONE,
RF_TEST_APRS_TONE,
RF_TEST_TELEMETRY_TONE,
RF_TEST_RSID,
};
#define RF_TEST RF_TEST_NONE

Wyświetl plik

@ -27,12 +27,18 @@
#include "samd20.h"
enum si_filter_model {
SI_FILTER_DEFAULT,
SI_FILTER_APRS,
SI_FILTER_RSID
};
float si_trx_get_temperature(void);
void si_trx_modem_set_deviation(uint32_t deviation);
void si_trx_on(uint8_t modulation_type, uint32_t frequency,
uint16_t deviation, uint8_t power);
uint16_t deviation, uint8_t power, enum si_filter_model filter);
void si_trx_off(void);
void si_trx_modem_set_offset(int16_t channel);

Wyświetl plik

@ -39,12 +39,12 @@
void telemetry_tone(void)
{
while (1) {
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 36);
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 36, SI_FILTER_DEFAULT);
for (int i = 0; i < 200*1000; i++) {
idle(IDLE_TELEMETRY_ACTIVE);
}
si_trx_off();
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 0x7f);
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 0, 0x7f, SI_FILTER_DEFAULT);
for (int i = 0; i < 200*1000; i++) {
idle(IDLE_TELEMETRY_ACTIVE);
}
@ -54,12 +54,12 @@ void telemetry_tone(void)
void aprs_tone(void)
{
while (1) {
si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 36);
si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 36, SI_FILTER_DEFAULT);
for (int i = 0; i < 200*1000; i++) {
idle(IDLE_TELEMETRY_ACTIVE);
}
si_trx_off();
si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 0x7f);
si_trx_on(SI_MODEM_MOD_TYPE_CW, APRS_TEST_FREQUENCY, 0, 0x7f, SI_FILTER_DEFAULT);
for (int i = 0; i < 200*1000; i++) {
idle(IDLE_TELEMETRY_ACTIVE);
}
@ -83,7 +83,7 @@ void aprs_high_fm_tone(void)
false); /* Output Pin Enable */
si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, APRS_TEST_FREQUENCY,
AX25_DEVIATION, APRS_POWER);
AX25_DEVIATION, APRS_POWER, SI_FILTER_APRS);
while (1) {
idle(IDLE_TELEMETRY_ACTIVE);
}
@ -109,6 +109,23 @@ void aprs_test(void)
}
}
/**
* RSID function for use during testing. Not for flight
*/
void rsid_test(void)
{
while (1) {
telemetry_start_rsid(RSID_CONTESTIA_32_1000);
// Sleep wait for RSID
while (telemetry_active()) {
idle(IDLE_TELEMETRY_ACTIVE);
}
for (int i = 3*200*1000; i; i--);
}
}
void rf_tests(void)
{
@ -125,6 +142,9 @@ void rf_tests(void)
case RF_TEST_TELEMETRY_TONE:
telemetry_tone();
break;
case RF_TEST_RSID:
rsid_test();
break;
default:
break;
}

Wyświetl plik

@ -100,6 +100,7 @@ void rsid_encode(rsid_code_t rsid_code, int8_t* rsid)
*/
uint8_t rsid_index = 0xFE;
uint8_t rsid_subtick;
int8_t rsid[RSID_NSYMBOLS];
#define MODEM_TONE_SPACING 7.805
@ -118,6 +119,7 @@ void rsid_start(rsid_code_t rsid_code)
{
/* Start transmission */
rsid_index = 0;
rsid_subtick = 0;
rsid_encode(rsid_code, rsid);
}
@ -147,24 +149,35 @@ void rsid_tone(uint8_t tone)
deviation = tone_offset - (float)channel;
#endif
float duty_cycle = 0.5 + (deviation / 2); // FSK only provides a marginal improvement in performance!
float duty_cycle = 0.5 + deviation;
si_trx_switch_channel(channel);
si_trx_switch_channel(channel-2); /* -2 offset to line up with contestia signal */
telemetry_gpio1_pwm_duty(duty_cycle);
}
/**
* Called at the rsid baud rate
*
* We mantain the first tone longer than the others to give the radio
* time to start up. Oh so hacky but hey
*/
uint8_t rsid_tick(void)
{
if (rsid_index < RSID_NSYMBOLS || rsid_subtick) {
if (rsid_index < RSID_NSYMBOLS) {
/* Actual tick */
if (rsid_subtick == 0) {
/* Transmit this tone */
rsid_tone(rsid[rsid_index]);
rsid_index++;
}
/* Transmit this tone */
rsid_tone(rsid[rsid_index]);
rsid_subtick++;
if ((rsid_index-1 == 0 && rsid_subtick == 3) || /* First tone */
(rsid_index-1 != 0 && rsid_subtick == 2)) { /* Other tones */
rsid_subtick = 0;
}
rsid_index++;
return 1;
}

Wyświetl plik

@ -427,7 +427,7 @@ static float si_trx_set_frequency(uint32_t frequency, uint16_t deviation)
* Resets the transceiver
*/
void si_trx_reset(uint8_t modulation_type, uint32_t frequency,
uint16_t deviation, uint8_t power)
uint16_t deviation, uint8_t power, enum si_filter_model filter)
{
_si_trx_sdn_enable(); /* active high shutdown = reset */
@ -459,22 +459,40 @@ void si_trx_reset(uint8_t modulation_type, uint32_t frequency,
si_trx_set_frequency(frequency, deviation);
si_trx_set_tx_power(power);
/**
* Modem tx filter coefficients for APRS
* 0dB @ 2.2kHz
* -6dB @ 1.2kHz (for pre-emphasis)
* < -30dB from 3.6KHz
*/
/* Modem tx filter coefficients */
uint8_t rsid_si_coeff[] = {0x1, 0x4, 0x9, 0x11, 0x19, 0x22, 0x2a, 0x30, 0x31};
uint8_t p_si_coeff[] = {0x6, 0x8, 0x1, 0xf2, 0xe4, 0xe7, 0xff, 0x1d, 0x2b};
si_trx_modem_set_tx_datarate(1600); /* Filter sampling rate 1600*10 = 16kHz */
si_trx_modem_tx_filter_coefficients(p_si_coeff);
switch (filter) {
case SI_FILTER_APRS:
/**
* Modem tx filter coefficients for APRS
* 0dB @ 2.2kHz
* -6dB @ 1.2kHz (for pre-emphasis)
* < -30dB from 3.6KHz
*/
si_trx_modem_set_tx_datarate(1600); /* Filter sampling rate 1600*10 = 16kHz */
si_trx_modem_tx_filter_coefficients(p_si_coeff);
break;
case SI_FILTER_RSID:
/**
* Modem tx filter coefficients for RSID
* -6dB @ dc (for ±0.5 deviation max)
* < -50dB from 1.8KHz
*/
si_trx_modem_set_tx_datarate(1600); /* Filter sampling rate 1600*10 = 16kHz */
si_trx_modem_tx_filter_coefficients(rsid_si_coeff);
break;
default: /* Just leave the defaults from startup in place */
break;
}
/* RTTY from GPIO1 */
si_trx_modem_set_modulation(SI_MODEM_MOD_DIRECT_MODE_SYNC, // ASYNC
SI_MODEM_MOD_GPIO_1,
SI_MODEM_MOD_SOURCE_DIRECT,
modulation_type);
SI_MODEM_MOD_GPIO_1,
SI_MODEM_MOD_SOURCE_DIRECT,
modulation_type);
si_trx_state_tx_tune();
}
@ -483,9 +501,9 @@ void si_trx_reset(uint8_t modulation_type, uint32_t frequency,
* Enables the radio and starts transmitting
*/
void si_trx_on(uint8_t modulation_type, uint32_t frequency,
uint16_t deviation, uint8_t power)
uint16_t deviation, uint8_t power, enum si_filter_model filter)
{
si_trx_reset(modulation_type, frequency, deviation, power);
si_trx_reset(modulation_type, frequency, deviation, power, filter);
si_trx_start_tx(0);
}
/**

Wyświetl plik

@ -238,7 +238,8 @@ void telemetry_tick(void) {
if (!radio_on) {
/* Contestia: We use the modem offset to modulate */
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER);
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER,
SI_FILTER_DEFAULT);
radio_on = 1;
contestia_preamble();
}
@ -259,7 +260,8 @@ void telemetry_tick(void) {
if (!radio_on) {
/* RTTY: We use the modem offset to modulate */
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER);
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER,
SI_FILTER_DEFAULT);
radio_on = 1;
rtty_preamble();
}
@ -290,10 +292,9 @@ void telemetry_tick(void) {
/* RSID: We PWM frequencies with the external pin */
telemetry_gpio1_pwm_init();
si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER);
si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER,
SI_FILTER_RSID);
radio_on = 1;
return;
}
/* Do Tx */
@ -304,6 +305,7 @@ void telemetry_tick(void) {
telemetry_gpio1_pwm_deinit();
return;
}
break;
case TELEMETRY_APRS: /* ---- ---- APRS */
@ -313,8 +315,8 @@ void telemetry_tick(void) {
if (aprs_start() && _aprs_frequency) {
/* Radio on */
si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, _aprs_frequency,
AX25_DEVIATION, APRS_POWER);
si_trx_on(SI_MODEM_MOD_TYPE_2GFSK, _aprs_frequency, AX25_DEVIATION,
APRS_POWER, SI_FILTER_APRS);
radio_on = 1;
} else {
/* Stop immediately */
@ -333,7 +335,8 @@ void telemetry_tick(void) {
if (!radio_on) { /* Turn on */
/* Pips: Cw */
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER);
si_trx_on(SI_MODEM_MOD_TYPE_CW, TELEMETRY_FREQUENCY, 1, TELEMETRY_POWER,
SI_FILTER_DEFAULT);
radio_on = 1;
} else { /* Turn off */
@ -430,7 +433,7 @@ void telemetry_init(void)
rtty_timer_count = timer0_get_count_value(RTTY_BITRATE);
pips_timer_count = timer0_get_count_value(PIPS_FREQUENCY);
ax25_timer_count = timer0_get_count_value(AX25_TICK_RATE);
rsid_timer_count = timer0_get_count_value(RSID_SYMBOL_RATE);
rsid_timer_count = timer0_get_count_value(RSID_SYMBOL_RATE*2); /* 2x Subtick */
}

File diff suppressed because one or more lines are too long