世纪电源网社区logo
社区
Datasheet
标题
返回顶部
原创

F组+以F334为核心的双向DC-DC多功能数字电源(支持脉冲充电,基于HAL库)

[复制链接]
查看: 12242 |回复: 11
1
e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 18:36:41
这款双向dcdc总的来说设计思路是基于2015年全国大学生电子设计竞赛试题的A题指标来设计制作的,不管怎么说,先贴出当年的题目:
1.基本要求
接通S1、S3,断开S2,将装置设定为充电模式。
(1)U2=30V 条件下,实现对电池恒流充电。充电电流I1 在1~2A 范围内步进可调,步
进值不大于0.1A,电流控制精度不低于5%。
(2)设定I1=2A,调整直流稳压电源输出电压,使U2 在24~36V 范围内变化时,要求
充电电流I1 的变化率不大于1%。
(3)设定I1=2A,在U2=30V 条件下,变换器的效率1   90%。
(4)测量并显示充电电流I1,在I1=1~2A 范围内测量精度不低于2%。
(5)具有过充保护功能:设定I1=2A,当U1 超过阈值U1th=24±0.5V 时,停止充电。
2.发挥部分
(1)断开S1、接通S2,将装置设定为放电模式,保持U2=30±0.5V,此时变换器效率
2   95%。
(2)接通S1、S2,断开S3,调整直流稳压电源输出电压,使Us 在32~38V 范围内变化
时,双向DC-DC 电路能够自动转换工作模式并保持U2=30±0.5V。
(3)在满足要求的前提下简化结构、减轻重量,使双向DC-DC 变换器、测控电路与辅
助电源三部分的总重量不大于500g。
(4)其他。
当时做这个题目的时候,以buckboost拓扑为基本结构,设计了如下的电路:
最终测试指标如下:
4.2、测试数据
4.2.1、充电模式:

U2 = 30V 时,以I = 0.05A 步进值在 1A~2A 进行调整(单位A):


  
理论
  
  
1
1.05
1.10
1.15
1.20
1.25
1.30
1.35
1.40
1.45
实际
  
1.016
1.065
1.109
1.134
1.212
1.265
1.322
1.363
1.428
1.442
  
差%
1.6
1.4
0.8
1.4
1.0
1.2
1.7
0.9
2
0.5

  
1.50
  
1.55
1.60
1.65
1.70
1.75
1.80
1.85
1.90
1.95
2.00
1.519
1.560
1.632
1.664
1.718
1.775
1.845
1.849
1.927
1.979
2.012
1.3
0.6
2.0
0.8
1.0
1.4
2.5
0.05
1.4
1.4
0.6
② 设定 I1 =2A,U2 在 24V 和36V 之间调节:

  
U2 /V
  
24
26
28
30
32
34
36
实际 I1  
2.01
2.02
2.02
2.01
1.99
2.01
2.98
电流变
  
化率
0.5
1.0
1.0
0.5
0.5
0.5
1.0

I1 = 2A,U2 = 30V:

  
I1 /A
  
U1 /V
I2 /A
U2 /V
效率/%
2.012
22.51
1.57
30.00
96.2


I1 在 1A 和 2A 之间调节:

  
理论
  
电流 值
  

  
1.0

  
1.1

  
1.2

  
1.3

  
1.4

  
1.5

  
1.6

  
1.7

  
1.8

  
1.9

  
2.0
实际
  
电流 值

  
1.01

  
1.09

  
1.22

  
1.32

  
1.39

  
1.51

  
1.59

  
1.71

  
1.82

  
1.91

  
2.01
误差
  
/%
1
0.9
1.7
1.5
0.7
0.7
0.6
0.6
0.6
0.5
0.5
4.2.2、放电模式
① 保持U2 30 0.5V

  
I1 /A
  
U1 /V
I2 /A
U2 /V
效率/%
1.736
17.251
1.002
30.07
98.66
4.2.3、S1,S2 接通,断开 S3:
  
Us/V
  
32
33
34
35
36
37
38
U2/V
30.006
30.05
30.07
30.06
30.00
29.85
29.53




效率等指标基本都很好,就唯一不足是pid算法采样时机当时不了解,随便采样然后做软件滤波,导致输出电流很不稳定。


