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 +}