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

开源一个F334的多功能数控电源,基于HAL库编写,手头有一... 精华  

[复制链接]
长大养猪怪我咯 发布时间:2016-8-23 15:18
本帖最后由 长大养猪怪我咯 于 2016-8-23 15:25 编辑

QQ截图20160823115349.jpg PCB3D视角
1471607331836.jpg
连续调压
1471607345106.jpg
过流保护
1471607354458.jpg
保护恢复



从最基本的说起吧,DC-DC的变换电路有很多种,线性电源、开关电源、电荷泵,线性电源大家比较熟悉的应该就是78XX系列的芯片了,电荷泵主要用在小电流的应用中,我们也不加讨论。主要讲讲开关电源,我呢也是一个先学先卖的人,就对照资料啥的随便介绍下拉,权当是开源本设计前的一点准备工作。


开关稳压器的工作原理,就是通过控制电路来控制开关器件的通断,配合负反馈完成稳压,跟线性稳压比起来,具有效率高体积小的特点,但是输出没有线性电源稳定。开关电源的基本结构有很多种,包括BUCK、BOOST、BUCK-BOOST、CUK等非隔离式的DCDC变换器,也有Flyback、LLC等隔离式的DCDC变换器。
开源的这个设计,是以buck拓扑为核心,配合F334的高级定时器的PWM、PI算法,实现的一个很简单的闭环控制,设计输入电压60V时,输出电压可调,输出电流最大5A,输出最大功率在200W左右。


QQ截图20160823133011.jpg
系统框图如上,首先说明我这款电压是从HP电源的基础上增加人机界面和改善栅极驱动做的,也是征得了原作者的同意,在此表示感谢,借这个机会分享下自己的心得。
QQ截图20160823133445.jpg
BUCK电路的基本结构如上图所示,相信大家基本或多或少对这个结构都有一定的了解。简单说下,S1闭合时,输入的通路为S1到L1到电容C2以及负载,S2关断时,L1中储存的能量经过D1形成新的回路,如此循环往复,在此过程中实现能量的转移,输出与输入电压的比值为占空比D。

同步BUCK,就是采用导通电阻特别低的mosfet来代替续流二极管,以此来提高整个拓扑的工作效率。基本图如下:
QQ截图20160823134111.jpg
在有了以上了解的基础上,开始本设计的电路设计,亦即在同步buck的基本拓扑之上展开设计,最终设计如下:
QQ截图20160823134409.jpg

图中采用了无电解电容设计,这样虽然纹波可能会大一点,但是响应的体积却小了很多,实际测试中,纹波在100MV以下。电感和电容的取值有响应公式可以推到,这里不多赘述,直接给大家提供一个小工具,输入参数就可以计算出结果的小工具:
BOOST电感、BUKC电感、逆变电容、电感计算表.rar (8.36 KB, 下载次数: 537)

评分

参与人数 5 ST金币 +37 收起 理由
g921002 + 8 神马都是浮云
any012 + 8 很给力!
wofei1314 + 10 神马都是浮云
sky7 + 1
zero99 + 10 很给力!

查看全部评分

4 收藏 37 评论131 发布时间:2016-8-23 15:18

举报

131个回答
长大养猪怪我咯 回答时间:2016-8-23 15:26:18
这里给出配置的代码和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.   * [url=home.php?mod=space&uid=159083]@brief[/url]  用于配置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. }
复制代码
长大养猪怪我咯 回答时间:2016-8-23 15:26:36
  1. /**
  2. * @brief  This function calculates new duty order with PI.
  3. * @param  None
  4. * @retval New duty order
  5. */
  6. int32_t PI_Buck(uint32_t RealVol,uint32_t SetVol,int32_t dec2hex(int32_t temp))
  7. {
  8.   /* Compute PI for Buck Mode */
  9.   /* Every time the PI order sets extreme values then CTMax or CTMin are managed */
  10.   int32_t seterr, pid_out;
  11.   int32_t error;
  12.         
  13.   error = ((int32_t ) RealVol - (int32_t) SetVol);
  14.         error = dec2hex(error);
  15.         
  16.   seterr = (-Kp * error) / 200;

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

  18.   if (Int_term_Buck > SAT_LIMIT)
  19.   {
  20.     Int_term_Buck = SAT_LIMIT;
  21.   }
  22.   if (Int_term_Buck < -(SAT_LIMIT))
  23.   {
  24.     Int_term_Buck = -(SAT_LIMIT);
  25.   }
  26.   pid_out = seterr + Int_term_Buck;
  27.   pid_out += BUCK_PWM_PERIOD / 2;

  28.   if (pid_out >= MAX_DUTY_A)
  29.   {
  30.     pid_out = MAX_DUTY_A;
  31.     CTMax++;
  32.   }
  33.   else
  34.   {
  35.     if (CTMax != 0)
  36.     {
  37.       CTMax--;
  38.     }
  39.   }
  40.   if (pid_out <= MIN_DUTY_A)
  41.   {
  42.     pid_out = MIN_DUTY_A;
  43.     CTMin++;
  44.   }
  45.   else
  46.   {
  47.     if (CTMin != 0)
  48.     {
  49.       CTMin--;
  50.     }
  51.   }
  52.   return  pid_out;
  53. }
复制代码
长大养猪怪我咯 回答时间:2016-8-23 15:27:12
给出原理图和工程文件: mybuck2.0.rar (857.63 KB, 下载次数: 1184)
长大养猪怪我咯 回答时间:2016-8-23 21:33:35
好冷清,没人看呀
无名-空幻 回答时间:2016-8-23 22:29:47
已经看到,感谢分享
anny 回答时间:2016-8-23 22:53:41
必须支持
disheng4688 回答时间:2016-8-24 08:13:08
支持,太赞了。收藏了。
stary666 回答时间:2016-8-24 09:42:47
zhangxu56726 回答时间:2016-8-24 09:46:47
好好好好好好好好好好好好好好好好好好好好v
关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版