欢迎光临散文网 会员登陆 & 注册

STM32H7高精度定时器(HRTIM)的移相配置

2023-07-26 12:50 作者:油炸糖糕  | 我要投稿

参考自AN4539的多相buck,可以在F3的固件包中找到例程代码

由于缺少独立的倍频器,H7最高仅支持主频频率的HRTIM,对于H750而言是480M

一、时钟配置

首先在RCC中将HSE选好,并调整H7的版本,Y版最高400M,V版最高480M

Y版可以将Power Regulator Voltage Scale调整至0,V版只能调整至1



接下来先把HRTIM勾选上,我这里需要4路PWM,主时钟用来移相,其他四个时钟用来输出


接下来进时钟树,将PLL达到HSE上(CSI RC也行,不过正常做东西都有外部时钟吧),System Clock Mux打到PLL上,系统时钟打个480让cube自己搜索,搜索完后拉到下面调整一下HRTIM Clock Mux


二、HRTIM配置

stm32的HRTIM模块下面有6个独立的时钟,分别是Master和A、B、C、D、E五个slave时钟,每个时钟下面有4个比较器。其中,Master可以用来产生trigger启动其他的时钟

配置移相的基本思路就是Master用来控制移相角度,在合适的时间通过比较器产生trigger启动对应的slave时钟,slave通过自己的比较器产生脉宽可调的PWM

简单来说就是Master的比较器控制移相角,其他时钟的比较器控制波形形状,频率由Master确定,移相角可以做到±180°


首先调整Master:

  1. HRTIM的频率,F334和G474都能在主时钟的基础上倍频,H7不行,只能调整到480M上

  2. Master时钟的周期,决定了开关频率,我这里配置的500kHz,在这个频率下PWM分辨率约10bits

  3. Repetition Counter用来控制中断频率,0x00意味着每个周期进一次中断

  4. Preload Enable需要enable

  5. Repetition Update也要enable

  6. Interrupt Requests Sources数量调整到1,并且调整中断源

  7. 需要几路移相就开几个Compare Unit


Timer A~E的配置都类似,这里以A为例:

  1. 时钟和周期与Master一致,其实周期随便配置,配成0xFFFF都没问题

  2. 这里要改成单次触发模式,否则在调整移相角时占空比会出问题

  3. Preload和Repetition Update和Master一样

  4. 这里一定要打开,将寄存器更新延后到了reset时刻

  5. Reset Trigger要改成Master Timer Compare event,这个和前面配置的Master Cpmpare Unit是对应的

  6. Compare Unit用于控制波形,我这里是占空比50%的半桥,所以前面Dead Time Insertion Mode改成了Deadtime is inserted,这里只需要使用一个Compare Unit

  7. 死区按照自己想法设置

  8. 输出配置,我这里配置的是Timer A被Master的trigger reset的同时输出拉高,并在Compare Unit 1处置低,这样占空比刚好是50%(0->480)


最后把Master的全局中断打开


三、初始化代码

HRTIM初始化完成后需要手动打开输出和Counter

   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA1);
   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA2);

   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TB1);
   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TB2);

   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TC1);
   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TC2);

   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TD1);
   HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TD2);

   HAL_HRTIM_WaveformCountStart_IT(&hhrtim, HRTIM_TIMERID_MASTER | HRTIM_TIMERID_TIMER_A | HRTIM_TIMERID_TIMER_B |
                                            HRTIM_TIMERID_TIMER_C | HRTIM_TIMERID_TIMER_D);

中断回调函数是void HAL_HRTIM_RepetitionEventCallback(HRTIM_HandleTypeDef *hhrtim,uint32_t TimerIdx)

占空比与周期的调节可以通过直接写寄存器来完成,也可以通过HAL库提供的宏来实现

   //调整周期
   __HAL_HRTIM_SETPERIOD(&hhrtim, HRTIM_TIMERINDEX_MASTER, SPS_BASE_PERIOD + delta_tick / 2);
   //调整相位
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_1, phaseAB);
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_2, phaseAB);
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_3, phaseCD);
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_MASTER, HRTIM_COMPAREUNIT_4, phaseCD);
   //调整占空比
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, phi_tick);
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_B, HRTIM_COMPAREUNIT_1, phi_tick);
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_1, SPS_BASE_PERIOD / 2);
   __HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_1, SPS_BASE_PERIOD / 2);

这套配置默认使用了缓冲寄存器(影子寄存器),Master寄存器的更新时刻是repetition事件,slave寄存器的更新时刻是reset时刻

密麻麻的b站什么烂编辑器,连个代码格式化都没有

STM32H7高精度定时器(HRTIM)的移相配置的评论 (共 条)

分享到微博请遵守国家法律