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

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

3天内不再提示

单片机 | STM32定时器比较输出切换模式之应用实例

茶话MCU 来源:YXQ 2019-06-04 14:08 次阅读

经常有人想利用STM32定时器输出一些任意波形来满足应用需求。比方最近有人在某论坛发帖咨询想使用STM32芯片TIM1实现如下4路特征的驱动波形。【下面波形只画出了两个周期】

通过观察不难看出,四路波形是有规律的周期性波形。不过除了/B路外,其它三路不太容易通过定时器PWM输出模式来简单实现。

我们知道,对于STM32常规定时器,其比较输出功能较常用的输出模式主要是PWM输出模式和比较输出切换模式。其中PWM输出模式是指定时器输出控制单元根据计数器的值与比较寄存器的值的比较结果来决定输出电平的高低。而比较输出切换模式是指定时器输出控制单元在计数器的值与比较寄存器的值匹配相等时,做输出电平的切换。即如果发生匹配之前是高电平的,发生匹配时输出电平切换为低电平。反之亦然。

结合到本案例,对于A路、/A路及B路输出波形我们就可以考虑使用比较输出切换模式来实现。

我们这里假设定时器的计数器采用向上计数模式,每记800个时钟单位为1个计数周期。【向上计数模式,ARR=800-1】

对于A路,当CCR=200和 CCR=700时发生输出切换,这样周期性的修改CCR的值,从而实现目前所期望的输出波形。此时我们可以使用比较事件触发DMA,通过DMA将下次要用来做比较的数据从内存传到相应通道的CCR寄存器

同理,对于/A路,当CCR=300和 CCR=600时发生输出切换。同样开启该通道的比较事件触发DMA传输,实现CCR寄存器的数据循环更新。

同样,对于B路,参照上面的相同做法。当CCR=100和CCR=400时做输出切换。

至于最后的/B路,可以跟上面一样采用比较输出切换模式。不过,该通道直接使用PWM输出模式更方便,具体到这里我们可以使用PWM2输出模式,CCR=500.

下面是基于STM32F4系列芯片的TIM1来实现上述输出波形的配置及相关用户代码介绍。其中,代码是基于STM32CUBE库。

一、基于上述分析,使用STM32CubeMx来完成基本的初始化配置。

从上面两幅图我们可以看出,TIM1的通道1/2/3都被配置为比较输出切换模式。通道4被配置PWM2输出模式。【另外,注意下通道1/2/3三个比较输出通道的初始比较值。】

前面说了,我们要利用各通道的比较事件触发DMA做CCR寄存器的数据更新,所以需做基于各个通道比较事件的DMA配置。见下图,各通道CCR寄存器的数据更新都使用循环模式。

2、准备或编写用户应用代码。

2.1 准备3个数组,对应存放用来动态更新3个比较输出通道CCR值的数据。数据的拟定请结合上面的介绍和待实现的波形特征。

uint16_t Data1_to_Comp[]={200,700}; //ch1

uint16_t Data2_to_Comp[]={600,300}; //ch2

uint16_t Data3_to_Comp[]={400,100}; //ch3

2.2 关闭通道1/2/3的比较寄存器的预装功能,即修改CCR的值后立即生效,无须也不需等待更新事件。

__HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_1);

__HAL_TIM_DISABLE_OCxPRELOAD(&htim1,TIM_CHANNEL_2);

__HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_3);

2.3 开启TIM1通道1/2/3的比较输出功能。

TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_1, TIM_CCx_ENABLE);

TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_2, TIM_CCx_ENABLE);

TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_3, TIM_CCx_ENABLE);

2.4允许相应通道比较事件的DMA请求并开启相应通道的DMA传输功能。

hdma_tim1_ch1.State = HAL_DMA_STATE_READY;

HAL_DMA_Start_IT(&hdma_tim1_ch1,(uint32_t)Data1_to_Comp, (uint32_t)&TIM1->CCR1, 2);

__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC1);

hdma_tim1_ch2.State= HAL_DMA_STATE_READY;

HAL_DMA_Start_IT(&hdma_tim1_ch2, (uint32_t)Data2_to_Comp, (uint32_t)&TIM1->CCR2,2);

__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC2);

hdma_tim1_ch3.State= HAL_DMA_STATE_READY;

HAL_DMA_Start_IT(&hdma_tim1_ch3, (uint32_t)Data3_to_Comp,(uint32_t)&TIM1->CCR3, 2)

__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC3);

2.5 使能TIM1通道4的PWM输出功能并使能TIM1, 启动计数器计数。

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);

三、结果验证。

经过上面的准备之后,编译运行工程代码即可看到开篇所期望的结果。【下面图形是我使用MDK环境下的逻辑分析仪所得截图,供参考】

好,到此上面案例就基本介绍完毕,全部配置及用户代码均贴出来了,供有需要的STM32用户参考。

说实话,要彻底搞明白上述过程并实现它,需要对STM32定时器输出比较切换模式原理、定时器的部分寄存器的预装特性、比较事件、DMA传输有较为细致和深入的理解。不像使用PWM输出模式给个CCR的值即可输出PWM波形那么简单。

