aboutsummaryrefslogtreecommitdiffstats
path: root/src/glutt-o-logique/analog_input.c
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2016-06-25 00:00:31 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2016-06-25 00:00:31 +0200
commitb5e4df11a5e177827879813c4bdf47b3cbe34928 (patch)
tree7bad9dbaa542e2646ab9d845e82fe46e0d221fe6 /src/glutt-o-logique/analog_input.c
parent04cf37f8b416b13484823bb4761928964dcc8b30 (diff)
downloadglutte-o-matic-b5e4df11a5e177827879813c4bdf47b3cbe34928.tar.gz
glutte-o-matic-b5e4df11a5e177827879813c4bdf47b3cbe34928.tar.bz2
glutte-o-matic-b5e4df11a5e177827879813c4bdf47b3cbe34928.zip
Add code to read SWR analog voltages
Diffstat (limited to 'src/glutt-o-logique/analog_input.c')
-rw-r--r--src/glutt-o-logique/analog_input.c63
1 files changed, 48 insertions, 15 deletions
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;
+}
+