如何利用STM32G474芯片的高精度定时器实现两对互补输出

有人利用stm32g474芯片的高精度定时器实现两对互补输出,即用到tima和timb两个定时单元分别输出两对互补信号。
可是他发现两个定时器单元输出的同频pwm波形存在着明显的相位差,就像下面的截图一样。
但是他希望二者的输出完全同步且无相位差,那有没有办法做到呢?
这是可以的。我们让hrtim的定时单元基于某个触发事件来同步启动。对于hrtim来说,可以利用外部触发输入信号或通用定时器tim1的触发输出信号来同步hrtim各定时单元的启动。这里就如何使用tim1的触发输出作为hrtim的同步信号让hrtim的定时器单元同步启动做下简单介绍。
hrtim的各个单元间的同步操作是通过hrtim里的master timer进行管理的,所以要实现hrtim各单元间的同步就必须启用master timer,显然,除了启用tima/timb外,还得使能master timer。
关于同步配置可以参考下面截图:
这里对master timer的配置主要是开启它,让它能工作,能管理同步事件即可。
经过上面的配置,再对tima/timb做“同步事件启动定时器的配置”后,二者就能做到同步启动了,加上二者配置了相同的per周期值,这样就可以输出如下图所示的同步同相信号了。
如果说除了tima/timb的输出保持同步同相外,还希望中途不时修改周期及占空比且不破坏同相,那又怎么办呢? 即如何在输出频率和占空比可调的情况下仍然保持着两个定时器的输出同步呢?
我们可以开启tima或timb的更新中断,在其中任意一个定时器的更新中断服务程序里同时修改两个定时器的计数周期值和比较值,并开启预装功能,让参数在下一个溢出更新事件到来时生效,这样就可以做到既能调整定时器的周期值和比较值,又能保证二者的输出同步。
下面简单介绍下实现过程。
master timer的配置没啥特别的,主要是让它工作起来,能让hrtim的定时单元的同步起作用。tima和timb的配置这里基本一样,二者的配置差别主要体现在比较值不一样而已。
来看看tima的相关配置。重点留意下面截图中下划线标识的地方。主要配置内容包括设置per、cmp1的参数,开启同步启动、使能预装功能、启用tim更新中断,对tima-ta1/ta2的输出进行配置。
上面是tima的基本配置,因为timb的配置跟tima的相比,除了cmp值不同外,其它基本一样,这里就不重复贴图了。
配置完成后,生成hal类初始化代码。然后添加如下用户代码。
hal_hrtim_waveformcountstart_it(&hhrtim1,hrtim_timerid_timer_a);//使能tima
hal_hrtim_waveformoutputstart(&hhrtim1 , hrtim_output_ta1);
hal_hrtim_waveformoutputstart(&hhrtim1 , hrtim_output_ta2);
hal_hrtim_waveformcountstart_it(&hhrtim1, hrtim_timerid_timer_b); //使能timb
hal_hrtim_waveformoutputstart(&hhrtim1 , hrtim_output_tb1);
hal_hrtim_waveformoutputstart(&hhrtim1 , hrtim_output_tb2);
hal_tim_base_start(&htim1);//让tim1产生同步触发信号
上面的黄色代码行,基本功能就是开启tim1,它的trgo输出信号作为hrtim-tima/timb的同步启动信号。如果没有这行代码,此时的tima/timb是不会工作的。
我在tima的更新中断服务程序里修改tima/timb的per/cmp的值,查看输出结果。
extern uint16_t interrupt_count;
#define hrtimreg (hrtim1-》stimerxregs)
void hrtim1_tima_irqhandler(void)
{
/*user code begin hrtim1_tima_irqn 0 */
/*user code end hrtim1_tima_irqn 0 */
hal_hrtim_irqhandler(&hhrtim1,hrtim_timerindex_timer_a);
/*user code begin hrtim1_tima_irqn 1 */
interrupt_count++;
if(interrupt_count 《 20000)
{
hrtimreg[hrtim_timerindex_timer_a].perxr= 0xa000;
hrtimreg[hrtim_timerindex_timer_a].cmp1xr= 0x2000;
hrtimreg[hrtim_timerindex_timer_b].perxr= 0xa000;
hrtimreg[hrtim_timerindex_timer_b].cmp1xr= 0x3000;
}
else if(interrupt_count 《 40000)
{
hrtimreg[hrtim_timerindex_timer_a].perxr= 0x9000;
hrtimreg[hrtim_timerindex_timer_a].cmp1xr= 0x4000;
hrtimreg[hrtim_timerindex_timer_b].perxr= 0x9000;
hrtimreg[hrtim_timerindex_timer_b].cmp1xr= 0x5000;
}
else
{
hrtimreg[hrtim_timerindex_timer_a].perxr= 0x7000;
hrtimreg[hrtim_timerindex_timer_a].cmp1xr= 0x2000;
hrtimreg[hrtim_timerindex_timer_b].perxr= 0x7000;
hrtimreg[hrtim_timerindex_timer_b].cmp1xr= 0x5000;
}
}
经过测试,即使修改了两个定时器单元的计时周期和占空比,二者的同步一直都可以保持得很好。关于这个话题就交流到这里,分享以上内容供有需要的人士参考,祝君好运!


看完区别再说磁环电感和贴片电感哪个好
语音芯片方案说明 会喊你加油的跑步机
What is NI Ultiboard?什么是Ultibo
低噪声放大器设计的宽带实现和负反馈原理
水面蒸发传感器参数功能介绍
如何利用STM32G474芯片的高精度定时器实现两对互补输出
告别特殊摄像机的动作捕捉服
【服务器数据恢复】raid5掉线2块硬盘后强制上线失败的数据恢复案例
重庆东微电子推出高性能抗射频干扰MEMS硅麦放大器芯片
康耐视推出全新升级的In-Sight 7905V系列条码验证器
不用重新装修 几百元内轻松玩转全屋智能照明系统-geekpad智慧屏智能开关
基于高性能16位定点数字信号处理器实现心电监护系统的设计
儿童玩具音乐芯片方案,6通道midi播放语音芯片,WT588F02B-8S
云途车规MCU软件开发环境搭建及使用详解
一文深度了解Malloy Aeronautics Hoverbike
酷派cool1拆机图解 做工在目前千元机里面可以排在前列
高清视频大潮汹涌 你能HOLD住么?
欧盟诉华为中兴 商务部首次回应
IBM与3M开发3D封装 芯片提速1000倍
pytorch用来干嘛的