你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F3 使用 HRTIM 与 ADC实现精准BOOST转换

[复制链接]
STMCU小助手 发布时间:2021-12-5 10:21
硬件环境
芯片 STM32F334C8Tx
开发板 STM32F3348-Discovery
升降压电路

20210503193954294.png


试验目的
输入电压范围2-5V,恒定升压到10V输出

实现原理
根据原理图得知,要实现BOOST功能,需要控制PA8恒为高电平
然后控制PA10为高电平,PA11低电平时为电感L3充电。
再控制PA11为高电平,PA10低电平,让电感与输入电压一起放电,达到升压的目的

软件配置
1、ADC采样
因为BOOST电路有纹波,为了实现ADC的精准采样,需要在纹波上升沿中间的瞬间进行准确采样

需要将ADC配置为HRTIM触发采样

首先进行ADC基本配置

  1.   hadc1.Instance = ADC1;  //OK
  2.   hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;//OK
  3.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;//OK
  4.   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//OK
  5.   hadc1.Init.ContinuousConvMode = DISABLE; //OK
  6.   hadc1.Init.DiscontinuousConvMode = DISABLE;//OK
  7.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//OK
  8.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; //OK
  9.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;//OK
  10.   hadc1.Init.NbrOfConversion = 1;//OK
  11.   hadc1.Init.DMAContinuousRequests = DISABLE;//OK
  12.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;//OK
  13.   hadc1.Init.LowPowerAutoWait = DISABLE; //OK
  14.   hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;//OK
  15.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  16.   {
  17.     Error_Handler();
  18.   }
复制代码

然后配置ADC为HRTIM触发采样

  1.   /** Configure Injected Channel
  2.   */
  3.   sConfigInjected.InjectedChannel = ADC_CHANNEL_2; //OK
  4.   sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1; //OK
  5.   sConfigInjected.InjectedSingleDiff = ADC_SINGLE_ENDED;//OK
  6.   sConfigInjected.InjectedNbrOfConversion = 2;//OK
  7.   sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5;//OK
  8.   sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISING;//OK
  9.   sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_HRTIM_TRG2;//OK
  10.   sConfigInjected.AutoInjectedConv = DISABLE;//OK
  11.   sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;//OK
  12.   sConfigInjected.QueueInjectedContext = DISABLE;//OK
  13.   sConfigInjected.InjectedOffset = 0;//OK
  14.   sConfigInjected.InjectedOffsetNumber = ADC_OFFSET_NONE;//OK
  15.   if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  16.   {
  17.     Error_Handler();
  18.   }
  19.     /** Configure Injected Channel
  20.   */
  21.   sConfigInjected.InjectedChannel = ADC_CHANNEL_4;//OK
  22.   sConfigInjected.InjectedRank = ADC_INJECTED_RANK_2;//OK
  23.   sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_19CYCLES_5;//OK
  24.   if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
  25.   {
  26.     Error_Handler();
  27.   }
复制代码

最后启动ADC
  1.   /* Run the ADC calibration in single-ended mode */
  2.   HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);

  3.   /* Start ADC1 Injected Conversions */
  4.   HAL_ADCEx_InjectedStart(&hadc1);
复制代码

2、HRTIM配置
HRTIM需要配置的东西很多,需要对以下结构体进行初始化并调用库函数进行配置

  1.   HRTIM_TimeBaseCfgTypeDef timebase_config;
  2.   HRTIM_TimerCfgTypeDef timer_config;
  3.   HRTIM_OutputCfgTypeDef output_config;
  4.   HRTIM_CompareCfgTypeDef compare_config;
  5.   HRTIM_DeadTimeCfgTypeDef HRTIM_TIM_DeadTimeConfig;
  6.   HRTIM_ADCTriggerCfgTypeDef adc_trigger_config;
  7.   HRTIM_FaultCfgTypeDef fault_config;
复制代码