在此基础上,做了若干改善之后,设计出这款dcdc双线多功能数控电源。先给出指标吧:
1、80V以内额定输入电压,0-输入电压范围内可调电压输出,误差在1%以内。
2、最大输出功率240W,输出电流可调,误差在0.05A以内。
3、具有脉冲充电功能、定时充电功能、过放电池修复功能。

本帖最后由 e3r4y6p0 于 2016-8-26 18:42 编辑

收藏收藏13
e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 18:40:52
 
从最基本的说起吧,DC-DC的变换电路有很多种,线性电源、开关电源、电荷泵,线性电源大家比较熟悉的应该就是78XX系列的芯片了,电荷泵主要用在小电流的应用中,我们也不加讨论。主要讲讲开关电源,我呢也是一个先学先卖的人,就对照资料啥的随便介绍下拉,权当是开源本设计前的一点准备工作。
开关稳压器的工作原理,就是通过控制电路来控制开关器件的通断,配合负反馈完成稳压,跟线性稳压比起来,具有效率高体积小的特点,但是输出没有线性电源稳定。开关电源的基本结构有很多种,包括BUCK、BOOST、BUCK-BOOST、CUK等非隔离式的DCDC变换器,也有Flyback、LLC等隔离式的DCDC变换器。
开源的这个设计,是以buck拓扑为核心,配合F334的高级定时器的PWM、PI算法,实现的一个很简单的闭环控制。除了以上刚刚描述的指标外,实际这块板子还具有以下三个特征及功能(只不过代码还没写-。-)[td]1、250 KHz 开关频率支持更小的无源组件,从而减小电路板面积并延长寿命;
2、 三个满足各种应用场合的控制模式:1) 输出电压控制2) MPPT 控制(输入电流控制)3) 反向电压控制。
3、 保护机制:过压保护,欠压保护,过流保护。[/td]
系统框图如上,首先说明我这款电压是从HP电源的基础上增加人机界面和改善栅极驱动做的,结合当年做电赛的经验,也是征得了原作者的同意,借这个机会分享下自己的心得。

e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 18:49:13
  • 倒数10
 
首先看基本的buck电路:

说实话这个原理大家应该都很了解,简单说下,S1闭合时,输入的通路为S1到L1到电容C2以及负载,S2关断时,L1中储存的能量经过D1形成新的回路,如此循环往复,在此过程中实现能量的转移,输出与输入电压的比值为占空比D。实际上就是LC对于一个高频方波的滤波。
而同步的buck电路如下:

在这个电路中,通过将a中的续流二极管换成一个mos管,具有以下显而易见的有点,首先,mos管的导通电阻很小,也不具有正向压降,因此在高输入电流和低输入电压下都有更高的效率,其次,mos管的体积比大功率二极管的体积要小很多。
e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 18:51:29
  • 倒数9
 
在此基础上,设计如下的能量变化电路。

输入端与输出端都采用LC 滤波,使得输入输出电流连续,便于滤波,输出端采用采用电阻实现电流差分采样,并经过放大电路放大之后送入MCU 的ADC 口。
图中采用了无电解电容设计,这样虽然纹波可能会大一点,但是相应的体积却小了很多,实际测试中,纹波在100MV以下。电感和电容的取值有响应公式可以推到,这里不多赘述,直接给大家提供一个小工具,输入参数就可以计算出结果的小工具: BOOST电感、BUKC电感、逆变电容、电感计算表.rar (8.36 KB, 下载次数: 492)
本帖最后由 e3r4y6p0 于 2016-8-26 18:52 编辑

e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 18:55:34
  • 倒数8
 
下面就到了程序控制部分了,首先介绍这款设计的主人公,STM32F334,这是M4内核的一款新品,STM32F334xx产品的目标市场是需要高度精确计时数字信号、尤其是数字功率转换应用的细分市场。包括:• 数字电源;
• 照明;
• 不间断电源;
• 太阳能逆变器;
• 无线充电器。
STM32F334xx微控制器具有高分辨率定时器(HRTIM)外设,可产生多达10个信号,能够处理用于控制、同步或保护的各种不同输入信号。其模块化架构允许对大部分转换拓扑和多并联转换器进行处理,并可在运行中重新配置它们。

