nrf52832 PWM外设产生PWM波形笔记


static void demo2(void)
{
    NRF_LOG_INFO("Demo 2");

    /*
     * This demo plays back two concatenated sequences:
     * - Sequence 0: Light intensity is increased in 25 steps during one second.
     * - Sequence 1: LED blinks twice (100 ms off, 100 ms on), then stays off
     *   for 200 ms.
     * The same output is generated on all 4 channels (LED 1 - LED 4).
     * The playback is repeated in a loop.
     */

    enum { // [local constants]
        TOP        = 10000,
        STEP_COUNT = 25
    };

    nrf_drv_pwm_config_t const config0 =
    {
        .output_pins =
        {
            BSP_LED_0 | NRF_DRV_PWM_PIN_INVERTED, // channel 0
            BSP_LED_1 | NRF_DRV_PWM_PIN_INVERTED, // channel 1
            BSP_LED_2 | NRF_DRV_PWM_PIN_INVERTED, // channel 2
            BSP_LED_3 | NRF_DRV_PWM_PIN_INVERTED  // channel 3
        },
        .irq_priority = APP_IRQ_PRIORITY_LOWEST,
        .base_clock   = NRF_PWM_CLK_500kHz,   //设置PWM外设的时钟
        .count_mode   = NRF_PWM_MODE_UP,    
        .top_value    = TOP,    //PWM波形周期,相当于STM32的ARR值
        .load_mode    = NRF_PWM_LOAD_COMMON, //通道比较值同时加载
        .step_mode    = NRF_PWM_STEP_AUTO
    };
    APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, NULL));
    m_used |= USED_PWM(0);

    // This array cannot be allocated on stack (hence "static") and it must
    // be in RAM.
    static nrf_pwm_values_common_t seq0_values[STEP_COUNT];
    uint16_t value = 0;
    uint16_t step  = TOP / STEP_COUNT;
    uint8_t  i;
    for (i = 0; i < STEP_COUNT; ++i)
    {
        value         += step;
        seq0_values[i] = value;
    }

    nrf_pwm_sequence_t const seq0 =
    {
        .values.p_common = seq0_values,
        .length          = NRF_PWM_VALUES_LENGTH(seq0_values),
        .repeats         = 1,    //此PWM值的数组(队列)重复加载的次数为(repeats+1)
        .end_delay       = 0
    };

    // This array cannot be allocated on stack (hence "static") and it must
    // be in RAM (hence no "const", though its content is not changed).
    static nrf_pwm_values_common_t /*const*/ seq1_values[] =
    {
             0,
        0x8000,
             0,
        0x8000,
             0,
             0
    };
    nrf_pwm_sequence_t const seq1 =
    {
        .values.p_common = seq1_values,
        .length          = NRF_PWM_VALUES_LENGTH(seq1_values),
        .repeats         = 4,
        .end_delay       = 0
    };

    (void)nrf_drv_pwm_complex_playback(&m_pwm0, &seq0, &seq1, 1,
                                       NRF_DRV_PWM_FLAG_LOOP);  

//nrf_drv_pwm_comples_playback 函数的意思是:先按seq0的设置模式加载到m_pwm0,然后再加载seq1的设置模式,然后就是循环 (NRF_DRV_PWM_FLAG_LOOP)执行seq0,seq1.
}

### nRF52832 PWM配置与使用教程 #### 启用PWM模块 为了在nRF52832上启用PWM功能,在SDK驱动配置中需要开启相应的PWM模块[^1]。 #### 设置PWM模式 PWM操作可以设置为两种不同的计数模式:上升沿对齐(Up mode)和中心对齐(Up and Down mode)。这通过枚举`nrf_pwm_mode_t`来定义,其中包含了两个选项:`NRF_PWM_MODE_UP`用于边缘对齐的PWM占空比,而`NRF_PWM_MODE_UP_AND_DOWN`则适用于中心对齐的情况[^2]。 #### 初始化PWM实例并配置参数 下面是一个简单的初始化函数示例,它设置了PWM通道的数量、频率以及其他必要的属性: ```c #include "nrf_drv_pwm.h" #include "boards.h" static const nrf_drv_pwm_config_t pwm_default_config = { .output_pins = {BSP_LED_0, BSP_LED_1, NRF_DRV_PWM_PIN_NOT_USED, NRF_DRV_PWM_PIN_NOT_USED}, // LED连接到指定引脚 .irq_priority = APP_IRQ_PRIORITY_LOWEST, .base_clock = NRF_PWM_CLK_16MHz, // 基础时钟源选择 .count_mode = NRF_PWM_MODE_UP, // 计数器工作方式 .top_value = 999, // 定义周期长度 .load_mode = NRF_PWM_LOAD_COMMON, // 加载模式 .step_mode = NRF_PWM_STEP_AUTO // 步骤模式 }; void init_pwm(void){ ret_code_t err_code; err_code = nrf_drv_pwm_init(&m_pwm0, &pwm_default_config, NULL); APP_ERROR_CHECK(err_code); uint16_t sequence_values[] = {750, 250}; // 占空比序列值 static nrf_pwm_sequence_t const seq = { .values.p_common = sequence_values, .length = NRF_PWM_VALUES_LENGTH(sequence_values), .repeats = 0, .end_delay = 0 }; nrf_drv_pwm_simple_playback(&m_pwm0, &seq, 1, NRF_DRV_PWM_FLAG_LOOP | NRF_DRV_PWM_FLAG_STOP_ON_DONE); } ``` 此代码片段展示了如何创建一个PWM对象,并对其进行基本配置。这里选择了外部LED作为输出设备,并指定了基础时钟速度和其他重要特性。最后还提供了一个简单播放回放的例子,用来循环发送预设好的脉宽调制信号给LED灯。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值