zoukankan      html  css  js  c++  java
  • [nRF51822] 12、基础实验代码解析大全 · 实验19

    一、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 - 物联网&普适计算实践者
    e-mail:beautifulzzzz@qq.com 
    i-blog:blog.beautifulzzzz.com 

  • 相关阅读:
    【剑指Offer面试编程题】题目1504:把数组排成最小的数--九度OJ
    【剑指Offer面试编程题】题目1373:整数中1出现的次数--九度OJ
    【剑指Offer面试编程题】题目1372:最大子向量和--九度OJ
    【剑指Offer面试编程题】题目1371:最小的K个数--九度OJ
    vue路由传参
    Es5.Es6区别
    面向对象和面向过程
    vuex
    Vue脚手架使用
    vue中fetch请求
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/5755227.html
Copyright © 2011-2022 走看看