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

    文章

    3360

    浏览量

    121736
  • CMP
    CMP
    +关注

    关注

    6

    文章

    159

    浏览量

    27572
  • Tim
    Tim
    +关注

    关注

    0

    文章

    84

    浏览量

    18892

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ‌基于STM32G474的数字电源控制板设计解析与应用指南

    STMicroelectronics STEVAL-DPSG474Q数字电源控制盘基于STM32G4系列的STM32G474QE微控制。STEVAL-DPSG
    的头像 发表于 10-15 13:59 759次阅读
    ‌基于<b class='flag-5'>STM32G474</b>的数字电源控制板设计解析与应用指南

    求助,关于STM32G474使用HRTIME完成路180度移相问题求解

    开发平台 STM32G474RET6CUBEMX+MDK 现在的问题是 我已经完成了移向 使用的是主定时器做同步 使能了TIMA TIMB定时器的period和主
    发表于 07-24 08:29

    STM32G474如何实现Buck变换的COT控制模式?

    我想用STM32G474实现恒定导通时间模式控制,如下图所示,我打算使用片上比较实现VOUT和Vref的比较功能以开通pwm波,但是要如何实现
    发表于 07-10 06:35

    有一个关于STM32G474双BANK的测试问题求解答

    工程师朋友,您好有一个关于STM32G474 双BANK的测试问题请教各位:一个LED 闪烁的测试程序已经在IAR环境构建成功,使用STM32CubeProgrammer 加载到0X800 0000
    发表于 06-17 07:15

    求助,关于STM32G474双BANK的测试问题求解

    工程师朋友,您好有一个关于STM32G474 双BANK的测试问题请教各位:一个LED 闪烁的测试程序已经在IAR环境构建成功,使用STM32CubeProgrammer 加载到0X800 0000
    发表于 06-11 07:57

    STM32G474高精度定时器HRTIM配置死区互补PWM极端输出问题求解

    下图是我在stm32cbueMX中的主要配置 按照这个配置,假如我将主通道TE1的PWM占空比设置为0%(将比较值1设置为18000),辅通道TE2的PWM占空比应该为100%,但是实际情况如下
    发表于 06-09 06:45

    求助,关于STM32G474高精度定时器HRTIM配置死区互补PWM极端输出问题求解

    下图是我在stm32cbueMX中的主要配置 按照这个配置,假如我将主通道TE1的PWM占空比设置为0%(将比较值1设置为18000),辅通道TE2的PWM占空比应该为100%,但是实际情况如下
    发表于 05-28 07:32

    MCU定时器/计数

    架构与功能特性‌ 定时器类型与配置‌ 高级控制定时器‌:支持互补PWM输出与刹车功能,适用于电机驱动等高精度控制场景。通用
    的头像 发表于 04-27 13:54 592次阅读

    求助,关于STM32G474高精度定时器HRTIM配置死区互补PWM极端输出问题求解

    下图是我在stm32cbueMX中的主要配置 按照这个配置,假如我将主通道TE1的PWM占空比设置为0%(将比较值1设置为18000),辅通道TE2的PWM占空比应该为100%,但是实际情况如下
    发表于 04-27 07:59

    stm32G474的flash模式如何判定?

    请教各位,使用的芯片stm32g474cbt6,按照手册说法,single bank是单一flash区域,最小擦除是4k,dual bank是支持双flash区域,一边操作不影响另外一块,最小擦除
    发表于 03-12 08:18

    stm32g474 hrtim中怎么使用dual channel DAC trigger?

    stm32g474 hrtim 中怎么使用 dual channel DAC trigger
    发表于 03-12 07:33

    stm32g474的开发板很烫的原因?

    stm32g474的开发板很烫
    发表于 03-10 08:30

    STM32G474利用高精度HRTIM怎么捕获外部波形计算波形频率?

    STM32G474 利用高精度HRTIM怎么捕获外部波形计算波形频率,想用STM32Cube配置工程代码,网上查了很多资料,没有看到这个用法。希望大神指导一下。
    发表于 03-10 06:29

    stm32同一个定时器不同的通道,可以不同时的输出pwm波形吗?

    请问,stm32的同一个定时器,不同的通道,可以不同时的输出pwm波形吗?比如tim1的ch1输出,延时几毫秒后tim1的ch2输出。 现在
    发表于 03-07 08:20

    STM32G474的DAC4无输出怎么解决?

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