fix interfaccia

This commit is contained in:
nzasch
2022-01-12 01:09:32 +01:00
parent b9a7a1e15b
commit 6d0c31556a
435 changed files with 436215 additions and 10940 deletions

View File

@@ -45,7 +45,10 @@
#define MOD_DC 0
#define MOD_LSB 1
#define MOD_USB 2
#define MOD_AM 3
#define MOD_CWL 3
#define MOD_CWU 4
#define MOD_AM 5
#define MOD_FM 6
#define STATUS_RX 0
#define STATUS_TX 1
@@ -72,7 +75,7 @@ extern uint32_t frequency;
extern int32_t rit;
extern uint16_t pwm_tx_period;
extern int32_t modulation;
extern int32_t gain;
extern int32_t rx_gain;
extern int32_t peak, oldpeak, peakset;
extern int32_t volume;
extern int32_t squelch;
@@ -111,9 +114,16 @@ extern q31_t lf_buffer[2][LF_BUFFER_SIZE];
// ======== FUNZIONI ========
void start_transmit(void);
void stop_transmit(void);
void start_receive(void);
void stop_receive(void);
void set_rx_gain(void);
int32_t set_nco1_freq(int32_t freq);
void set_filter(void);
// void set_filter(void);
void set_frequency(void);
void set_modulation(void);
void set_dummy (void);

View File

@@ -82,7 +82,7 @@ struct menu_item {
extern uint8_t menu_item, menu_page;
extern uint8_t menu_last_item[MENU_PAGE_EOM + 1];
extern char modulation_list[4][4];
extern char modulation_list[][4];
extern char status_list[3][3];
extern struct menu_item items[];

View File

@@ -54,7 +54,7 @@ extern "C" {
void Error_Handler(void);
/* USER CODE BEGIN EFP */
void set_gain(void);
// void set_rx_gain(void);
/* USER CODE END EFP */

View File

@@ -78,6 +78,7 @@ void am_demodulator(q31_t *in_I, q31_t *in_Q, uint16_t size, q31_t *out);
// filtri
// void filter_init(void);
void set_rx_audio_filter(void);
void st2_filter_init(void);
void audio_filter_init(void);
void audio_filter_generate_coeffs(int32_t *Coeffs, uint32_t freq, uint32_t bw, uint8_t beta);

View File

@@ -5,6 +5,8 @@
#define SI5351_MIN_FREQ 3000
#define SI5351_MAX_FREQ 200000000
// #### registri ####
#define SI5351_OUT_ENABLE 3
#define SI5351_OUT_DIS_STATE 24
@@ -25,3 +27,8 @@
#define SI5351_CRYSTAL_LOAD 183
extern I2C_HandleTypeDef hi2c1;
void si53531_initialize(void);
void si53531_set_frequency(uint32_t freq, uint8_t synth);
void si5351_off(void);
void si5351_on(void);

View File

@@ -4,12 +4,15 @@
#include <stdint.h>
#include <arm_math.h>
#define CW_TONE_INCREMENT 0.15
#define CW_TONE_VOLUME 2
#define TX_TYPE_NONE 0
#define TX_TYPE_DAC 1
#define TX_TYPE_PWM 2
#define TX_TYPE_SI5351 3
// #define TX_TYPE TX_TYPE_SI5351
#define TX_TYPE TX_TYPE_NONE
#define TX_TYPE TX_TYPE_SI5351
// #define TX_TYPE TX_TYPE_NONE
#define TX_AUDIO_FILTER_INTERPOLATION_FACTOR (16)
#define TX_AUDIO_FILTER_BLOCK_SIZE (1024)
@@ -43,4 +46,7 @@ void ssb_modulator(q31_t *in_I, q31_t *in_Q, uint16_t size, q31_t *out, q31_t nc
void dc_modulator(q31_t *in, uint16_t size, q31_t *out);
void am_modulator(q31_t *in_I, q31_t *in_Q, uint16_t size, q31_t *out);
uint16_t u12_sine(void);
void generate_tone(q31_t *buffer, uint16_t buffer_size);
#endif

View File

@@ -37,7 +37,7 @@ uint32_t frequency;
int32_t rit;
uint16_t pwm_tx_period;
int32_t modulation;
int32_t gain;
int32_t rx_gain;
int32_t peak, oldpeak, peakset;
int32_t volume;
int32_t squelch;
@@ -79,8 +79,8 @@ q31_t tx_dac_buffer[2][TX_DAC_BUFFER_SIZE];
int32_t set_nco1_freq(int32_t freq){
int64_t tmp_increment;
if(modulation == MOD_USB) freq += (NCO2_FREQUENCY);
else if(modulation == MOD_LSB) freq -= (NCO2_FREQUENCY);
if(modulation == MOD_USB || modulation == MOD_CWU) freq += (NCO2_FREQUENCY);
else if(modulation == MOD_LSB || modulation == MOD_CWL) freq -= (NCO2_FREQUENCY);
tmp_increment = ((int64_t)freq * 0x100000000LL)/RX_ADC_SAMPLE_RATE;
return (int32_t)tmp_increment;
}
@@ -130,14 +130,15 @@ void set_frequency(void){
pwm_tx_period = get_pwm_period(frequency);
}
else if(TX_TYPE == TX_TYPE_SI5351){
si53531_set_frequency(frequency);
si53531_set_frequency(frequency, 0);
}
}
/*
void set_filter(void){
audio_filter_generate_coeffs(audio_filter_coeffs, audio_filter_freq, audio_filter_bw, audio_filter_beta);
}
*/
void set_modulation(void){
st2_filter_init();
// cambia offset
@@ -162,11 +163,11 @@ uint8_t get_changed(uint8_t state){
}
void state_set_default(void){
modulation = MOD_USB;
modulation = MOD_CWU;
frequency = 128000;
rit = 0;
set_frequency();
gain = 2;
rx_gain = 2;
volume = 8;
audio_filter_freq = RX_AUDIO_FILTER_FREQ_DEF;
audio_filter_bw = RX_AUDIO_FILTER_BW_DEF;
@@ -184,7 +185,7 @@ void diag(void){
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"1st out sample rate: %d\n", ST1_OUT_SAMPLE_RATE);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"2st buffer size: %d\n2st decimation factor: %d\n", ST2_BUFFER_SIZE, ST2_DECIMATION_FACTOR * 2);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"2st out sample rate: %d\n", ST2_OUT_SAMPLE_RATE);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"in gain %d\n", gain);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"in rx_gain %d\n", rx_gain);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"af gain %d\n", volume);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"rx nco1 inc %d\n", rx_nco1_increment);
uart_tx_buf_in_idx += sprintf(uart_tx_buf,"nco2 inc %d\n", NCO2_INCREMENT);
@@ -216,3 +217,7 @@ uint8_t measure_log_abs_mean(q31_t *samples, uint16_t size){
}
return log_sig;
}
void set_LO_freq(uint32_t freq){
}

