[nRF51822]|[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 的原理框图如下图所示:
[nRF51822]|[nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM
文章图片


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

三、代码解析:
main:
1 int main(void) 2 { 3ret_code_t err_code; 4 5/* 2-channel PWM, 200Hz, output on DK LED pins. */ 6app_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. */ 9pwm1_cfg.pin_polarity[1] = APP_PWM_POLARITY_ACTIVE_HIGH; 10 11/* Initialize and enable PWM. */ 12err_code = app_pwm_init(&PWM1, &pwm1_cfg, pwm_ready_callback); //PWM初始化(核心在这个里面,本次不讲) 13APP_ERROR_CHECK(err_code); 14app_pwm_enable(&PWM1); //使能PWM 15 16uint32_t value; 17while(true) 18{ 19for (uint8_t i = 0; i < 40; ++i) 20{ 21value = https://www.it610.com/article/(i < 20) ? (i * 5) : (100 - (i - 20) * 5); 22 23ready_flag = false; 24/* Set the duty cycle - keep trying until PWM is ready... */ 25while (app_pwm_channel_duty_set(&PWM1, 0, value) == NRF_ERROR_BUSY); //设置PWM1的0通道的值 26 27/* ... or wait for callback. */ 28while(!ready_flag); 29APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 1, value)); //设置通道1 30nrf_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 { 5ready_flag = true; 6 }



@nRF51822基础实验系列:
[nRF51822] 7、基础实验代码解析大全(前十)
[nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI
【[nRF51822]|[nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM】[nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC
[nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
[nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写


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

    推荐阅读