[nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

一、PWM概述:

  PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形。

  PWM 的几个基本概念:

  • 1) 占空比:占空比是指在一个周期内,信号处于高电平的时间占整个信号周期的百分比,方波的占空比是50%。
  • 2) 调制频率:周期的倒数。
  • 3) 脉冲宽度:信号处于高电平的时间。

二、nRF51822的PWM产生:

  NRF51822 通过Timer、PPI 和GPIOTE 的配合实现PWM 的功能,由Timer 产生一个事件,PPI 捕获这个事件并把这个事件转化为任务传递给GPIOTE, GPIOTE 模块根据传递过来额任务执行操作。NRF51822 实现PWM 的原理框图如下图所示:

  由上图可以看出,实现PWM 功能,需要使用2 个CC 通道,通过设定CC[0]和CC[1]通道的比较值,让他们在不同的时间产生比较值匹配事件,从而触发GPIOTE 模块控制管脚在设定的时间点输出高电平和低电平,这样,就可以产生不同脉冲宽度的输出信号,即PWM 输出信号。

三、代码解析:

main:

 1 int main(void)
 2 {
 3     ret_code_t err_code;
 4
 5     /* 2-channel PWM, 200Hz, output on DK LED pins. */
 6     app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_2CH(5000L, BSP_LED_0, BSP_LED_1);//PWM参数配置
 7
 8     /* Switch the polarity of the second channel. */
 9     pwm1_cfg.pin_polarity[1] = APP_PWM_POLARITY_ACTIVE_HIGH;
10
11     /* Initialize and enable PWM. */
12     err_code = app_pwm_init(&PWM1, &pwm1_cfg, pwm_ready_callback);//PWM初始化(核心在这个里面,本次不讲)
13     APP_ERROR_CHECK(err_code);
14     app_pwm_enable(&PWM1);//使能PWM
15
16     uint32_t value;
17     while(true)
18     {
19         for (uint8_t i = 0; i < 40; ++i)
20         {
21             value = (i < 20) ? (i * 5) : (100 - (i - 20) * 5);
22
23             ready_flag = false;
24             /* Set the duty cycle - keep trying until PWM is ready... */
25             while (app_pwm_channel_duty_set(&PWM1, 0, value) == NRF_ERROR_BUSY);//设置PWM1的0通道的值
26
27             /* ... or wait for callback. */
28             while(!ready_flag);
29             APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 1, value));//设置通道1
30             nrf_delay_ms(25);
31         }
32     }
33
34 }

注:PWM参数配置宏定义如下

1 /**@brief PWM instance default configuration (2 channels). */
2 #define APP_PWM_DEFAULT_CONFIG_2CH(period_in_us, pin0, pin1)                           3 {                                                                                  4     .pins            = {pin0, pin1},                                               5     .pin_polarity    = {APP_PWM_POLARITY_ACTIVE_LOW, APP_PWM_POLARITY_ACTIVE_LOW}, 6     .num_of_channels = 2,                                                          7     .period_us       = period_in_us                                                8 }

注:PWM回调函数如下

1 static volatile bool ready_flag;            // A flag indicating PWM status.
2
3 void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
4 {
5     ready_flag = true;
6 }

@nRF51822基础实验系列:



[nRF51822] 7、基础实验代码解析大全(前十)

[nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI

[nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC

[nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC



@beautifulzzzz - 物联网&普适计算实践者
e-mail:[email protected] 
i-blog:blog.beautifulzzzz.com

时间: 2024-08-04 19:24:10

[nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM的相关文章

[nRF51822] 10、基础实验代码解析大全 &#183; 实验15 - RTC

一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻转状态, 即指示灯D1 以8Hz 的速率翻转状态 COMPARE0 中断中点亮指示灯D2 二.nRF51822的内部RTC结构: NRF51822 有两个RTC 时钟:RTC0,RTC1.两个RTC 均为24 位,使用LFCLK 低频时钟,并带有12 位分频器,可产生TICK.compare 和溢出

[nRF51822] 11、基础实验代码解析大全 &#183; 实验16 - 内部FLASH读写

 一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识: EN-nRF51D 开发板使用NRF51822 芯片为nRF51822-QFAA,如下图所示,共有256KBFLASH,256 页,页大小为1024 字节. NRF51822 内部FLASH 写流程如下: 三.代码解析: main: 1 int main(void) 2 { 3 ... 4 5

[nRF51822] 8、基础实验代码解析大全 &#183; 实验11 - PPI

前一篇分析了前十个基础实验的代码,从这里开始分析后十个~ 一.PPI原理: PPI(Programmable Peripheral Interconnect),中文翻译为可编程外设互连. 在nRF51822 内部设置了PPI 方式,可以通过任务和事件让不同外设之间进行互连,而不需要CPU 进行参与. PPI 通过通道让任务和事件连接在一起.PPI 通道由两个端点组成: 任务端点:Task End-Point (TEP). 事件端点:Event End-Point (EEP). 所谓的互联就是将任

[nRF51822] 7、基础实验代码解析大全(前十)

实验01 - GPIO输出控制LED 引脚输出配置:nrf_gpio_cfg_output(LED_1); 引脚输出置高:nrf_gpio_pin_set(LED_1); 引脚电平转换:nrf_gpio_pin_toggle(LED_1); 毫秒延时:nrf_delay_ms(100); 1 int main(void) 2 { 3 nrf_gpio_cfg_output(LED_1);//配置P0.21为输出 4 nrf_gpio_pin_set(LED_1); //指示灯D1初始状态为熄灭

MYSQL常见出错mysql_errno()代码解析

如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 "网站出现Query was empty 报错" 帖子,后来我查阅了 MYSQL常见出错代码解析大全mysql_errno()才知道是 1065:无效的SQL语句,SQL语句为空 导致的错误. 所以我们应该把重点放在sql语句上,最后发现是我的SQL语句的变量用了大写,而执行的时候该变量用了

JAVA将数字字符串强制转换成整型变量----求参数之和实验代码

实验代码: package demo; public class CommandParameter {  /**  * @param args  */  public static void main(String[] args) {   // TODO Auto-generated method stub    int sum=0;                                                                             //设数值

【原创】大数据基础之Spark(4)RDD原理及代码解析

一 简介 spark核心是RDD,官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds官方描述如下:重点是可容错,可并行处理 Spark revolves around the concept of a resilient distributed dataset (RDD), which is a fault-tolerant colle

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可

Joel谈软件 12步让代码趋于完善【译】

2000年8月9日 星期三 你听说过SEMA(软件工程测试与分析)吗?那是一个相对难懂的系统——用于衡量一个软件开发小组的好赖.停下来,别点击那个链接,弄懂那个系统兴许长达六年之久.我提出一个我自己的.不负责任.草率的方法测试软件团队的质量.这个方法的好处是它只用大约三分钟.如果你总是节省时间,你可以出门右拐. Joel的测试: 1.代码源控制软件你有用吗? 2.你能一步建立工程吗? 3.平时做工程吗? 4.你有bug数据库吗? 5.在写新代码前bug是否都已排除? 6.你有不断更新的计划表单吗