本帖最后由 suyong_yq 于 2015-1-26 23:50 编辑
LiteFwLib 固件库之PWM样例工程——
电子调光灯
——基于Keil5和FRDM-KL25板
suyong_yq@126.com
2015年1月
一点牢骚。累得终于病倒了,省略若干字的有病呻吟。。。
呵呵,其实样例工程的名字叫“电子调灯光”更合适,但总觉得太没有气势了,还是用个名词才能镇得住场子。
PWM是
单片机应用中非常有用的一个功能,基于定时器,在设定的计数点(我自己喜欢用里程碑,mile stone来说明这个点的重要性)反转输出电平,周而复始,从而形成了方波输出信号。一般能够产生PWM波形的模块都是单片机中的定时器,而计数的周期和和计数里程碑都是可以编程的。因此,在程序中,可以通过编程调节PWM的频率和占空比这两个PWM输出信号的关键属性。
在KL25单片机中,TPM(
timer/PWM Module)模块就是一个可以产生PWM的定时器模块。当然,我们也应该看到,TPM不仅能当PWM发生器用,还有输入捕捉、输出比较及基本的定时器功能。LiteFwLib固件库中TPM模块的驱动程序就提供了不同的API,用以将TPM配置成不同的工作模式。见图1。
图1
至于具体的实现方式,英文好的可以直接看原版手册,英文不好的可以看翻译的中文版手册,比较懒的可以等我有空把LiteFwLib用户手册写出来再看。当然,如果想尽快上手,并且体验PWM的编程乐趣,可以直接下载运行LiteFwLib固件库里的样例程序“tpm_pwm_led”。
样例程序“tpm_pwm_led”演示的是通过PWM控制FRDM-KL25
开发板上的三色灯(实际只用到了红灯,控制其它颜色灯的控制同红灯相同)的亮度。手快的童鞋可能会先跑一下程序,好吧,大家随意。
老样子,我们大家先简单看一下样例工程的代码,熟悉一下基于LiteFwLib固件库使用PWM的流程。
1. 在init_board()函数中准备好使用TPM的系统及板级配置
首先要配置好TPM模块的时钟源,并将时钟信号灌入到TPM模块中。代码见图2。
图2
这里使用PLL输出的2分频作为TPM定时器的时钟源,即24MHz。
同时不要忘记配置连接小灯的引脚为TPM通道功能。
2. 在main()函数的开始配置TPM以PWM方式工作
在main()函数的开始部分配置TPM以PWM的方式工作。见图3。
图3
首先将TPM作为基本定时器的功能设定为:采用边界对齐的事件响应、对内部的时钟源信号进行计数、计数时钟源的16分频(即24MHz/16 = 1.5MHz)。从0开始递增计数,当记到2000的时候就返回0,周而复始。
然后调用函数“TPM_ConfigChn_PWM()”将TPM配置为PWM模式,并设置在电平翻转点(里程碑)前为高电平,后为低电平。调用函数“TPM_SetChnEventValue()”设定电平翻转点的位置,初始值为2000,也就是最开始一直都是高电平,最后一个点刚拉下来就复位计数器继续变高。
3. 在while(1)循环中更改PWM的占空比控制小灯亮度
接下来的程序中就通过改变这个翻转点的位置控制PWM输出信号占空比。见图4。
图4
在这里我们能够猜到程序的执行逻辑:通过在终端中按键触发PwmEventValue值的变化,而PwmEventValue值就是电平翻转点的位置。这样,通过调整电平翻转点的位置,可以控制在2000计数点的周期之内,高电平的时间(小灯灭)和低电平的时间(小灯亮)。小灯实际上是以非常快的频率闪烁的(1.5MHz/2000 = 750Hz),远远大于人眼能感知出来的变化频率上限(电影胶片的25Hz),所以人眼实际看到的是小灯的亮度变化,达到电子调光的效果。
这里贴出来串口终端的输出信息,作为一个运行的现象的说明,见图5。实际板子上的图片没啥好看的,用相机拍下来,要么是全亮,要么是全灭,聪明的童鞋们想想这是为什么呢?
图5
End.
网页的排版实在不行,上传pdf版本,看起来舒服一些。