Ignore:
Timestamp:
Aug 4, 2026, 1:53:58 PM (29 hours ago)
Author:
f.jahn
Message:

Delta Sigma ADC auf 10Channel geändert.

Location:
trunk/fw_g473rct/SES/src
Files:
8 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/fw_g473rct/SES/src/ads1260.c

    r38 r73  
    5151#include "iwdg.h"
    5252//      --- EXTERNE VARIABLEN --------------------------------------------------------
    53 
     53extern CRC_HandleTypeDef hcrc;
    5454//      --- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
    5555
     
    116116#define CHOP_MODE_RESET_MASK                     ~(0b11 << 5)/*Default*/
    117117
    118 #define CONVERSION_MODE_REGISTER                                  (CHOP_MODE_REGISTER)
     118#define CONVERSION_MODE_REGISTER                                  (CHOP_MODE_REGISTER)
    119119#define CONVERSION_MODE_CONTINIOUS                (0 << 4)/*Default*/
    120120#define CONVERSION_MODE_PULSE                     (1 << 4)
    121121#define CONVERSION_MODE_RESET_MASK               ~(1 << 4)
    122122
    123 #define CONVERSION_START_DELAY_REGISTER                           (CHOP_MODE_REGISTER)
     123#define CONVERSION_START_DELAY_REGISTER           (CHOP_MODE_REGISTER)
    124124#define CONVERSION_START_DELAY_0u                 (0b0000 << 0)
    125125#define CONVERSION_START_DELAY_50u                (0b0001 << 0)/*Default*/
     
    173173#define POS_INPUT_MUX_SELECT_AIN3                 (0b0100 << 4)
    174174#define POS_INPUT_MUX_SELECT_AIN4                 (0b0101 << 4)
     175#define POS_INPUT_MUX_SELECT_AIN5                 (0b0110 << 4)
     176#define POS_INPUT_MUX_SELECT_AIN6                 (0b0111 << 4)
     177#define POS_INPUT_MUX_SELECT_AIN7                 (0b1000 << 4)
     178#define POS_INPUT_MUX_SELECT_AIN8                 (0b1001 << 4)
     179#define POS_INPUT_MUX_SELECT_AIN9                 (0b1010 << 4)
    175180#define POS_INPUT_MUX_SELECT_INT_TEMP_SENSOR_POS  (0b1011 << 4)
    176181#define POS_INPUT_MUX_SELECT_INT_AVDD_DIV4_POS    (0b1100 << 4)
     
    185190#define NEG_INPUT_MUX_SELECT_AIN3                 (0b0100 << 0)
    186191#define NEG_INPUT_MUX_SELECT_AIN4                 (0b0101 << 0)
     192#define NEG_INPUT_MUX_SELECT_AIN5                 (0b0110 << 0)
     193#define NEG_INPUT_MUX_SELECT_AIN6                 (0b0111 << 0)
     194#define NEG_INPUT_MUX_SELECT_AIN7                 (0b1000 << 0)
     195#define NEG_INPUT_MUX_SELECT_AIN8                 (0b1001 << 0)
     196#define NEG_INPUT_MUX_SELECT_AIN9                 (0b1010 << 0)
    187197#define NEG_INPUT_MUX_SELECT_INT_TEMP_SENSOR_NEG  (0b1011 << 0)
    188198#define NEG_INPUT_MUX_SELECT_INT_AVDD_DIV4_NEG    (0b1100 << 0)
     
    201211int32_t avgValWithOffsetCommonModeOffsetTemperatureCorrection;
    202212double current;
     213double batteryvoltage;
     214double shuntVoltage;
    203215double currentWithGainCorrection;
    204216double currentWithGainAndGainShuntTempCorrection;
     
    230242static void ADS_1260_SetInternalReference(SPI_HandleTypeDef * hspi);
    231243static void ADS_1260_SetExternalReference(SPI_HandleTypeDef * hspi);
    232 static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect);
     244static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect, uint8_t crcmode);
    233245static void ADS_1260_SetChopMode(SPI_HandleTypeDef * hspi, uint8_t chopMode);
    234246static void ADS_1260_ActivateStatusData(void);
     
    237249static uint32_t ADS1260_ProcessCurrent(int32_t current);
    238250volatile uint32_t newCurrentValue=0;
     251volatile uint32_t channelInProgress; // 0 = current, 1 = voltage battery
    239252//static uint32_t ADS1260_ProcessVoltage(int32_t voltage, sys_data_t * data);
    240253//static uint32_t ADS1260_ProcessTemperature(int32_t temperature, sys_data_t * data);
     
    383396* @retval       kein
    384397*/
    385 static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect)
    386 {
    387   // Write
    388   uint8_t spiData[3] = {(REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER), muxSelect, 0};
    389   //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
    390   HAL_SPI_TransmitReceive(hspi, spiData, spiData, 2, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
    391   //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
    392   // Read
    393   spiData[COMMAND_POS] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER);
    394   //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
    395   HAL_SPI_TransmitReceive(hspi, spiData, spiData, 3, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
    396   //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
    397   // Verifie
    398   if(spiData[RECEIVE_DATA_POS] != muxSelect)
    399   {
    400     printf("ERROR ADS_1260_InputMuxSelect\n");
    401 //    while(1);
    402   }
     398static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect,uint8_t crcmode)
     399{
     400  if (crcmode==0)
     401  {
     402    // Write
     403    uint8_t spiData[3] = {(REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER), muxSelect, 0};
     404    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
     405    HAL_SPI_TransmitReceive(hspi, spiData, spiData, 2, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
     406    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
     407    // Read
     408    spiData[COMMAND_POS] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER);
     409    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
     410    HAL_SPI_TransmitReceive(hspi, spiData, spiData, 3, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
     411    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
     412    // Verifie
     413    if(spiData[RECEIVE_DATA_POS] != muxSelect)
     414    {
     415      printf("ERROR ADS_1260_InputMuxSelect\n");
     416    }
     417  }
     418  else
     419
     420  {
     421
     422    // Write
     423    uint8_t spiDataIn[6];
     424        spiDataIn[0] = REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER;
     425        spiDataIn[1] = muxSelect;
     426        spiDataIn[2] = HAL_CRC_Calculate(&hcrc, (uint32_t*) spiDataIn, 2);
     427        spiDataIn[3] = 0;
     428
     429        uint8_t spiDataOut[6] = {0,0,0,0,0,0};
     430    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
     431    HAL_SPI_TransmitReceive(hspi, spiDataIn, spiDataOut, 4, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
     432    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
     433   
     434        // Read back mux register
     435    spiDataIn[0] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER);
     436        spiDataIn[1] = arbitraryByte;
     437        spiDataIn[2] = HAL_CRC_Calculate(&hcrc, (uint32_t*) spiDataIn, 2);
     438        spiDataIn[3] = 0;
     439        spiDataIn[4] = 0;
     440        spiDataIn[5] = 0;
     441
     442
     443
     444    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
     445    HAL_SPI_TransmitReceive(hspi, spiDataIn, spiDataOut, 6, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
     446    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
     447    // Verifie
     448    if(spiDataOut[4] != muxSelect)
     449    {
     450      printf("ERROR ADS_1260_InputMuxSelect\n");
     451        }
     452  }
     453
    403454}
    404455
     
    613664static uint32_t ADS1260_ProcessCurrent(int32_t newval)
    614665{
    615    static signed long avgsum = 0;
    616    static int meas_counter;
    617    if (meas_counter < INT32_MAX) meas_counter++;
    618    int32_t avgval;
     666   //static signed long avgsum = 0;
     667   //static int meas_counter;
     668   //if (meas_counter < INT32_MAX) meas_counter++;
     669   //int32_t avgval;
    619670
    620671   // Filterlängen in 2er-Potenzen --> Compiler optimiert
    621    avgsum -= avgsum/ BATTERY_CURRENT_FILTER;
    622    avgsum += newval;
    623    avgval = avgsum / BATTERY_CURRENT_FILTER;
    624    sys_data.s.values.battryCurrentRaw = avgval;
     672   //avgsum -= avgsum/ BATTERY_CURRENT_FILTER;
     673   //avgsum += newval;
     674   //avgval = avgsum / BATTERY_CURRENT_FILTER;
     675  sys_data.s.values.battryCurrentRaw = newval;
    625676  /**********************Offset Kompensation:*******************************/
    626677  // Offset abziehen
    627   avgValWithOffsetCompensation = avgval - sys_data.s.parameter.batteryCurrentOffset;
     678  avgValWithOffsetCompensation = newval - sys_data.s.parameter.batteryCurrentOffset;
    628679  // Temperaturabhängiges Offset abziehen
    629680  // in ADC Messwerten mal Abweichung von Referenttemperatur
     
    739790
    740791
    741   if (meas_counter > (BATTERY_CURRENT_FILTER *10)) // Nur aktualiseren, wenn es schon ausreichend Messwerte gab
    742   {
     792//  if (meas_counter > (BATTERY_CURRENT_FILTER *10)) // Nur aktualiseren, wenn es schon ausreichend Messwerte gab
     793//  {
    743794    // höchster und niedrigster Stromwert werden gespeichert
    744795    if(sys_data.s.values.batteryCurrent > sys_data.s.values.batteryCurrentMax)
     
    750801      sys_data.s.values.batteryCurrentMin = sys_data.s.values.batteryCurrent;
    751802    }
    752   }
     803//  }
    753804 
    754805  newCurrentValue=1;
     
    757808}
    758809
     810static uint32_t ADS1260_ProcessBatteryVoltage(int32_t newval)
     811{
     812   static signed long avgsum = 0;
     813   static int meas_counter;
     814   if (meas_counter < INT32_MAX) meas_counter++;
     815   //int32_t avgval;
     816
     817   // Filterlängen in 2er-Potenzen --> Compiler optimiert
     818   //avgsum -= avgsum/ BATTERY_CURRENT_FILTER;
     819   //avgsum += newval;
     820   //avgval = avgsum / BATTERY_CURRENT_FILTER;
     821
     822  /**********************Offset Kompensation:*******************************/
     823  // Offset abziehen
     824
     825
     826  batteryvoltage = ((newval * (double) 1.5 * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / (double)0x800000);
     827  sys_data.s.values.batteryVoltage = (batteryvoltage * 1000) -  sys_data.s.parameter.batteryVoltageOffset;
     828
     829  //printf("battery voltage = %.4d V\n", (int32_t) (batteryvoltage*1000));
     830
     831
     832
     833
     834
     835
     836
     837
     838  return 0;
     839}
     840
     841static uint32_t ADS1260_ProcessShuntVoltage(int32_t newval)
     842{
     843
     844  shuntVoltage = ((newval * (double) 1.5 * SHUNT_VOLTAGE_VOLTAGE_DIVIDER ) / (double)0x800000);
     845  sys_data.s.values.shuntVoltage = (shuntVoltage * 1000) -  sys_data.s.parameter.shuntVoltageOffset;
     846
     847  return 0;
     848}
    759849
    760850//      --- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
     
    788878  /* 6*/ ADS_1260_SetDataRate(&hspi3, DATA_RATE_20);
    789879  //  /* 7*/ ADS_1260_SetDigitalFilter(&hspi1, FILTER_SINC4);
    790   /* 8*/ ADS_1260_SetConversionMode(&hspi3, CONVERSION_MODE_CONTINIOUS);
     880  /* 8*/ ADS_1260_SetConversionMode(&hspi3, CONVERSION_MODE_PULSE);
    791881         // langsamer
    792882         ADS_1260_SetChopMode(&hspi3, CHOP_MODE_CHOP_MODE);
    793          ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3);
     883         ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3,0);
    794884
    795885         ADS_1260_ActivateStatusData();
    796886                 HAL_IWDG_Refresh(&hiwdg);
    797          ADS_1260_ActivateLock();
    798                  HAL_IWDG_Refresh(&hiwdg);
     887       //  ADS_1260_ActivateLock();
     888        //       HAL_IWDG_Refresh(&hiwdg);
    799889
    800890  /*10*/ //ADS_1260_SelfOffsetCalibration(&hspi1);
     
    804894         ADS1260_StartConversion();
    805895                 HAL_IWDG_Refresh(&hiwdg);
     896                 channelInProgress=0;
    806897}
    807898
     
    810901{
    811902  HAL_GPIO_WritePin(ADC_START_CONV_GPIO_Port, ADC_START_CONV_Pin, GPIO_PIN_SET);
     903
     904        //Vorbereitung aufg nächsten Start
     905 
    812906}
    813907
    814908void ADS1260_ReadConversion(void)
    815909{
    816     extern CRC_HandleTypeDef hcrc;
     910   
    817911    convert_union_t convert;
     912         HAL_GPIO_WritePin(ADC_START_CONV_GPIO_Port, ADC_START_CONV_Pin, GPIO_PIN_RESET);
     913
    818914
    819915    //                                                    CRC2
     
    831927        uint8_t STATUS_reg = spiDataOut[4];
    832928
    833         if ((STATUS_reg & (1 << STATUS_LOCK)) && (STATUS_reg & (1 << STATUS_DRDY)) && !(STATUS_reg & (1 << STATUS_CRCERR)) && !(STATUS_reg & (1 << STATUS_REFL_ALM)))
     929        if ( (STATUS_reg & (1 << STATUS_DRDY)) && !(STATUS_reg & (1 << STATUS_CRCERR)) && !(STATUS_reg & (1 << STATUS_REFL_ALM)))
    834930        {
    835931            // Rohwerte Byteswitch
     
    864960    }
    865961
    866     ADS1260_ProcessCurrent(value);
     962        if (channelInProgress==0)
     963        {
     964          ADS1260_ProcessCurrent(value);
     965          ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN4 + NEG_INPUT_MUX_SELECT_AIN5,1);
     966          channelInProgress=1;
     967        }
     968        else if (channelInProgress==1)
     969        {
     970          ADS1260_ProcessBatteryVoltage(value);
     971          ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN6 + NEG_INPUT_MUX_SELECT_AIN7,1);
     972          channelInProgress=2;
     973        }
     974        else if (channelInProgress==2)
     975        {
     976          ADS1260_ProcessShuntVoltage(value);
     977          ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3,1);
     978          channelInProgress=0;
     979        }
     980
     981        ADS1260_StartConversion();
    867982}
    868983
     
    10411156}
    10421157
     1158void ADS1260_BatteryVoltageZeroCal(void)
     1159{
     1160  sys_data.s.parameter.batteryVoltageOffset = sys_data.s.values.batteryVoltage + sys_data.s.parameter.batteryVoltageOffset ;
     1161}
     1162
     1163void ADS1260_ShuntVoltageZeroCal(void)
     1164{
     1165  sys_data.s.parameter.shuntVoltageOffset = sys_data.s.values.shuntVoltage + sys_data.s.parameter.shuntVoltageOffset ;
     1166}
     1167
     1168
    10431169//-----------------------------------------------------------------------------
  • trunk/fw_g473rct/SES/src/battery_voltage_fast.c

    r72 r73  
    1010
    1111//      --- INCLUDES -----------------------------------------------------------------
    12 #include "battery_voltage.h"
     12#include "battery_voltage_fast.h"
    1313#include "main.h"
    1414#include "sysdata.h"
    1515#include "stdlib.h"
    1616#include "stdio.h"
    17 
     17#include "tim.h"
    1818//      --- EXTERNE VARIABLEN --------------------------------------------------------
    1919
    2020//      --- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
    2121
    22 #define BATTERY_VOLTAGE_FILTER  32
    2322
    2423
     
    2726//      --- DEFINITIONEN GLOBALER VARIABLEN - Bitte in Header dokumentieren ----------
    2827extern ADC_HandleTypeDef hadc2;
     28extern __IO int32_t adc2Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
    2929//      --- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
    30  int32_t BATTERY_VOLTAGE_adc_offset =0;
    31  int32_t last_adc_value = 0 ;
     30
     31
     32
    3233//      --- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
    33 void ADC2_SetOffset(uint32_t channel, int16_t offset);
     34
    3435//      --- LOKALE FUNKTIONEN - bitte hier dokumentieren -----------------------------
    3536
     
    3738
    3839
    39 void BATTERY_VOLTAGE_Exec(int32_t newVal)
     40void BATTERY_VOLTAGE_FAST_Exec(int32_t newVal)
    4041{
    41   static int measCounter;
    42   static unsigned long avgSum = 0;
    43   int32_t avgVal;
    44   last_adc_value = newVal;
    45   if (measCounter < INT32_MAX) measCounter++;
     42  //Umrechung auf Eingangsspannung am Gerät mit Teiler
     43  sys_data.s.values.batteryVoltageFast = ((newVal - BATTERY_VOLTAGE_FAST_ADC_OFFSET) * (int64_t)VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_FAST_ADC_RESOLUTION) - sys_data.s.parameter.batteryVoltageFastOffset;
     44
     45 }
    4646
    4747
    48   // Filterlängen in 2er-Potenzen --> Compiler optimiert
    49   //avgSum -= avgSum / BATTERY_VOLTAGE_FILTER;
    50   //avgSum += newVal;
    51   //avgVal =  avgSum / BATTERY_VOLTAGE_FILTER;
    52 
    53  
    54 
    55 
    56   //Umrechung auf Eingangsspannung am Gerät mit Teiler
    57   sys_data.s.values.batteryVoltage = ((newVal-BATTERY_VOLTAGE_ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / BATTERY_VOLTAGE_ADC_RESOLUTION;
    58 
    59  
    60 
    61 
    62   //Max und Minwert
    63   if (measCounter > BATTERY_VOLTAGE_FILTER * 10)
    64   {
    65     if (sys_data.s.values.batteryVoltage > sys_data.s.values.batteryVoltageMax)
    66     {
    67       sys_data.s.values.batteryVoltageMax = sys_data.s.values.batteryVoltage;
    68     }
    69     if (sys_data.s.values.batteryVoltage < sys_data.s.values.batteryVoltageMin)
    70     {
    71       sys_data.s.values.batteryVoltageMin = sys_data.s.values.batteryVoltage;
    72     }
    73   }
    74 
    75 
    76 
    77   //Berechnung schnelle Wert ohne Glättung:
    78   //Umrechung auf Eingangsspannung am Gerät mit Teiler
    79   //sys_data.s.values.fast_voltage = ((newVal-BATTERY_VOLTAGE_ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / BATTERY_VOLTAGE_ADC_RESOLUTION;
    80 
    81 
    82 
     48void BATTERY_VOLTAGE_FAST_ZeroCal(void)
     49{
     50  sys_data.s.parameter.batteryVoltageFastOffset = sys_data.s.values.batteryVoltageFast + sys_data.s.parameter.batteryVoltageFastOffset ;
    8351}
    84 
    85     ADC_ChannelConfTypeDef sConfig = {0};
    86 
    87 void BATTERY_VOLTAGE_ZeroCal(void)
    88 {
    89   BATTERY_VOLTAGE_adc_offset = last_adc_value - BATTERY_VOLTAGE_ADC_OFFSET;
    90  
    9152
    9253
    9354
    9455
    95     // 1. ADC2 stoppen und sicherstellen, dass er deaktiviert ist
    96     HAL_ADC_Stop(&hadc2);
    97 
    98   uint16_t offset_value = abs(BATTERY_VOLTAGE_adc_offset);
    99 
    100   if (BATTERY_VOLTAGE_adc_offset < 0 )
    101   {
    102    ADC2->OFR1 = (ADC_OFR1_OFFSET1_EN |
    103                  (3 << ADC_OFR1_OFFSET1_CH_Pos) |
    104                                  (1 << ADC_OFR1_OFFSETPOS_Pos) |
    105                  (offset_value  ));
    106   }
    107   else
    108   {
    109    ADC2->OFR1 = (ADC_OFR1_OFFSET1_EN |
    110                  (3 << ADC_OFR1_OFFSET1_CH_Pos) |
    111                                  (0 << ADC_OFR1_OFFSETPOS_Pos) |
    112                  (offset_value  ));
    113   }
    114 
    115   // 5. ADC2 wieder für die Wandlung starten
    116   HAL_ADC_Start(&hadc2);
    117 }
    118 
    119 
    120 
    12156/*************************** End of file ****************************/
  • trunk/fw_g473rct/SES/src/chip_temperature.c

    r24 r73  
    7272}
    7373
    74 void CHIP_TEMPERATURE_Exec(uint32_t chiptemperature)
     74void CHIP_TEMPERATURE_Exec(int32_t chiptemperature)
    7575{
    7676    double voltage;
  • trunk/fw_g473rct/SES/src/eeprom.c

    r38 r73  
    6161  uint32_t        currentGain;
    6262
     63
    6364  int32_t         currentOffsetFast;
    6465  uint32_t        currentGainFast;
     66
     67  int32_t         batteryVoltageOffset;
     68  int32_t         batteryVoltageFastOffset;
     69  int32_t         shuntVoltageOffset;
     70  int32_t         shuntVoltageFastOffset;
    6571
    6672  int64_t         mAsCounter;
     
    209215        /* currentGainFast  */                                                                                                  1000000,                //uint32_t  currentGain;
    210216
     217        /* batteryVoltageOffset */                                                                                              0,
     218        /* batteryVoltageFastOffset */                                                                                  0,
     219        /* shuntVoltageOffset   */                                                                                              0,
     220        /* shuntVoltageFastOffset       */                                                                                      0,
     221
    211222        /* mAsCounter           */                                                                                                      0,                              // mAsCounter
    212223        /* detectedCapacity     */                                                                                                      -1,                             // detectedCapacity
     
    223234        /* iBatFull                                     */                                                                                      10,                             // I-batt full 10%, 10A bei 100Ah akku
    224235        /* tBatFull                                     */                                                                                      2,                              // t-batt full 2 Sekunden
    225 #if defined SYSTEM_VOLTAGE_12V
     236#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
    226237        /* uBatFull                                     */                                                                                      14000,                          // 14V olt Ubatt full, Neu: Bei 0: Erkung von Lipro LVP als 0%
    227238        /* uBatEmpty                            */                                                                                      12400,                          // 11,312V Ubatt Empty
    228 #elif defined SYSTEM_VOLTAGE_24V
     239#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
    229240        /* uBatFull                                     */                                                                                      28000,                          // 14V olt Ubatt full, Neu: Bei 0: Erkung von Lipro LVP als 0%
    230241        /* uBatEmpty                            */                                                                                      24800,                          // 11,312V Ubatt Empty
    231 #elif defined SYSTEM_VOLTAGE_48V
     242#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
    232243        /* uBatFull                                     */                                                                                      56000,                          // 14V olt Ubatt full, Neu: Bei 0: Erkung von Lipro LVP als 0%
    233244        /* uBatEmpty                            */                                                                                      49600,                          // 11,312V Ubatt Empty
     
    239250        /* socCalcMode                          */                                                                                      1,                              // SoC calculation mode: 0(default)
    240251        /* 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
    241 #if defined SYSTEM_VOLTAGE_12V
     252#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
    242253        /* lvpStart     */                                                                                                                      12000,                  // uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
    243254        /* lvpStop      */                                                                                                                      12500,                  // uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
    244255        /* ovpStart     */                                                                                                                      14800,                  // uint16_t  ovpStart; Spannung ab der die OVER Voltage Protection aktiv wird in mV
    245256        /* ovpStop      */                                                                                                                      14000,                  // uint16_t  ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird
    246 #elif defined SYSTEM_VOLTAGE_24V
     257#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
    247258        /* lvpStart     */                                                                                                                      24000,                  // uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
    248259        /* lvpStop      */                                                                                                                      25000,                  // uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
     
    250261        /* ovpStop      */                                                                                                                      28000,                  // uint16_t  ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird
    251262
    252 #elif defined SYSTEM_VOLTAGE_48V
     263#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
    253264        /* lvpStart     */                                                                                                                      48000,                  // uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
    254265        /* lvpStop      */                                                                                                                      50000,                  // uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
     
    284295        /* uBatEmptyCompStartTemp       */                                                                                      50,                             // 5°C We start calculating uBatEmpty compensations only when cell temperature is lower than this value
    285296        /* uBatEmptyCompStopTemp        */                                                                                      -200,                   // -20°C We stop calculating uBatEmpty compensations when cell temperature is lower than this value
    286 #if defined SYSTEM_VOLTAGE_12V
     297#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
    287298        /* uBatEmptyCompStopVolt        */                                                                                      10000,                  // 10V uBatEmpty voltage at temperatures lower than -20°C
    288 #elif defined SYSTEM_VOLTAGE_24V
     299#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
    289300/* uBatEmptyCompStopVolt        */                                                                                              20000,                  // 10V uBatEmpty voltage at temperatures lower than -20°C
    290 #elif defined SYSTEM_VOLTAGE_48V
     301#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
    291302/* uBatEmptyCompStopVolt        */                                                                                              40000,                  // 10V uBatEmpty voltage at temperatures lower than -20°C
    292303#else
     
    298309        /* Battery Empty Detection Mode*/                                                                               1,                              // Auto, from BMS
    299310        /* AUX MODE */                                                                                                                  AUX_MODE_HEATER,// Heizung
    300 #if defined SYSTEM_VOLTAGE_12V
     311#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
    301312        /* AUX SETPOINT ON */                                                                                                   13600,                  // Erkennung Ladegerät ab 13,6V
    302 #elif defined SYSTEM_VOLTAGE_24V
     313#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
    303314        /* AUX SETPOINT ON */                                                                                                   27200,                  // Erkennung Ladegerät ab 13,6V
    304 #elif defined SYSTEM_VOLTAGE_48V
     315#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
    305316        /* AUX SETPOINT ON */                                                                                                   54400,                  // Erkennung Ladegerät ab 13,6V
    306317#else
    307 #error No valid device type
     318  #error "No valid default voltage for factory parameter"
    308319#endif
    309320        /* AUX SETPOINT OFF */                                                                                                  100,                    // Batterie Entladung wird erkannt bei -100mA
     
    396407  eepromData.changedData.currentOffsetFast                                                                                      = data->s.parameter.batteryCurrentOffsetFast;
    397408  eepromData.changedData.currentGainFast                                                                                        = data->s.parameter.batteryCurrentGainCorrectionFaktorFast;
     409  eepromData.changedData.batteryVoltageOffset                                                                           = data->s.parameter.batteryVoltageOffset;
     410  eepromData.changedData.batteryVoltageFastOffset                                                                       = data->s.parameter.batteryVoltageFastOffset;
     411  eepromData.changedData.shuntVoltageOffset                                                                                     = data->s.parameter.shuntVoltageOffset;
     412  eepromData.changedData.shuntVoltageFastOffset                                                                         = data->s.parameter.shuntVoltageFastOffset;
     413 
    398414 
    399415  eepromData.changedData.batteryCurrentGainRefTempShunt                                                         = data->s.parameter.batteryCurrentGainRefTempShunt;
     
    510526  dataToStore->changedData.currentGainFast = data->s.parameter.batteryCurrentGainCorrectionFaktorFast;
    511527
     528  dataToStore->changedData.batteryVoltageOffset = data->s.parameter.batteryVoltageOffset;
     529  dataToStore->changedData.batteryVoltageFastOffset = data->s.parameter.batteryVoltageFastOffset;
     530  dataToStore->changedData.shuntVoltageOffset = data->s.parameter.shuntVoltageOffset;
     531  dataToStore->changedData.shuntVoltageFastOffset = data->s.parameter.shuntVoltageFastOffset;
    512532
    513533  // AH COUNTER Einstellungen
     
    615635  data->s.parameter.batteryCurrentGainCorrectionFaktorFast                                              = dataToStore->changedData.currentGainFast;
    616636
     637  data->s.parameter.batteryVoltageOffset                                                                                = dataToStore->changedData.batteryVoltageOffset;       
     638  data->s.parameter.batteryVoltageFastOffset                                                                    = dataToStore->changedData.batteryVoltageFastOffset;
     639  data->s.parameter.shuntVoltageOffset                                                                                  = dataToStore->changedData.shuntVoltageOffset; 
     640  data->s.parameter.shuntVoltageFastOffset                                                                                      = dataToStore->changedData.shuntVoltageFastOffset;
    617641  //Einstellungenm für AH counter
    618642  data->s.parameter.cef                                                                                                                 = dataToStore ->changedData.cef;
  • trunk/fw_g473rct/SES/src/esr.c

    r71 r73  
    44#include "esr.h"
    55#include <stdlib.h>
     6#include <stdio.h>
    67#include "main.h"
    7 #include "battery_voltage.h"
     8#include "battery_voltage_fast.h"
    89#include "fast_current.h"
    9 #include "stdio.h"
    1010
     11#define I_MULTIPLIER  ((int64_t) VREF / FAST_CURRENT_SHUNT_RESISTOR /  FAST_CURRENT_I_SENSE_GAIN /  FAST_CURRENT_ADC_RESOLUTION)
     12#define U_MULTIPLIER  ((int64_t) VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_FAST_ADC_RESOLUTION )
    1113
    1214int32_t current_buffer[SAMPLE_ARRAY_SIZE]; 
     
    1416
    1517
    16 extern uint32_t adc1Data[SAMPLE_ARRAY_SIZE];
    17 extern uint32_t adc2Data[SAMPLE_ARRAY_SIZE];
    18 extern uint32_t adc4Data[SAMPLE_ARRAY_SIZE];
     18extern int32_t adc1Data[SAMPLE_ARRAY_SIZE];
     19extern int32_t adc2Data[SAMPLE_ARRAY_SIZE];
     20extern int32_t adc4Data[SAMPLE_ARRAY_SIZE];
    1921
    20 
    21 //int16_t ESR_Exec(void)
    22 //{
    23  
    24 
    25 //  static int32_t last_refresh;
    26 //  int x;
    27 
    28 //  //Anzeige vor wieviel Sekunden zuletzt aktualisiert wurd.
    29 //  sys_data.s.values.esrCalcTime = sys_data.s.values.onTime - last_refresh;
    30 
    31 //  for (x=SAMPLE_ARRAY_SIZE-1; x>0; x--)
    32 //  {
    33 //    current_buffer[x] = current_buffer[x-1];
    34 //    voltage_buffer[x] = voltage_buffer[x-1];
    35 //  }
    36 
    37 //  // Neue Werte ins array aufnehmen
    38 //  current_buffer[0] = sys_data.s.values.batteryCurrent;
    39 //  voltage_buffer[0] = sys_data.s.values.batteryVoltage;
    40 
    41 
    42 //  //Suche Min und max werte im Array
    43 //  int32_t minU=INT32_MAX;
    44 //  int32_t maxU=0;
    45 //  int32_t minI=INT32_MAX;
    46 //  int32_t maxI=0;
    47 //  int32_t minIPos = -1;
    48 //  int32_t maxdIPos = -1;
    49 //  int32_t minUPos = -1;
    50 //  int32_t maxUPos = -1;
    51 
    52 //  //Suche min und max werte
    53 //  for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
    54 //  {
    55 //     if (abs(current_buffer[x]) < minI)  { minI = abs(current_buffer[x]); minIPos  = x; }
    56 //     if (abs(current_buffer[x]) >= maxI) { maxI = abs(current_buffer[x]); maxdIPos = x; }
    57 //     if (abs(voltage_buffer[x]) < minU)  { minU = abs(voltage_buffer[x]); minUPos = x; }
    58 //     if (abs(voltage_buffer[x]) > maxU)  { maxU = abs(voltage_buffer[x]); maxUPos = x; }
    59 //  }
    60 
    61  
    62 //  //Suche Zeitpunkt der größten Änderung in I
    63 
    64 //  //Delta berechnen
    65 //  int32_t dI = abs (maxI - minI);
    66 //  int32_t dU = abs (maxU - minU);
    67 
    68 //  //Minimale Belastung Prüfen ob es genügent Änderungen gab
    69 //  // 1/20 des Nennstroms
    70 //  // Bei 100Ah Batterie mit 0,5 Std discharge --> 50A --> /20 =2,5 A
    71 //  int32_t min_dI;
    72 //  min_dI = sys_data.s.parameter.cellCapacity /  sys_data.s.parameter.cellRatedDischargeTime; //Nennlaststrom  in mA
    73 //  min_dI = min_dI / 20 ;
    74 
    75 //  int32_t min_dU = 25;
    76  
    77 //  if( dI < min_dI)
    78 //  {
    79  
    80 //    return -1;
    81 //  }
    82 
    83 //  printf("1)dI change!\r\n");
    84 
    85 //  if (dU < min_dU) {
    86 //    return -2;
    87 //  }
    88 
    89 //  //printf("dU change!\r\n");
    90 
    91  
    92 //  int32_t dIMax=-1;
    93 //  int32_t dIx=-1;;
    94 //  int32_t dIMaxPos=-1;
    95  
    96 //  for (x=0; x < (SAMPLE_ARRAY_SIZE-1); x++)
    97 //  {
    98 //    dIx = abs(current_buffer[x+1] - current_buffer[x]);
    99 //    if (dIx > dIMax) { dIMax = dIx; dIMaxPos = x; }
    100 //  }
    101 
    102 
    103 
    104 //  if (dIMaxPos == SAMPLE_ARRAY_SIZE / 2)
    105 //  {
    106 //    //ESR berechnen!
    107 //    sys_data.s.values.esr = ( (double)dU / (double) dI) * 1000;
    108 //    last_refresh = sys_data.s.values.onTime;
    109 
    110 
    111 //    for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
    112 //    {
    113 //      sys_data.s.values.current_buffer[(SAMPLE_ARRAY_SIZE-1)-x] = adc1Data[x];
    114 //      sys_data.s.values.voltage_buffer[(SAMPLE_ARRAY_SIZE-1)-x] = adc2Data[x];
    115 //    }
    116 
    117 
    118    
    119 //  }
    120 //  return 0;
    121 //}
    12222
    12323
     
    12525{
    12626 
    127     printf("esr\r\n");
     27  //  printf("esr\r\n");
    12828  static int32_t last_refresh;
    12929  int x;
     
    13737  //Suche Min und max werte im Array
    13838  int32_t minUBatt=INT32_MAX;
    139   int32_t maxUBatt=0;
     39  int32_t maxUBatt=INT32_MIN;
    14040  int32_t minUOut=INT32_MAX;
    141   int32_t maxUOut=0;
     41  int32_t maxUOut=INT32_MIN;
    14242  int32_t minI=INT32_MAX;
    143   int32_t maxI=0;
     43  int32_t maxI=INT32_MIN;
    14444  int32_t minIPos = -1;
    145   int32_t maxdIPos = -1;
     45  int32_t maxIPos = -1;
    14646  int32_t minUBattPos = -1;
    14747  int32_t maxUBattPos = -1;
     
    14949  int32_t maxUOutPos = -1;
    15050
     51
     52  //Entferne Offset
     53  for (x=0; x < SAMPLE_ARRAY_SIZE -1; x++)
     54  {
     55        adc1Data[x] = adc1Data[x] - FAST_CURRENT_ADC_OFFSET;
     56        adc2Data[x] = adc2Data[x] - BATTERY_VOLTAGE_FAST_ADC_OFFSET;
     57        adc4Data[x] = adc4Data[x] - BATTERY_VOLTAGE_FAST_ADC_OFFSET;
     58  }
     59
     60
     61
    15162  //Suche min und max werte
    15263  for (x=0; x < SAMPLE_ARRAY_SIZE -1; x++)
    15364  {
    154      if (adc1Data[x] < minI)  { minI = adc1Data[x]; minIPos  = x; }
    155      if (adc1Data[x] >= maxI) { maxI = adc1Data[x]; maxdIPos = x; } 
    156      if (adc2Data[x] < minUBatt)  { minUBatt = adc2Data[x]; minUBattPos = x; }
    157      if (adc2Data[x] > maxUBatt)  { maxUBatt = adc2Data[x]; maxUBattPos = x; }
    158          if (adc4Data[x] < minUOut)  { minUOut = adc4Data[x]; minUOutPos = x; }
    159      if (adc4Data[x] > maxUOut)  { maxUOut = adc4Data[x]; maxUOutPos = x; }
     65     if (adc1Data[x] <= minI)  { minI = adc1Data[x]; minIPos  = x; }
     66     if (adc1Data[x] >= maxI) { maxI = adc1Data[x]; maxIPos = x; } 
     67     if (adc2Data[x] <= minUBatt)  { minUBatt = adc2Data[x]; minUBattPos = x; }
     68     if (adc2Data[x] >= maxUBatt)  { maxUBatt = adc2Data[x]; maxUBattPos = x; }
     69         if (adc4Data[x] <= minUOut)  { minUOut = adc4Data[x]; minUOutPos = x; }
     70     if (adc4Data[x] >= maxUOut)  { maxUOut = adc4Data[x]; maxUOutPos = x; }
    16071  }
    161 
    162  
    16372
    16473
    16574  //Delta berechnen
    166   int32_t dI = maxI - minI;
    167  
    168   //Nehme nicht mehr die gesamte maximale Differenz der Spannungen, sondern nehme das delt U wo auch das Delta I gemessen wurde
    169   //Funktioniert nur bei Synchroner Messug von Strom und Spannung
    170   //int32_t dU = maxU - minU;
    171   int32_t dUBatt = adc2Data[maxdIPos]  - adc2Data[minIPos];
    172   int32_t dUOut =  adc4Data[maxdIPos]  - adc4Data[minIPos];
     75  int32_t dI;
     76  int32_t dUBatt;
     77  int32_t dUOut;
     78
     79  if (maxIPos > minIPos)
     80  {
     81        dI = maxI - minI;
     82        //Nehme nicht mehr die gesamte maximale Differenz der Spannungen, sondern nehme das delt U wo auch das Delta I gemessen wurde
     83        //Funktioniert nur bei Synchroner Messug von Strom und Spannung
     84        //int32_t dU = maxU - minU;
     85        dUBatt= adc2Data[maxIPos]  - adc2Data[minIPos];
     86        dUOut=  adc4Data[maxIPos]  - adc4Data[minIPos];
     87  }
     88  else
     89  {
     90        dI = minI - maxI;
     91        dUBatt= adc2Data[minIPos]  - adc2Data[maxIPos];
     92        dUOut=  adc4Data[minIPos]  - adc4Data[maxIPos];
     93  }
     94
    17395
    17496  //Umrechnung in mV / mA
    175   dI = dI * ((double) VREF / FAST_CURRENT_SHUNT_RESISTOR /  FAST_CURRENT_I_SENSE_GAIN /  FAST_CURRENT_ADC_RESOLUTION);
    176   dI = dI * (sys_data.s.parameter.batteryCurrentGainCorrectionFaktor / 1000000.0);
    177 
    178   dUBatt = dUBatt  * (double )VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_ADC_RESOLUTION ;
    179   dUOut  = dUOut  * (double )VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_ADC_RESOLUTION ;
     97  dI = dI * I_MULTIPLIER;
     98  dUBatt = dUBatt  * U_MULTIPLIER;
     99  dUOut  = dUOut  * U_MULTIPLIER;
    180100
    181101  //Minimale Belastung Prüfen ob es genügent Änderungen gab
     
    184104  int32_t min_dI;
    185105  min_dI = sys_data.s.parameter.cellCapacity /  sys_data.s.parameter.cellRatedDischargeTime; //Nennlaststrom  in mA
    186   min_dI = min_dI / 100 ;
     106  min_dI = min_dI / 10 ;
    187107 
    188108
     
    195115  }
    196116
    197   printf("2)dI change!\r\n");
    198117
     118
     119 
     120 int absMax = abs(maxI);
     121 int absMin = abs(minI);
     122
     123 //Suche die Spitze
     124  //if (absMax > absMin){
     125         // //Der größte absolut wert steht in maxI
     126         // //schauen ob die spitze nicht am Anfang oder Ende des arrays ist
     127         // if ((maxIPos < 10) || (maxIPos > 53))
     128         // {
     129                //return -3;
     130         // }
     131         
     132  //}
     133  //else
     134  //{
     135
     136         // if ((minIPos < 10) || (minIPos > 53)) 
     137         // {
     138                //return -3;
     139         // }
     140  //}
    199141  //if (abs(dU) < min_dU) {
    200142  //  return -2;
     
    204146
    205147 
    206   int32_t dIMax=-1;
    207   int32_t dIx=-1;;
    208   int32_t dIMaxPos=-1;
     148//  int32_t dIMax=-1;
     149//  int32_t dIx=-1;;
     150//  int32_t dIMaxPos=-1;
    209151 
    210152
    211153
    212154  //Finde Position der flanke
    213   for (x=0; x < (SAMPLE_ARRAY_SIZE-1); x++)
    214   {
    215     dIx = adc1Data[x+1] - adc1Data[x];
    216     if (dIx > dIMax) { dIMax = dIx; dIMaxPos = x; }
    217   }
     155//  for (x=0; x < (SAMPLE_ARRAY_SIZE-2); x++)
     156//  {
     157//    dIx = adc1Data[x+1] - adc1Data[x];
     158//    if (dIx > dIMax) { dIMax = dIx; dIMaxPos = x; }
     159//  }
    218160
    219  
     161  sys_data.s.values.neg_I_peak = (minI ) * I_MULTIPLIER / 10;
     162  sys_data.s.values.pos_I_peak = (maxI ) * I_MULTIPLIER / 10 ;
     163
     164  sys_data.s.values.neg_U_Batt_peak = (minUBatt ) * U_MULTIPLIER / 10;
     165  sys_data.s.values.pos_U_Batt_peak = (maxUBatt ) * U_MULTIPLIER / 10;
     166  sys_data.s.values.neg_U_Shunt_peak = (minUOut ) * U_MULTIPLIER / 10;
     167  sys_data.s.values.pos_U_Shunt_peak = (maxUOut ) * U_MULTIPLIER / 10;
     168
     169  sys_data.s.values.neg_I_Buffer_pos = minIPos;
     170  sys_data.s.values.pos_I_Buffer_pos = maxIPos;
     171
    220172
    221173
    222174  //ESR berechnen!
    223   sys_data.s.values.esr_fast = ( (double)dUBatt / (double) dI) * 1000;
    224   sys_data.s.values.esr =          ( (double)dUOut  / (double) dI) * 1000;
     175  sys_data.s.values.esr_batt =          ( (double)dUBatt / (double) dI) * 1000;
     176  sys_data.s.values.esr_shunt =     ( (double)dUOut  / (double) dI) * 1000;
    225177  last_refresh = sys_data.s.values.onTime;
    226178       
     
    228180  for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
    229181  {
    230         sys_data.s.values.current_buffer_fast[x] = (int32_t) adc1Data[x] - FAST_CURRENT_ADC_OFFSET  ;
    231         sys_data.s.values.voltage_buffer_fast[x] = (int32_t) adc2Data[x] - BATTERY_VOLTAGE_ADC_OFFSET ;
     182        sys_data.s.values.current_buffer[x] =            adc1Data[x]  ;
     183        sys_data.s.values.voltage_buffer_batt[x] =       adc2Data[x] ;
     184        sys_data.s.values.voltage_buffer_shunt[x] =  adc4Data[x]  ;
    232185  }
    233186
    234187
     188  //Auswertung darf nur erfolgen wenn Singulares Erreigniss nicht am Anfang oder Ende des Buffers erfolgt.
     189  //Also z.B. bei der Belastung mit elektronischer Last. Da ansonsten eventuell nicht der Beginn der Kurve mit aufgezeichnet wird
     190  //printf("delta I: %d, deltaUBatt=%d, deltaUOut=%d,posMax=%d; posMin=%d, esr1=%d, esr2=%d \r\n",dI,dUBatt,dUOut,maxIPos, minIPos,sys_data.s.values.esr_batt,sys_data.s.values.esr_shunt);
    235191
    236192
  • trunk/fw_g473rct/SES/src/fast_current.c

    r26 r73  
    3232
    3333//      --- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
    34 void CurrentOffsetCal(uint32_t newVal)
     34void CurrentOffsetCal(int32_t newVal)
    3535{
    3636  sys_data.s.parameter.batteryCurrentOffsetFast = newVal-FAST_CURRENT_ADC_OFFSET;
    3737}
    3838
    39 void CurrentGainCal(uint32_t newVal)
     39void CurrentGainCal(int32_t newVal)
    4040{
    4141  double correction;
    4242  double valWithoutGainCorrection;
    4343
    44   valWithoutGainCorrection = ((int32_t) newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
     44  valWithoutGainCorrection = ( newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
    4545  valWithoutGainCorrection = valWithoutGainCorrection / FAST_CURRENT_ADC_RESOLUTION;
    4646  valWithoutGainCorrection = valWithoutGainCorrection / FAST_CURRENT_I_SENSE_GAIN ;
     
    5151
    5252}
    53 void FAST_CURRENT_Exec(uint32_t newVal )
     53void FAST_CURRENT_Exec(int32_t newVal )
    5454{
    5555 
    5656  //Umrechung auf Strom
    5757  double temp_current;
    58   temp_current = ((int32_t) newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
     58  temp_current = ( newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
    5959  temp_current = temp_current / FAST_CURRENT_ADC_RESOLUTION;
    6060  temp_current = temp_current / FAST_CURRENT_I_SENSE_GAIN ;
  • trunk/fw_g473rct/SES/src/int_bat_voltage.c

    r24 r73  
    3535
    3636//      --- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
    37 void INT_BAT_VOLTAGE_Exec(uint32_t newval)
     37void INT_BAT_VOLTAGE_Exec(int32_t newval)
    3838{
    3939  // Messung Externe Spannung basierend auf 3,3V Versorgungsspannung
  • trunk/fw_g473rct/SES/src/outputs.c

    r55 r73  
    7676void OUTPUTS_OverwriteChargeCtrl_Disabled(void)
    7777{
     78
     79
    7880  GPIO_InitTypeDef GPIO_InitStruct = {0};
    7981  GPIO_InitStruct.Pin = OVERWRITE_CHARGE_CTRL_Pin;
     
    202204                                printf("OUTPUT LVP OK\n");
    203205                                sys_data.s.values.lvpState = OUTPUTS_LVP_OK;
     206#ifndef NO_TRISTATE_OUTPUTS
    204207                                OUTPUTS_OverwriteDischargeCtrl_Disabled();
     208#else
     209                                OUTPUTS_OverwriteDischargeCtrl_DischargeEnabled();
     210#endif
    205211                        }
    206212                }
     
    295301                                printf("OUTPUT OVP OK\n");
    296302                                sys_data.s.values.ovpState = OUTPUTS_OVP_OK;
    297                                 OUTPUTS_OverwriteChargeCtrl_Disabled(); // externer steuerung
     303#ifndef NO_TRISTATE_OUTPUTS
     304                                OUTPUTS_OverwriteChargeCtrl_Disabled();
     305#else
     306                                OUTPUTS_OverwriteChargeCtrl_ChargeEnabled();
     307#endif
    298308                        }
    299309                }
  • trunk/fw_g473rct/SES/src/shunt_voltage_fast.c

    r72 r73  
    1212#include <stdio.h>
    1313#include "sysdata.h"
    14 #include "shunt_voltage.h"
     14#include "shunt_voltage_fast.h"
    1515#include "adc.h"
     16#include "tim.h"
    1617//      --- EXTERNE VARIABLEN --------------------------------------------------------
     18extern __IO int32_t adc4Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
     19//      --- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
     20#define SHUNT_VOLTAGE_FAST_ADC_RESOLUTION                                                 65536
     21#define SHUNT_VOLTAGE_FAST_ADC_OFFSET                                                     32768
    1722
    18 //      --- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
    19 #define ADC_RESOLUTION                                            32768 //65536/2 da im differential mode
    20 #define ADC_OFFSET                                                        32768
    21 
    22 #if defined SYSTEM_VOLTAGE_12V
    23   #define SHUNT_VOLTAGE_DIVIDER       6.0
    24 #elif defined SYSTEM_VOLTAGE_24V
    25   #define SHUNT_VOLTAGE_DIVIDER       11.0
    26 #elif defined SYSTEM_VOLTAGE_48V
    27   #define SHUNT_VOLTAGE_DIVIDER       21.0
    28 #else
    29   #error "System voltage not defined"
    30 #endif
    3123
    3224
     
    3729
    3830//      --- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
     31
    3932
    4033//      --- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
     
    5245
    5346
    54 //#define SHUNT_FILTER            128
    5547
    5648
    57 void SHUNT_VOLTAGE_Exec(int32_t newval)
     49void SHUNT_VOLTAGE_FAST_Exec(int32_t newval)
    5850{
    59    sys_data.s.values.shuntVoltage =  ((newval-ADC_OFFSET) * VREF * SHUNT_VOLTAGE_DIVIDER ) / ADC_RESOLUTION;
     51  sys_data.s.values.shuntVoltageFast =  ((newval - SHUNT_VOLTAGE_FAST_ADC_OFFSET) * (int64_t) (VREF) * SHUNT_VOLTAGE_VOLTAGE_DIVIDER / SHUNT_VOLTAGE_FAST_ADC_RESOLUTION) - sys_data.s.parameter.shuntVoltageFastOffset ;
    6052
     53}
     54
     55void SHUNT_VOLTAGE_FAST_ZeroCal(void)
     56{
     57        sys_data.s.parameter.shuntVoltageFastOffset = sys_data.s.values.shuntVoltageFast  + sys_data.s.parameter.shuntVoltageFastOffset ;
    6158}
    6259
  • trunk/fw_g473rct/SES/src/sysdata.c

    r65 r73  
    2929        sys_data.s.values.detectedEnergy = -1; //(int32_t)sys_data.s.parameter.battEnergy;
    3030
    31         sys_data.s.values.esr = -1;
    32         sys_data.s.values.esr_fast = -1;
     31        sys_data.s.values.esr_batt = -1;
     32        sys_data.s.values.esr_shunt= -1;
    3333
    3434        sys_data.s.values.selfDischarge = -1;
Note: See TracChangeset for help on using the changeset viewer.