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

Delta Sigma ADC auf 10Channel geändert.

File:
1 edited

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//-----------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.