STM32F334高分辨率定时器HRTIM1输出1对互补PWM波详细解析(使用CubeMx配置)HAL库代码

芯片型号:STM32F334C8T6
工作频率:72MHz
Flash:64KB
RAM:16KB
内核:ARM Cortex-M4(比M3内核浮点运算能力强好几倍!)
  这块芯片看着很像F103C8T6,就连引脚都一模一样,你完全可以直接买F103C8T6的最小系统板,然后只要把原MCU拆下来更换成F334C8T6即可!!如下图:

  这块F334是专门针对开关电源和高频信号处理的而研发的,内部集成了一个比以前的高级定时器TIM1/TIM8还要高级的定时器,即高分辨率定时器HRTIM,因为功能更强大所以配置起来也很麻烦,对于第一次使用它的人来说简直看得眼花缭乱。
  HRTIM的时钟频率可以通过倍频最高可以达到4.608GHz,F334的普通高级定时器TIM1最高才72MHz!!!超高的时钟频率意味着在需要产生高频PWM波的时候也能保持超高的精度,这正是数控开关电源中所需要的。举个例子:要求产生1MHz的PWM波时,如果使用72MHz的TIM1来做,不分频,则ARR的值只能设为72,也就是说 0 - 72 对应占空比 0 - 100% 显然精度太差了。如果使用4.608GHz的HRTIM来做,则ARR的值要设为4608,即 0 - 4608 对应 0 - 100% 的占空比,可见精度大幅度提高了。

注意:HRTIM1里面有TimerA、TimerB、TimerC、TimerD一共4个子定时器,每个子定时器2个输出通道。还有一个TimerE无输出通道的。。。。。

子定时器的重装载寄存器ARR改名了,叫做PER;比较值寄存器CCR也改名了,叫做CMP。


接下来是STM32CubeMx中配置HRTIM产生一对互补PWM波输出的详细步骤:

 

这里提一下,关于填数字的选项中默认是十六进制的,可以改成十进制显示!

 

死区的配置默认是以通道1为设置对象的,死区效果图:

如果更改死区时间:

放大波形查看测量死区:

 

图形化理解:

到这一步已经配置完毕,可以生成代码,然后在主函数的死循环前加入开启输出的函数:

HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1|HRTIM_OUTPUT_TA2); //通道打开
HAL_HRTIM_WaveformCounterStart(&hhrtim1, HRTIM_TIMERID_TIMER_A); //开启子定时器A

编译下载到板子上运行,示波器观测输出波形

如果想修改PWM的频率或者占空比可以:

hhrtim1.Instance->sTimerxRegs[0].PERxR = 50000;//通过修改重装载值PER,从而修改PWM的频率
hhrtim1.Instance->sTimerxRegs[0].CMP1xR = 11504;//通过修改比较值CMP,从而修改占空比

//sTimerxRegs[0]---->TimerA
//sTimerxRegs[1]---->TimerB
//sTimerxRegs[2]---->TimerC
//sTimerxRegs[3]---->TimerD
//sTimerxRegs[4]---->TimerE

 

### 使用 STM32 HRTIM 模块生成 PWM 输出 STM32高分辨率定时器 (HRTIM) 提供了强大的功能来生成精确的 PWM 形。为了配置 HRTIM输出 PWM 信号,需要初始化并设置多个参数。 #### 初始化 HRTIM 外设 首先,在使用 HRTIM 功能之前,需确保外设已被正确初始化: ```c // 定义全局变量用于存储 HRTIM 句柄 HRTIM_HandleTypeDef hhrtim1; void MX_HRTIM1_Init(void) { // 配置 HRTIM 主时钟源和其他基本属性... } ``` 此部分的具体实现应参照 STMicroelectronics 的官方文档以获得最详尽指导[^1]。 #### 设置 PWM 参数 接着定义要使用的通道以及期望的工作模式——对于 PWM 应用来说通常是边缘对齐或中心对齐方式之一。这里展示了一个简单的例子,其中 E 和 F 计数器被用来创建两个独立但同步工作的 PWM 输出。 ```c static void HRTIM_PWM_Configuration(void) { /* Timer E Configuration */ sTimerCfg.Period = 0xFFFF; sTimerCfg.RepetitionCounter = 0; if(HAL_HRTIM_TimeBaseConfig(&hhrtim1, HRTIM_TIMERID_TIMER_E, &sTimerCfg) != HAL_OK){ Error_Handler(); } /* Output Channel TE1 and TE2 configuration */ sOutputChannel.Polarity = HRTIM_OUTPUTPOLARITY_HIGH; sOutputChannel.SetResetFactor = HRTIM_RESETFACTOR_REPETITION; sOutputChannel.IdleLevel = HRTIM_OCIDLELEVEL_ACTIVE; // Set duty cycle to 50% sCompareUnit.CompareValue = 0x7FFF; if(HAL_HRTIM_OC_Config(&hhrtim1, HRTIM_TIMERID_TIMER_E, HRTIM_CHANNEL_1, &sCompareUnit) != HAL_OK || HAL_HRTIM_OC_Config(&hhrtim1, HRTIM_TIMERID_TIMER_E, HRTIM_CHANNEL_2, &sCompareUnit) != HAL_OK){ Error_Handler(); } } ``` 上述代码片段展示了如何设定计数值周期长度 (`Period`) 和重复次数 (`RepetitionCounter`), 并指定了比较单元中的占空比(`CompareValue`). 这里假设我们想要得到一个大约 50% 占空比的方. 最后一步就是启动这些已配置好的输出: ```c HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TE1 | HRTIM_OUTPUT_TE2); ``` 以上即为利用 STM32 HRTIM 实现 PWM 输出的基本流程概述[^3].
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值