Changeset 73 for trunk/fw_g473rct/Core


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/Core
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/fw_g473rct/Core/Inc/main.h

    r71 r73  
    4747#define GOTO_SYSTEM_BOOTLOADER_MARK                       0xACCE55ED
    4848
    49 #define VREF                                                              3000.0
     49#define VREF                                                              3000
    5050/* USER CODE END EC */
    5151
  • trunk/fw_g473rct/Core/Src/adc.c

    r71 r73  
    2323/* USER CODE BEGIN 0 */
    2424
     25/*   --------------- ACHTUNG ---------
     26- ADC1&2 und ADC3,4, 5 teilen sich den gleichen Prescaaler, deshalb muss 3 und 5 auch schnell takten
     27- SYNC nicht ASYNC als quelle nehmen, dadurch weniger Jitter
     28
     29*/
    2530/* USER CODE END 0 */
    2631
     
    5459  */
    5560  hadc1.Instance = ADC1;
    56   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
     61  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    5762  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    5863  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
     
    6166  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    6267  hadc1.Init.LowPowerAutoWait = DISABLE;
    63   hadc1.Init.ContinuousConvMode = DISABLE;
     68  hadc1.Init.ContinuousConvMode = ENABLE;
    6469  hadc1.Init.NbrOfConversion = 1;
    6570  hadc1.Init.DiscontinuousConvMode = DISABLE;
     
    120125  */
    121126  hadc2.Instance = ADC2;
    122   hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
     127  hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    123128  hadc2.Init.Resolution = ADC_RESOLUTION_12B;
    124129  hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
     
    127132  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    128133  hadc2.Init.LowPowerAutoWait = DISABLE;
    129   hadc2.Init.ContinuousConvMode = DISABLE;
     134  hadc2.Init.ContinuousConvMode = ENABLE;
    130135  hadc2.Init.NbrOfConversion = 1;
    131136  hadc2.Init.DiscontinuousConvMode = DISABLE;
     
    151156  sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED;
    152157  sConfig.OffsetNumber = ADC_OFFSET_NONE;
    153   sConfig.Offset = 0;
     158  sConfig.Offset = 0; //Spannung etwa 100mV erhöhen
     159
    154160  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
    155161  {
     
    179185  */
    180186  hadc3.Instance = ADC3;
    181   hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV256;
     187  hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    182188  hadc3.Init.Resolution = ADC_RESOLUTION_12B;
    183189  hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
     
    263269  */
    264270  hadc4.Instance = ADC4;
    265   hadc4.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
     271  hadc4.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    266272  hadc4.Init.Resolution = ADC_RESOLUTION_12B;
    267273  hadc4.Init.DataAlign = ADC_DATAALIGN_RIGHT;
     
    270276  hadc4.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    271277  hadc4.Init.LowPowerAutoWait = DISABLE;
    272   hadc4.Init.ContinuousConvMode = DISABLE;
     278  hadc4.Init.ContinuousConvMode = ENABLE;
    273279  hadc4.Init.NbrOfConversion = 1;
    274280  hadc4.Init.DiscontinuousConvMode = DISABLE;
     
    295301  sConfig.OffsetNumber = ADC_OFFSET_NONE;
    296302  sConfig.Offset = 0;
     303
     304
    297305  if (HAL_ADC_ConfigChannel(&hadc4, &sConfig) != HAL_OK)
    298306  {
     
    321329  */
    322330  hadc5.Instance = ADC5;
    323   hadc5.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV256;
     331  hadc5.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    324332  hadc5.Init.Resolution = ADC_RESOLUTION_12B;
    325333  hadc5.Init.DataAlign = ADC_DATAALIGN_RIGHT;
     
    407415  */
    408416    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
    409     PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_PLL;
     417    PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
    410418    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    411419    {
     
    436444    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    437445    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    438     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
     446    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    439447    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    440448    hdma_adc1.Init.Mode = DMA_NORMAL;
     
    460468  */
    461469    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
    462     PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_PLL;
     470    PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
    463471    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    464472    {
     
    489497    hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;
    490498    hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;
    491     hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
     499    hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    492500    hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    493501    hdma_adc2.Init.Mode = DMA_NORMAL;
     
    513521  */
    514522    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC345;
    515     PeriphClkInit.Adc345ClockSelection = RCC_ADC345CLKSOURCE_PLL;
     523    PeriphClkInit.Adc345ClockSelection = RCC_ADC345CLKSOURCE_SYSCLK;
    516524    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    517525    {
     
    567575  */
    568576    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC345;
    569     PeriphClkInit.Adc345ClockSelection = RCC_ADC345CLKSOURCE_PLL;
     577    PeriphClkInit.Adc345ClockSelection = RCC_ADC345CLKSOURCE_SYSCLK;
    570578    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    571579    {
     
    596604    hdma_adc4.Init.PeriphInc = DMA_PINC_DISABLE;
    597605    hdma_adc4.Init.MemInc = DMA_MINC_ENABLE;
    598     hdma_adc4.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
     606    hdma_adc4.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    599607    hdma_adc4.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    600608    hdma_adc4.Init.Mode = DMA_NORMAL;
     
    620628  */
    621629    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC345;
    622     PeriphClkInit.Adc345ClockSelection = RCC_ADC345CLKSOURCE_PLL;
     630    PeriphClkInit.Adc345ClockSelection = RCC_ADC345CLKSOURCE_SYSCLK;
    623631    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    624632    {
     
    820828        return 0.0f;
    821829
    822     float sample_cycles = 6.5f;
     830    float sample_cycles = 640.5f;
    823831    float conversion_cycles = 12.5f;
    824 
    825     return adc_clk / (sample_cycles + conversion_cycles);
     832        float oversampling = 256;
     833
     834    return adc_clk / (sample_cycles + conversion_cycles) / oversampling;
    826835}
    827836/* USER CODE END 1 */
  • trunk/fw_g473rct/Core/Src/main.c

    r71 r73  
    4242#include "modbus.h"
    4343#include "chip_temperature.h"
    44 #include "battery_voltage.h"
     44#include "battery_voltage_fast.h"
    4545#include "ads1260.h"
    46 #include "shunt_voltage.h"
     46#include "shunt_voltage_fast.h"
    4747#include "fast_current.h"
    4848#include "int_bat_voltage.h"
     
    9292
    9393
    94 __IO uint32_t adc1Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
    95 __IO uint32_t adc2Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
    96 __IO uint32_t adc3Data[3];
    97 __IO uint32_t adc4Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
    98 __IO uint32_t adc5Data[4];
     94__IO int32_t adc1Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
     95__IO int32_t adc2Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
     96__IO int32_t adc3Data[3];
     97__IO int32_t adc4Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
     98__IO int32_t adc5Data[4];
    9999int silentmode = 0;
    100100static volatile uint32_t newADC124Data = 0;
     
    162162
    163163  /* USER CODE BEGIN Init */
    164  
     164  /* ------------------------------------------ INFO  -----------------
     165   - Einige Module sind zum Stromsparen ausgeschaltet
     166
     167  */
    165168  /* USER CODE END Init */
    166169
     
    187190  MX_CRC_Init();
    188191  MX_RTC_Init();
    189  // MX_IWDG_Init();
     192  MX_IWDG_Init();
    190193  MX_TIM3_Init();
     194#ifndef  NO_USB_SUPPORT
    191195  MX_USB_Device_Init();
    192196  MX_UCPD1_Init();
     197#endif
    193198  /* USER CODE BEGIN 2 */
     199
    194200  printf("Test debug io\r\n");
    195   printf("adc samplerate  core clock: %d kHz\r\n", (uint32_t) GetADCSampleRate() / 1000U);
     201
    196202  SYS_DATA_Init();
    197203  WH_COUNTER_Init();
     
    225231  mbInit(&modbusData, sys_data.s.parameter.baudrate, sys_data.s.parameter.parityMode, sys_data.s.parameter.stopBit, &huart2);
    226232  HAL_IWDG_Refresh(&hiwdg);
     233  HAL_Delay(500);
     234  HAL_IWDG_Refresh(&hiwdg);
     235
    227236  // STM32G0 Chiptemperatur Kalibrierung
    228237  CHIP_TEMPERATURE_Calibration();
    229238
    230   HAL_ADCEx_Calibration_Start(&hadc1, ADC_DIFFERENTIAL_ENDED);
    231   HAL_ADCEx_Calibration_Start(&hadc2, ADC_DIFFERENTIAL_ENDED);
    232   HAL_ADCEx_Calibration_Start(&hadc3, ADC_SINGLE_ENDED);
    233   HAL_ADCEx_Calibration_Start(&hadc4, ADC_DIFFERENTIAL_ENDED);
    234   HAL_ADCEx_Calibration_Start(&hadc5, ADC_SINGLE_ENDED);
     239  if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_DIFFERENTIAL_ENDED) != HAL_OK) Error_Handler();
     240  if (HAL_ADCEx_Calibration_Start(&hadc2, ADC_DIFFERENTIAL_ENDED) != HAL_OK) Error_Handler();
     241  if (HAL_ADCEx_Calibration_Start(&hadc3, ADC_SINGLE_ENDED) != HAL_OK) Error_Handler();
     242  if (HAL_ADCEx_Calibration_Start(&hadc4, ADC_DIFFERENTIAL_ENDED) != HAL_OK) Error_Handler();
     243  if (HAL_ADCEx_Calibration_Start(&hadc5, ADC_SINGLE_ENDED) != HAL_OK) Error_Handler();
     244
     245
     246
     247  printf("%u, %u, %u\n", LL_ADC_GetCalibrationFactor(ADC1, LL_ADC_DIFFERENTIAL_ENDED), LL_ADC_GetCalibrationFactor(ADC2, LL_ADC_DIFFERENTIAL_ENDED), LL_ADC_GetCalibrationFactor(ADC4, LL_ADC_DIFFERENTIAL_ENDED));
    235248  HAL_IWDG_Refresh(&hiwdg);
     249
    236250 
    237251  //SET_BIT(hadc2.Instance->CFGR, ADC_CFGR_DMAEN); //Enable DMA transfer for ADC slave (ADC12_CCR.MDMA = 0b00 -> MDMA mode disabled)
     
    267281
    268282  /* USBPD initialisation ---------------------------------*/
     283#ifndef NO_USB_SUPPORT
    269284  MX_USBPD_Init();
    270  
     285#endif
    271286  /* Infinite loop */
    272287  /* USER CODE BEGIN WHILE */
     
    274289  {
    275290    /* USER CODE END WHILE */
     291#ifndef NO_USB_SUPPORT
    276292    USBPD_DPM_Run();
    277 
     293#endif
    278294    /* USER CODE BEGIN 3 */
    279295    HAL_IWDG_Refresh(&hiwdg);
    280296    if (newADC124Data == 7)
    281297    {
    282           SHUNT_VOLTAGE_Exec( adc4Data[0]);
     298
     299          SHUNT_VOLTAGE_FAST_Exec( adc4Data[SAMPLE_ARRAY_SIZE-1]);
    283300          //Mit ADC_DIV2,Sample time 12,5Cycklen, ADC Clock 50Mhz, Oversampling 256
    284301          //Tconv = 6400 Takte = 0,128ms Pro Konvertierung. Also für 100 messwerte 12,8mS
    285           BATTERY_VOLTAGE_Exec( adc2Data[SAMPLE_ARRAY_SIZE-1]);
     302          BATTERY_VOLTAGE_FAST_Exec( adc2Data[SAMPLE_ARRAY_SIZE-1]);
    286303          FAST_CURRENT_Exec(adc1Data[SAMPLE_ARRAY_SIZE-1]);
    287304          ESR_FAST_Exec();
     
    290307          newADC124Data = 0;
    291308
    292         //Auskommentiert, bringt komiscxherweise Spannungsschwankungen, beim loggen,... Spannung springt bis zu 50mv
    293         //   HAL_ADCEx_Calibration_Start(&hadc1, ADC_DIFFERENTIAL_ENDED);
    294         //   HAL_ADCEx_Calibration_Start(&hadc2, ADC_DIFFERENTIAL_ENDED);
    295         //   HAL_ADCEx_Calibration_Start(&hadc4, ADC_DIFFERENTIAL_ENDED);
    296 
    297 
    298309
    299310
     
    301312          if (HAL_ADC_Start_DMA(&hadc2,(uint32_t*)adc2Data,SAMPLE_ARRAY_SIZE)) Error_Handler(); //Start ADC interleaved mode
    302313          if (HAL_ADC_Start_DMA(&hadc4,(uint32_t*)adc4Data,SAMPLE_ARRAY_SIZE)) Error_Handler(); //Start ADC interleaved mode
     314         
     315 
    303316        }
    304317
     
    368381      if (silentmode == 0)
    369382      {
    370         //HAL_GPIO_TogglePin(LED_FUNCTION_GPIO_Port, LED_FUNCTION_Pin);
     383        HAL_GPIO_TogglePin(LED_FUNCTION_GPIO_Port, LED_FUNCTION_Pin);
    371384                //HAL_GPIO_TogglePin(AUX_EN_GPIO_Port, AUX_EN_Pin);
    372385      }
     
    425438                  case COMMAND_GOTO_SYS_BOOTLOADER:                                       bootLoaderMark = GOTO_SYSTEM_BOOTLOADER_MARK;
    426439                                                                                                                          HAL_NVIC_SystemReset();                                                                                                         break;
    427                   case COMMAND_SET_VOLTAGE_MEAS_TO_ZERO:                          BATTERY_VOLTAGE_ZeroCal();                                                                                              break;         
     440                  case COMMAND_SET_VOLTAGE_MEAS_TO_ZERO:                          BATTERY_VOLTAGE_FAST_ZeroCal();
     441                                                                                                                          ADS1260_BatteryVoltageZeroCal();
     442                                                                                                                          ADS1260_ShuntVoltageZeroCal();
     443                                                                                                                          SHUNT_VOLTAGE_FAST_ZeroCal();
     444                                                                                                                          break;         
    428445                                                                                                                       
    429446          default:                                            printf("UNKNOWN COMMAND\n");
     
    475492    }
    476493
     494        //HAL_SuspendTick();
     495        //HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
     496        //HAL_ResumeTick();
     497
     498
     499#ifndef NO_USB_SUPPORT
    477500        if (rb_available(&usb_in_buff) > 8)                                                                                     // 8 minimum packet size in Modbus RTU RHR/WHR
    478501        {       // Theres something in our USB buffer. We need to process it
    479502                processUSB(&usb_in_buff, &usb_out_buff);
    480503        }
     504
    481505
    482506        if (rb_available(&usb_out_buff) > 0)
     
    499523                lastTime_ms = HAL_GetTick();
    500524        }
    501  
     525#endif
    502526  }
    503527  /* USER CODE END 3 */
     
    563587/* USER CODE BEGIN 4 */
    564588
     589#ifndef NO_USB_SUPPORT
    565590void processUSB(ring_buffer_t* const ring_in_buff, ring_buffer_t* const ring_out_buff)
    566591{
     
    719744        }
    720745}
    721 
     746#endif
    722747//------------------------------------------------------------------------------
    723748
     
    804829 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
    805830 {
    806         if (hadc->Instance==ADC1)
     831        if (hadc->Instance == ADC1)
    807832        {
    808833          newADC124Data |= 1;
     
    814839        else if (hadc->Instance==ADC3)
    815840        {
    816           newADC3Data=1;
     841          newADC3Data = 1;
    817842        }
    818843        else if (hadc->Instance==ADC4)
    819844        {
    820           newADC124Data |=4;
     845          newADC124Data |= 4;
    821846        }
    822847        else if (hadc->Instance==ADC5)
    823848        {
    824           newADC5Data=1;
     849          newADC5Data = 1;
    825850        }
    826851 }
  • trunk/fw_g473rct/Core/Src/stm32g4xx_it.c

    r71 r73  
    5959
    6060/* External variables --------------------------------------------------------*/
     61#ifndef NO_USB_SUPPORT
    6162extern PCD_HandleTypeDef hpcd_USB_FS;
     63#endif
    6264extern DMA_HandleTypeDef hdma_adc1;
    6365extern DMA_HandleTypeDef hdma_adc2;
     
    206208  /* USER CODE END SysTick_IRQn 0 */
    207209  HAL_IncTick();
     210#ifndef  NO_USB_SUPPORT
    208211  USBPD_DPM_TimerCounter();
     212#endif
    209213  /* USER CODE BEGIN SysTick_IRQn 1 */
    210214
     
    337341{
    338342  /* USER CODE BEGIN USB_LP_IRQn 0 */
    339 
     343#ifndef NO_USB_SUPPORT
    340344  /* USER CODE END USB_LP_IRQn 0 */
    341345  HAL_PCD_IRQHandler(&hpcd_USB_FS);
    342346  /* USER CODE BEGIN USB_LP_IRQn 1 */
    343 
     347#endif
    344348  /* USER CODE END USB_LP_IRQn 1 */
    345349}
     
    400404}
    401405
     406
     407
    402408/**
    403409  * @brief This function handles UCPD1 interrupt / UCPD1 wake-up interrupt through EXTI line 43.
     
    406412{
    407413  /* USER CODE BEGIN UCPD1_IRQn 0 */
    408 
     414#ifndef NO_USB_SUPPORT
    409415  /* USER CODE END UCPD1_IRQn 0 */
    410416  USBPD_PORT0_IRQHandler();
    411417
    412418  /* USER CODE BEGIN UCPD1_IRQn 1 */
    413 
     419#endif
    414420  /* USER CODE END UCPD1_IRQn 1 */
    415421}
  • trunk/fw_g473rct/Core/Src/tim.c

    r71 r73  
    4242  /* USER CODE END TIM3_Init 1 */
    4343  htim3.Instance = TIM3;
    44   htim3.Init.Prescaler = 99;
     44  htim3.Init.Prescaler = 100 - 1;
    4545  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    46   htim3.Init.Period = 1000;
     46  htim3.Init.Period = 500 - 1;
    4747  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    4848  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
     
    6363  }
    6464  /* USER CODE BEGIN TIM3_Init 2 */
    65   HAL_TIM_Base_Start_IT(&htim3);
     65  HAL_TIM_Base_Start(&htim3);
    6666
    6767  /* USER CODE END TIM3_Init 2 */
Note: See TracChangeset for help on using the changeset viewer.