pwm、、英语好的人估计又知道这三个大写字母代表哪三个英语单词了、小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对pwm非常的不陌生吧、电机驱动需要pwm,控制舵机的转向需要pwm,总之、可以说,pwm,you
are so good。
好了、、言归正传,广大的互联网的网友们,咱们又见面了,大家早上晚上中午好好好、额、、好像也没见过面,stm32的pwm,可谓是小强中的小强,stm32的pwm,就是由定时器产生的,但是奇怪的是除了定时器tim6和tim7不能产生pwm外,其他的定时器都可以产生,而且还有多路之分,“高级官员”tim1和tim8说:老子可以产生多达7路,而其他的定时器默默的哀伤,因为自己最多只能产生4路(四个通道)。
上篇博客介绍了几位寄存器大神(http://www.cnblogs.com/alvis-jing/p/3691901.html),请把他们的脚步继续留下,因为还需用到,如不肯留,给他们最残酷的惩罚:金钱美女伺候、好了,言归正传,接下来,为了诞生pwm,我们还将有请以下的几位寄存器大神(由于大神们都比较低调,在此就不隆重介绍了,大家有兴趣的找下“葵花兄”)
注:对于寄存器,本博客就不再深入的讲解,大家也可以参照stm32的参考手册,因为本博客讲解的是思路和用库函数,所以就不再细讲寄存器,请见谅
1、捕获/比较模式寄存器1(timx_ccmr1)
2、捕获/比较使能寄存器(timx_ccer)
3、捕获/比较寄存器2(timx_ccr2)
那好,我们该怎么利用定时器来产生pwm呢??再此之前,我们来了解产生pwm的背后那不为人知的秘密:
脉冲宽度调制模式可以产生一个由timx_arr寄存器确定频率、由timx_ccrx寄存器确定占空比的信号。
在timx_ccmrx寄存器中的ocxm位写入’110’(pwm模式1)或’111’(pwm模式2),能够独立地设置每个ocx输出通道产生一路pwm。必须设置timx_ccmrx寄存器ocxpe位以使能相应的预装载寄存器,(请注意这句话!!!!)最后还要设置timx_cr1寄存器的arpe位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
在pwm模式(模式1或模式2)下,timx_cnt和timx_ccrx始终在进行比较,(依据计数器的计数方向)以确定是否符合timx_ccrx≤timx_cnt或者timx_cnt≤timx_ccrx。
所以,该寄存器的值一直与cnt比较,根据比较结果产生相应的动作,利用这里一点,我们通过修改这个寄存器的值,就可以控制pwm的输出脉宽了,(在这里有专门的库函数可以操作,所以是相当方便)
那怎么操作呢??在这里,我们通过一直没有提过的非常重要的概念:重映射,把tim3_ch2的pa7重映射到pb5,而pb5是连接led的,所以我们可以通过观察led的亮度才体验pwm、、也难为了led君,老是被观察,脸也不红下、、
所谓的重映射,就是把原本默认的引脚给诱惑到另一个引脚上,专业上给的是重映射,但是我觉得并非这么简单、果然,它还有一个功能:复用、、所以第一步:
我们要打开复用的时钟和把io口设成复用推挽输出,当然也要打开tim3的时钟,见代码:(映射有部分映射和全部映射,都有可用的函数,在这里我们是部分映射,但是,映射了一个引脚,另外的引脚也被牵扯下来了,哎)
接下来:
通用计时器的初始化:(由于上篇博客已讲解,在这就不细讲了哈,请见谅哈http://www.cnblogs.com/alvis-jing/p/3691901.html)请看代码:
接下来,就是pwm的重头戏了,在这里,我们要设置tim3_ch2为pwm模式,(注意,由于tim3可以产生四路pwm,每路都有不同的但类似的函数来控制)在这里,我们是通过
void tim_oc2init(tim_typedef* timx,
tim_ocinittypedef* tim_ocinitstruct)来实现的
打开"stm32f10x_tim.h"可以看到,在这里,我们只显示一些跟我们有用的参数:
tim_ocmode输出模式;—>pwm2
tim_outputstate输出使能;—>使能pwm
tim_ocpolarity输出极性;—>极性为高 代码如下:
接下来,最关键的一步也是最容易遗漏的:就是使能预装载寄存器,在这里我们通过库函数
tim_oc2preloadconfig
使能或者失能timx在ccr2上的预装载寄存器 请看代码:
好了,最后一步,我们开启定时器tim3,这个大家也不陌生了吧、、还是老规矩;知道的,来人,赏美女十个,还不知道的,拉出去调戏十分钟
亲、、在这里、、你觉得你能看到led从暗到亮了吗??你想看,led君还不肯呢、没错了、、但这是为什么呢??
原因就是这里设置产生的pwn是固定脉宽的、、那我们怎么来改变它呢??咦、库函数为我们提供了这样的一个好机会:
tim_setcompare2 设置timx捕获比较2寄存器值
通过这个函数我们就可以设置脉冲宽度,从而控制pwm了、、代码如下:
好了,我们来总结下步骤:
1、开启tim3定时器的时钟,如果有复用,也要打开复用的时钟。
2、初始化tim3
3、设置tim3_ch2的pwm模式,并使能其输出(注:要使能预装载寄存器)
4、开启tim3
5、改变脉冲宽度,从而改变pwm
少了一些自认为是幽默风趣的语言、、为了是让自己不再显得那么吊儿郎当、、这篇博客在这又到了尾声、、本人也在学习阶段、、尽量把自己当成读者,让读者看得懂、、有写错之处望指出来、不胜感激、、希望能对你有理解上的帮助、、