一、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:

 int main(void)
{
ret_code_t err_code; /* 2-channel PWM, 200Hz, output on DK LED pins. */
app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_2CH(5000L, BSP_LED_0, BSP_LED_1);//PWM参数配置

/* Switch the polarity of the second channel. */
pwm1_cfg.pin_polarity[] = APP_PWM_POLARITY_ACTIVE_HIGH; /* Initialize and enable PWM. */
err_code = app_pwm_init(&PWM1, &pwm1_cfg, pwm_ready_callback);//PWM初始化(核心在这个里面,本次不讲)
APP_ERROR_CHECK(err_code);
app_pwm_enable(&PWM1);//使能PWM

uint32_t value;
while(true)
{
for (uint8_t i = ; i < ; ++i)
{
value = (i < ) ? (i * ) : ( - (i - ) * ); ready_flag = false;
/* Set the duty cycle - keep trying until PWM is ready... */
while (app_pwm_channel_duty_set(&PWM1, , value) == NRF_ERROR_BUSY);//设置PWM1的0通道的值 /* ... or wait for callback. */
while(!ready_flag);
APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 1, value));//设置通道1
nrf_delay_ms();
}
} }

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

 /**@brief PWM instance default configuration (2 channels). */
#define APP_PWM_DEFAULT_CONFIG_2CH(period_in_us, pin0, pin1) \
{ \
.pins = {pin0, pin1}, \
.pin_polarity = {APP_PWM_POLARITY_ACTIVE_LOW, APP_PWM_POLARITY_ACTIVE_LOW}, \
.num_of_channels = , \
.period_us = period_in_us \
}

注:PWM回调函数如下

 static volatile bool ready_flag;            // A flag indicating PWM status.

 void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
{
ready_flag = true;
}

@nRF51822基础实验系列:


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

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

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

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

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


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

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

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

    一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...

  2. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

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

    一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...

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

    前一篇分析了前十个基础实验的代码,从这里开始分析后十个~ 一.PPI原理: PPI(Programmable Peripheral Interconnect),中文翻译为可编程外设互连. 在nRF51 ...

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

    实验01 - GPIO输出控制LED 引脚输出配置:nrf_gpio_cfg_output(LED_1); 引脚输出置高:nrf_gpio_pin_set(LED_1); 引脚电平转换:nrf_gpi ...

  6. 基础Gan代码解析

    initializer总结: #f.constant_initializer(value) 将变量初始化为给定的常量,初始化一切所提供的值. #tf.random_normal_initializer ...

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

    如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...

  8. 【原创】大数据基础之Spark(5)Shuffle实现原理及代码解析

    一 简介 Shuffle,简而言之,就是对数据进行重新分区,其中会涉及大量的网络io和磁盘io,为什么需要shuffle,以词频统计reduceByKey过程为例, serverA:partition ...

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

    一 简介 spark核心是RDD,官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-di ...

随机推荐

  1. Cocos2d-x 生成真正的随机数

    关于随机数 cocos2d-x 定义了一个宏 CCRANDOM_0_1 生成的是 [0, 1] 之间的值 因此,要生成  [0-100] 之间的数    CCRANDOM_0_1 * 100 生成 [ ...

  2. 深入浅出JMS(一) JMS基本概念

    摘要:The JavaMessage Service (JMS) API is a messaging standard that allows application components base ...

  3. jQuery简单入门

    jQuery是什么 John Resig在2006年1月发布的一款跨主流浏览器的JavaScript库,简化JavaScript对HTML操作为什么要使用jQuery (1)write less do ...

  4. ZoomEye 钟馗之眼 搜索工具 基于API

    #!/usr/bin/env python # -*- coding: utf-8 -*- # Author: f0rsaken import getopt import requests impor ...

  5. Good Bye 2016 - B

    题目链接:http://codeforces.com/contest/750/problem/B 题意:地球的子午线长度为40000,两极点的距离为20000.现在你从北极出发,按照题目输入方式来走. ...

  6. C++-Qt【5】-QT的QString,char*,QByteArray转化以及中文乱码的问题

    引用:http://blog.sina.com.cn/s/blog_a7e2c7490101oatt.html QTextCodec *codec = QTextCodec::codecForName ...

  7. 前馈网络求导概论(一)·Softmax篇

    Softmax是啥? Hopfield网络的能量观点 1982年的Hopfiled网络首次将统计物理学的能量观点引入到神经网络中, 将神经网络的全局最小值求解,近似认为是求解热力学系统的能量最低点(最 ...

  8. Leetcode Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  9. requirejs 打包 添加版本号收集资料 待测试

    https://www.npmjs.org/package/rjs-optimhttps://www.npmjs.org/package/grunt-requirejs-md5指定js版本号 但不是M ...

  10. HDU 2509 Nim博弈变形

    1.HDU 2509  2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...