View File

@@ -32,18 +32,18 @@ struct menu_item {
// name, type, size,row,col,step, min, max, wrap suffix *varptr, set_function_ptr print_function_ptr
struct menu_item items[] = {
{MENU_PAGE_DEFAULT, " Frequency", TYP_INT, 9, 1, 0, 100, 1000, 175000, WRAP, "", " Hz", &frequency, &set_frequency, &print_frequency},
{MENU_PAGE_DEFAULT, " Frequency", TYP_INT, 9, 1, 0, 100, 1000, 1750000,WRAP, "", " Hz", &frequency, &set_frequency, &print_frequency},
// {MENU_PAGE_DEFAULT, " Rit ", TYP_INT, 4, 2, 0, 10, 0, 9999, SAT, "", "", &rit, &set_frequency, &print_frequency},
{MENU_PAGE_DEFAULT, " Volume ", TYP_INT, 5, 2, 0, 1, 0, 32, SAT, "", "|", &volume, &set_dummy, &print_bar},
{MENU_PAGE_DEFAULT, " Gain ", TYP_INT, 1, 2, 7, 1, 1, 6, SAT, "", "x", &gain, &set_gain, &print_integer},
{MENU_PAGE_DEFAULT, " Modulation", TYP_INT, 3, 2, 10, 1, 0, 3, WRAP, "", "", &modulation, &set_modulation,&print_modulation},
{MENU_PAGE_DEFAULT, " Gain ", TYP_INT, 1, 2, 7, 1, 1, 6, SAT, "", "x", &rx_gain, &set_rx_gain, &print_integer},
{MENU_PAGE_DEFAULT, " Modulation", TYP_INT, 3, 2, 10, 1, 0, 6, WRAP, "", "", &modulation, &set_modulation,&print_modulation},
// {MENU_PAGE_DEFAULT, " Squelch ", TYP_INT, 2, 3, 10, 1, 0, 32, SAT, "", "", &squelch, &set_dummy, &print_integer},
{MENU_PAGE_AUDIO, " Filter CF ", TYP_INT, 4, 1, 0, 50, 50, 3500, SAT, "", " Hz", &audio_filter_freq, &set_filter, &print_integer},
{MENU_PAGE_AUDIO, " Filter BW ", TYP_INT, 4, 2, 0, 50, 50, 2500, SAT, "", " Hz", &audio_filter_bw, &set_filter, &print_integer},
{MENU_PAGE_AUDIO, " Filter Q ", TYP_INT, 2, 3, 0, 1, 1, 32, SAT, "", " Q", &audio_filter_beta, &set_filter, &print_integer},
{MENU_PAGE_AUDIO, " Filter CF ", TYP_INT, 4, 1, 0, 50, 50, 3500, SAT, "", " Hz", &audio_filter_freq, &set_rx_audio_filter, &print_integer},
{MENU_PAGE_AUDIO, " Filter BW ", TYP_INT, 4, 2, 0, 50, 50, 2500, SAT, "", " Hz", &audio_filter_bw, &set_rx_audio_filter, &print_integer},
{MENU_PAGE_AUDIO, " Filter Q ", TYP_INT, 2, 3, 0, 1, 1, 32, SAT, "", " Q", &audio_filter_beta, &set_rx_audio_filter, &print_integer},
{MENU_PAGE_ALL, " Signal ", TYP_NED, 13, 4, 0, 0, 0, 0, SAT, "S", "", &s_meter, &set_dummy, &print_bar},
{MENU_PAGE_ALL, " Signal ", TYP_NED, 13, 4, 0, 0, 0, 0, SAT, "S", "", &s_meter, &set_dummy, &print_bar},
{MENU_PAGE_ALL, " TX tab ", TYP_NED, 3, 5, 0, 0, 0, 0, SAT, "", "", "PTT", &set_dummy, &print_string},
{MENU_PAGE_ALL, " Tabs ", TYP_NED, 3, 5, 4, 0, 0, 0, SAT, "", "", "SET", &set_dummy, &print_string},
{MENU_PAGE_ALL, " Tabs ", TYP_NED, 2, 5, 9, 0, 0, 0, SAT, "", "", "BL", &set_dummy, &print_string},
@@ -63,7 +63,10 @@ char modulation_list[][4] = {
[MOD_DC] = "DC",
[MOD_LSB] = "LSB",
[MOD_USB] = "USB",
[MOD_AM] = "AM"
[MOD_CWL] = "CWL",
[MOD_CWU] = "CWU",
[MOD_AM] = "AM",
[MOD_FM] = "FM"
};
uint8_t modulation_list_count = sizeof(modulation_list)/sizeof(modulation_list[0]);
@@ -334,12 +337,12 @@ void tab_down(uint8_t tab){
void display_init(void){
// https://git.lattuga.net/asdrea/tosta
// caratteri print_bar
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[128,255,0,0,0,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[129,255,255,0,0,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[130,255,255,255,0,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[131,255,255,255,255,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[132,255,255,255,255,255,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[133,255,255,255,255,255,255c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[128,127,0,0,0,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[129,127,127,0,0,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[130,127,127,127,0,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[131,127,127,127,127,0,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[132,127,127,127,127,127,0c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[133,127,127,127,127,127,127c");
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[%ds",DISPLAY_STANDBY_TIMER);
uart_tx_buf_in_idx += sprintf(uart_tx_buf+uart_tx_buf_in_idx,"\x1B[150,100q");

View File

@@ -235,6 +235,12 @@ void start_transmit(void){
} else if(TX_TYPE == TX_TYPE_SI5351){
si5351_on();
}
if(modulation == MOD_CWL || modulation == MOD_CWU){
// TONO su DAC
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, lf_buffer, (LF_BUFFER_SIZE * 2), DAC_ALIGN_12B_R);
}
}
void stop_transmit(void){
@@ -252,6 +258,12 @@ void stop_transmit(void){
} else if(TX_TYPE == TX_TYPE_SI5351){
si5351_off();
}
if(modulation == MOD_CWL || modulation == MOD_CWU){
// DAC
HAL_TIM_Base_Stop(&htim6);
HAL_DAC_Stop(&hdac1,DAC_CHANNEL_1);
HAL_DAC_Stop_DMA(&hdac1, DAC_CHANNEL_1);
}
}
void start_receive(void){
@@ -276,9 +288,9 @@ void stop_receive(void){
HAL_DAC_Stop_DMA(&hdac1, DAC_CHANNEL_1);
}
void set_gain(void){
void set_rx_gain(void){
HAL_OPAMP_Stop(&hopamp1);
switch (gain){
switch (rx_gain){
case 1:
hopamp1.Init.PgaGain = OPAMP_PGA_GAIN_2_OR_MINUS_1;
break;
@@ -301,9 +313,8 @@ void set_gain(void){
hopamp1.Init.PgaGain = OPAMP_PGA_GAIN_2_OR_MINUS_1;
break;
}
HAL_OPAMP_Init(&hopamp1);
HAL_OPAMP_Start(&hopamp1);
HAL_OPAMP_Init(&hopamp1);
HAL_OPAMP_Start(&hopamp1);
}
@@ -367,7 +378,7 @@ int main(void)
audio_filter_init();
// diag();
HAL_OPAMP_Start(&hopamp1);
set_gain();
set_rx_gain();
HAL_TIM_Base_Start_IT(&htim7);
HAL_UART_Receive_IT(&huart1, uart_rx_buf, 1);
// HAL_UART_Receive_IT(&huart2, uart_rx_buf, 1);
@@ -376,7 +387,6 @@ int main(void)
// rooto!
si53531_initialize();
}
start_receive();
/* USER CODE END 2 */
@@ -387,7 +397,7 @@ int main(void)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIO1_GPIO_Port, GPIO1_Pin);
// HAL_GPIO_TogglePin(GPIO1_GPIO_Port, GPIO1_Pin);
// receive = transmit = 0;
if(receive){
if(rx_adc_buffer_ready){
@@ -399,7 +409,7 @@ int main(void)
if(half_rx_dac_buffer_empty){
// HAL_GPIO_WritePin(GPIO1_GPIO_Port, GPIO1_Pin, SET);
if (modulation == MOD_DC) dc_demodulator(if_I, LF_BUFFER_SIZE, prefilter_lf_buffer);
else if(modulation == MOD_LSB || modulation == MOD_USB) ssb_demodulator(if_I, if_Q, LF_BUFFER_SIZE, prefilter_lf_buffer, NCO2_INCREMENT);
else if(modulation == MOD_LSB || modulation == MOD_USB || modulation == MOD_CWL || modulation == MOD_CWU) ssb_demodulator(if_I, if_Q, LF_BUFFER_SIZE, prefilter_lf_buffer, NCO2_INCREMENT);
else if (modulation == MOD_AM) am_demodulator(if_I, if_Q, LF_BUFFER_SIZE, prefilter_lf_buffer);
arm_fir_q31(&audio_filter_struct, prefilter_lf_buffer, lf_buffer[lf_buffer_toggle], RX_AUDIO_FILTER_BLOCK_SIZE);
// arm_fir_q31(&audio_filter_struct, prefilter_lf_buffer, lf_buffer_test[lf_buffer_toggle], AUDIO_FILTER_BLOCK_SIZE);
@@ -419,6 +429,12 @@ int main(void)
else if(modulation == MOD_LSB || modulation == MOD_USB) ssb_modulator(if_I, if_Q, LF_BUFFER_SIZE, prefilter_lf_buffer, NCO2_INCREMENT);
else if (modulation == MOD_AM) am_modulator(if_I, if_Q, LF_BUFFER_SIZE, prefilter_lf_buffer);
}
if(half_rx_dac_buffer_empty && (modulation == MOD_CWL || modulation == MOD_CWU)){
generate_tone(lf_buffer[lf_buffer_toggle], LF_BUFFER_SIZE);
half_rx_dac_buffer_empty = 0;
}
}
if(tick){
// consuma coda comandi

View File

@@ -234,10 +234,10 @@ inline q31_t hb_fir15(q31_t * samples_ringbuf, uint8_t sample_index, uint8_t buf
}
void st2_filter_init(void){
if((modulation == MOD_LSB) || (modulation == MOD_USB)){
if((modulation == MOD_LSB) || (modulation == MOD_USB || modulation == MOD_CWL || modulation == MOD_CWU)){
arm_fir_decimate_init_q31(&st2_filter_I_struct, ST2_FILTER_TAP_NUM, ST2_DECIMATION_FACTOR, &st2_filter_taps[0], &st2_filter_I_state[0], ST2_FILTER_BLOCK_SIZE);
arm_fir_decimate_init_q31(&st2_filter_Q_struct, ST2_FILTER_TAP_NUM, ST2_DECIMATION_FACTOR, &st2_filter_taps[0], &st2_filter_Q_state[0], ST2_FILTER_BLOCK_SIZE);
} else if ((modulation == MOD_DC) || (modulation == MOD_AM)){
} else if ((modulation == MOD_DC) || (modulation == MOD_AM || modulation == MOD_FM)){
arm_fir_decimate_init_q31(&st2_filter_I_struct, ST2_FILTER_TAP_NUM, ST2_DECIMATION_FACTOR, &st2_wide_taps[0], &st2_filter_I_state[0], ST2_FILTER_BLOCK_SIZE);
arm_fir_decimate_init_q31(&st2_filter_Q_struct, ST2_FILTER_TAP_NUM, ST2_DECIMATION_FACTOR, &st2_wide_taps[0], &st2_filter_Q_state[0], ST2_FILTER_BLOCK_SIZE);
}
@@ -260,3 +260,7 @@ void audio_filter_generate_coeffs(int32_t *Coeffs, uint32_t freq, uint32_t bw, u
Coeffs[index] = (int32_t) ( (double)(FPCoeff[index])*(double)0x7FFFFFFF );
}
}
void set_rx_audio_filter(void){
audio_filter_generate_coeffs(audio_filter_coeffs, audio_filter_freq, audio_filter_bw, audio_filter_beta);
}

View File

@@ -44,14 +44,14 @@ void CalcRegisters(uint32_t fout, uint8_t *regs){
rd++;
}
rx_div = rd << 4;
d = 600e6 / (r * fout); // Use lowest VCO frequency but handle d minimum
if (d % 2) // Make d even to reduce spurious and phase noise/jitter, see datasheet 4.1.2.1.
d++;
if (d * r * fout < 600e6) // VCO frequency to low check and maintain an even d value
d += 2;
}
}
else // 292968 Hz <= fout <= 150 MHz
{
d = 600e6 / fout; // Use lowest VCO frequency but handle d minimum
@@ -144,20 +144,22 @@ void si53531_initialize(){
// si5351_write8(SI5351_OUT_ENABLE, 0xFC); // Output Enable Control. Active low
}
void si53531_set_frequency(uint32_t freq){
void si53531_set_frequency(uint32_t freq, uint8_t synth){
uint8_t regs[16];
CalcRegisters(freq, regs);
// Load PLLA Feedback Multisynth NA
for (int i = 0; i < 8; i++)
si5351_write8(SI5351_PLLA + i, regs[i]);
// Load Output Multisynth0 with d (e and f already set during init. and never changed)
for (int i = 10; i < 13; i++)
si5351_write8(34 + i, regs[i]);
for (int i = 10; i < 13; i++)
si5351_write8(42 + i, regs[i]);
if(synth = 0){
for (int i = 10; i < 13; i++)
si5351_write8(34 + i, regs[i]);
} else if(synth = 1){
for (int i = 10; i < 13; i++)
si5351_write8(42 + i, regs[i]);
}
// Reset PLLA
// delayMicroseconds(500); // Allow registers to settle before resetting the PLL

View File

@@ -87,3 +87,18 @@ void tx_audio_filter_init(void){
arm_fir_interpolate_init_q15 (&tx_audio_filter_I_struct, TX_AUDIO_FILTER_INTERPOLATION_FACTOR, TX_AUDIO_FILTER_TAP_NUM, tx_audio_filter_coeffs, &tx_audio_filter_I_state[0], TX_AUDIO_FILTER_BLOCK_SIZE);
arm_fir_interpolate_init_q15 (&tx_audio_filter_Q_struct, TX_AUDIO_FILTER_INTERPOLATION_FACTOR, TX_AUDIO_FILTER_TAP_NUM, tx_audio_filter_coeffs, &tx_audio_filter_Q_state[0], TX_AUDIO_FILTER_BLOCK_SIZE);
}
uint16_t u12_sine(void){
static double angle;
angle += CW_TONE_INCREMENT;
if(angle >= 6.28) angle = 0;
return (uint16_t)((sin(angle) * CW_TONE_VOLUME) + 0x7ff);
}
void generate_tone(q31_t *buffer, uint16_t buffer_size){
uint16_t i;
while(i < buffer_size){
buffer[i] = u12_sine();
i++;
}
}