NRF52832 PWM 占空比调整详解

NRF的PWM信号占空比调节基本上有两种方式,一般地方讲的不清楚,在此说明下,参考程序源自nrf5_sdk_17.1.0_ddde560,代码如下:

 nrf_drv_pwm_config_t const config0 =
    {
        .output_pins =
        {
            BSP_LED_0 | NRF_DRV_PWM_PIN_INVERTED, // channel 0
            BSP_LED_2 | NRF_DRV_PWM_PIN_INVERTED, // channel 1
            BSP_LED_3 | NRF_DRV_PWM_PIN_INVERTED, // channel 2
            BSP_LED_1 | NRF_DRV_PWM_PIN_INVERTED  // channel 3
        },
        .irq_priority = APP_IRQ_PRIORITY_LOWEST,
        .base_clock   = NRF_PWM_CLK_125kHz,
        .count_mode   = NRF_PWM_MODE_UP,
        .top_value    = 16000,
        .load_mode    = NRF_PWM_LOAD_INDIVIDUAL,
        .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 (hence no "const", though its content is not changed).
    static nrf_pwm_values_individual_t /*const*/ seq_values[] =
    {
        { 0x8000,      0x8000,      0x8000,      0x8000 },
        {      0, 					0,     			 0,     		 	0 },
        {      0,     		  0,				 	0,     		 		0 },
        {      0,     		  0,     			 0, 					0 },

    };
    nrf_pwm_sequence_t const seq =
    {
        .values.p_individual = seq_values,
        .length              = NRF_PWM_VALUES_LENGTH(seq_values),
        .repeats             = 0,
        .end_delay           = 0
    };

    (void)nrf_drv_pwm_simple_playback(&m_pwm0, &seq, 1, NRF_DRV_PWM_FLAG_LOOP);

这其中包括了PWM的初始化,PWM序列的初始化和序列的播放;

第一种:用播放序列来确定占空比

static nrf_pwm_values_individual_t /*const*/ seq_values[] =
    {
        { 0x8000,      0x8000,      0x8000,      0x8000 },
        {      0, 					0,     			 0,     		 	0 },
        {      0,     		  0,				 	0,     		 		0 },
        {      0,     		  0,     			 0, 					0 },

         { 0x8000,      0x8000,      0x8000,      0x8000 },//1,2,3,4通道输出PWM
        {      0,                     0,                  0,                  0 },//1,2,3,4通道不输出PWM
        {      0,               0,                     0,                      0 },//1,2,3,4通道不输出PWM
        {      0,               0,                  0,                     0 },//1,2,3,4通道不输出PWM

横向代表了通道1-4,竖向代表了每个通道的四个PWM生成顺序。如此来看,每个通道的PWM输出情况就是在平均分成四份的时间上有一份时间输出PWM,剩下三份时间里不输出PWM,如下图:

         

|       PWM        |           0      |         0       |           0      |

那么占空比就是25%.示波器波形如图:

 

如果修改成下图的序列

        { 0x8000,      0x8000,      0x8000,      0x8000 },//1,2,3,4
        { 0x8000, 	   0x8000,     	0x8000,      0x8000 },//
        {      0,     		 0,			0,     		 0 },//
        {      0,     		  0,     	 0, 		0 },//

PWM的播放顺序就成了

  

|       PWM        |           PWM      |         0       |           0      |,1234通道都是一样的情况,占空比就成了50%,示波器波形如图:

第二种:调整播放序列中的值来调整占空比

这种调节方法和 .top_value    = 16000,值有关系

  nrf_drv_pwm_config_t const config0 =
    {
        .output_pins =
        {
            BSP_LED_0 | NRF_DRV_PWM_PIN_INVERTED, // channel 0
            BSP_LED_2 | NRF_DRV_PWM_PIN_INVERTED, // channel 1
            BSP_LED_3 | NRF_DRV_PWM_PIN_INVERTED, // channel 2
            BSP_LED_1 | NRF_DRV_PWM_PIN_INVERTED  // channel 3
        },
        .irq_priority = APP_IRQ_PRIORITY_LOWEST,
        .base_clock   = NRF_PWM_CLK_125kHz,
        .count_mode   = NRF_PWM_MODE_UP,
        .top_value    = 16000,
        .load_mode    = NRF_PWM_LOAD_INDIVIDUAL,
        .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 (hence no "const", though its content is not changed).
    static nrf_pwm_values_individual_t /*const*/ seq_values[] =
    {
        { 4000,      4000,      8000,      8000 },//1,2,3,4
        

    };

如上面的代码那样,top_value值为16000,seq_values[] = { 4000,      4000,      8000,      8000 },//1,2,3,4通道

1,2通道占空比就是25%,3,4通道就是50%,1,2通道波形如图:

 

要注意的是,用调整播放序列的值来调整占空比时如果定义了两组序列而且值不同,也将会影响到占空比,比如:

seq_values[] =
    {
        { 4000,      4000,      8000,      8000 },//1,2,3,4
		{    0,         0,         0,         0 },//1,2,3,4
    }

第二个序列值为空,但是还是占用了1600个值的时间,此时12通道的占空比为12.5%,34通道为25%。1,2通道波形如图:

 

以上。

### 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、付费专栏及课程。

余额充值