2020.08.09更新
PS:因为手中有其他项目,最近才有空搞搞这个拓扑,这个周末熟悉了STM32的HRTIM模块,配合官方的应用手册、HAL库和CubeMX代码生成工具,总算将功率回路跑起来了,下面上ST的应用资料和库中例程截图
dm00121475-hrtim-cookbook-stmicroelectronics.pdf
(911.33 KB, 下载次数: 128)
这些例子对于从事数字电源的工程师来说具有一定的参考价值,感兴趣的朋友可以下载来看看
包的名字就是以V1.11.0结尾的这行字母
HRTIM与一般的PWM模块不同的是
1.它具有较高的主频,在F334中可达144MHz;
2.可将PWM的分辨率再乘以32;
这样就可以得到很高的分辨率,对电压和电流的精细控制相当出色;
3.由于功能强大,内部的功能模块也挺多,因此配置起来较为复杂,可结合CubeMX和官方示例轻松配置;下面是我的配置代码
//从结构体部分可以看出,主要功能配置模块有5项,分别为时基,时钟属性设置,死区设置,输出设置和比较触发设置
HRTIM_TimeBaseCfgTypeDef pTimeBaseCfg = {0};
HRTIM_TimerCfgTypeDef pTimerCfg = {0};
HRTIM_DeadTimeCfgTypeDef pDeadTimeCfg = {0};
HRTIM_OutputCfgTypeDef pOutputCfg = {0};
HRTIM_CompareCfgTypeDef pCompareCfg = {0};
hhrtim1.Instance = HRTIM1;
hhrtim1.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
hhrtim1.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
if (HAL_HRTIM_Init(&hhrtim1) != HAL_OK)
{
Error_Handler();
}
if (HAL_HRTIM_DLLCalibrationStart(&hhrtim1, HRTIM_CALIBRATIONRATE_14) != HAL_OK)
{
Error_Handler();
}
if (HAL_HRTIM_PollForDLLCalibration(&hhrtim1, 100) != HAL_OK)
{
Error_Handler();
}
//1.时基部分确定时钟周期和运行模式,这里先设置频率为100kHz
pTimeBaseCfg.Period = 46080; //100kHz
pTimeBaseCfg.RepetitionCounter = 0x00;
pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;
if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pTimeBaseCfg) != HAL_OK)
{
Error_Handler();
}
if (HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pTimeBaseCfg) != HAL_OK)
{
Error_Handler();
}
//2.设置定时器的其他参数(主要为开关选通量),包括IT请求,DMA请求,HalfMode, 同步模式,预加载,门刷新,触发模式,重复更新模式, 推挽使能,错误处理使能,死区使能,触发及更新功能的配置
pTimerCfg.InterruptRequests = HRTIM_TIM_IT_NONE;
pTimerCfg.DMARequests = HRTIM_TIM_DMA_NONE;
pTimerCfg.DMASrcAddress = 0x0000;
pTimerCfg.DMADstAddress = 0x0000;
pTimerCfg.DMASize = 0x0;
pTimerCfg.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
pTimerCfg.StartOnSync = HRTIM_SYNCSTART_DISABLED;
pTimerCfg.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
pTimerCfg.DACSynchro = HRTIM_DACSYNC_NONE;
pTimerCfg.PreloadEnable = HRTIM_PRELOAD_ENABLED;
pTimerCfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
pTimerCfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
pTimerCfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
pTimerCfg.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
pTimerCfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
pTimerCfg.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
pTimerCfg.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_ENABLED;
pTimerCfg.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
pTimerCfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE;
pTimerCfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
pTimerCfg.ResetUpdate = HRTIM_TIMRESETTRIGGER_NONE;
if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pTimerCfg) != HAL_OK)
{
Error_Handler();
}
if (HAL_HRTIM_WaveformTimerConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pTimerCfg) != HAL_OK)
{
Error_Handler();
}
//3.设置死区时间,针对同步整流应用和推挽型应用,单输出不需要
pDeadTimeCfg.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL8;
pDeadTimeCfg.RisingValue = 200;
pDeadTimeCfg.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
pDeadTimeCfg.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE;
pDeadTimeCfg.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_READONLY;
pDeadTimeCfg.FallingValue = 200;
pDeadTimeCfg.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
pDeadTimeCfg.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;
pDeadTimeCfg.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_READONLY;
if (HAL_HRTIM_DeadTimeConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, &pDeadTimeCfg) != HAL_OK)
{
Error_Handler();
}
if (HAL_HRTIM_DeadTimeConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, &pDeadTimeCfg) != HAL_OK)
{
Error_Handler();
}
//4.输出极性和输出置位与复位事件,可有多个,在此只用到一个
pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
pOutputCfg.SetSource = HRTIM_OUTPUTRESET_TIMCMP1;
pOutputCfg.ResetSource = HRTIM_OUTPUTSET_TIMPER;
pOutputCfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
pOutputCfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
pOutputCfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
pOutputCfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
pOutputCfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &pOutputCfg) != HAL_OK)
{
Error_Handler();
}
// pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
//// pOutputCfg.SetSource = HRTIM_OUTPUTSET_TIMPER;
//// pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
// pOutputCfg.SetSource = HRTIM_OUTPUTRESET_TIMCMP1;
// pOutputCfg.ResetSource = HRTIM_OUTPUTSET_TIMPER;
if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1, &pOutputCfg) != HAL_OK)
{
Error_Handler();
}
// pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
// pOutputCfg.SetSource = HRTIM_OUTPUTSET_NONE;
// pOutputCfg.ResetSource = HRTIM_OUTPUTRESET_NONE;
if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA2, &pOutputCfg) != HAL_OK)
{
Error_Handler();
}
// pOutputCfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
// pOutputCfg.SetSource = HRTIM_OUTPUTRESET_TIMCMP1;
// pOutputCfg.ResetSource = HRTIM_OUTPUTSET_TIMPER;
if (HAL_HRTIM_WaveformOutputConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB2, &pOutputCfg) != HAL_OK)
{
Error_Handler();
}
//5.配置输出占空比,本次试验Buck桥的占空比为97%,Boost桥为50%
pCompareCfg.CompareValue = (int)46080*0.97;
if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
{
Error_Handler();
}
pCompareCfg.CompareValue = 46080/2;
if (HAL_HRTIM_WaveformCompareConfig(&hhrtim1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, &pCompareCfg) != HAL_OK)
{
Error_Handler();
}
//6.配置IO
HAL_HRTIM_MspPostInit(&hhrtim1);
//7.使能波形输出
/* This must be done after HRTIM initialization */
HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TA2 | HRTIM_OUTPUT_TB1 | HRTIM_OUTPUT_TB2);
//8.开启定时器
HAL_HRTIM_WaveformCountStart(&hhrtim1, HRTIM_TIMERID_TIMER_A | HRTIM_TIMERID_TIMER_B);
以上为HRTIM的配置文件,在IO和时钟正确配置的情况下,可输出两路互补的PWM, 即同步Buck和同步boost的驱动信号;
下图为程序加载到板上进行开环带载运行测试的情况,空载时没有过零点检测,所以空载电流较大;
124W输出功率板基本没有发热,倒是输入线很烫,线损较大。欢迎各位看官前来拍砖