summaryrefslogtreecommitdiff
path: root/tests/adc-power/adc-power.c
diff options
context:
space:
mode:
authorKarl Palsson <karlp@tweak.net.au>2015-10-28 18:55:56 +0000
committerKarl Palsson <karlp@tweak.net.au>2015-10-28 18:55:56 +0000
commit26eeb488073fb55b25e5d9e3addf968e1d5f9b82 (patch)
tree8b74cb25604c7ab308bb6ffcee7fa23e454f43c7 /tests/adc-power/adc-power.c
parent3830ded6e766fe9a1746994820df5e412fd19fa1 (diff)
downloadolsndot-26eeb488073fb55b25e5d9e3addf968e1d5f9b82.tar.gz
olsndot-26eeb488073fb55b25e5d9e3addf968e1d5f9b82.tar.bz2
olsndot-26eeb488073fb55b25e5d9e3addf968e1d5f9b82.zip
f3: wip continues
Diffstat (limited to 'tests/adc-power/adc-power.c')
-rw-r--r--tests/adc-power/adc-power.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/tests/adc-power/adc-power.c b/tests/adc-power/adc-power.c
index 817671c..4214c05 100644
--- a/tests/adc-power/adc-power.c
+++ b/tests/adc-power/adc-power.c
@@ -23,6 +23,14 @@
void adc_power_init(void)
{
/* Some basic ADC config, that we won't touch again */
+#if defined(STM32F3)
+ /* silly f303 */
+ rcc_periph_clock_enable(RCC_ADC12);
+ rcc_adc_prescale(RCC_CFGR2_ADCxPRES_PLL_CLK_DIV_1, RCC_CFGR2_ADCxPRES_PLL_CLK_DIV_1);
+ adc_enable_regulator(ADC1);
+ adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR1_SMP_19DOT5CYC);
+ adc_set_sample_time(ADC1, ADC_CHANNEL_TEMP, ADC_SMPR1_SMP_181DOT5CYC);
+#else
rcc_periph_clock_enable(RCC_ADC1);
adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR_SMP_28CYC);
#if 0
@@ -35,6 +43,9 @@ void adc_power_init(void)
adc_disable_scan_mode(ADC1);
#endif
+#endif
+ adc_enable_temperature_sensor();
+ adc_enable_vrefint();
/*
* We're going to setup a timer to run at top speed, so... "fast"
* but we don't actually care about the rate itself. We just
@@ -57,6 +68,30 @@ static uint16_t read_adc_naiive(uint8_t channel)
return adc_read_regular(ADC1);
}
+static uint16_t compensate_vref(uint16_t adc_count, uint16_t vref_count) {
+ uint32_t ret = adc_count * ST_VREFINT_CAL;
+ return (ret / vref_count);
+}
+
+static int work_temp(unsigned int ts_v, unsigned int vref) {
+ // This is important! as the calibration values are give us a slope in mv/C
+ int raw_temp_mv = compensate_vref(ts_v, vref);
+ // millivolts gives millcentigrade
+ float slope = raw_temp_mv - (ST_TSENSE_CAL1_30C * 1.0) / (ST_TSENSE_CAL2_110 * 1.0) - ST_TSENSE_CAL1_30C;
+ int temp_mc = (110 - 30) * slope + 30.0;
+ return temp_mc / 10;
+}
+
+static float adc_calculate_temp(unsigned int ts_v) {
+#if 0
+ float factor = (110-30) / ((ST_TSENSE_CAL1_30C * 1.0) - (ST_TSENSE_CAL2_110 * 1.0));
+ return (factor * (ts_v - ST_TSENSE_CAL2_110)) + 30.0;
+#else
+ float factor = (110-30) / ((ST_TSENSE_CAL2_110 * 1.0) - (ST_TSENSE_CAL1_30C * 1.0));
+ return (factor * (ts_v - ST_TSENSE_CAL1_30C)) + 30.0;
+#endif
+}
+
void adc_power_task_up(void) {
TIM_CNT(TIMER) = 0;
adc_power_on(ADC1);
@@ -77,12 +112,18 @@ void adc_power_task_up(void) {
unsigned int tconv = TIM_CNT(TIMER);
#else
TIM_CNT(TIMER) = 0;
- unsigned int v1 = read_adc_naiive(0);
- unsigned int v2 = read_adc_naiive(1);
+ unsigned int v1 = read_adc_naiive(1);
+ unsigned int v5 = read_adc_naiive(5);
+ unsigned int temp_adc = read_adc_naiive(ADC_CHANNEL_TEMP);
+ unsigned int vref_adc = read_adc_naiive(ADC_CHANNEL_VREF);
+ // TODO - use vref to adjust temp_adc for non-3v readings!
+ float temp = adc_calculate_temp(temp_adc);
+ int tempi = 100 * temp;
unsigned int tconv = TIM_CNT(TIMER);
#endif
- printf("ton: %u, tconv: %u, v1: %u, v2: %u\n", td, tconv, v1, v2);
+ printf("ton: %u, tconv: %u, ch1: %u, ch5: %u\n", td, tconv, v1, v5);
+ printf("\tTemperature: %f (raw count: %u)\n", temp, temp_adc);
}
void adc_power_task_down()