首先是HRTIM的基本配置

  1.   /* ----------------------------*/
  2.   /* HRTIM Global initialization */
  3.   /* ----------------------------*/
  4.   /* Initialize the HRTIM handle (and clear it before for greater portability) */
  5.   hhrtim.Instance = HRTIM1;                                //OK
  6.   hhrtim.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;                              //OK
  7.   hhrtim.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;                              //OK

  8.   /* Initialize HRTIM */
  9.   HAL_HRTIM_Init(&hhrtim);                               //OK

  10.   /* HRTIM DLL calibration: periodic calibration, set period to 14祍 */
  11.   HAL_HRTIM_DLLCalibrationStart(&hhrtim, HRTIM_CALIBRATIONRATE_14);                              //OK
  12.   /* Wait calibration completion*/
  13.   if (HAL_HRTIM_PollForDLLCalibration(&hhrtim, 100) != HAL_OK)                               //OK
  14.   {
  15.     Error_Handler(); /* if DLL or clock is not correctly set */
  16.   }
复制代码

再配置HRTIM的频率为250KHZ

  1.   timebase_config.Period = BUCK_PWM_PERIOD; /* 250kHz switching frequency */  //OK
  2.   timebase_config.RepetitionCounter = 31; /* 1 ISR every 32 PWM periods */  //OK
  3.   timebase_config.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;  //OK
  4.   timebase_config.Mode = HRTIM_MODE_CONTINUOUS;  //OK
  5.   HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &timebase_config);
  6.   HAL_HRTIM_TimeBaseConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, &timebase_config);
复制代码

再对TIMERA和TIMEB的一些参数进行配置

  1.   timer_config.DMARequests = HRTIM_TIM_DMA_NONE;//OK
  2.   timer_config.DMASrcAddress = 0x0;//OK
  3.   timer_config.DMADstAddress = 0x0;//OK
  4.   timer_config.DMASize = 0x0;//OK
  5.   timer_config.HalfModeEnable = HRTIM_HALFMODE_DISABLED;//OK
  6.   timer_config.StartOnSync = HRTIM_SYNCSTART_DISABLED;//OK
  7.   timer_config.ResetOnSync = HRTIM_SYNCRESET_DISABLED;//OK
  8.   timer_config.DACSynchro = HRTIM_DACSYNC_NONE;//OK
  9.   timer_config.PreloadEnable = HRTIM_PRELOAD_ENABLED;//OK
  10.   timer_config.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;//OK
  11.   timer_config.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;//OK
  12.   timer_config.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;//OK
  13.   timer_config.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED; //OK
  14.   timer_config.InterruptRequests = HRTIM_TIM_IT_REP; //OK
  15.   timer_config.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;//OK
  16.   timer_config.FaultEnable = HRTIM_TIMFAULTENABLE_FAULT1;//OK
  17.   timer_config.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;//OK
  18.   timer_config.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_ENABLED;//OK
  19.   timer_config.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;//OK
  20.   timer_config.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE;//OK
  21.   timer_config.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;//OK
  22.   HAL_HRTIM_WaveformTimerConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &timer_config);

  23.   HAL_HRTIM_WaveformTimerConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, &timer_config);
复制代码

