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

开源一个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

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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