PWM

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


功能概述

PWM的基本概念

PWM(Pulse Width Modulation,脉冲宽度调制)是一种利用脉冲信号的宽度来调制输出信号的技术。通过改变脉冲的宽度(即高电平持续的时间),PWM能够有效地控制输出信号的平均电压,从而实现对模拟信号的数字编码和控制。

工作原理

  1. 占空比:PWM信号的占空比是指高电平持续时间与一个完整周期的比例。通过调节占空比,可以控制输出信号的平均电压值。

  2. 周期与频率:PWM信号的周期是指完成一个完整的高低电平循环所需的时间,频率则是单位时间内周期的数量。不同的应用场景可能需要不同的工作频率,常见的PWM频率范围从数百Hz到几MHz不等。

  3. 面积等效原理:PWM的基本原理之一是面积等效原理,即冲量(面积)相等而形状不同的脉冲,作用于惯性环节时效果基本相同。通过调节脉冲的宽度,可以实现与目标波形相等的效果。

../../_images/image_WSGZboCaAornmvxn60bcSpI0nOh.webp

应用领域

PWM技术广泛应用于多个领域,包括但不限于:

  • 电机控制:用于调节电机的转速和转矩,广泛应用于电动车、风力发电等。

  • 开关电源:在电源管理中,PWM技术能够提高效率和功率密度,降低系统成本和功耗。

  • 通信系统:PWM可以用于信号传输,增强抗干扰能力,延长通信距离。

PWM API

头文件

qosa_pwm.h

函数概览

函数

说明

qosa_pwm_config()

配置PWM功能

qosa_pwm_enable()

启用PWM输出功能并配置其参数

qosa_pwm_disable()

禁用PWM输出功能

函数详解

qosa_pwm_config

  • 功能描述
    配置PWM功能。

  • 函数原型

qosa_pwm_error_e qosa_pwm_config(unsigned char pwm_sel, qosa_pwm_info_t *pwm_info);
  • 参数说明

参数名

输入/输出

类型

说明

pwm_sel

输入

unsigned char

PWM通道标识符;范围:0~4

pwm_info

输入

qosa_pwm_info_t*

指向PWM配置信息结构体的指针;详见 qosa_pwm_info_t

  • 返回值说明
    QOSA_PWM_SUCCESS:函数执行成功
    其他值(详见 qosa_pwm_error_e):函数执行失败

qosa_pwm_enable

  • 功能描述
    启用PWM输出功能并配置其参数。

  • 函数原型

qosa_pwm_error_e qosa_pwm_enable(unsigned char pwm_sel, unsigned int high_one_cycle_duration);
  • 参数说明

参数名

输入/输出

类型

说明

pwm_sel

输入

unsigned char

PWM通道标识符;范围:0~4

high_one_cycle_duration

输入

unsigned int

单周期内PWM输出保持高电平的持续时间;单位:定时器计数值;范围:0~total_one_cycle_duration。若传入此参数,将覆盖 qosa_pwm_config() 初始化时设置的初值

  • 返回值说明
    QOSA_PWM_SUCCESS:函数执行成功
    其他值(详见 qosa_pwm_error_e):函数执行失败

qosa_pwm_disable

  • 功能描述
    禁用PWM输出功能。

  • 函数原型

qosa_pwm_error_e qosa_pwm_disable(unsigned char pwm_sel);
  • 参数说明

参数名

输入/输出

类型

说明

pwm_sel

输入

unsigned char

PWM通道标识符;范围:0~4

  • 返回值说明
    QOSA_PWM_SUCCESS:函数执行成功
    其他值(详见 qosa_pwm_error_e):函数执行失败

结构体定义

qosa_pwm_info_t

PWM配置信息结构体定义如下:

typedef struct {
    unsigned int       high_one_cycle_duration;  
    unsigned int       total_one_cycle_duration; 
    unsigned int       pwm_psc;                  
    qosa_pwm_clk_src_e clk_src;                
} qosa_pwm_info_t;

参数

类型

说明

high_one_cycle_duration

unsigned int

单周期内PWM输出保持高电平的持续时间;单位:定时器计数值;范围:0~total_one_cycle_duration。仅作为PWM初始化时的初值,后续实际生效值为 qosa_pwm_enable() 传入的参数

total_one_cycle_duration

unsigned int

一个完整PWM周期的总持续时间;单位:定时器计数值;取值不可为 0

pwm_psc

unsigned int

时钟分频系数;取值不可为 0

clk_src

qosa_pwm_clk_src_e

时钟源选择;详见 qosa_pwm_clk_src_e

枚举定义

qosa_pwm_clk_src_e

PWM时钟源选择枚举定义如下:

typedef enum {
    QOSA_FCLK_SEL_32K = 0,  
    QOSA_FCLK_SEL_13M,      
    QOSA_FCLK_SEL_26M,      
} qosa_pwm_clk_src_e;

成员

说明

QOSA_FCLK_SEL_32K

32 kHz时钟源;当需要在睡眠期间维持输出时可选

QOSA_FCLK_SEL_13M

13 MHz时钟源(暂不支持)

QOSA_FCLK_SEL_26M

26 MHz时钟源

qosa_pwm_error_e

PWM错误码枚举定义如下:

typedef enum {
    QOSA_PWM_SUCCESS = 0,                                       
    QOSA_PWM_EXECUTE_ERR = 1 | (QOSA_COMPONENT_BSP_PWM << 16), 
    QOSA_PWM_INVALID_PARAM_ERR,                                
    QOSA_PWM_FUNC_SET_ERR,                                     
    QOSA_PWM_START_ERR,                                        
    QOSA_PWM_STOP_ERR,                                         
    QOSA_PWM_REPEAT_OPEN_ERR,                                  
    QOSA_PWM_REPEAT_CLOSE_ERR,                                 
    QOSA_PWM_NO_OPEN_ERR,                                      
    QOSA_PWM_SET_CLK_ERR,                                      
} qosa_pwm_error_e;

成员

说明

QOSA_PWM_SUCCESS

函数执行成功

QOSA_PWM_EXECUTE_ERR

函数执行失败

QOSA_PWM_INVALID_PARAM_ERR

输入参数无效

QOSA_PWM_FUNC_SET_ERR

功能设置失败

QOSA_PWM_START_ERR

启动失败

QOSA_PWM_STOP_ERR

停止失败

QOSA_PWM_REPEAT_OPEN_ERR

重复打开失败

QOSA_PWM_REPEAT_CLOSE_ERR

重复关闭失败

QOSA_PWM_NO_OPEN_ERR

打开配置失败

QOSA_PWM_SET_CLK_ERR

时钟设置失败

备注

QOSA_COMPONENT_BSP_PWM 为PWM组件ID,定义于 qosa_def.h 中。

应用逻辑流程图

image

示例代码

完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/pwm/pwm_demo.c