diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index a41cd2089e3c3d93d8ae7ebeae9a6546e2645f57..85f8472994beb4d99743efc28361c3e9b763d105 100644
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -8,7 +8,7 @@
             "defines": [
                 "DEBUG",
                 "_ARCH_CORTEXM4_STM32F4",
-                "_BOARD_STM32F407VG_STM32F4DISCOVERY",
+                "_BOARD_STM32F4DISCOVERY",
                 "_MIOSIX_BOARDNAME=stm32f407vg_stm32f4discovery",
                 "HSE_VALUE=8000000",
                 "SYSCLK_FREQ_168MHz=168000000",
diff --git a/src/shared/drivers/adc/InternalADC.cpp b/src/shared/drivers/adc/InternalADC.cpp
index 3f0efa629f67ef086f20f4e95d767a1c7f14e206..7204cee1a54f43ec5a210400d8e3013dc212416f 100644
--- a/src/shared/drivers/adc/InternalADC.cpp
+++ b/src/shared/drivers/adc/InternalADC.cpp
@@ -88,13 +88,13 @@ bool InternalADC::init()
     adc->CR2 |= ADC_CR2_ADON;
 
     // Set single conversion mode
-    adc->CR2 &= ~ADC_CR2_CONT;
+    // adc->CR2 &= ~ADC_CR2_CONT;
 
     // Set scan mode
-    adc->CR1 |= ADC_CR1_SCAN;
+    // adc->CR1 |= ADC_CR1_SCAN;
 
     // Data alignment
-    adc->CR2 &= ~ADC_CR2_ALIGN;  // right
+    // adc->CR2 &= ~ADC_CR2_ALIGN;  // right
 
     if (isUsingDMA)
     {
@@ -161,8 +161,6 @@ bool InternalADC::addRegularChannel(Channel channel)
     if (activeChannels >= 16)
         return false;
 
-    printf("Active channels %d\n", activeChannels);
-
     // Add the channel to the sequence
     volatile uint32_t* sqrPtr;
     switch (activeChannels / 6)
@@ -279,6 +277,8 @@ ADCData InternalADC::sampleImpl()
     return lastSample;
 }
 
+float InternalADC::getSupplyVoltage() { return supplyVoltage; }
+
 inline void InternalADC::resetRegisters()
 {
     // Reset the ADC configuration
diff --git a/src/shared/drivers/adc/InternalADC.h b/src/shared/drivers/adc/InternalADC.h
index 12ba9e6387809360f80ff8db2f554e97298eeb6a..feee9e21b7599969af2c2801dce4035ad05aace7 100644
--- a/src/shared/drivers/adc/InternalADC.h
+++ b/src/shared/drivers/adc/InternalADC.h
@@ -145,6 +145,8 @@ public:
 
     ADCData sampleImpl() override;
 
+    float getSupplyVoltage();
+
 private:
     inline void resetRegisters();
 
diff --git a/src/shared/drivers/adc/InternalTemp.cpp b/src/shared/drivers/adc/InternalTemp.cpp
index 89a7914062869ccf2ce41bf3e24b489284644527..39a41d4ed7a7fe304017ca131dc2a27f055c6611 100644
--- a/src/shared/drivers/adc/InternalTemp.cpp
+++ b/src/shared/drivers/adc/InternalTemp.cpp
@@ -22,10 +22,10 @@
 
 #include "InternalTemp.h"
 
-#define TEMP110_CAL_VALUE ((uint16_t*)((uint32_t)0x1FFF7A2E))
 #define TEMP30_CAL_VALUE ((uint16_t*)((uint32_t)0x1FFF7A2C))
-#define TEMP110 110
+#define TEMP110_CAL_VALUE ((uint16_t*)((uint32_t)0x1FFF7A2E))
 #define TEMP30 30
+#define TEMP110 110
 
 namespace Boardcore
 {
@@ -39,6 +39,14 @@ InternalTemp::InternalTemp(InternalADC::SampleTime sampleTime,
 bool InternalTemp::init()
 {
     bool result = adc.init();
+
+#ifdef _BOARD_STM32F4DISCOVERY
+    adc.addRegularChannel(InternalADC::CH16);
+#else
+    adc.addRegularChannel(InternalADC::CH18);
+#endif
+
+    ADC->CCR &= ~ADC_CCR_VBATE;
     ADC->CCR |= ADC_CCR_TSVREFE;
 
     return result;
@@ -48,17 +56,25 @@ bool InternalTemp::selfTest() { return adc.selfTest(); }
 
 InternalTempData InternalTemp::sampleImpl()
 {
-    auto adcData = adc.readChannel(InternalADC::CH16);
-    printf("%2.3f \n", adcData.voltage);
+#ifdef _BOARD_STM32F4DISCOVERY
+    auto adcData = adc.readChannel(InternalADC::CH16, sampleTime);
+#else
+    auto adcData = adc.readChannel(InternalADC::CH18, sampleTime);
+#endif
+
     InternalTempData data;
     data.temperatureTimestamp = adcData.voltageTimestamp;
-    data.temperature          = ((adcData.voltage - 0.76) / 0.0025) + 25;
-    // data.temperature          = (int32_t)(
-    //    (TEMP110 - TEMP30) /
-    //        ((float)(*TEMP110_CAL_VALUE) - (float)(*TEMP30_CAL_VALUE)) *
-    //        (adcData.voltage - (float)(*TEMP30_CAL_VALUE)) +
-    //    TEMP30);
+
+    // Default conversion
+    // data.temperature          = ((adcData.voltage - 0.76) / 0.0025) + 25;
+
+    // Factory calibration
+    float voltage30  = static_cast<float>(*TEMP30_CAL_VALUE) * 3.3 / 4095;
+    float voltage110 = static_cast<float>(*TEMP110_CAL_VALUE) * 3.3 / 4095;
+    float slope      = (voltage110 - voltage30) / (TEMP110 - TEMP30);
+    data.temperature = ((adcData.voltage - voltage30) / slope) + TEMP30;
+
     return data;
 }
 
-}  // namespace Boardcore
\ No newline at end of file
+}  // namespace Boardcore
diff --git a/src/shared/drivers/adc/InternalTemp.h b/src/shared/drivers/adc/InternalTemp.h
index 280deb38eedd79cbb7ad8157f9193d8b7bb56b48..a66e32cafa0283ee463a82c0d8c7be4b3efa99a3 100644
--- a/src/shared/drivers/adc/InternalTemp.h
+++ b/src/shared/drivers/adc/InternalTemp.h
@@ -32,7 +32,7 @@ class InternalTemp : public Sensor<InternalTempData>
 {
 public:
     explicit InternalTemp(
-        InternalADC::SampleTime sampleTime = InternalADC::CYCLES_3,
+        InternalADC::SampleTime sampleTime = InternalADC::CYCLES_480,
         const float supplyVoltage          = 5.0);
 
     bool init() override;
diff --git a/src/tests/drivers/test-internal-adc.cpp b/src/tests/drivers/test-internal-adc.cpp
index 40bbf4f973f5a024f3911ab4e0b992089f7fbc3f..351505ab0319d204b2de7dd34ee438158cf75af5 100644
--- a/src/tests/drivers/test-internal-adc.cpp
+++ b/src/tests/drivers/test-internal-adc.cpp
@@ -35,9 +35,9 @@ int main()
     // parent clock
 
     InternalADC adc(ADC3, 3.3);
-    adc.enableChannel(InternalADC::CH18);  // PF6
-    adc.enableChannel(InternalADC::CH5);   // PF7
-    adc.enableChannel(InternalADC::CH6);   // PF8
+    adc.enableChannel(InternalADC::CH4);  // PF6
+    adc.enableChannel(InternalADC::CH5);  // PF7
+    adc.enableChannel(InternalADC::CH6);  // PF8
     adc.init();
 
     printf("Configuration completed\n");
@@ -47,7 +47,7 @@ int main()
         adc.sample();
 
         printf("CH4:%1.3f\tCH5:%1.3f\tCH6:%1.3f\n",
-               adc.getVoltage(InternalADC::CH18).voltage,
+               adc.getVoltage(InternalADC::CH4).voltage,
                adc.getVoltage(InternalADC::CH5).voltage,
                adc.getVoltage(InternalADC::CH6).voltage);
 
diff --git a/src/tests/drivers/test-internal-temp.cpp b/src/tests/drivers/test-internal-temp.cpp
index 209f8aadeaa16699b6ea429a282a99268d8f135f..2d6c7dcf4bd22f337aebb1950b6c11fc696c3681 100644
--- a/src/tests/drivers/test-internal-temp.cpp
+++ b/src/tests/drivers/test-internal-temp.cpp
@@ -30,10 +30,9 @@ using namespace Boardcore;
 int main()
 {
     ADC->CCR |= ADC_CCR_ADCPRE_0 | ADC_CCR_ADCPRE_1;
+
     InternalTemp temp(InternalADC::CYCLES_480, 3.0);
     temp.init();
-    printf("Init done %ld\n",
-           ClockUtils::getAPBFrequency(ClockUtils::APB::APB2));
 
     for (;;)
     {
@@ -42,4 +41,4 @@ int main()
 
         miosix::delayMs(1000);
     }
-}
\ No newline at end of file
+}