From 04d2bab6594bbefb7faf8ca9f0b097b2cb51edef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noah=20Piqu=C3=A9?= Date: Wed, 17 Nov 2021 11:35:41 +0100 Subject: [PATCH] with hardware oversampling --- .settings/language.settings.xml | 4 ++-- Core/Application/INIT_Initialization.c | 9 ++++++++- Core/Application/MAIN_MainApplication.c | 9 +++++++-- Core/Drivers/ANPI_AnalogPortsIn.c | 12 ++++++++++-- Core/Drivers/ANPI_AnalogPortsIn.h | 5 +++-- Core/Drivers/ANPO_AnalogPortsOut.c | 2 +- Core/Drivers/TEMP_Temperature.c | 2 +- Core/Src/main.c | 6 +++++- PeltierControllerV3 Debug.launch | 2 +- PeltierControllerV3.ioc | 5 ++++- 10 files changed, 42 insertions(+), 14 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 6bdbdda..c6d18b7 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -6,7 +6,7 @@ - + @@ -18,7 +18,7 @@ - + diff --git a/Core/Application/INIT_Initialization.c b/Core/Application/INIT_Initialization.c index 39e9fed..a22e8ce 100644 --- a/Core/Application/INIT_Initialization.c +++ b/Core/Application/INIT_Initialization.c @@ -183,7 +183,14 @@ PRIVATE VOID vInitTask( PVOID arg ) boOK &= MAIN_boInitializeModule(); - //!boOK ? RTOS_vFatalError() : NULL; + if(!boOK){ + osKernelLock(); // lock kernel to prevent task switch + while(1){ + DIPO_vToggleOutput(DIPO_eLED); + DELAY_MS( 100 ); + } + } + // boInitConfig ? ELOG_ADD_LOG( ELOG_eFactoryReset ) : NULL; // diff --git a/Core/Application/MAIN_MainApplication.c b/Core/Application/MAIN_MainApplication.c index f90ebf6..62bce69 100644 --- a/Core/Application/MAIN_MainApplication.c +++ b/Core/Application/MAIN_MainApplication.c @@ -297,6 +297,11 @@ PRIVATE VOID vMainTask( PVOID arg ) S16 SupplyCurrent24V = ((S16)(ANPI_flGetInputValue(ANPI_eSupplyCurrent24V)*1000)); S16 OutputVoltage = ((S16)(ANPI_flGetInputValue(ANPI_eOutputVoltage)*1000)); S16 OutputCurrent = ((S16)(ANPI_flGetInputValue(ANPI_eOutputCurrent)*1000)); + + /*U16 SupplyVoltage24V = ANPI_flGetInputValue(ANPI_eSupplyVoltage24V); + U16 SupplyCurrent24V = ANPI_flGetInputValue(ANPI_eSupplyCurrent24V); + U16 OutputVoltage = ANPI_flGetInputValue(ANPI_eOutputVoltage); + U16 OutputCurrent = ANPI_flGetInputValue(ANPI_eOutputCurrent);*/ au8Buffer[0] = (SupplyVoltage24V & 0xFF00) >> 8; au8Buffer[1] = SupplyVoltage24V & 0xFF; @@ -335,7 +340,7 @@ PRIVATE VOID vMainTask( PVOID arg ) } if( u32Flags & EVENT_TIMER_UPDATE ) { - DIPO_vToggleOutput(DIPO_eLED); + //DIPO_vToggleOutput(DIPO_eLED); } } @@ -360,7 +365,7 @@ PRIVATE VOID vEventCallback( PVOID pvData ) //------------------------------------------------------------------------------------------------- PRIVATE VOID vMsgRxCallback( CAND_Message stMessage ) { - osMessageQueuePut(m_pstCANRxMsgQueueID, &stMessage, 0, 0); + osMessageQueuePut(m_pstCANRxMsgQueueID, &stMessage, 0, 0); osEventFlagsSet( m_pstEventID, EVENT_NEW_MESSAGE ); } diff --git a/Core/Drivers/ANPI_AnalogPortsIn.c b/Core/Drivers/ANPI_AnalogPortsIn.c index fcf301d..c38c6ce 100644 --- a/Core/Drivers/ANPI_AnalogPortsIn.c +++ b/Core/Drivers/ANPI_AnalogPortsIn.c @@ -38,6 +38,7 @@ // Toolbox #include "../Toolbox/UTIL_Utility.h" +#include "DIPO_DigitalPorts.h" // include STM32 drivers #include "stm32l4xx_hal.h" @@ -49,11 +50,11 @@ // Description: Definition of local constants (visible by this module only). //================================================================================================= -#define ADC_RES (4096) // ADC resolution: 12 bits +#define ADC_RES (4096) // ADC resolution: 12 bits #define NR_OF_ADCS 5 // number of internal adc channels // definitions of internal adc -#define INT_ADC_REF_HI (3.28f) // HI int. reference voltage for conversion +#define INT_ADC_REF_HI (3.3f) // HI int. reference voltage for conversion #define INT_ADC_REF_LO (0.0f) // LO int. reference voltage for conversion #define INT_ADC_REF (INT_ADC_REF_HI-INT_ADC_REF_LO)// int. reference voltage for conversion @@ -269,6 +270,8 @@ VOID ANPI_vTask( PVOID arg ) { u32Flags = osEventFlagsWait( m_pstEventID, ANPI_FLAGS_ALL, osFlagsWaitAny, osWaitForever ); + DIPO_vSetOutput(DIPO_eLED); + if( u32Flags & ANPI_ADC_FULL_COMPLETE ) { u16Offset = BUFFER_HALF_SIZE; @@ -288,6 +291,7 @@ VOID ANPI_vTask( PVOID arg ) for(U16 u16Cnt = 0; u16Cnt < BUFFER_HALF_SIZE; u16Cnt++ ) { m_au32ADCRawData[ u16Cnt % NR_OF_ADCS ] += m_au16ADCDataBuffer[eADC1][u16Cnt + u16Offset]; + //m_au32ADCRawData[ u16Cnt % NR_OF_ADCS ] = m_au16ADCDataBuffer[eADC1][u16Cnt + u16Offset]; } // ... multiply by the conversion factor and add the offset @@ -297,9 +301,12 @@ VOID ANPI_vTask( PVOID arg ) { m_aflValues[u16Cnt] = ((((FLOAT)m_au32ADCRawData[u16Cnt] / (FLOAT)ANPI_OVERSAMPLING_FACTOR * OFFSET) - (FLOAT)m_aflOffset1[u16Cnt] ) * (FLOAT)m_aflConversionFactor[u16Cnt]) - (FLOAT)m_aflOffset2[u16Cnt]; + //m_aflValues[u16Cnt] = (FLOAT)m_au32ADCRawData[u16Cnt]; } osMutexRelease( m_pstMutexID ); // release mutex + + DIPO_vResetOutput(DIPO_eLED); } } @@ -323,6 +330,7 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc) { osEventFlagsSet( m_pstEventID, ANPI_ADC_HALF_COMPLETE ); + } //------------------------------------------------------------------------------------------------- diff --git a/Core/Drivers/ANPI_AnalogPortsIn.h b/Core/Drivers/ANPI_AnalogPortsIn.h index 225249c..ec08a38 100644 --- a/Core/Drivers/ANPI_AnalogPortsIn.h +++ b/Core/Drivers/ANPI_AnalogPortsIn.h @@ -7,7 +7,7 @@ //------------------------------------------------------------------------------------------------- // // Project: Peltier Controller V2 -// Author: Noah Piqué (noah.pique@psi.ch) +// Author: Noah Piqu� (noah.pique@psi.ch) // //------------------------------------------------------------------------------------------------- // @@ -41,10 +41,11 @@ extern "C" { //================================================================================================= // attention: perhaps you have to change the ADC sample time in ANPI_AnalogPortsIn.c +//#define ANPI_OVERSAMPLING_FACTOR 64 #define ANPI_OVERSAMPLING_FACTOR 64 #if( ANPI_OVERSAMPLING_FACTOR % 2 != 0 ) - #error "ANPI_OVERSAMPLING_FACTOR must be power of 2!" + //#error "ANPI_OVERSAMPLING_FACTOR must be power of 2!" #endif //================================================================================================= diff --git a/Core/Drivers/ANPO_AnalogPortsOut.c b/Core/Drivers/ANPO_AnalogPortsOut.c index fb33ec7..2822c53 100644 --- a/Core/Drivers/ANPO_AnalogPortsOut.c +++ b/Core/Drivers/ANPO_AnalogPortsOut.c @@ -159,7 +159,7 @@ BOOL ANPO_boSetVoltage( FLOAT Voltage ){ U32 u32ConvertVoltagetoRaw( FLOAT Voltage ){ U32 RawData; - RawData = Voltage * 4095 / 3.28; + RawData = Voltage * 4095 / 3.3; return RawData; } diff --git a/Core/Drivers/TEMP_Temperature.c b/Core/Drivers/TEMP_Temperature.c index 8550f5e..6994ec8 100644 --- a/Core/Drivers/TEMP_Temperature.c +++ b/Core/Drivers/TEMP_Temperature.c @@ -66,7 +66,7 @@ #define RTD_A 3.9083e-3 #define RTD_B -5.775e-7 -#define R_REF 3900 +#define R_REF 4000 #define R_NOMINAL 1000 //================================================================================================= diff --git a/Core/Src/main.c b/Core/Src/main.c index dc4a64b..b26a94d 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -250,7 +250,11 @@ static void MX_ADC1_Init(void) hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc1.Init.OversamplingMode = DISABLE; + hadc1.Init.OversamplingMode = ENABLE; + hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_64; + hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_2; + hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; + hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); diff --git a/PeltierControllerV3 Debug.launch b/PeltierControllerV3 Debug.launch index 26f6422..89cfb76 100644 --- a/PeltierControllerV3 Debug.launch +++ b/PeltierControllerV3 Debug.launch @@ -48,7 +48,7 @@ - + diff --git a/PeltierControllerV3.ioc b/PeltierControllerV3.ioc index ff84bd2..c455f69 100644 --- a/PeltierControllerV3.ioc +++ b/PeltierControllerV3.ioc @@ -7,7 +7,7 @@ ADC1.Channel-4\#ChannelRegularConversion=ADC_CHANNEL_15 ADC1.ContinuousConvMode=ENABLE ADC1.DMAContinuousRequests=ENABLE ADC1.EOCSelection=ADC_EOC_SEQ_CONV -ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,NbrOfConversion,ContinuousConvMode,DMAContinuousRequests,Rank-1\#ChannelRegularConversion,Channel-1\#ChannelRegularConversion,SamplingTime-1\#ChannelRegularConversion,OffsetNumber-1\#ChannelRegularConversion,Rank-2\#ChannelRegularConversion,Channel-2\#ChannelRegularConversion,SamplingTime-2\#ChannelRegularConversion,OffsetNumber-2\#ChannelRegularConversion,Rank-3\#ChannelRegularConversion,Channel-3\#ChannelRegularConversion,SamplingTime-3\#ChannelRegularConversion,OffsetNumber-3\#ChannelRegularConversion,Rank-4\#ChannelRegularConversion,Channel-4\#ChannelRegularConversion,SamplingTime-4\#ChannelRegularConversion,OffsetNumber-4\#ChannelRegularConversion,EOCSelection +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,NbrOfConversion,ContinuousConvMode,DMAContinuousRequests,Rank-1\#ChannelRegularConversion,Channel-1\#ChannelRegularConversion,SamplingTime-1\#ChannelRegularConversion,OffsetNumber-1\#ChannelRegularConversion,Rank-2\#ChannelRegularConversion,Channel-2\#ChannelRegularConversion,SamplingTime-2\#ChannelRegularConversion,OffsetNumber-2\#ChannelRegularConversion,Rank-3\#ChannelRegularConversion,Channel-3\#ChannelRegularConversion,SamplingTime-3\#ChannelRegularConversion,OffsetNumber-3\#ChannelRegularConversion,Rank-4\#ChannelRegularConversion,Channel-4\#ChannelRegularConversion,SamplingTime-4\#ChannelRegularConversion,OffsetNumber-4\#ChannelRegularConversion,EOCSelection,OversamplingMode,RightBitShift,Ratio ADC1.NbrOfConversion=5 ADC1.NbrOfConversionFlag=1 ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE @@ -15,11 +15,14 @@ ADC1.OffsetNumber-1\#ChannelRegularConversion=ADC_OFFSET_NONE ADC1.OffsetNumber-2\#ChannelRegularConversion=ADC_OFFSET_NONE ADC1.OffsetNumber-3\#ChannelRegularConversion=ADC_OFFSET_NONE ADC1.OffsetNumber-4\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.OversamplingMode=ENABLE ADC1.Rank-0\#ChannelRegularConversion=1 ADC1.Rank-1\#ChannelRegularConversion=2 ADC1.Rank-2\#ChannelRegularConversion=3 ADC1.Rank-3\#ChannelRegularConversion=4 ADC1.Rank-4\#ChannelRegularConversion=5 +ADC1.Ratio=ADC_OVERSAMPLING_RATIO_64 +ADC1.RightBitShift=ADC_RIGHTBITSHIFT_2 ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_640CYCLES_5 ADC1.SamplingTime-1\#ChannelRegularConversion=ADC_SAMPLETIME_640CYCLES_5 ADC1.SamplingTime-2\#ChannelRegularConversion=ADC_SAMPLETIME_640CYCLES_5