跳转至

脉冲宽度调制输出(PWM)


1、简介

PWM(Pulse Width Modulation,脉冲宽度调制)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。

CI14LP芯片共有PWM0 ~ PWM3共4路独立PWM输出通道,可自由配置输出频率与占空比,广泛应用于LED调光、电机控制、蜂鸣器驱动等场景。


2、API

函数名 描述
pwm_init PWM初始化(频率/占空比分子/最大占空比)
pwm_en PWM输出使能/关闭
pwm_set_duty PWM占空比设置(duty/duty_max)
pwm_set_stop_level PWM停止后的输出电平设置
pwm_pause_en PWM暂停使能

3、关键类型

类型 说明
pwm_base_t 控制器选择:PWM0、PWM1、PWM2、PWM3
pwm_level_t 停止电平:PWM_LEVEL_LOW(低电平)、PWM_LEVEL_HIGH(高电平)
pwm_init_t 配置结构体:freq(频率,单位Hz)、pulse_width(占空比分子计数值)、period(最大占空比计数值)

4、示例

1) 以下代码配置PWM0输出1KHz、50%占空比的方波:

#include "ci14lp_pwm.h"
#include "ci14lp_scu.h"

void pwm_demo(void)
{
    pwm_init_t init;

    //打开PWM0外设时钟
    scu_set_device_clock_en(HAL_PWM0_BASE, ENABLE);

    //1KHz频率,50%占空比
    init.freq        = 1000;   //频率1KHz
    init.period      = 100;    //最大占空比计数
    init.pulse_width = 50;     //占空比分子,50/100 = 50%

    pwm_init(PWM0, init);
    pwm_en(PWM0, ENABLE);
}

2) 以下代码动态修改PWM占空比实现呼吸灯效果:

#include "ci14lp_pwm.h"

void pwm_breath(void)
{
    int duty = 0;
    int dir  = 1;

    while (1)
    {
        duty += dir * 5;
        if (duty >= 100 || duty <= 0)
        {
            dir = -dir;    //方向反转
        }
        //duty取值0~100,对应0%~100%占空比
        pwm_set_duty(PWM0, duty, 100);
        //延时20ms,控制呼吸节奏
        vTaskDelay(20);
    }
}

5、其它

  • PWM输出引脚需通过GPIO复用接口(gpio_set_pad_reuse)配置对应管脚为PWM功能。
  • pwm_set_duty(base, duty, duty_max) 中实际占空比为 duty/duty_max,可自由选择计数粒度。
  • pwm_en(base, DISABLE) 停止输出后,引脚电平由 pwm_set_stop_level 配置决定。

6、API 参考

本模块接口声明于 driver\ci14lp_chip_driver\inc\ci14lp_pwm.h,实现位于 driver\ci14lp_chip_driver\src\ci14lp_pwm.c。