e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 19:02:59
  • 倒数7
 
因为这款设计为了尽可能减少体积,因此使用了较大频率的PWM波,取值为250k,所采用的主控stm32f334是意法半导体专为数控电源所设计的一款MCU。STM32F334xx微控制器具有高分辨率定时器(HRTIM)外设,可产生多达10个信号,能够处理用于控制、同步或保护的各种不同输入信号。其模块化架构允许对大部分转换拓扑和多并联转换器进行处理,并可在运行中重新配置它们。以下内容来自ST公司对于334应用的手册。

在如上所示的拓扑当中,包括输出电压读数和过流保护(利用FAULT输入),使在电流超出可编程阈值时关闭转换器。为简单起见,此处不讨论电流传感器和调整电路;预期的FAULT反馈(在FLT1输入上)为数字信号(在PA12输入上)。
HRTIM工作于连续模式,PWM信号定义如下:
• TA1:在 TA Period 置位,在 TA CMP2 复位
• TA2:利用死区时间发生器,与 TA1 互补 (相同的上升沿和下降沿死区时间)

正是这篇手册,解开了我有关AD采样的疑惑,上面提到,在当年参加电赛的时候,无论我对采集到的AD数据做怎样的处理,冒泡+中值滤波等软件滤波,亦或是不断调节pid参数,输出的电流总是不稳,然而我查看OLED屏幕显示的电流值却是稳定的,那么问题就出在采样的时机选择上了,由于高频纹波的存在,这100mv左右的电压,是一个锯齿一样的变化的,如果采样的时机不合适,那么这一误差对PI的调节有着致命的影响。

如上图所示,对于特定占空比的PWM波,在其中央触发AD工作,这样可以避免纹波的影响。开关ON期间在TD1和TD2上计算了CMP3和CMP4时间 。这允许进行平均电压测量,并确保转换中没有电平震荡和由电源开关带来的开关噪声。
e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 19:04:24
  • 倒数6
 
