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

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

3天内不再提示

一个定时器输出4路不同频率波形的应用示例

冬至子 来源:茶话MCU 作者:MilerShao 2023-07-06 15:57 次阅读

一般来讲,一个STM32定时器输出基于同一频率的各路信号比较方便。但经常也会有人问使用STM32一个定时器是否可以实现多路不同频率的输出。从实现这个功能角度来讲,答案是肯定的,并可以满足相应的应用需求。

这里利用STM32G4的Nucleo开发板进行一个简单的实现示例,顺便交流和分享些思路,以拓宽STM32定时器的应用场景。示例中使用STM32定时器输出模式中的比较切换模式,即Toggle模式,结合定时器的比较事件及DMA传输来完成。

我使用STM32G431RB片内TIM1,通过它实现4路不同频率的PWM输出,分别是20KHz,50KHz,70KHz,80KHz,让TIM1运行在10Khz的循环计数状态。TIMER的计数时钟源为170Mhz,没有对时钟进行分频。

基于上述条件,TIM1的10KHz更新频率所对应的计数脉冲个数则为17000,那么,20KHz、50KHz、70KHz、80KHz所对应的计数脉冲个数分别是8500、3400、2428、2125,分别对应着TIM1四个通道CH1/CH2/CH3/CH4的PWM输出。【可参考下面表格】

图片

现在开始使用STM32CubeMx进行初始化配置。TIM1的时基配置如下:

图片

将TIM1的CH1/CH2/CH3/CH4的比较输出模式配置为匹配切换模式。这里关闭了CCR寄存器的预装功能。

图片

上图中绿色圆圈里的用于比较的初始数据,依据不同通道的占空比来拟定,不是很重要,只会影响到第一个脉冲的占空比。当然,也不能乱写。【为什么呢,请自行思考下】

再来看看有关DMA的配置,4个通道都开启了基于比较事件的DMA触发请求,并使用循环传输模式。

图片

基于CubeMx配置完成后,生成初始化工程代码。

下面进行用户代码的添加和整理。假设四个通道输出的占空比分别为70%,70%,40%,40%。为了实现4路不同输出频率及占空比的波形,需拟定一些用于比较切换的数据,借助各个通道的比较事件触发DMA,让DMA适时修改相应通道的比较寄存器的值,即修改CCRx的值。【这个地方的实现原理很难一两句完全写清楚,有兴趣的请先了解STM32定时器的比较切换模式,再结合DMA传输琢磨琢磨。下面表格是实现上面输出需要用到的一些数据。】

图片

结合上述表格的数据,定义一些宏参数和内存数组。内存数组用来存放各个通道不同时刻的比较值。【本想放源码文本上来的,因为可能有人需要验证测试。但这里实在不好排版,只能贴图了。抱歉!】

图片

图片

图片

图片

图片

上面的四个数组分别对应四个通道做比较切换输出时需用到的比较值。这些数据的拟定需好好琢磨下。我刚开始在代码里都是放的具体数据,但考虑到不太好理解各个数据的含义。我这里特意将它们改成宏替换,旨在以宏替换的形式顺便做个比较直观的注释,希望帮到有需要或感兴趣的工程师

接下来添加具体的功能实现代码。代码不多,很简单,都是基于HAL库的。看到函数名就大致知道什么意思了。下面的代码就是本示例中用到功能代码。它们的功能分别是使能相关定时器通道的比较输出事件;开启基于定时器比较事件的DMA传输并完成相关配置;使能各个定时器通道比较事件的DMA请求;使能TIM1的主输出功能并开启计数器的工作。

图片

编译调试整理后,运行程序查看结果.

图片

从上面示波器测得结果来看,输出波形满足前面提到的设计要求。频率、占空比跟我们设计要求的一致。【注:手机模式下可点击图片放大查看】

在上面代码的基础上,我保持4个通道输出的脉冲频率不变,对各自占空比做下调整,分别调整为30%,30%,60%,60%【在上面代码里只需调整那几个Dutyn值】,显然也能很好地实现各自的输出。波形图如下:

图片