对 TA1 TA2 TB1 and TB2 的波形进行配置

  1.   output_config.Polarity = HRTIM_OUTPUTPOLARITY_HIGH; //OK
  2.   output_config.SetSource = HRTIM_OUTPUTSET_TIMCMP1;//OK
  3.   output_config.ResetSource  = HRTIM_OUTPUTRESET_TIMPER;
  4.   output_config.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;//OK
  5.   output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;//OK
  6.   output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_INACTIVE;
  7.   output_config.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;//OK
  8.   output_config.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;//OK
  9.   HAL_HRTIM_WaveformOutputConfig(&hhrtim,
  10.                                  HRTIM_TIMERINDEX_TIMER_A,
  11.                                  HRTIM_OUTPUT_TA1,
  12.                                  &output_config);

  13.   HAL_HRTIM_WaveformOutputConfig(&hhrtim,
  14.                                  HRTIM_TIMERINDEX_TIMER_A,
  15.                                  HRTIM_OUTPUT_TA2,
  16.                                  &output_config);

  17.   /* Set compare registers for duty cycle on TA1 在TA1上设置占空比寄存器*/
  18.   compare_config.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
  19.   compare_config.AutoDelayedTimeout = 0;
  20.   compare_config.CompareValue = BUCK_PWM_PERIOD - 0x60;  /* Start with minimal duty cycle */
  21.   HAL_HRTIM_WaveformCompareConfig(&hhrtim,
  22.                                   HRTIM_TIMERINDEX_TIMER_A,
  23.                                   HRTIM_COMPAREUNIT_1,
  24.                                   &compare_config);
  25.   output_config.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
  26.   output_config.SetSource = HRTIM_OUTPUTSET_TIMCMP1;
  27.   output_config.ResetSource  = HRTIM_OUTPUTRESET_TIMPER;
  28.   output_config.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
  29.   output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  30.   output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_INACTIVE;
  31.   output_config.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
  32.   output_config.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
  33.   HAL_HRTIM_WaveformOutputConfig(&hhrtim,
  34.                                  HRTIM_TIMERINDEX_TIMER_B,
  35.                                  HRTIM_OUTPUT_TB1,
  36.                                  &output_config);

  37.   HAL_HRTIM_WaveformOutputConfig(&hhrtim,
  38.                                  HRTIM_TIMERINDEX_TIMER_B,
  39.                                  HRTIM_OUTPUT_TB2,
  40.                                  &output_config);

  41.   /* Set compare registers for duty cycle on TB1 */
  42.   compare_config.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
  43.   compare_config.AutoDelayedTimeout = 0;
  44.   compare_config.CompareValue = BUCK_PWM_PERIOD+1;  /* 0% duty cycle */
  45.   HAL_HRTIM_WaveformCompareConfig(&hhrtim,
  46.                                   HRTIM_TIMERINDEX_TIMER_B,
  47.                                   HRTIM_COMPAREUNIT_1,
  48.                                   &compare_config);      
复制代码

死区时间配置,这一步配置完后,PA10和PA11高低电平不会完全重叠,将留一小段时间同时为低电平,如果不这样做的话,输入电源将存在短路现象

  1.   HRTIM_TIM_DeadTimeConfig.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;//OK
  2.   HRTIM_TIM_DeadTimeConfig.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE; //OK
  3.   HRTIM_TIM_DeadTimeConfig.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_READONLY; //OK
  4.   HRTIM_TIM_DeadTimeConfig.FallingValue = DT_FALLING; //OK
  5.   HRTIM_TIM_DeadTimeConfig.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL8;
  6.   HRTIM_TIM_DeadTimeConfig.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE; //OK
  7.   HRTIM_TIM_DeadTimeConfig.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE; //OK
  8.   HRTIM_TIM_DeadTimeConfig.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_READONLY; //OK
  9.   HRTIM_TIM_DeadTimeConfig.RisingValue = DT_RISING; //OK
  10.   HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, &HRTIM_TIM_DeadTimeConfig);

  11.   /* Same parameters for Timer B */
  12.   HAL_HRTIM_DeadTimeConfig(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, &HRTIM_TIM_DeadTimeConfig);
复制代码

配置之后的波形:

20210503202449828.png


将ADC与HRTIM关联起来,让HRTIM触发ADC采样

  1.   compare_config.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
  2.   compare_config.CompareValue = BUCK_PWM_PERIOD/2; /* Samples at 50% of period */
  3.   compare_config.AutoDelayedTimeout = 0;
  4.   HAL_HRTIM_WaveformCompareConfig(&hhrtim,
  5.                                   HRTIM_TIMERINDEX_TIMER_A,
  6.                                   HRTIM_COMPAREUNIT_2,
  7.                                   &compare_config);

  8.   adc_trigger_config.Trigger = HRTIM_ADCTRIGGEREVENT24_TIMERA_CMP2;
  9.   adc_trigger_config.UpdateSource = HRTIM_ADCTRIGGERUPDATE_TIMER_A;
  10.   HAL_HRTIM_ADCTriggerConfig(&hhrtim,
  11.                              HRTIM_ADCTRIGGER_2,
  12.                              &adc_trigger_config);
复制代码