最后补充两点,上面波形的实现是基于STM32的TIMER1一个定时器来完成的。如果换成别的定时器一个定时器可能实现不了,可能要用到2个定时器。这时往往涉及到定时器的主从同步问题。其中的关键点就是要知道如何让两个定时器上下级联并做同步启动,实现上述输出也是没问题的。

还有一点,对于上述波形的实现,如果我们使用STM32的高精度定时器实现起来就会更方便,STM32F334,STM32H7,STM32G4等系列都有高精度定时器。

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

    关注

    6035

    文章

    44554

    浏览量

    634653
  • STM32
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355743
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114720

原文标题:STM32定时器比较输出切换模式之应用实例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机定时器部分

    带您从零学单片机定时器部分 课程简介1定时器/计数简介2定时器/计数
    发表于 02-10 14:20 49次下载

    STM32单片机定时器介绍

    这节课给大家介绍一下 STM32 单片机定时器STM32 单片机的定 时的功能是非常强大的
    发表于 11-11 17:17 22次下载

    52单片机有几个定时器?52单片机定时器1和52单片机定时器2程序对比

    52单片机有几个定时器?STC89C52RC其实是有三个定时器单片机,STC89C52RC共有3个定时器,分别是T0、T1、T2。而51
    发表于 11-10 14:30 3.5w次阅读

    基于stm32单片机的通用定时器配置

    stm32单片机定时器资源相当丰富,它的定时器分为高级控制定时器、通用定时器和基本
    发表于 04-12 07:54 3454次阅读

    关于MCS_51和MSP430单片机定时器的应用比较

    单片机产生 PWM 波作为实例, 对 MCS-51 单片机定时器 T0 和 MSP430 单片机的 Timer A 进行了
    发表于 04-25 17:04 8次下载
    关于MCS_51和MSP430<b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>的应用<b class='flag-5'>比较</b>

    51单片机的应该如何使用定时器详细资料和实例说明

    本文档的主要内容详细介绍的是51单片机的应该如何使用定时器详细资料和实例说明。
    发表于 08-29 17:28 2次下载
    51<b class='flag-5'>单片机</b>的应该如何使用<b class='flag-5'>定时器</b>详细资料和<b class='flag-5'>实例</b>说明

    使用51单片机定时器进行计数实例的程序免费下载

    本文档的主要内容详细介绍的是使用51单片机定时器进行计数实例的程序免费下载。
    发表于 08-14 17:32 1次下载
    使用51<b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>进行计数<b class='flag-5'>实例</b>的程序免费下载

    单片机定时器的工作模式TMOD设置资料说明

    单片机定时器工作模式TMOD设置TMOD:定时器/计数模式控制寄存
    发表于 07-19 17:38 1次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>的工作<b class='flag-5'>模式</b>TMOD设置资料说明

    使用51单片机定时器和计数实现定时实例说明

    本文档的主要内容详细介绍的是使用51单片机定时器和计数实现定时实例说明。
    发表于 07-12 17:39 7次下载
    使用51<b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>和计数<b class='flag-5'>器</b>实现<b class='flag-5'>定时</b>的<b class='flag-5'>实例</b>说明

    STM32F4单片机定时器实现互补输出和死区刹车和工程文件免费下载

    本文档的主要内容详细介绍的是STM32F4单片机定时器实现互补输出和死区刹车和工程文件免费下载。
    发表于 11-25 08:00 9次下载
    <b class='flag-5'>STM32</b>F4<b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>实现互补<b class='flag-5'>输出</b>和死区刹车和工程文件免费下载

    STM32单片机定时器1设置成为AB项编码模式

    STM32单片机定时器1设置成为AB项编码模式大家好·,我是DXZ,这篇博客是使用STM32
    发表于 11-18 15:21 21次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>1设置成为AB项编码<b class='flag-5'>器</b><b class='flag-5'>模式</b>

    STM32 单片机配置定时器输出比较 + 中断的步骤

    配置 STM32 单片机定时器时,定时器的功能很好查,但是经常会忘一些东西的使能(比如说我经常忘记配置 IO 口的复用)。现将完整步骤记录如下,以 F407
    发表于 11-19 09:51 7次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>单片机</b>配置<b class='flag-5'>定时器</b><b class='flag-5'>输出</b><b class='flag-5'>比较</b> + 中断的步骤

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

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

    STM32定时器单脉冲输出模式

    STM32定时器单脉冲输出模式
    发表于 12-08 20:51 48次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>单脉冲<b class='flag-5'>输出</b><b class='flag-5'>模式</b>

    STM32定时器的几种输出模式

    最近有接触到通过可控硅的方式来控制交流风机或者电烙铁功率,STM32定时器输出比较模式,刚好可以满足这种需求,借此机会总结一下
    的头像 发表于 01-12 16:49 5688次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>的几种<b class='flag-5'>输出</b><b class='flag-5'>模式</b>