共享一下hrtimer的代码和pi的控制代码:
  1. /***************************************************************************
  2. #define PWM_PERIOD = 144000000*32/switchfrequency
  3. #define DT_RISING = risingtime*switchfrequency*PWM_PERIOD
  4. #define DT_FALLING = fallingtime*switchfrequency*PWM_PERIOD
  5. ***************************************************************************/
  6. /**
  7.   * @brief  用于配置HRTIM_A的输出,关闭deadtime时,为单输出,开启deadtime时,为双输出。
  8.   * @param  死区使能,配套AD采样使能,错误使能,中断使能,初始频率,初始占空比(HO),中断频率,上升死区时间(单位纳秒),下降死区时间
  9.   * @retval None
  10.   */
  11. void MY_BSP_Init_HRTIM_A(BOOLEAN deadtime,BOOLEAN adenable,BOOLEAN faultenable,BOOLEAN interrupt,uint32_t Initial_Fre,uint8_t Initial_Duty,uint8_t n_ISR,uint8_t risingtime,uint8_t fallingtime)
  12. {
  13.   HRTIM_TimeBaseCfgTypeDef timebase_config;
  14.   HRTIM_TimerCfgTypeDef timer_config;
  15.   HRTIM_OutputCfgTypeDef output_config_TA;
  16.   HRTIM_CompareCfgTypeDef compare_config;
  17.   /* ----------------------------*/
  18.   /* HRTIM Global initialization */
  19.   /* ----------------------------*/
  20.   /* Initialize the hrtim structure (minimal configuration) */
  21.   hhrtimA.Instance = HRTIM1;
  22.   hhrtimA.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
  23.   hhrtimA.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;

  24.   /* Initialize HRTIM */
  25.   HAL_HRTIM_Init(&hhrtimA);

  26.   /* HRTIM DLL calibration: periodic calibration, set period to 14祍 */
  27.   HAL_HRTIM_DLLCalibrationStart(&hhrtimA, HRTIM_CALIBRATIONRATE_14);
  28.   /* Wait calibration completion*/
  29.   if (HAL_HRTIM_PollForDLLCalibration(&hhrtimA, 100) != HAL_OK)
  30.   {
  31.     Error_Handler(); // if DLL or clock is not correctly set
  32.   }        
  33.   /* --------------------------------------------------- */
  34.   /* TIMERA initialization: timer mode and PWM frequency */
  35.   /* --------------------------------------------------- */
  36.   timebase_config.Period = 4608000000/Initial_Fre; /* 400kHz switching frequency */
  37.   timebase_config.RepetitionCounter = n_ISR - 1; /* n ISR every 128 PWM periods */
  38.   timebase_config.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
  39.   timebase_config.Mode = HRTIM_MODE_CONTINUOUS;
  40.         HAL_HRTIM_TimeBaseConfig(&hhrtimA, HRTIM_TIMERINDEX_TIMER_A, &timebase_config);        
  41.   /* --------------------------------------------------------------------- */
  42.   /* TIMERA global configuration: cnt reset, sync, update, fault, burst... */
  43.   /* timer running in continuous mode, with deadtime enabled               */
  44.   /* --------------------------------------------------------------------- */
  45.   timer_config.DMARequests = HRTIM_TIM_DMA_NONE;
  46.   timer_config.DMASrcAddress = 0x0;
  47.   timer_config.DMADstAddress = 0x0;
  48.   timer_config.DMASize = 0x0;
  49.   timer_config.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
  50.   timer_config.StartOnSync = HRTIM_SYNCSTART_DISABLED;
  51.   timer_config.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
  52.   timer_config.DACSynchro = HRTIM_DACSYNC_NONE;
  53.   timer_config.PreloadEnable = HRTIM_PRELOAD_ENABLED;
  54.   timer_config.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
  55.   timer_config.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
  56.   timer_config.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
  57.   timer_config.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
  58.         if(interrupt == TRUE)
  59.         {
  60.                 timer_config.InterruptRequests = HRTIM_TIM_IT_REP;
  61.         }
  62.         else
  63.                 timer_config.InterruptRequests = HRTIM_TIM_IT_NONE;
  64.   timer_config.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
  65.         if(faultenable == TRUE)
  66.                 timer_config.FaultEnable = HRTIM_TIMFAULTENABLE_FAULT1;
  67.         else
  68.                 timer_config.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
  69.   timer_config.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
  70.   timer_config.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_ENABLED;
  71.   timer_config.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
  72.   timer_config.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE;
  73.   timer_config.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
  74.         HAL_HRTIM_WaveformTimerConfig(&hhrtimA, HRTIM_TIMERINDEX_TIMER_A, &timer_config);        
  75.         
  76.   /* Set compare registers for duty cycle on TA1 */
  77.   compare_config.CompareValue = 46080000*Initial_Duty/Initial_Fre;  /*duty cycle */
  78.   HAL_HRTIM_WaveformCompareConfig(&hhrtimA,
  79.                                   HRTIM_TIMERINDEX_TIMER_A,
  80.                                   HRTIM_COMPAREUNIT_1,
  81.                                   &compare_config);        
  82.         /* --------------------------------- */
  83.   /* TA1 and TA2 waveforms description */
  84.   /* --------------------------------- */
  85.   output_config_TA.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
  86.   output_config_TA.SetSource = HRTIM_OUTPUTSET_TIMPER;
  87.   output_config_TA.ResetSource  = HRTIM_OUTPUTRESET_TIMCMP1;
  88.   output_config_TA.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
  89.   output_config_TA.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  90.   output_config_TA.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_INACTIVE;
  91.   output_config_TA.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
  92.   output_config_TA.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
  93.   HAL_HRTIM_WaveformOutputConfig(&hhrtimA,
  94.                                  HRTIM_TIMERINDEX_TIMER_A,
  95.                                  HRTIM_OUTPUT_TA1,
  96.                                  &output_config_TA);
  97.         if(deadtime == TRUE)
  98.         {
  99.                 HAL_HRTIM_WaveformOutputConfig(&hhrtimA,
  100.                                                                                                                                                 HRTIM_TIMERINDEX_TIMER_A,
  101.                                                                                                                                                 HRTIM_OUTPUT_TA2,
  102.                                                                                                                                                 &output_config_TA);
  103.         }        
  104.         if(deadtime == TRUE)
  105.         {
  106.                 HRTIM_DeadTimeCfgTypeDef HRTIM_TIM_DeadTimeConfig;
  107.           /* Deadtime configuration for Timer A */
  108.                 HRTIM_TIM_DeadTimeConfig.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;
  109.                 HRTIM_TIM_DeadTimeConfig.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
  110.                 HRTIM_TIM_DeadTimeConfig.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_READONLY;
  111.                 HRTIM_TIM_DeadTimeConfig.FallingValue = risingtime*4096/1000;
  112.                 HRTIM_TIM_DeadTimeConfig.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL8;
  113.                 HRTIM_TIM_DeadTimeConfig.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE;
  114.                 HRTIM_TIM_DeadTimeConfig.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
  115.                 HRTIM_TIM_DeadTimeConfig.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_READONLY;
  116.                 HRTIM_TIM_DeadTimeConfig.RisingValue = fallingtime*4096/1000;
  117.                 HAL_HRTIM_DeadTimeConfig(&hhrtimA, HRTIM_TIMERINDEX_TIMER_A, &HRTIM_TIM_DeadTimeConfig);               
  118.         }
  119.         if(adenable == TRUE)
  120.         {
  121.                 HRTIM_ADCTriggerCfgTypeDef adc_trigger_config;
  122.                 /* ------------------------------------------- */
  123.                 /* ADC trigger intialization (with CMP4 event) */
  124.                 /* ------------------------------------------- */
  125.                 compare_config.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
  126.                 compare_config.AutoDelayedTimeout = 0;
  127.                 if(Initial_Duty >=50)
  128.                         compare_config.CompareValue = 46080000*Initial_Duty/Initial_Fre; /* Samples in middle of ON time */
  129.                 else                                                                                                                                                               
  130.                         compare_config.CompareValue = 23040000*(100+Initial_Duty)/Initial_Fre;
  131.                 HAL_HRTIM_WaveformCompareConfig(&hhrtimA,
  132.                                                                                                                                                 HRTIM_TIMERINDEX_TIMER_A,
  133.                                                                                                                                                 HRTIM_COMPAREUNIT_4,
  134.                                                                                                                                                 &compare_config);

  135.                 adc_trigger_config.Trigger = HRTIM_ADCTRIGGEREVENT24_TIMERA_CMP4;
  136.                 adc_trigger_config.UpdateSource = HRTIM_ADCTRIGGERUPDATE_TIMER_A;
  137.                 HAL_HRTIM_ADCTriggerConfig(&hhrtimA,
  138.                                                                                                                          HRTIM_ADCTRIGGER_2,
  139.                                                                                                                          &adc_trigger_config);
  140.         }
  141.         if(faultenable == TRUE)
  142.         {
  143.                 HRTIM_FaultCfgTypeDef fault_config;
  144.                 /* ---------------------*/
  145.                 /* FAULT initialization */
  146.                 /* ---------------------*/
  147.                 fault_config.Filter = HRTIM_FAULTFILTER_NONE;
  148.                 fault_config.Lock = HRTIM_FAULTLOCK_READWRITE;
  149.                 fault_config.Polarity = HRTIM_FAULTPOLARITY_LOW;
  150.                 fault_config.Source = HRTIM_FAULTSOURCE_DIGITALINPUT;
  151.                 HAL_HRTIM_FaultConfig(&hhrtimA,
  152.                                                                                                         HRTIM_FAULT_1,
  153.                                                                                                         &fault_config);

  154.                 HAL_HRTIM_FaultModeCtl(&hhrtimA,
  155.                                                                                                         HRTIM_FAULT_1,
  156.                                                                                                         HRTIM_FAULTMODECTL_ENABLED);
  157.         }
  158.         if(deadtime == TRUE)
  159.         {
  160.                 /* ---------------*/
  161.                 /* HRTIM start-up */
  162.                 /* ---------------*/
  163.                 /* Enable HRTIM's outputs TA1 and TA2 */
  164.                 /* Note: it is necessary to enable also GPIOs to have outputs functional */
  165.                 /* This must be done after HRTIM initialization */
  166.                 HAL_HRTIM_WaveformOutputStart(&hhrtimA, HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TA2);        
  167.         }
  168.         else
  169.                 HAL_HRTIM_WaveformOutputStart(&hhrtimA, HRTIM_OUTPUT_TA1);        
  170.         
  171.   /* Start both HRTIM TIMER A, B and D */
  172.         if(interrupt == TRUE)
  173.                 HAL_HRTIM_WaveformCounterStart_IT(&hhrtimA, HRTIM_TIMERID_TIMER_A);
  174.         else
  175.                 HAL_HRTIM_WaveformCounterStart(&hhrtimA, HRTIM_TIMERID_TIMER_A);
  176.         
  177.         
  178.         
  179.         GPIO_InitTypeDef GPIO_InitStruct;

  180.   /* Enable GPIOA clock for timer A outputs */
  181.   __HAL_RCC_GPIOA_CLK_ENABLE();

  182.   /* Configure HRTIM output: TA1 (PA8) */
  183.   GPIO_InitStruct.Pin = GPIO_PIN_8;
  184.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  185.   GPIO_InitStruct.Pull = GPIO_NOPULL;;  
  186.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;;  
  187.   GPIO_InitStruct.Alternate = GPIO_AF13_HRTIM1;
  188.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  189.         if(deadtime == TRUE)
  190.         {
  191.                 /* Configure HRTIM output: TA2 (PA9) */
  192.                 GPIO_InitStruct.Pin = GPIO_PIN_9;
  193.                 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  194.         }
  195. }
