源码
HRTIM
产品概况
继续上次的写
# 二、中断服务函数
## HRTIM1_TIMB_IRQHandler
```c
// **
// **********************************************************
// * @函数:void HRTIM1_TIMA_IRQHandler(void)
// * @描述:HRTIM1_TIMA中断服务函数
// * @输入:无
// * @返回:无
// * @作者:何。小P
// * @版本:V1.0
// **********************************************************
// */
void HRTIM1_TIMB_IRQHandler(void)
{
api_EftestEnter( 0 );
dp_BuckBoostCmcCtrl( );
api_EftestExit( 0 );
HRTIM_ClearITPendingBit( HRTIM1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_TIM_FLAG_REP); //清楚中断标志位
}
```
这玩意没啥说的,api_EftestEnter和api_EftestExit是对dp_BuckBoostCmcCtrl函数执行时间的检查,检测代码执行效率。
## dp_BuckBoostCmcCtrl
![Code](https://IMG_URL_REPLACE/bbsimages/201912/57017df4041f9c885e6fc110aa4bb716.png "Code")
1.首先是一些内部使用的变量的静态定义,循环变量,闭环模式,错误计数
2.然后是将新获得的ADC采样值压入16长度的数组中进行平均值滑动滤波大法
这种滤波方法实现简单,就是消耗性能,占内存,有相位延迟,并不能消除干扰,只是抹平不明显而已,对于2的指数长度的整型变量可以用移位操作代替除法,速度能快一点,有想法的可以使用更好的滤波算法,并且采样频率为PID频率的8倍,也给滤波算法留有很大的空间。
3.将滑动滤波的结果换算为实际物理值
4.异常状态计数及保护
如果出现异常,清除PID缓存,关闭PWM输出,此时电感前后的MOS半桥均处于上管关断,下管导通的状态,相当于H桥电机驱动的刹车模式,彻底关闭输出,释放电感储能。
5.环路模式选择
一个switch选择是电压环还是电流环,闭环模式切换条件在break之前的一行,电流环下如果输出电压超过设置电压,进行模式切换,下一次将进入电压环,说是双环,实际一个时刻只有一个环在运行。
6.PID闭环计算
先对期望电压或电流进行限幅,保证在板子承受范围内,然后进行PID计算,并将PID输出与另一个环同步,PID使用的是增量式PID
7.更新PWM占空比
使用dr_PwmUpdate函数更新占空比
最后还有一个default,一般情况不会进去,算是一个保险措施。
## dr_PwmUpdate
```c
// **
// **********************************************************
// * @函数:void dr_PwmUpdate(uint32 CompareValue)
// * @描述:pwm占空比更新
// * @输入:比较值(占空比)
// * @返回:无
// * @作者:何。小P
// * @版本:V1.1
// **********************************************************
// *
void dr_PwmUpdate(uint32 CompareValue)
{
uint32 buck_duty,boost_duty;
uint32 PWM_PER_0_5 = 0.5f * DP_PWM_PER;
if(CompareValue>1.70f*DP_PWM_PER)CompareValue = 1.70f*DP_PWM_PER; //限制最大占空比
if(CompareValue<0.05f*DP_PWM_PER)CompareValue = 0.05f*DP_PWM_PER; //限制最小占空比
if(CompareValue;0.9f*DP_PWM_PER) //当总占空比大于90%时,进入BOOST模式。
boost_duty = CompareValue/2 - 0.8f*PWM_PER_0_5;//设置boost的占空比,并且模拟中心对称的PWM。注意要减去buck_duty的占空比: 0.8*PWM_PER_0_5
else
boost_duty = 0.05f * DP_PWM_PER; //当总占空比不大于90%时,进入BUCK模式,boost_duty给固定占空比
if(CompareValue>0.9f*DP_PWM_PER)
buck_duty = 0.9f * PWM_PER_0_5; //当总占空比大于90%时,进入BOOST模式,buck_duty给固定占空比
else
buck_duty = CompareValue/2; //设置buck的占空比,并且模拟中心对称的PWM。
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_1, PWM_PER_0_5 - buck_duty);//PWM置1比较器,模拟中心对称的PWM,以PWM_PER_0_5为中心
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_4, PWM_PER_0_5 + buck_duty);//PWM置0比较器,比如 (400-50)与(400+50)的中心点为400
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_2, PWM_PER_0_5 + boost_duty);
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_3, PWM_PER_0_5 - boost_duty);
}
```
这个函数的注释非常全面,我就不多解释了,这个函数生成的波形上管不会100%占空比,留有MOS驱动自举电容充电的时间,buck和boost模式无缝切换,带有输入限幅
原创作品,未经权利人授权禁止转载。详情见转载须知。