[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

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



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/5755227.html,如需转载请自行联系原作者

相关文章
|
8天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
25天前
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
180 1
|
25天前
|
存储 C# 容器
C变量数据类型深度解析:打造高效代码的基石
C变量数据类型深度解析:打造高效代码的基石
13 1
|
1月前
|
安全 Java
Java 枚举(Enums)解析:提高代码可读性与易维护性
在 Java 中,实现抽象的另一种方式是使用接口。 接口定义 接口是一个完全抽象的类,用于将具有空方法体的相关方法分组:
69 1
|
2月前
|
传感器 存储 监控
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
【物联网】液滴即信息:雨滴探测传感器实验解析降雨的密码
53 0
|
3月前
|
自然语言处理 Java 编译器
深入解析Java代码执行过程,揭开神秘的黑匣子!
深入解析Java代码执行过程,揭开神秘的黑匣子!
|
25天前
|
机器学习/深度学习 存储 Java
揭秘数组:数据结构的基石与代码实践解析
揭秘数组:数据结构的基石与代码实践解析
8 0
|
25天前
|
Python
继承概念深度解析:代码视角下的科普之旅
继承概念深度解析:代码视角下的科普之旅
6 0
|
25天前
|
设计模式 缓存 Java
单例模式解析:从理论到代码实践
单例模式解析:从理论到代码实践
11 0
|
25天前
|
C#
C运算符优先级深度解析:从新手到专家的代码实操之旅
C运算符优先级深度解析:从新手到专家的代码实操之旅
9 0

推荐镜像

更多