Changeset 26 for trunk/firmware/Src
- Timestamp:
- Sep 8, 2025, 6:57:30 PM (7 weeks ago)
- Location:
- trunk/firmware/Src
- Files:
-
- 10 edited
-
adc.c (modified) (8 diffs)
-
battery_voltage.c (modified) (2 diffs)
-
eeprom.c (modified) (2 diffs)
-
fast_current.c (modified) (2 diffs)
-
main.c (modified) (5 diffs)
-
ref_voltage.c (modified) (2 diffs)
-
self_discharge.c (modified) (5 diffs)
-
shunt_voltage.c (modified) (1 diff)
-
stm32g0xx_it.c (modified) (1 diff)
-
sysdata.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/firmware/Src/adc.c
r6 r26 36 36 */ 37 37 hadc1.Instance = ADC1; 38 hadc1.Init.ClockPrescaler = LL_ADC_CLOCK_SYNC_PCLK_DIV4;38 hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; 39 39 hadc1.Init.Resolution = ADC_RESOLUTION_12B; 40 40 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; 41 hadc1.Init.ScanConvMode = ADC_SCAN_ ENABLE;41 hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; //More channnels 42 42 hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV; 43 43 hadc1.Init.LowPowerAutoWait = DISABLE; 44 44 hadc1.Init.LowPowerAutoPowerOff = DISABLE; 45 45 hadc1.Init.ContinuousConvMode = ENABLE; 46 hadc1.Init.NbrOfConversion = 8;46 hadc1.Init.NbrOfConversion = 1; 47 47 hadc1.Init.DiscontinuousConvMode = DISABLE; 48 48 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; 49 49 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; 50 50 hadc1.Init.DMAContinuousRequests = ENABLE; 51 hadc1.Init.Overrun = ADC_OVR_DATA_ OVERWRITTEN;52 hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5; 51 hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; 52 hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5; //bei79,5 ist das gezappelt in der fast voltage eindeutig höher 53 53 hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5; 54 54 hadc1.Init.OversamplingMode = ENABLE; … … 65 65 //Messung Common Mode Voltage (Shunt Spannung - gegen Batterie Minus) 66 66 sConfig.Channel = ADC_CHANNEL_0; 67 sConfig.Rank = ADC_R EGULAR_RANK_1;67 sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; 68 68 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; 69 69 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) … … 75 75 //Messung Batteriespannung Plus 76 76 sConfig.Channel = ADC_CHANNEL_1; 77 sConfig.Rank = ADC_REGULAR_RANK_2;78 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;79 77 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 80 78 { … … 85 83 //Messung Neu : Vref 86 84 sConfig.Channel = ADC_CHANNEL_2; 87 sConfig.Rank = ADC_REGULAR_RANK_3;88 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;89 85 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 90 86 { … … 94 90 //Fast current Plus 95 91 sConfig.Channel = ADC_CHANNEL_3; 96 sConfig.Rank = ADC_REGULAR_RANK_4;97 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;98 92 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 99 93 { … … 103 97 //Fast current Minus 104 98 sConfig.Channel = ADC_CHANNEL_4; 105 sConfig.Rank = ADC_REGULAR_RANK_5; 106 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; 107 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 108 { 109 Error_Handler(); 110 } 99 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 100 { 101 Error_Handler(); 102 } 103 104 105 sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; 106 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 107 { 108 Error_Handler(); 109 } 110 111 111 112 112 … … 115 115 //ovp sense 116 116 sConfig.Channel = ADC_CHANNEL_8; 117 sConfig.Rank = ADC_REGULAR_RANK_6;118 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;119 117 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 120 118 { … … 124 122 //lvp sense 125 123 sConfig.Channel = ADC_CHANNEL_9; 126 sConfig.Rank = ADC_REGULAR_RANK_7; 127 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2; 128 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 129 { 130 Error_Handler(); 131 } 132 124 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 125 { 126 Error_Handler(); 127 } 133 128 134 129 //Temp Meas 135 130 sConfig.Channel = ADC_CHANNEL_10; 136 sConfig.Rank = ADC_REGULAR_RANK_8; 137 sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; 138 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 139 { 140 Error_Handler(); 141 } 142 143 144 145 131 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 132 { 133 Error_Handler(); 134 } 146 135 } 147 136 -
trunk/firmware/Src/battery_voltage.c
r6 r26 53 53 54 54 //Umrechung auf Eingangsspannung am Gerät mit Teiler 55 sys_data.s.values.batteryVoltage = (avgvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536 0.0;55 sys_data.s.values.batteryVoltage = (avgvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536; 56 56 57 57 … … 75 75 //Berechnung schnellen Wert ohne Glättung: 76 76 //Umrechung auf Eingangsspannung am Gerät mit Teiler 77 sys_data.s.values.fast_voltage = (newvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536 0.0;77 sys_data.s.values.fast_voltage = (newvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536; 78 78 79 79 -
trunk/firmware/Src/eeprom.c
r6 r26 48 48 int32_t detectedCapacity; 49 49 int32_t detectedEnergy; 50 //int32_t mAh_AutoMode;51 //int32_t mWh_AutoMode;52 50 int64_t mAs_AutoMode; // 160-163 Helps to restore current SoC after Reset or Shutdown 53 51 int64_t mWs_AutoMode; // 164-167 Helps to restore current SoC after Reset or Shutdown … … 298 296 /* tBatFull */ 2, // t-batt full 2 Sekunden 299 297 /* uBatFull */ 14000, // 14Volt Ubatt full 300 /* uBatEmpty */ 1 1312, // 11,312V Ubatt Empty298 /* uBatEmpty */ 12500, // 11,312V Ubatt Empty 301 299 /* socCalcMode */ 1, // SoC calculation mode: 0(default) 302 300 /* cellRatedDischargeTime */ 2, // cell rated current discharge time [C/x]. For example, if 40Ah cell is rated as 0.5c, then rated discharge time is 2 303 301 304 /* lvpStart */ 1 1200, // uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV305 /* lvpStop */ 12 000, // uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird306 /* ovpStart */ 60000, // uint16_t ovpStart; Spannung ab der die OVER Voltage Protection aktiv wird in mV307 /* ovpStop */ 56000, // uint16_t ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird302 /* lvpStart */ 12000, // uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV 303 /* lvpStop */ 12500, // uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird 304 /* ovpStart */ 15000, // uint16_t ovpStart; Spannung ab der die OVER Voltage Protection aktiv wird in mV 305 /* ovpStop */ 14000, // uint16_t ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird 308 306 309 307 #if (DEVICETYPE == 500) -
trunk/firmware/Src/fast_current.c
r6 r26 20 20 21 21 22 // Formel zur Berechnen der Eingangsspannung 23 // Da ein Spannungteiler mit Offset genutzt wird muss die gemessene Spannung korrigiert werden 24 // R14 bis R19 sind die Wiederstände auf der Platine die Formel findet sich unter folgendem Link: 25 // https://www.mikrocontroller.net/articles/Spannungsteiler#Spannungsteiler_mit_Offset.2C_passiv 26 // Widerstände auf der Platine sind um den Faktor 1000 größer 22 27 23 #define I_SENSE_GAIN 40.0 28 24 … … 80 76 double diff; 81 77 diff = (int32_t) newvalP - (int32_t) newvalM; 82 diff = (diff * sys_data.s.values.realVdd) / 6553 50.0;78 diff = (diff * sys_data.s.values.realVdd) / 65536; 83 79 84 80 //Umrechung auf Strom 85 sys_data.s.values.fast_current = (diff / I_SENSE_GAIN) / SHUNT_RESISTOR; 86 81 double temp_current; 82 temp_current = (diff / I_SENSE_GAIN) / SHUNT_RESISTOR; 83 sys_data.s.values.fast_current = temp_current * (sys_data.s.parameter.batteryCurrentGainCorrectionFaktor / 1000000.0); 87 84 88 85 } -
trunk/firmware/Src/main.c
r6 r26 31 31 /* USER CODE BEGIN Includes */ 32 32 #include <stdio.h> 33 #include <stdlib.h> 34 #include <math.h> 33 35 34 #include "sysdata.h" 36 35 #include "chip_temperature.h" … … 74 73 modbus_t modbusData; 75 74 76 static volatile uint32_t adcData[ 8];75 static volatile uint32_t adcData[9]; 77 76 static RTC_TimeTypeDef Time; 78 77 static uint32_t conversionCounter; … … 126 125 } 127 126 127 //Wenn Speichernutzung größer 50% (debug) nötig?? 128 //https://community.st.com/t5/stm32-mcus-products/hard-fault-with-stm32g0b1-and-lvgl/td-p/777366 129 __HAL_FLASH_PREFETCH_BUFFER_DISABLE(); 130 128 131 /* USER CODE END 1 */ 129 132 … … 194 197 195 198 // STM32G0 Chiptemperatur Kalibrierung 196 //CHIP_TEMPERATURE_Calibration(/*&sys_data*/);199 CHIP_TEMPERATURE_Calibration(/*&sys_data*/); 197 200 198 201 // ADC auf STM32G0 starten 199 202 HAL_ADCEx_Calibration_Start(&hadc1); 200 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcData, 8);203 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcData, 9); 201 204 202 205 // Power up Sequenz fr INA240 Strommessverstrker … … 315 318 316 319 // Ausgabe der Temperatur des STM32G0 317 //CHIP_TEMPERATURE_Exec( adcData[7]);320 CHIP_TEMPERATURE_Exec( adcData[8]); 318 321 319 322 SHUNT_TEMPERATURE_Exec(adcData[7]); -
trunk/firmware/Src/ref_voltage.c
r6 r26 39 39 uint32_t avgval; 40 40 // Filterlängen in 2er-Potenzen --> Compiler optimiert 41 avgsum -= avgsum /REF_FILTER;41 avgsum -= avgsum / REF_FILTER; 42 42 avgsum += newval; 43 43 avgval = avgsum / REF_FILTER; … … 45 45 // Messung Externe Spannung basierend auf 3,3V Versorgungsspannung 46 46 // Nur für Debug Zwecke 47 sys_data.s.values.voltageVref = (avgval * 330 * 100) / 65535;47 sys_data.s.values.voltageVref = (avgval * 3300) / 65536; 48 48 49 49 // Ermittlung Vdd als Referenz 50 sys_data.s.values.realVdd = 3000 0L * 65535/ avgval;;50 sys_data.s.values.realVdd = 3000L * 65536 / avgval;; 51 51 } 52 52 /*************************** End of file ****************************/ -
trunk/firmware/Src/self_discharge.c
r6 r26 1 1 #include <stdio.h> 2 2 #include "sysdata.h" 3 3 #include "self_discharge.h" 4 4 5 #define HOLD_TIME ( 3 * 3600 ) //3 stunde5 #define HOLD_TIME (10800 ) //10800 = 3 stunde 6 6 #define SD_FILTER 64 7 7 … … 10 10 11 11 const double batt_float_voltage_tol = 0.03; 12 const doublebatt_voltage_holding_tol = 10;12 const int32_t batt_voltage_holding_tol = 10; 13 13 int32_t max_u = sys_data.s.parameter.uBatFull * ( 1 + batt_float_voltage_tol); 14 14 int32_t min_u = sys_data.s.parameter.uBatFull * ( 1 - batt_float_voltage_tol); … … 48 48 u_hold = 0; 49 49 holding_counter = 0; 50 //printf("self_discharge: fail voltage too high!\n"); 50 51 return -2; 51 52 } … … 56 57 u_hold = 0; 57 58 holding_counter = 0; 59 //printf("self_discharge: fail voltage too low!\n"); 58 60 return -2; 61 } 62 63 64 if (sys_data.s.values.batteryCurrent < sys_data.s.parameter.extraDischargeStrom_mA) 65 { 66 //Abbruch Ladegerät wurde entfernt, wir müssen mindesten den Lipro Strom messen 67 u_hold = 0; 68 holding_counter = 0; 69 //printf("self_discharge: fail current too small!\n"); 70 return -3; 59 71 } 60 72 … … 62 74 if (holding_counter > HOLD_TIME) 63 75 { 64 sys_data.s.values.selfDischarge = sys_data.s.values.batteryCurrent ;76 sys_data.s.values.selfDischarge = sys_data.s.values.batteryCurrent - sys_data.s.parameter.extraDischargeStrom_mA; 65 77 } 66 78 67 79 80 //Wenn ein gültiger Wert gemessen wurde, dann zu Mittelwert hinzufügen 81 if (sys_data.s.values.selfDischarge > 0) 82 { 68 83 69 // --- Mittelwert ---70 static uint32_t last_days;71 static unsigned long avgsum = 0;84 // --- Mittelwert --- 85 static uint32_t last_days; 86 static unsigned long avgsum = 0; 72 87 73 // Converting seconds into days74 uint32_t days = sys_data.s.values.onTime / (24U * 3600U);88 // Converting seconds into days 89 uint32_t days = sys_data.s.values.onTime / (24U * 3600U); 75 90 76 // Alle 24 Stunden ein Wert zur Mittelwertberechnung hinzufügen77 if (days != last_days)78 {79 last_days = days;91 // Alle 24 Stunden ein Wert zur Mittelwertberechnung hinzufügen 92 if (days != last_days) 93 { 94 last_days = days; 80 95 81 uint32_t avgval;82 // Filterlängen in 2er-Potenzen --> Compiler optimiert83 avgsum -= avgsum/SD_FILTER;84 avgsum += sys_data.s.values.selfDischarge;85 avgval = avgsum / SD_FILTER;96 uint32_t avgval; 97 // Filterlängen in 2er-Potenzen --> Compiler optimiert 98 avgsum -= avgsum/SD_FILTER; 99 avgsum += sys_data.s.values.selfDischarge; 100 avgval = avgsum / SD_FILTER; 86 101 87 sys_data.s.values.selfDischargeAvg = avgval; 102 sys_data.s.values.selfDischargeAvg = avgval; 103 } 104 88 105 } 89 90 91 106 92 107 -
trunk/firmware/Src/shunt_voltage.c
r6 r26 51 51 //avgval = avgsum / SHUNT_FILTER; 52 52 53 sys_data.s.values.shuntVoltage = (newval * (uint64_t)sys_data.s.values.realVdd * SHUNT_VOLTAGE_DIVIDER ) / 65536 0.0;53 sys_data.s.values.shuntVoltage = (newval * (uint64_t)sys_data.s.values.realVdd * SHUNT_VOLTAGE_DIVIDER ) / 65536; 54 54 55 55 } -
trunk/firmware/Src/stm32g0xx_it.c
r6 r26 90 90 { 91 91 /* USER CODE BEGIN HardFault_IRQn 0 */ 92 static volatile uint32_t cont=0; 92 93 93 94 /* USER CODE END HardFault_IRQn 0 */ 94 while ( 1)95 while (cont == 0) 95 96 { 96 97 /* USER CODE BEGIN W1_HardFault_IRQn 0 */ -
trunk/firmware/Src/sysdata.c
r6 r26 35 35 sys_data.s.values.selfDischargeAvg = -1; 36 36 37 //sys_data.s.values.mWh_AutoMode = -sys_data.s.parameter.battEnergy; 38 //sys_data.s.values.mAh_AutoMode = -sys_data.s.parameter.cellCapacity; 37 39 38 40 39 sys_data.s.parameter.fw_revision_major = 2;
Note: See TracChangeset
for help on using the changeset viewer.
