概述
文章目录
- 一、前言
- 二、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(相当于脉冲)给步进电机,从而计算步进电机的步距角,有时候也需要计算电平翻转的次数。
- 计算PWM的个数需要使用定时器溢出中断(CNT寄存器的值 = ARR寄存器的值)
- 计算电平翻转次数的总数,需要同时使用定时器溢出中断(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的值,然后才启动溢出中断。
五、细节补充
- 不要被函数HAL_TIM_PWM_PulseFinishedCallback的名字欺骗了,一开始我以为进入这个中断回调函数时是PWM波结束(相当于PWM开始)的那个时刻(CNT = ARR),测试的结果表明并不是这样的。反而是PWM中间的位置(CNT = CCR),占空比设置50%时)。函数HAL_TIM_PWM_PulseFinishedCallback与函数HAL_TIM_OC_DelayElapsedCallback效果一样。
- 计算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的问题。
- 需要弄明白以下寄存器的意义,比如CubeMX上的Counter Period相当于TIMx_ARR寄存器,Pulse相当于TIMx_CCR寄存器等。
最后
以上就是笨笨鞋子为你收集整理的STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断一、前言二、CubeMX三、代码四、DEBUG五、细节补充的全部内容,希望文章能够帮你解决STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断一、前言二、CubeMX三、代码四、DEBUG五、细节补充所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复