Changeset 24 for trunk/fw_g473rct/SES
- Timestamp:
- Aug 31, 2025, 6:56:29 PM (5 days ago)
- Location:
- trunk/fw_g473rct/SES
- Files:
-
- 9 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/fw_g473rct/SES/inc/fast_current.h
r20 r24 20 20 21 21 //--- GLOBALE FUNKTIONS PROTOTYPEN --------------------------------------------- 22 void FAST_CURRENT_Exec(uint32_t new valP, uint32_t newvalM);22 void FAST_CURRENT_Exec(uint32_t newVal ); 23 23 24 24 #endif // -
trunk/fw_g473rct/SES/inc/int_bat_voltage.h
r23 r24 26 26 * @retval kein 27 27 */ 28 void REF_VOLTAGE_Exec(uint32_t newval);28 void INT_BAT_VOLTAGE_Exec(uint32_t newval); 29 29 30 30 #endif // __REF_VOLTAGE_H -
trunk/fw_g473rct/SES/smartPro.emProject
r22 r24 185 185 <file file_name="inc/esr.h" /> 186 186 <file file_name="inc/fast_current.h" /> 187 <file file_name="inc/int_bat_voltage.h" /> 187 188 <file file_name="inc/modbus.h" /> 188 189 <file file_name="inc/outputs.h" /> 189 <file file_name="inc/ref_voltage.h" />190 190 <file file_name="inc/rtc.h" /> 191 191 <file file_name="inc/self_discharge.h" /> … … 212 212 <file file_name="src/esr.c" /> 213 213 <file file_name="src/fast_current.c" /> 214 <file file_name="src/int_bat_voltage.c" /> 214 215 <file file_name="src/main.c" /> 215 216 <file file_name="src/modbus.c" /> 216 217 <file file_name="src/outputs.c" /> 217 <file file_name="src/ref_voltage.c" />218 218 <file file_name="src/self_discharge.c" /> 219 219 <file file_name="src/shunt_temperature.c" /> -
trunk/fw_g473rct/SES/src/battery_voltage.c
r22 r24 13 13 #include "main.h" 14 14 #include "sysdata.h" 15 15 #include <stdio.h> 16 16 // --- EXTERNE VARIABLEN -------------------------------------------------------- 17 17 18 18 // --- LOKALE DEFINES - bitte hier dokumentieren -------------------------------- 19 #define BATTERY_VOLTAGE_FILTER 25619 #define BATTERY_VOLTAGE_FILTER 32 20 20 21 21 22 #define BATTERY_VOLTAGE_VOLTAGE_DIVIDER 6 23 #define ADC_RESOLUTION 65536//65536/2 da im differential mode24 #define ADC_OFFSET 025 #define VREF 3000 22 #define BATTERY_VOLTAGE_VOLTAGE_DIVIDER 6.0 23 #define ADC_RESOLUTION 32768.0 //65536/2 da im differential mode 24 #define ADC_OFFSET 32768.0 25 26 26 // --- LOKALE TYPE DEFS - bitte hier dokumentieren------------------------------- 27 27 … … 37 37 38 38 39 void BATTERY_VOLTAGE_Exec(int32_t new valP)39 void BATTERY_VOLTAGE_Exec(int32_t newVal) 40 40 { 41 41 static int measCounter; 42 static unsigned long avgsumP = 0; 43 int32_t avgvalP; 44 42 static unsigned long avgSum = 0; 43 int32_t avgVal; 45 44 if (measCounter < INT32_MAX) measCounter++; 46 45 47 46 48 47 // Filterlängen in 2er-Potenzen --> Compiler optimiert 49 avg sumP -= avgsumP/ BATTERY_VOLTAGE_FILTER;50 avg sumP += newvalP;51 avg valP = avgsumP/ BATTERY_VOLTAGE_FILTER;48 avgSum -= avgSum / BATTERY_VOLTAGE_FILTER; 49 avgSum += newVal; 50 avgVal = avgSum / BATTERY_VOLTAGE_FILTER; 52 51 53 52 … … 55 54 56 55 //Umrechung auf Eingangsspannung am Gerät mit Teiler 57 sys_data.s.values.batteryVoltage = ((avg valP-2048) * 3000 * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 2048;56 sys_data.s.values.batteryVoltage = ((avgVal-ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / ADC_RESOLUTION; 58 57 59 58 … … 75 74 76 75 77 //Berechnung schnelle nWert ohne Glättung:76 //Berechnung schnelle Wert ohne Glättung: 78 77 //Umrechung auf Eingangsspannung am Gerät mit Teiler 79 sys_data.s.values.fast_voltage = ((new valP-ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / ADC_RESOLUTION;78 sys_data.s.values.fast_voltage = ((newVal-ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / ADC_RESOLUTION; 80 79 81 80 -
trunk/fw_g473rct/SES/src/chip_temperature.c
r20 r24 24 24 // --- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------ 25 25 uint32_t calTemperatureSensor30Value; // Kalibrierungswert für den Temperatursensor auf dem STM32G0 (Werksmäßig im SCB Bereich gespeichert wird beim Programmstart ausgelesen) 26 uint32_t calTemperatureSensor1 30Value; // Kalibrierungswert für den Temperatursensor auf dem STM32G0 (Werksmäßig im SCB Bereich gespeichert wird beim Programmstart ausgelesen)26 uint32_t calTemperatureSensor110Value; // Kalibrierungswert für den Temperatursensor auf dem STM32G0 (Werksmäßig im SCB Bereich gespeichert wird beim Programmstart ausgelesen) 27 27 uint32_t calTemperatureSensorDiff; // Differenz calTemperatureSensor130Value und calTemperatureSensor30Value wird für die Kalibrierung des internen Temperatursensors bentigt 28 28 // Daten Temperaturanzeige µProzessor 29 29 double slope; 30 30 // --- LOKALE FUNKTIONS PROTOTYPEN ---------------------------------------------- 31 31 … … 46 46 uint16_t * pCalibrationData; 47 47 float calibrationData30; 48 float calibrationData1 30;48 float calibrationData110; 49 49 50 50 // lade Temperatur Kalibrierungswert (Wert bei 30°C) … … 55 55 //Berechnung Spannung in mV bei CAL Punk 30°C 56 56 //Kalbibrierung wurde mit 12 Bit und 3000mV Vref durchgeführt 57 calibrationData30 = calibrationData30 / 4096; 58 calTemperatureSensor30Value = calibrationData30 * 3000 ; // jetzt haben wir die Kalibrierungsspannung in Volt bei 30°C; 57 calTemperatureSensor30Value = (calibrationData30 * 3000) / 4096 ; // jetzt haben wir die Kalibrierungsspannung in Volt bei 30°C; 59 58 60 59 pCalibrationData = (uint16_t *)TEMPSENSOR_CAL2_ADDR; 61 calibrationData1 30 = * pCalibrationData;60 calibrationData110 = * pCalibrationData; 62 61 63 //Berechnung Spannung in mV bei CAL Punk 1 30°C62 //Berechnung Spannung in mV bei CAL Punk 110°C 64 63 //Kalbibrierung wurde mit 12 Bit und 3000mV Vref durchgeführt 65 calibrationData130 = calibrationData130 / 4096; 66 calTemperatureSensor130Value = calibrationData130 * 3000; // jetzt haben wir die Kalibrierungsspannung in Volt bei 130°C; 64 calTemperatureSensor110Value = (calibrationData110 * 3000 / 4096); // jetzt haben wir die Kalibrierungsspannung in Volt bei 110°C; 67 65 68 66 // Spannungsdifferenz bei 100 Kelvin Temperatureunterschied 69 calTemperatureSensorDiff = (calTemperatureSensor130Value - calTemperatureSensor30Value); 67 // Slope enthält die Änderung in mV pro °C 68 calTemperatureSensorDiff = (calTemperatureSensor110Value - calTemperatureSensor30Value); 69 slope = (double) calTemperatureSensorDiff / (TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP); 70 71 70 72 } 71 73 72 74 void CHIP_TEMPERATURE_Exec(uint32_t chiptemperature) 73 75 { 74 int32_tvoltage;76 double voltage; 75 77 //Aktuelle Spannung am Temp Sensor 76 voltage = (3 300 * chiptemperature) / 65536;78 voltage = (3000 * chiptemperature) / 65536; 77 79 78 80 79 81 voltage = voltage - calTemperatureSensor30Value; 80 voltage = voltage * 100000; //100000 da Kalibrierwerte 100 Kelvin Delta T haben und wir alles in m°C rechnen 81 voltage = voltage / (int32_t)(calTemperatureSensorDiff); 82 voltage = voltage + 30000; //30000 da Erste Kalibrierpunkt bei 30°C --> 30 000 m°C 82 voltage = voltage / slope; 83 voltage = voltage + 30.0; 83 84 84 //Durch 10 teilen, damit es in 16 Bit signed modbus register passt 85 sys_data.s.values.chipTemperature = voltage /10;85 //*100 für Kommastellen 86 sys_data.s.values.chipTemperature = voltage * 100 ; 86 87 87 88 calc_temp_compensation(); -
trunk/fw_g473rct/SES/src/fast_current.c
r20 r24 17 17 18 18 // --- LOKALE DEFINES - bitte hier dokumentieren -------------------------------- 19 //#define FAST_CURRENT_FILTER 220 21 22 19 23 20 #define I_SENSE_GAIN 40.0 21 #define ADC_OFFSET 32768 22 #define ADC_RESOLUTION 32768 //65536/2 da im differential mode 24 23 25 24 … … 51 50 52 51 53 void FAST_CURRENT_Exec(uint32_t new valP, uint32_t newvalM)52 void FAST_CURRENT_Exec(uint32_t newVal ) 54 53 { 55 static int measCounter; 56 static unsigned long avgsumP = 0; 57 uint32_t avgvalP; 58 59 if (measCounter < INT32_MAX) measCounter++; 60 61 62 // Filterlängen in 2er-Potenzen --> Compiler optimiert 63 // avgsumP -= avgsumP / FAST_CURRENT_FILTER; 64 // avgsumP += newvalP; 65 // avgvalP = avgsumP / FAST_CURRENT_FILTER; 66 67 // static unsigned long avgsumM = 0; 68 // uint32_t avgvalM; 69 // Filterlängen in 2er-Potenzen --> Compiler optimiert 70 // avgsumM -= avgsumM / FAST_CURRENT_FILTER; 71 // avgsumM += newvalM; 72 // avgvalM = avgsumM / FAST_CURRENT_FILTER; 73 74 75 //Berechne Differenzspannung am ADC Eingnag 76 double diff; 77 diff = (int32_t) newvalP - (int32_t) newvalM; 78 diff = (diff * sys_data.s.values.realVdd) / 65536; 79 54 80 55 //Umrechung auf Strom 81 56 double temp_current; 82 temp_current = (diff / I_SENSE_GAIN) / SHUNT_RESISTOR; 57 temp_current = ((int32_t) newVal - ADC_OFFSET) * VREF ; 58 temp_current = temp_current / ADC_RESOLUTION; 59 temp_current = temp_current / I_SENSE_GAIN ; 60 temp_current = temp_current / SHUNT_RESISTOR ; 83 61 sys_data.s.values.fast_current = temp_current * (sys_data.s.parameter.batteryCurrentGainCorrectionFaktor / 1000000.0); 84 62 -
trunk/fw_g473rct/SES/src/int_bat_voltage.c
r23 r24 12 12 #include "main.h" 13 13 #include "sysdata.h" 14 #include "int_bat_voltage.h" 14 15 // --- EXTERNE VARIABLEN -------------------------------------------------------- 15 16 … … 34 35 35 36 // --- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------ 36 void REF_VOLTAGE_Exec(uint32_t newval)37 void INT_BAT_VOLTAGE_Exec(uint32_t newval) 37 38 { 38 static unsigned long avgsum = 0;39 uint32_t avgval;40 // Filterlängen in 2er-Potenzen --> Compiler optimiert41 avgsum -= avgsum / REF_FILTER;42 avgsum += newval;43 avgval = avgsum / REF_FILTER;44 45 39 // Messung Externe Spannung basierend auf 3,3V Versorgungsspannung 46 40 // Nur für Debug Zwecke 47 sys_data.s.values.voltageVref = (avgval * 3300) / 65536;41 sys_data.s.values.voltageVref = VREF; 48 42 49 // Ermittlung Vdd als Referenz50 sys_data.s.values.realVdd = 3 000L * 65536 / avgval;;43 44 sys_data.s.values.realVdd = 3 * (newval * VREF) / 65536; 51 45 } 52 46 /*************************** End of file ****************************/ -
trunk/fw_g473rct/SES/src/main.c
r23 r24 39 39 #include "battery_voltage.h" 40 40 #include "ads1260.h" 41 #include "shunt_voltage.h" 42 #include "fast_current.h" 43 #include "int_bat_voltage.h" 44 #include "chip_temperature.h" 45 #include "shunt_temperature.h" 41 46 /* USER CODE END Includes */ 42 47 … … 61 66 modbus_t modbusData __attribute__((section(".RAM1"))); 62 67 63 __IO uint16_t adc12Data[ 2] __attribute__((section(".RAM1")));68 __IO uint16_t adc12Data[100][2] __attribute__((section(".RAM1"))); 64 69 __IO uint32_t adc1Data[1] __attribute__((section(".RAM1"))); 65 70 __IO uint32_t adc2Data[1] __attribute__((section(".RAM1"))); … … 68 73 __IO uint32_t adc5Data[4] __attribute__((section(".RAM1"))); 69 74 int silentmode =0; 70 static volatile uint32_t newADC1Data = 0; 71 static volatile uint32_t newADC2Data = 0; 75 static volatile uint32_t newADC12Data = 0; 76 static volatile uint32_t newADC3Data = 0; 77 static volatile uint32_t newADC4Data = 0; 78 static volatile uint32_t newADC5Data = 0; 72 79 /* USER CODE END PV */ 73 80 … … 95 102 uint8_t firstStartCatcher; 96 103 int mode_button_disable_time=0; 104 uint32_t adc12_time; 105 uint32_t adc12_lasttime; 97 106 /* USER CODE END 1 */ 98 107 … … 160 169 161 170 // STM32G0 Chiptemperatur Kalibrierung 162 CHIP_TEMPERATURE_Calibration( /*&sys_data*/);171 CHIP_TEMPERATURE_Calibration(); 163 172 164 173 HAL_ADCEx_Calibration_Start(&hadc1, ADC_DIFFERENTIAL_ENDED); … … 169 178 170 179 171 172 180 //SET_BIT(hadc2.Instance->CFGR, ADC_CFGR_DMAEN); //Enable DMA transfer for ADC slave (ADC12_CCR.MDMA = 0b00 -> MDMA mode disabled) 173 181 //HAL_DMA_Start(hadc2.DMA_Handle,(uint32_t)&hadc2.Instance->DR, (uint32_t)adc2Data,1); //Start ADC slave DMA … … 175 183 176 184 //HAL_ADC_Start_DMA(&hadc2, (uint32_t*)adc2Data, 1); 177 if (HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)adc12Data,1 )) //Start ADC interleaved mode185 if (HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)adc12Data,100)) //Start ADC interleaved mode 178 186 { 179 187 /* Start Error */ 180 188 Error_Handler(); 181 189 } 190 191 if (HAL_ADC_Start_DMA(&hadc3, (uint32_t *) adc3Data , 3)) 192 { 193 /* Start Error */ 194 Error_Handler(); 195 } 196 197 if (HAL_ADC_Start_DMA(&hadc4, (uint32_t *) adc4Data , 1)) 198 { 199 /* Start Error */ 200 Error_Handler(); 201 } 202 182 203 183 204 if (HAL_ADC_Start_DMA(&hadc5, (uint32_t *) adc5Data , 4)) … … 196 217 197 218 /* USER CODE BEGIN 3 */ 198 if (newADC1Data == 1) 199 { 200 BATTERY_VOLTAGE_Exec( adc12Data[1]); 201 } 202 219 if (newADC12Data == 1) 220 { 221 //Mit ADC_DIV2,Sample time 12,5Cycklen, ADC Clock 50Mhz, Oversampling 256 222 //Tconv = 6400 Takte = 0,128ms Pro Konvertierung. Also für 100 messwerte 12,8mS 223 BATTERY_VOLTAGE_Exec( adc12Data[0][1]); 224 FAST_CURRENT_Exec(adc12Data[0][0]); 225 newADC12Data = 0; 226 adc12_time = HAL_GetTick() - adc12_lasttime; 227 adc12_lasttime = HAL_GetTick(); 228 229 } 230 231 232 if (newADC3Data == 1) 233 { 234 SHUNT_TEMPERATURE_Exec(adc3Data[0]); 235 } 236 237 238 if (newADC4Data == 1) 239 { 240 SHUNT_VOLTAGE_Exec( adc4Data[0]); 241 } 242 243 244 if (newADC5Data == 1) 245 { 246 CHIP_TEMPERATURE_Exec(adc5Data[0]); 247 INT_BAT_VOLTAGE_Exec( adc5Data[1]); 248 sys_data.s.values.ovp_sense = (adc5Data[2] * VREF * 21 ) / 65536.0; 249 sys_data.s.values.lvp_sense = (adc5Data[3] * VREF * 21 ) / 65536.0; 250 } 203 251 204 252 if(sys_data.s.parameter.command != 0) … … 327 375 if (hadc->Instance==ADC1) 328 376 { 329 newADC1 Data=1;330 } 331 332 if (hadc->Instance==ADC 2)377 newADC12Data=1; 378 } 379 380 if (hadc->Instance==ADC3) 333 381 { 334 newADC2Data=1; 382 newADC3Data=1; 383 } 384 385 386 if (hadc->Instance==ADC4) 387 { 388 newADC4Data=1; 389 } 390 391 if (hadc->Instance==ADC5) 392 { 393 newADC5Data=1; 335 394 } 336 395 } -
trunk/fw_g473rct/SES/src/modbus.c
r23 r24 183 183 } 184 184 185 uint32_t fixedDelayInBitDurations = (FAST_BAUDRATE_INTERFRAME_DELAY_us * baudrate) / 1000000UL + 1UL; 186 // HAL_UART_EnableReceiverTimeout( usart); 187 // HAL_UART_ReceiverTimeout_Config(usart, fixedDelayInBitDurations); 188 189 if(HAL_UARTEx_ReceiveToIdle_DMA(mb_data->uart, mb_data->rx_buffer, RXBUFFERSIZE) != HAL_OK) 185 186 HAL_UART_EnableReceiverTimeout( usart); 187 HAL_UART_ReceiverTimeout_Config(usart, 3.5 * nrOfBitsPerChar); 188 SET_BIT(usart->Instance->CR1, USART_CR1_RTOIE); 189 190 191 if(HAL_UART_Receive_DMA(mb_data->uart, mb_data->rx_buffer, RXBUFFERSIZE) != HAL_OK) 190 192 { 191 193 printf("uart error \n\r"); … … 202 204 modbusData.mb_rx_frame_complete = 1; 203 205 modbusData.setRxLed = false; 204 modbusData.rx_head = 0;205 206 modbusData.rx_head = huart->RxXferSize - __HAL_DMA_GET_COUNTER(huart->hdmarx); 207 206 208 207 209 if (huart->ErrorCode == HAL_UART_ERROR_RTO) 208 210 { 209 printf("MB RTO Event! \n\r"); 211 212 // printf("MB RTO Event! \n\r"); 213 // Kein Fehler, normale Funktion 210 214 } 211 215 if (huart->ErrorCode == HAL_UART_ERROR_FE) … … 240 244 241 245 242 if(HAL_UARTEx_ReceiveToIdle_DMA(huart, huart->pRxBuffPtr, RXBUFFERSIZE) != HAL_OK) 246 247 if(HAL_UART_Receive_DMA(huart, huart->pRxBuffPtr, RXBUFFERSIZE) != HAL_OK) 243 248 { 244 249 printf("Uart Error bei neustart nach Fehler \n\r"); … … 250 255 } 251 256 252 void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)253 {254 //printf("MB rxEvent!RX=%d \n\r",Size);255 modbusData.setRxLed = true;256 257 modbusData.mb_rx_frame_complete = 1;258 modbusData.rx_head= Size +1;259 260 if(HAL_UARTEx_ReceiveToIdle_DMA(huart, huart->pRxBuffPtr, RXBUFFERSIZE) != HAL_OK)261 {262 printf("uart error \n\r");263 // while(1)264 // {265 // }266 }267 268 269 }257 //void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) 258 //{ 259 // //printf("MB rxEvent!RX=%d \n\r",Size); 260 // modbusData.setRxLed = true; 261 262 // modbusData.mb_rx_frame_complete = 1; 263 // modbusData.rx_head= Size +1; 264 265 // if(HAL_UART_Receive_DMA(huart, huart->pRxBuffPtr, RXBUFFERSIZE) != HAL_OK) 266 // { 267 // printf("uart error \n\r"); 268 // // while(1) 269 // // { 270 // // } 271 // } 272 273 274 //} 270 275 271 276 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) -
trunk/fw_g473rct/SES/src/shunt_temperature.c
r20 r24 38 38 void SHUNT_TEMPERATURE_Exec(int32_t adcval) 39 39 { 40 int32_ttemp;40 double temp; 41 41 42 42 43 43 //Umrechnung Spannung in mV 44 temp = (adcval * 3300 ) / 65536;44 temp = (adcval * VREF ) / 65536.0; 45 45 46 //Umrechnung in °C mit PT 1000 Sensor47 // temp = temp - 747;48 // temp = temp * 70.406;49 46 50 47 //Umrechnung in °C mit LM61 Sensor 51 48 temp = temp - 600; 52 temp = temp * 100;49 temp = temp / 10; 53 50 54 51 //2Nackommastellen 55 52 //milli grad in grad * 100 /festkomma 56 sys_data.s.values.shuntTemperature = temp / 10;53 sys_data.s.values.shuntTemperature = temp * 100; 57 54 58 55 -
trunk/fw_g473rct/SES/src/shunt_voltage.c
r20 r24 17 17 18 18 // --- LOKALE DEFINES - bitte hier dokumentieren -------------------------------- 19 20 #define SHUNT_VOLTAGE_DIVIDER 6 19 #define ADC_RESOLUTION 32768 //65536/2 da im differential mode 20 #define ADC_OFFSET 32768 21 #define SHUNT_VOLTAGE_DIVIDER 6 21 22 // --- LOKALE TYPE DEFS - bitte hier dokumentieren------------------------------- 22 23 … … 44 45 void SHUNT_VOLTAGE_Exec(int32_t newval) 45 46 { 46 static unsigned long avgsum = 0; 47 uint32_t avgval; 48 // Filterlängen in 2er-Potenzen --> Compiler optimiert 49 //avgsum -= avgsum/SHUNT_FILTER; 50 //avgsum += newval; 51 //avgval = avgsum / SHUNT_FILTER; 52 53 sys_data.s.values.shuntVoltage = (newval * (uint64_t)sys_data.s.values.realVdd * SHUNT_VOLTAGE_DIVIDER ) / 65536; 47 sys_data.s.values.shuntVoltage = ((newval-ADC_OFFSET) * VREF * SHUNT_VOLTAGE_DIVIDER ) / ADC_RESOLUTION; 54 48 55 49 }
Note: See TracChangeset
for help on using the changeset viewer.