关于学习使用stm32输出频率和占空比均可调的PWM波的一些心得

近日在复习stm32输出PWM波之际,由于看到————————————————
版权声明:本文为CSDN博主「fei…」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34952376/java/article/details/81172535
这位博主文章中所写与正点原子官方手册中所使用的方式有所不同,故引发思考,查阅一些资料后幸有所得,故写此文。

1.关于通用定时器的一些理解

首先我们看一下正点原子提供的不完全手册对于通用定时器功能的讲解,主要用到的是(1)(2)(3)和(5)。关于学习使用stm32输出频率和占空比均可调的PWM波的一些心得
其中TIMx_CNT 寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值。 如果计数器发生溢出,该计数器会清零并重新开始计数。下图中所示的自动重装载寄存器的值可以看做计数器的阀门,计数器计数到ARR之后就会归零重新计数。
关于学习使用stm32输出频率和占空比均可调的PWM波的一些心得预分频值显而易见可以起到对72MHZ的频率进行分频的作用,频率越小,周期越大。
TIM_ClockDivision 的值是改变做输入捕获时滤波用的并不是定时器的分频器,此处无需改变。同时,我们可以计算出该定时器的溢出时间Tout= ((arr+1)*(psc+1))/Tclk; 其中Tclk为该定时器的输入时钟频率。

2.PWM输出配置

关于学习使用stm32输出频率和占空比均可调的PWM波的一些心得
结合此图还有1中的描述,相信大家已经可以清楚地理解PWM输出的原理。
大家可以结合下图了解一下捕获/比较寄存器,这个寄存器在PWM的输出过程中比较重要。

关于学习使用stm32输出频率和占空比均可调的PWM波的一些心得
关于配置定时器作为PWM 输出,前半部分的配置与上文中讲解的大同小异,接下来主要介绍一下结构体 TIM_OCInitTypeDef 的配置。关于学习使用stm32输出频率和占空比均可调的PWM波的一些心得
通用定时器的配置主要涉及上面四个参数。
关于第一个参数TIM_OCMode的不同配置我是通过看http://blog.sina.com.cn/s/blog_3ba262a10101esd1.html这位博主的博客后才明白的。此处放一截图,大家应该能够看明白。关于学习使用stm32输出频率和占空比均可调的PWM波的一些心得
第三个参数TIM_Pulse 设置的为捕获比较寄存器的初始值,可以在结构体初始化时设置,捕获比较寄存器的值也可以在后期使用TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);函数进行设置。
关于PWM输出的其余配置大家可以通过查看正点原子官方提供的手册进行学习,此处不再赘述。

3.对开头提出问题的解答

我在此讲一下我对于第一位博主PWM输出博客的理解:首先是对时钟进行分频,分频后为1MHZ,自动装载计数器的值为0XFFFF,最初捕获比较寄存器的值为0,也就是说刚开始要进入一次捕获比较中断,然后重新设定比较值,达到比较值之后电平翻转,再进入中断,重新设定比较值,然后电平翻转,如此循环。按照博主的思路,计数器的值达到0XFFFF之后会清零,这时候写入捕获比较寄存器的值就会有可能溢出,但是我查了一些资料也没发现关于该寄存器这一块的内容。如果需要改动的话,可以再增加一个更新中断,在此中断里进行捕获比较寄存器值的改变,当然,其他的办法也有很多,大家可以去网上搜索一下。
如果要输出占空比和频率均可调的PWM波,大家可以将相关函数整合到一起并把占空比和频率设置为入口参数即可,后续我可能会把自己的代码贴出来。
本博客只是就个别方面重点说了一下,详细的还请大家参考相关官方资料以及上文中列出的两位大佬的博客。
写这篇博客的目的是想将自己的想法和心得分享给大家,同时记录自己的学习历程。由于是第一次写博客,难免有哪里考虑不周,希望大家可以多多指正,我们也可以在评论区里交流,谢谢大家!