0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

单片机 来源:茶话MC 作者:Miler 2021-08-23 11:55 次阅读

有人利用STM32G474芯片高精度定时器实现两对互补输出,即用到TIMA和TIMB两个定时单元分别输出两对互补信号

可是他发现两个定时器单元输出的同频PWM波形存在着明显的相位差,就像下面的截图一样。

0440eed8-02a4-11ec-9bcf-12bb97331649.png

但是他希望二者的输出完全同步且无相位差,那有没有办法做到呢?

这是可以的。我们让HRTIM的定时单元基于某个触发事件来同步启动。对于HRTIM来说,可以利用外部触发输入信号或通用定时器TIM1的触发输出信号来同步HRTIM各定时单元的启动。这里就如何使用TIM1的触发输出作为HRTIM的同步信号让HRTIM的定时器单元同步启动做下简单介绍。

HRTIM的各个单元间的同步操作是通过HRTIM里的Master TIMER进行管理的,所以要实现HRTIM各单元间的同步就必须启用Master TIMER,显然,除了启用TIMA/TIMB外,还得使能Master TIMER。

关于同步配置可以参考下面截图:

0471b360-02a4-11ec-9bcf-12bb97331649.png

这里对Master TIMER的配置主要是开启它,让它能工作,能管理同步事件即可。

经过上面的配置,再对TIMA/TIMB做“同步事件启动定时器的配置”后,二者就能做到同步启动了,加上二者配置了相同的PER周期值,这样就可以输出如下图所示的同步同相信号了。

04c8d3a2-02a4-11ec-9bcf-12bb97331649.png

如果说除了TIMA/TIMB的输出保持同步同相外,还希望中途不时修改周期及占空比且不破坏同相,那又怎么办呢? 即如何在输出频率和占空比可调的情况下仍然保持着两个定时器的输出同步呢?

我们可以开启TIMA或TIMB的更新中断,在其中任意一个定时器的更新中断服务程序里同时修改两个定时器的计数周期值和比较值,并开启预装功能,让参数在下一个溢出更新事件到来时生效,这样就可以做到既能调整定时器的周期值和比较值,又能保证二者的输出同步。

下面简单介绍下实现过程。

Master TIMER的配置没啥特别的,主要是让它工作起来,能让HRTIM的定时单元的同步起作用。TIMA和TIMB的配置这里基本一样,二者的配置差别主要体现在比较值不一样而已。

来看看TIMA的相关配置。重点留意下面截图中下划线标识的地方。主要配置内容包括设置PER、CMP1的参数,开启同步启动、使能预装功能、启用TIM更新中断,对TIMA-TA1/TA2的输出进行配置。

0504d032-02a4-11ec-9bcf-12bb97331649.png

上面是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;

}

}

经过测试,即使修改了两个定时器单元的计时周期和占空比,二者的同步一直都可以保持得很好。关于这个话题就交流到这里,分享以上内容供有需要的人士参考,祝君好运!

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114435
  • CMP
    CMP
    +关注

    关注

    6

    文章

    141

    浏览量

    25936
  • Tim
    Tim
    +关注

    关注

    0

    文章

    81

    浏览量

    17873

原文标题:STM32高精度定时器定时单元间的同步问题

文章出处:【微信号:aidanpianji,微信公众号:单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在MSP430™上实现内置振荡高精度定时器

    电子发烧友网站提供《如何在MSP430™上实现内置振荡高精度定时器.pdf》资料免费下载
    发表于 09-14 11:10 0次下载
    如何在MSP430™上<b class='flag-5'>实现</b>内置振荡<b class='flag-5'>器</b>的<b class='flag-5'>高精度</b><b class='flag-5'>定时器</b>

    stm32g474 qspi不进dma中断是怎么回事?

    stm32g474 qspi 不进dma中断
    发表于 09-13 07:10

    stm32g474的开发板很烫的原因?

    stm32g474的开发板很烫
    发表于 07-24 06:59

    STM32G4系列芯片定时器的延时输出问题

    有人使用STM32G4系列芯片内部的多个定时器做PWM输出输出频率一样,占空比也一样,均为50%。可是,当他中途调整各个
    的头像 发表于 07-01 09:45 1417次阅读
    <b class='flag-5'>STM32G</b>4系列<b class='flag-5'>芯片</b><b class='flag-5'>定时器</b>的延时<b class='flag-5'>输出</b>问题

    基于STM32G474的电机控制,如何在sdk上配置使用spwm波?

    基于STM32G474的电机控制,如何在sdk上配置使用spwm波
    发表于 05-30 06:28

    STM32G474的HRTIM和高级定时器除了定时精度上有区别外,还有其它什么区别?

    STM32G474的HRTIM和高级定时器除了定时精度上有区别外,还有其它什么区别?什么情况下只能用HRTIM定时器,而用不了高级
    发表于 05-28 08:15

    STM32G474如何实现带同步整流管的BUCK电路?

    STM32G474 如何实现带同步整流管的BUCK电路
    发表于 05-22 07:53

    为什么STM32G474的hrtim里,timerA在使用死区模式后,设置TA1的输出后无法设置TA2的置位源和复位源?

    为什么STM32G474的hrtim里,timerA在使用死区模式后,设置TA1的输出后无法设置TA2的置位源和复位源,而timerB在使用死区模式后无法设置Tb2的置位源但可以设置复位源?
    发表于 05-22 06:23

    STM32G474除以0会进错误中断,为什么?

    我的编译环境为STM32CubeIDE,芯片STM32G474,我发现程序中如果有除以0的操作时,会跑到错误中断中。请问能不能通过设置,可以让程序不要跑进错误中断,直接等于当前变量类型的最大值
    发表于 04-01 06:32

    STM32G030定时器16 17和1同步输出如何实现

    STM32G030系列中只有定时器1 16和17三个定时器可以输出带死区时间互补pwm,我想实现
    发表于 03-27 06:45

    STM32G4如何利用ADC-DMA对全桥电路实现闭环控制?

    开始接触STM32G474,用于对一个全桥电路实现闭环控制,里面包括PI控制,准PR控制,和一个相位环;在学习完输出pwm和ADC-DMA个模块后无法将
    发表于 03-22 06:40

    如果STM32定时器外接了正交编码,该剩余通道是否能做PWM输出呢?

    其实,对于STM32芯片,编码输入信号就是定时器的计数时钟源之一。定时器外接了编码输入,若还有剩余通道的话,剩余通道依然可以实现输入捕获或
    的头像 发表于 03-21 09:06 1404次阅读
    如果<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>外接了正交编码<b class='flag-5'>器</b>,该剩余通道是否能做PWM<b class='flag-5'>输出</b>呢?

    STM32G474的DAC4无输出怎么解决?

    STM32G474 的DAC4采用定时器4触发dma,OUT1连接到比较5,测试下来 DAC4没输出,是配置哪里有问题吗 定时器4的配置:
    发表于 03-08 07:08

    stm32一个定时器能同时控制个灯以不同频率闪烁吗?

    STM32定时器功能强大,**STM32定时器可以同时控制个灯以不同频率闪烁** 。
    的头像 发表于 12-13 10:43 1980次阅读

    实战经验 | STM32G474 中 Triggered-half 模式的实现

    数字电源应用的高精度定时器(HRTIMER)外设,作为 HRTIMER V2 版本,其新增了 Triggered-half 功能,目的就是为了简化采样变频控制方式下相交错并联工作电源的设计。 02
    的头像 发表于 12-11 18:15 1709次阅读
    实战经验 | <b class='flag-5'>STM32G474</b> 中 Triggered-half 模式的<b class='flag-5'>实现</b>