在上面示例中,我将TIM1的10Khz更新频率做为配置CH1~CH4四个通道输出的一个参考或基准。既然一个定时器可以实现4路不同频率,那么多个定时器实现更多不同频率的PWM输出也就不难了。

关于使用1个定时器实现多路不同频率输出的示例就介绍到这里。本质上它是基于定时器比较输出功能的比较切换模式与DMA的灵活运用,抛砖引玉似地给大家提供些方法或思路。当我们将STM32各种定时器事件、定时器比较输出切换模式以及DMA传输灵活而巧妙加以运用时,往往可以实现很多客制化的东西。

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

    关注

    30

    文章

    5032

    浏览量

    117741
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112041
  • PWM输出
    +关注

    关注

    1

    文章

    62

    浏览量

    5055
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14448
  • HAL库
    +关注

    关注

    1

    文章

    112

    浏览量

    5878
收藏 人收藏

    评论

    相关推荐

    STM32G030C8T6要输出8~12PWM,每个定时器可以输出4,那如何让两定时器输出的PWM同步呢?

    STM32G030C8T6要输出8~12PWM,每个定时器可以输出4,那如何让两
    发表于 03-08 08:19

    stm32定时器输出4pwm

    我用stm32 103fvet6 写了程序。用定时器3输出4pwm,分别对应PA6,PA7
    发表于 05-10 22:53

    stm32能不能用定时器不用中断来实现输出3不同频率的pwm,那个大神知道?谢谢啊了

    stm32能不能用定时器不用中断来实现输出3不同频率的pwm,那个大神知道?谢谢啊了
    发表于 10-26 09:29

    stm32定时器14只能输出一路pwm波形吗?

    stm32定时器14只能输出一路pwm波形吗?
    发表于 03-26 14:11

    关于定时器多路输出

    我想控制定时器多路输出,在哪个寄存里可以找到,我看介绍可以说
    发表于 03-26 15:05

    请问定时器可以输出有移相效果的PWM波形吗?

    如题,请问原子定时器可以输出有移相效果的PWM波形吗我试过用Tim3的两
    发表于 04-29 21:33

    STM32定时器输出一路PWM

    STM32定时器输出一路PWM(控制LED灯的亮度)STM32的定时器具有强大的功能,今天的输出PWM功能是属于其中的
    发表于 08-04 07:21

    STM32F4的通用定时器配置步骤

    定时器包含 16 位或 32 位自动重载计数(CNT),该计数由可编程预分频(PSC)
    发表于 08-18 07:43

    定时器7PWM输出

    示例目的使用TMR1同时输出7PWM。支持型号:AT32F4xx全系列1 快速使用方法1.1硬件资源AT-START-F403A V1.0 实验板1.2 软件资源该Demo以AT32
    发表于 08-18 19:57

    如何去实现定时器输出一路PWM波形的设计呢

    PWM是什么?如何去实现定时器输出一路PWM波形的设计呢?有哪些步骤?
    发表于 11-15 06:04

    利用定时器B的比较功能输出PWM波形

    思路:利用定时器B的比较功能输出PWM波形定时器B定时器B的特点:1)异步16位
    发表于 11-29 06:52

    STM32F103是怎样使用TIM4定时器输出PWM的

    STM32F103使用TIM4定时器输出PWM通过定时器4实现两
    发表于 01-06 07:30

    采用定时器的方法输出PWM波形

    文章目录、采用定时器的方法输出 PWM 波形1.PWM简述、采用定时器的方法
    发表于 02-24 06:42

    STM32单片机一个定时器输出不同频率PWM波

      在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式。可以通过自动重装载寄存器(TIMx_ARR)来设置定时器
    发表于 11-23 18:21 18次下载
    STM32单片机一个<b class='flag-5'>定时器</b><b class='flag-5'>输出</b>不同<b class='flag-5'>频率</b>PWM波

    如何使用MAXQ微控制器上的定时器B生成PWM波形

    MAXQ微控制器有三种类型的定时器定时器0、定时器1和定时器2。定时器B是定时器1的增强版本,
    的头像 发表于 02-20 13:44 546次阅读
    如何使用MAXQ微控制器上的<b class='flag-5'>定时器</b>B生成PWM<b class='flag-5'>波形</b>