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等系列都有高精度定时器。

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

    关注

    5998

    文章

    43949

    浏览量

    620569
  • STM32
    +关注

    关注

    2239

    文章

    10665

    浏览量

    348518
  • 定时器
    +关注

    关注

    23

    文章

    3145

    浏览量

    112007

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

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

收藏 人收藏

    评论

    相关推荐

    总结一下定时器的几种输出比较模式

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

    STM32F103系列单片机定时器

    STM32F103系列的单片机一共有11个定时器,其中:1个系统嘀嗒定时器2个看门狗定时器2个基本定时器
    发表于 08-02 06:20

    单片机的系统定时器

    1.单片机的系统定时器也称为滴答定时器,能够实现精准定时。2.stm32f1XX和stm32f4
    发表于 08-19 06:46

    STM32定时器单片机控制

    STM32定时器单片机控制定时器占据着举足轻重的地位,定时输入,
    发表于 08-19 06:43

    51单片机两种不同的定时器中断程序实例

    51单片机两种不同的定时器中断程序实例关于51单片机定时器系统:1:51单片机有两组
    发表于 11-18 07:39

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

    STM32单片机定时器1设置成为AB项编码模式大家好·,我是DXZ,这篇博客是使用STM32
    发表于 11-26 08:09

    为什么STM32单片机定时器PWM输入捕获模式无法读取编码

    为什么STM32单片机定时器PWM输入捕获模式无法读取编码呢?怎样去解决STM32
    发表于 01-21 06:30

    STM32单片机定时器介绍

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

    基于STM32F103系列单片机的11个定时器解析

    STM32F103系列的单片机一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本
    发表于 10-23 15:54 6570次阅读
    基于<b class='flag-5'>STM32</b>F103系列<b class='flag-5'>单片机</b>的11个<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模式。可以通过自动重装载寄存器(TIMx_ARR)来设置
    发表于 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-通用定时器-PWM输出

    捕获、输出比较、PWM输出、单脉冲模式输出等。STM32
    发表于 11-26 15:36 22次下载
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定时器</b>-PWM<b class='flag-5'>输出</b>

    STM32F4单定时器独立输出四路PWM脉冲

    本文以STM32F405单片机为例,介绍如何用一个定时器的四个通道独立地输出四路PWM脉冲。主要使用定时器
    发表于 11-30 10:06 28次下载
    <b class='flag-5'>STM32</b>F4单<b class='flag-5'>定时器</b>独立<b class='flag-5'>输出</b>四路PWM脉冲

    STM32定时器单脉冲输出模式

    STM32定时器单脉冲输出模式
    发表于 12-08 20:51 47次下载
    <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 4532次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>的几种<b class='flag-5'>输出</b><b class='flag-5'>模式</b>