复制代码


本帖最后由 e3r4y6p0 于 2016-8-26 19:06 编辑

e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 19:07:03
  • 倒数5
 
/**
* @brief  This function calculates new duty order with PI.
* @param  None
* @retval New duty order
*/
int32_t PI_Buck(uint32_t RealVol,uint32_t SetVol,int32_t dec2hex(int32_t temp))
{
  /* Compute PI for Buck Mode */
  /* Every time the PI order sets extreme values then CTMax or CTMin are managed */
  int32_t seterr, pid_out;
  int32_t error;

  error = ((int32_t ) RealVol - (int32_t) SetVol);
        error = dec2hex(error);

  seterr = (-Kp * error) / 200;

  Int_term_Buck = Int_term_Buck + ((-Ki * error) / 200);

  if (Int_term_Buck > SAT_LIMIT)
  {
    Int_term_Buck = SAT_LIMIT;
  }
  if (Int_term_Buck < -(SAT_LIMIT))
  {
    Int_term_Buck = -(SAT_LIMIT);
  }
  pid_out = seterr + Int_term_Buck;
  pid_out += BUCK_PWM_PERIOD / 2;

  if (pid_out >= MAX_DUTY_A)
  {
    pid_out = MAX_DUTY_A;
    CTMax++;
  }
  else
  {
    if (CTMax != 0)
    {
      CTMax--;
    }
  }
  if (pid_out <= MIN_DUTY_A)
  {
    pid_out = MIN_DUTY_A;
    CTMin++;
  }
  else
  {
    if (CTMin != 0)
    {
      CTMin--;
    }
  }
  return  pid_out;
}


e3r4y6p0
  • 积分:114
  • |
  • 主题:2
  • |
  • 帖子:18
积分:114
LV2
本网技师
  • 2016-8-26 19:21:53
  • 倒数4
 
最后show一波美图





PeterXu
  • 积分:618
  • |
  • 主题:2
  • |
  • 帖子:39
积分:618
LV6
高级工程师
  • 2016-8-30 14:29:16
  • 倒数3
 
写的很详细,屏幕看着也很高大上啊
xkw1cn
  • 积分:131412
  • |
  • 主题:37517
  • |
  • 帖子:55626
积分:131412
版主
  • 2016-9-25 23:56:43
  • 倒数2
 
太棒了!工整、祥实!如果代码后适当加注就完美了!便于阅读
清风雪原
  • 积分:105
  • |
  • 主题:0
  • |
  • 帖子:1
积分:105
LV2
本网技师
最新回复
  • 2019-1-5 15:21:36
  • 倒数1
 
非常感谢分享,但是初始化程序里,死区上升时间与下降时间赋值是否反了?
或者是复制出差?
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号