前言
上一讲我们学习了nrf51822定的器的使用,那行如何用定时器实现PWM输出呢,NRF51的time模块不支持 PWM 功能,不可我们可以通过定时器+PPI+GPIOTE模块一起工作的方式在NRF51XX上产生 PWM 信号。 下面以使用 TIMER0 为例, 来介绍用定时器产生 PWM 的方法。
关于定时器,PPI,及GPIOTE模块的介绍可以查看之前的博文,本节将基于NRF51822芯片实现PWM信号输出,实现呼吸灯效果。实现思路:
文章图片
在初始化TIMER0的时候把PWM脉冲输出引脚电平置为一个初始电平,再给定时器的CC[0]和CC[1]分别赋一个数值,并且CC[1]的数值要比CC[0]大。当定时器内部计数器的值跟CC[0]相等的时候,见上图的counter0所示位置。这个时候把PWM脉冲输出引脚电平翻转。定计数器继续计数,当计数器的值跟CC[1]相等的时候,见上图counter1所示位置,再次把PWM脉冲输出引脚电平翻转,同时把TIMER0内部计数器的值清零。到此,一个PWM周期完成,CC[0]称之为占空比;CC[1]我们称之为PWM周期。上述过程持续进行就会产生连续的PWM信号。可以通过改变CC[0]的值来调整占空比;也可以通过改变CC[1]的值来调整PWM周期。
示例详解
基于硬件平台:nrf51822ek_tm开发板。
文章图片
本示例所用的最小系统板原理图:
【nrf51822|一起学nRF51xx 9 - pwm】
文章图片
-
- 工程创建:
- 打开KEIL,新建一个空工程:Project->NewuVisionProject
- 工程创建:
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/07f58c25cfad48a4b496cae8689ec8cf.jpg)
文章图片
工程名为nrfxx-pwm确认后按下图选择芯片为nrf51822_xxAA->ok
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/1eeedd7d3dda4eb1bd2674984f2a4e6d.jpg)
文章图片
在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51Series字样的);在nrf_device中勾选nrf_gpio, nrf_gpiote, nrf_ppi,nrf_timer,nrf_err并在nrf_Libraries中勾选app_error,nrf_assert模块。
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/76f53cd7ee634d69bfeada352694e3af.jpg)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/e26a8f03af2c41edae89dc7940cbf633.jpg)
文章图片
OK之后工程自动生成如下代码:
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/71c86d0121b2486ca9043f2340843ff7.png)
文章图片
新建一个空白文档,保存为main.c,并加入工程中:
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/a4beeecf39c143178d016f5db34700e7.png)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/b1285c619401478ab8e2ad9a4507db59.jpg)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/a68b47237ead46a784a85f2067144dcf.jpg)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/8b8b37dee67d4281b7bfafe83585595f.png)
文章图片
配置工程,选择使用MicroLIB库,可以减小程序体积:
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/2e7f823748124329a865976111e4f424.jpg)
文章图片
加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/749a4e506abd4d19a85bc67fbdd460ae.png)
文章图片
调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/2186ce3fb8304769807cdb941b8ef2ad.jpg)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/fa37762a8b4245e484915d7ca03fc102.png)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/b9294aaf4ee74b6285aa818889322441.png)
文章图片
-
- 工程代码
- OK之后在man.c中加入如下代码:
- 工程代码
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/b7e331f7c48e4de5afa3ed7e8a0b3968.jpg)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/28619437f39c4395ae9d6ed4e3e90c12.jpg)
文章图片
主函数依次执行gpio,gpiote,ppi,time初始化操作然后就是死循环,在中断服务函数里面, 执行清除中断标志、 清除内部计数寄存器的值、和修改占空比操作。把程序编译,下载到开发板上可以看到开发板上的蓝灯实现了呼吸灯效果。对应的PWM变化如下图所示:
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/7d4c05f9fb4b4d6480d58cf2df8d22ce.jpg)
文章图片
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/e31c262eaff14fb6b3ecd536ff3d2ff6.jpg)
文章图片
OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!
文中源码资料下载,在公众号里给十三发消息:
下载|一起学nRF51xx 9
![nrf51822|一起学nRF51xx 9 - pwm](https://img.it610.com/image/info8/d776109d2db040de80b3b3e710c75854.jpg)
文章图片
关注十三公众号