故障模式配置,故障输入时(PA12为低电平认为),将不输出PWM

  1.   /* ---------------------*/
  2.   /* FAULT initialization */
  3.   /* ---------------------*/
  4.   fault_config.Filter = HRTIM_FAULTFILTER_NONE;//OK
  5.   fault_config.Lock = HRTIM_FAULTLOCK_READWRITE;//OK
  6.   fault_config.Polarity = HRTIM_FAULTPOLARITY_LOW;//OK
  7.   fault_config.Source = HRTIM_FAULTSOURCE_DIGITALINPUT;  //OK
  8.   HAL_HRTIM_FaultConfig(&hhrtim,
  9.                         HRTIM_FAULT_1,
  10.                         &fault_config);

  11.   HAL_HRTIM_FaultModeCtl(&hhrtim,
  12.                         HRTIM_FAULT_1,
  13.                         HRTIM_FAULTMODECTL_ENABLED);
复制代码

ADC采样数据的读取
根据原理图的分压电阻,来读取ADC并计算电压
  1.     /* -------------------------------------------------------------------------*/
  2.     /* Input and output voltages measures (can be displayed in a watch window)  */
  3.     /* -------------------------------------------------------------------------*/
  4.     Vin = (HAL_ADCEx_InjectedGetValue(&AdcHandle, ADC_INJECTED_RANK_1) * 3300)/0xFFF;
  5.     /* VIN bridge conversion is 4.97 (6.8K / 6.8K + 27K) */
  6.     Vin = (497 * Vin )/100; /* Values in mV (for debug convenience) */

  7.     Vout = (HAL_ADCEx_InjectedGetValue(&AdcHandle, ADC_INJECTED_RANK_2) * 3300)/0xFFF;
  8.     /* VOUT bridge conversion is 5.03 (3.3K / 3.3K + 13.3K) */
  9.     Vout = (503 * Vout)/100; /* Values in mV (for debug convenience) */
复制代码

BOOST自动升压
首先永久开启PA8为高电平
  1.     /* BUCK side PMOS turned ON permanently BUCK侧PMOS永久开启 */
  2.     __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, BUCK_PWM_PERIOD);
复制代码
读取当前占空比

  1. CurrentDuty = __HAL_HRTIM_GETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1);
复制代码

根据电压来自动调节占空比大小,boost_cnt的作用是,让调节慢一些,否则调节太快了可能不稳定

  1.                 if(Vout <= 1000)
  2.                 {
  3.                         if(CurrentDuty > (BUCK_PWM_PERIOD / 4))
  4.                                 CurrentDuty -= 2;
  5.                 }
  6.                 else if(Vout <= 9000)
  7.                 {
  8.                         if(CurrentDuty > (BUCK_PWM_PERIOD / 4))
  9.                           CurrentDuty -= 1;
  10.                 }
  11.                 else if(Vout <= 9980)
  12.                 {
  13.                         boost_cnt ++;
  14.                         if(boost_cnt >= 10)
  15.                         {
  16.                                 if(CurrentDuty > (BUCK_PWM_PERIOD / 4))
  17.                                  CurrentDuty -= 1;
  18.                                 boost_cnt = 0;
  19.                         }
  20.                 }

  21.                
  22.                 if(Vout >= 10020)
  23.                 {
  24.                         
  25.                         boost_cnt ++;
  26.                         if(boost_cnt >= 10)
  27.                         {
  28.                                 if(CurrentDuty < BUCK_PWM_PERIOD - 1)
  29.                                         CurrentDuty += 1;
  30.                                 boost_cnt = 0;
  31.                         }                        
  32.                 }
  33.                 else if(Vout >= 15000)
  34.                 {
  35.                         if(CurrentDuty < BUCK_PWM_PERIOD - 2)
  36.                          CurrentDuty += 2;
  37.                 }
复制代码

重新配置占空比

  1.           if(Vout <= 9900)
  2.     {

  3.       __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, CurrentDuty);
  4.     }
  5.           if(Vout >= 10100)
  6.     {
  7.       __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, CurrentDuty);
  8.     }
复制代码

结果
根据KEIL的WATCH窗口,可以看到数据,测试成功

20210503204254646.png


20210503204320526.png


20210503204333671.png






收藏 1 评论0 发布时间:2021-12-5 10:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版