Ignore:
Timestamp:
Sep 8, 2025, 6:57:30 PM (7 weeks ago)
Author:
f.jahn
Message:
  • Bug in ADC Kalibrierung (STM32 ADC Strom) behoben
  • DMA Buffer für ADC 1 und ADC wird vor Überschreibung während bearbeitung geschützt, indem Datenübertragung nur einmalig erfolgt und erst nach Auswertung wieder gestartet wird
  • RS485Modbus: Timeout Zeit wird für Baudraten >19200 korrekt berechnet
  • Hardware ID geändert
  • Separates Register für "Batterie Empty detection mode" auf Adresse 92 angelegt
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/firmware/Src/self_discharge.c

    r6 r26  
    1 
     1#include <stdio.h>
    22#include "sysdata.h"
    33#include "self_discharge.h"
    44
    5 #define HOLD_TIME   ( 3 * 3600 ) // 3 stunde
     5#define HOLD_TIME (10800 ) //10800 = 3 stunde
    66#define SD_FILTER 64
    77
     
    1010
    1111  const double batt_float_voltage_tol = 0.03;
    12   const double batt_voltage_holding_tol = 10;
     12  const int32_t batt_voltage_holding_tol = 10;
    1313  int32_t max_u = sys_data.s.parameter.uBatFull * ( 1 + batt_float_voltage_tol);
    1414  int32_t min_u = sys_data.s.parameter.uBatFull * ( 1 - batt_float_voltage_tol);
     
    4848    u_hold = 0;
    4949    holding_counter = 0;
     50        //printf("self_discharge: fail voltage too  high!\n");
    5051    return -2;
    5152  }
     
    5657    u_hold = 0;
    5758    holding_counter = 0;
     59        //printf("self_discharge: fail voltage too  low!\n");
    5860    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;
    5971  }
    6072
     
    6274  if (holding_counter > HOLD_TIME)
    6375  {
    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;
    6577  }
    6678
    6779
     80  //Wenn ein gültiger Wert gemessen wurde, dann zu Mittelwert hinzufügen
     81  if (sys_data.s.values.selfDischarge > 0)
     82  {
    6883
    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;
    7287
    73   // Converting seconds into days
    74   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);
    7590
    76   // Alle 24 Stunden ein Wert zur Mittelwertberechnung hinzufügen
    77   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;
    8095   
    81     uint32_t avgval;
    82     // Filterlängen in 2er-Potenzen --> Compiler optimiert
    83     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;
    86101
    87     sys_data.s.values.selfDischargeAvg = avgval;
     102      sys_data.s.values.selfDischargeAvg = avgval;
     103    }
     104
    88105  }
    89 
    90 
    91106
    92107 
Note: See TracChangeset for help on using the changeset viewer.