文章目录

  • 一、前言
  • 二、CubeMX
    • 2.1、Mode and Parameter Settings
    • 2.2、NVIC Settings
    • 2.3、生成代码
  • 三、代码
    • 3.1、tim.c
    • 3.2、main.c
  • 四、DEBUG
    • 4.1、OC中断回调函数的验证
    • 4.2、定时器溢出中断
  • 五、细节补充

一、前言


STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)
上一次完成了使用定时器TIM的PWM Generation模式输出PWM波,没有产生中断。在实际项目上,有时候需要计算一共发了多少个PWM(相当于脉冲)给步进电机,从而计算步进电机的步距角,有时候也需要计算电平翻转的次数。

  1. 计算PWM的个数需要使用定时器溢出中断(CNT寄存器的值 = ARR寄存器的值)
  2. 计算电平翻转次数的总数,需要同时使用定时器溢出中断(CNT寄存器的值 = ARR寄存器的值)与OC中断(CNT计数器的值 = CCR寄存器的值)

二、CubeMX


2.1、Mode and Parameter Settings

TIM8的时钟频率是240M,当Prescaler = 239时,TIM8的时钟频率 = 240M / (239 + 1) = 1MHz。

Counter Period设置49999时,定时器溢出中断的频率 = 1M / (49999 + 1) = 20Hz,周期T = 1 / 20 = 0.05s = 50ms

Pulse设置24999时,OC中断的频率 = 1M / (24999 + 1) = 40Hz ,周期T = 1 / 40 = 0.025s = 25ms

根据示波器的波形,可以证明以上的计算是正确的。

2.2、NVIC Settings

TIM8 update interrupt : 更新:计数器上溢/下溢,计数器初始化(通过软件或内部/外部触发)

TIM8 capture compare interrupt : 输出比较

2.3、生成代码

三、代码


3.1、tim.c

首先,在函数void MX_TIM8_Init(void)添加用户代码。目的是打开定时器溢出中断与OC中断。

然后,添加OC中断回调函数。值得注意的是,经过实验证明:HAL_TIM_OC_DelayElapsedCallback与HAL_TIM_PWM_PulseFinishedCallback效果是一样的,都是当CNT寄存器的值 = CCR比较寄存器的值时就会进入函数一次。所以,任意挑一个来使用即可。

3.2、main.c

还需要添加另外一个中断回调函数HAL_TIM_PeriodElapsedCallback(),当CNT寄存器的值 = ARR寄存器的值时,进入一次回调函数。

HAL_TIM_PeriodElapsedCallback()也可以放到tim.c里面,这个都可以的。

四、DEBUG


4.1、OC中断回调函数的验证

HAL_TIM_OC_DelayElapsedCallback()与HAL_TIM_PWM_PulseFinishedCallback()都会获取当前CNT寄存器的值。目的是知道产生OC中断时,CNT寄存器当前的值时多少,从而判断究竟是OC中断还是溢出中断。

从Monitor的监控看来,Curr_CNT与OC_CNT一直都是24999,24999是CCR比较寄存器的值。并且从OC_Value与PWM_Value始终相等看来,这两个回调函数进入的次数是一样的。

所以,HAL_TIM_OC_DelayElapsedCallback与HAL_TIM_PWM_PulseFinishedCallback都是当CNT的值24999等于CCR寄存器的值24999时进入一次。

4.2、定时器溢出中断

从Monitor监控看来,main_Value一直在递增,main_CNT保持0,证明每一次定时器溢出时,都会进入此中断。

main_CNT保持0的原因是溢出后会马上复位CNT的值,然后才启动溢出中断。

五、细节补充


  1. 不要被函数HAL_TIM_PWM_PulseFinishedCallback的名字欺骗了,一开始我以为进入这个中断回调函数时是PWM波结束(相当于PWM开始)的那个时刻(CNT = ARR),测试的结果表明并不是这样的。反而是PWM中间的位置(CNT = CCR),占空比设置50%时)。函数HAL_TIM_PWM_PulseFinishedCallback与函数HAL_TIM_OC_DelayElapsedCallback效果一样。

  2. 计算PWM(脉冲)的数量需要在函数HAL_TIM_PeriodElapsedCallback。有一个细节需要注意,使用HAL_TIM_PeriodElapsedCallback计算PWM波数量时,会比实际的数量多1。原因是当计数初始化时也会进入一次HAL_TIM_PeriodElapsedCallback函数,这个细节需要注意一下。有一个不错的方法可以解决这个问题,这一次实验使用main_Value来计算PWM波的数量,main_Value的变量大小是uint32_t,所以声明main_Value时,可以让main_Value = 4294967295,相当于main_Value = -1,这样就能解决PWM波多1的问题。

  3. 需要弄明白以下寄存器的意义,比如CubeMX上的Counter Period相当于TIMx_ARR寄存器,Pulse相当于TIMx_CCR寄存器等。

STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断相关推荐

  1. STM32单片机:定时器TIM输出PWM波

    学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...

  2. stm32常见定时器---TIM定时及PWM输出

    STM32 常见定时器资源: 系统滴答定时器SysTick----提供时钟节拍做时间基准 看门狗定时器WatchDog----防止程序跑飞 实时时钟RTC 基本定时器:TIM7.TIM6 通用定时器: ...

  3. TIM输出比较——PWM

    目录 前言 一.什么是输出比较 二.什么是PWM 1. PWM的相关参数: 2.PWM的应用场景: 3.占空比 三.输出比较的几种模式: 四,输出比较的极性 五,在输出比较中,TIM常用函数 六,同一 ...

  4. STM32H743+CubeMX-定时器TIM输出PWM(Out Compare模式) + 中断

    文章目录 一.前言 二.CubeMX 2.1.NVIC Settings 2.2.生成代码 三.代码 3.1.tim.c 四.DEBUG 五.细节补充 一.前言 STM32H743+CubeMX-定时 ...

  5. STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.TIM8 Mode and Configuration 2.3.Parameter Settings Co ...

  6. [控制基础] 定时器TIM的PWM输出+用积分思想分析PWM对直流减速有刷电机的控制(基于STM32F103+CubeMX+HAL)

    目录 解决的需求 一.高级定时器TIM1/TIM8 1.时基单元 2.更新操作与更新事件 3.与其他定时器的比较 ①.与其他定时器时基单元的比较 ②.与通用定时器的比较 4.CK_INT与CK_CNT ...

  7. STM32H743+CubeMX-低功耗定时器LPTIM输出PWM波

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.LPTIM2 Mode and Configuration 2.3.Parameter Settings ...

  8. STM32H743+CubeMX-定时器TIM输出PWM(Output Compare模式)

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.TIM8 Mode and Configuration 2.3.Parameter Settings Co ...

  9. STM32H743+CubeMX-定时器TIM发送非对称PWM(使用一个通道)

    文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.TIM1 Mode and Configuration 2.3.Parameter Settings 2. ...

最新文章

  1. go语言中的变量与作用域
  2. QT的QSslPreSharedKeyAuthenticator类的使用
  3. 使用Eclipse构建Maven的SpringMVC项目
  4. hadoop之 Hadoop1.x和Hadoop2.x构成对比
  5. SAP Spartacus里使用defer的一个例子
  6. C++描述杭电OJ 2005.第几天? ||
  7. 【安装配置】DBCA创建数据库(图形界面)
  8. JavaScript Date(日期)对象
  9. 微信H5多级分佣开心刮刮乐源码
  10. kepware怎么读modbus/tcp数据_注塑机设备联网?EUROMAP 63?Kepware快速帮您搞定!
  11. 红色小吃加盟网站源码 织梦dede模板[带手机版数据同步]
  12. intel(R)wireless-ac 9462感叹号,WLAN消失,电脑连不上网解决办法
  13. IOS UIView详解
  14. iOS 8 状态栏保持黑底白字 亲测有效
  15. winform直接控制云台_299元,246g,260mm,一天销量破万的智云最新手机云台深度评测...
  16. NANDFLASH介绍(转)
  17. Android折线图,柱状图,股票走势图,基金走势图
  18. python框架漏洞_【入门】6.Python WEB框架下集成乌云漏洞查询
  19. R语言机器学习实战之多项式回归
  20. oracle ogg端口,OGG报错 OGG-01223

热门文章

  1. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(2月6日-2月12日)
  2. 大数据是如何助德国队打进欧洲杯半决赛的?
  3. 老男孩IT教育在线3期新学员司毅第一期作业
  4. RAC_Oracle集群服务安装Grid Infrastructure(案例)
  5. 在PropertyGrid中使用密码显示
  6. 程序员总结的:最没有学习效率的 5 种方法!你在用其中哪一种?
  7. 在Windows 64位操作系统安装Weblogic的注意事项
  8. 服务员就结账了的p8u8
  9. 为了建设我们的飞鸽传书2011
  10. 陶瓷移动在飞信版C++女程序员