脉冲宽度调制输出(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。