diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/includes/GPIO/analog.h | 9 | ||||
-rw-r--r-- | src/common/src/Core/main.c | 10 | ||||
-rw-r--r-- | src/glutt-o-logique/analog_input.c | 63 | ||||
-rw-r--r-- | src/glutt-o-logique/analog_input.h | 10 |
4 files changed, 75 insertions, 17 deletions
diff --git a/src/common/includes/GPIO/analog.h b/src/common/includes/GPIO/analog.h index 54dfb5d..0c45f0c 100644 --- a/src/common/includes/GPIO/analog.h +++ b/src/common/includes/GPIO/analog.h @@ -23,13 +23,20 @@ */ #pragma once +#include <stdint.h> void analog_init(void); /* Measure the 12V supply voltage, in 0.5V increments. - * Returns 0.0f in case of error */ + * Returns 0.0f in case of error + */ float analog_measure_12v(void); +/* Measure SWR, and return raw values. + * Returns 0 in case of error, 1 in case of success + */ +int analog_measure_swr(uint16_t *forward, uint16_t* reflected); + /* Keep an average of measurements, and decide if the repeater should enter * QRP. Returns 1 if low power must be activated */ diff --git a/src/common/src/Core/main.c b/src/common/src/Core/main.c index 10f87f3..8db5f20 100644 --- a/src/common/src/Core/main.c +++ b/src/common/src/Core/main.c @@ -204,11 +204,19 @@ static void launcher_task(void __attribute__ ((unused))*pvParameters) const int qrp = analog_supply_too_low(); if (qrp != last_qrp) { - usart_debug("QRP should be %d\r\n", qrp); + usart_debug("QRP = %d\r\n", qrp); last_qrp = qrp; pio_set_qrp(qrp); } + + struct fsm_output_signals_t fsm_out; + fsm_get_outputs(&fsm_out); + if (1) { + //if (fsm_out.tx_on) { + uint16_t swr_fwd, swr_refl; + analog_measure_swr(&swr_fwd, &swr_refl); + } } } diff --git a/src/glutt-o-logique/analog_input.c b/src/glutt-o-logique/analog_input.c index d970238..103d933 100644 --- a/src/glutt-o-logique/analog_input.c +++ b/src/glutt-o-logique/analog_input.c @@ -25,6 +25,8 @@ #include "analog_input.h" #include "stm32f4xx_adc.h" #include <math.h> +#include "GPIO/usart.h" + void analog_init(void) { @@ -32,10 +34,10 @@ void analog_init(void) RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - // Set Pin PA5 to analog input + // Set analog input pins mode GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; + GPIO_InitStructure.GPIO_Pin = PINS_ANALOG; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; @@ -53,32 +55,37 @@ void analog_init(void) ADC_InitTypeDef ADC_InitStruct; ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode = DISABLE; - ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; + ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; - ADC_InitStruct.ADC_NbrOfConversion = 1; + ADC_InitStruct.ADC_NbrOfConversion = 3; ADC_Init(ADC1, &ADC_InitStruct); - // Configure ADC1 to use the converted 12V signal (see schematics) - const uint8_t rank = 1; - ADC_RegularChannelConfig(ADC1, - ADC_Channel_5, - rank, - ADC_SampleTime_480Cycles); - // Enable ADC ADC_Cmd(ADC1, ENABLE); } -float analog_measure_12v(void) +static uint16_t analog_read_channel(uint8_t channel) { - ADC_SoftwareStartConv(ADC1); //Start the conversion + ADC_RegularChannelConfig(ADC1, + channel, + 1, + ADC_SampleTime_480Cycles); + + ADC_SoftwareStartConv(ADC1); // TODO add timeout - while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); - const uint16_t raw_value = ADC_GetConversionValue(ADC1); + /* wait for end of conversion */ + while((ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)); + + return ADC_GetConversionValue(ADC1); +} + +float analog_measure_12v(void) +{ + const uint16_t raw_value = analog_read_channel(ADC_CHANNEL_SUPPLY); const float adc_max_value = (1 << 12); const float v_ref = 2.965f; @@ -90,3 +97,29 @@ float analog_measure_12v(void) return voltage * 202.0f / 22.0f; } + +int analog_measure_swr(uint16_t *forward, uint16_t* reflected) +{ + const uint16_t raw_swr_fwd_value = analog_read_channel(ADC_CHANNEL_SWR_FWD); + const uint16_t raw_swr_refl_value = analog_read_channel(ADC_CHANNEL_SWR_REFL); + + *forward = raw_swr_fwd_value; + *reflected = raw_swr_refl_value; + + const int supply_decivolts = analog_measure_12v() * 10.0f; + + const float adc_max_value = (1 << 12); + const float v_ref = 2.965f; + + // Convert ADC measurement to mV (includes times 100 amplifier) + const int swr_fwd = ((float)raw_swr_fwd_value*10.0f*v_ref/adc_max_value); + const int swr_refl = ((float)raw_swr_refl_value*10.0f*v_ref/adc_max_value); + + usart_debug("RAW Meas %d dV - %d mV - %d mV\r\n", + supply_decivolts, + swr_fwd, + swr_refl); + + return 1; +} + diff --git a/src/glutt-o-logique/analog_input.h b/src/glutt-o-logique/analog_input.h index 9c8ef8c..0385ec4 100644 --- a/src/glutt-o-logique/analog_input.h +++ b/src/glutt-o-logique/analog_input.h @@ -28,3 +28,13 @@ #include "stm32f4xx_gpio.h" #include "GPIO/analog.h" +#define PIN_SUPPLY GPIO_Pin_5 +#define PIN_SWR_FWD GPIO_Pin_6 +#define PIN_SWR_REFL GPIO_Pin_7 + +#define PINS_ANALOG (GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7) + +#define ADC_CHANNEL_SUPPLY ADC_Channel_5 +#define ADC_CHANNEL_SWR_FWD ADC_Channel_6 +#define ADC_CHANNEL_SWR_REFL ADC_Channel_7 + |