Skip to main content

PWM

一 配置方法

1.1 pwm驱动配置

1

1.2 pwm shell命令

2

二 pwm shell 命令详解

相关源码见libhardware2/src/cmds目录下的pwm_main.c

2.1 shell 命令

cmd_pwm config <gpio> <freq=value> <max_level=value> [active_level=value] [accuracy_priority=freq(levels)]
功能:请求pwm和配置
参数: gpio //io口的名字
freq=value //频率
max_level=value //PWM最大调制的级数
active_level=value //活跃电平(active_level =1、 active_level=0)
accuracy_priority=freq // 频率优先
accuracy_priority=levels // 极数优先
example:
cmd_pwm config pc11 freq=1000000 max_level=300 active_level=1 accuracy_priority=freq
cmd_pwm set_level <gpio> <level>
功能:设置pwm级数
参数:pwm_id //io口的名字
level //pwm 调制级数,即一个周期内非空闲电平长度
example:
cmd_pwm set_level pc11 100
cmd_pwm disable <gpio>
功能:失能pwm
参数:gpio //io口的名字
example:
cmd_pwm disable PC25

三 pwm应用接口分析

相关源码见libhardware2/src/lib/pwm/pwm.c

3.1 API详细介绍

包含头文件:

#include <libhardware2/pwm.h>

pwm使用流程:

  1. pwm_request 申请指定 PWM 通道
  2. pwm_config 设置 pwm 参数
  3. pwm_set_level 设置 PWM 调制的级数,并输出PWM
  4. pwm_release 释放 PWM 资源
long pwm_request(const char *gpio_name)
功能:申请指定 PWM 通道
参数:gpio_name //pwm对应的gpio引脚,如,"pb17"、"pc11"
返回值:成功:pwm句柄
失败:-1
void pwm_release(long handle);
功能:释放指定的 PWM 通道
参数:handle //pwm句柄,由pwm_request()获取
返回值:无
int pwm_config(long handle, struct pwm_config_data *cfg);
功能:设置 pwm 参数,参数由 pwm_config_data 结构体传入
参数:handle //pwm句柄,由pwm_request()获取
cfg //存放设置pwm参数的信息结构体,详见中间参数详解
返回值:成功:0
失败:负数
int pwm_set_level(long handle, unsigned int level)
功能:设置 PWM 调制的级数,并输出PWM
参数:handle //pwm句柄,由pwm_request()获取
level //pwm调制的级数,即一个周期内非空闲电平的长度
返回值:成功:0
失败:负数

中间参数详解

/*设置pwm参数的信息结构体*/
struct pwm_config_data {
enum pwm_shutdown_mode shutdown_mode; //设置pwm结束时的模式
enum pwm_idle_level idle_level; //设置pwm空闲时的电平
enum pwm_accuracy_priority accuracy_priority; //设置pwm的精度优先
unsigned long freq; //设置pwm的频率
unsigned long levels; //设置最大级数
unsigned int id; //申请pwm成功后的id号
};
/*设置pwm结束时的模式枚举*/
enum pwm_shutdown_mode {
/**
* pwm停止输出时,尽量保证pwm的信号结尾是一个完整的周期
*/
PWM_graceful_shutdown,
/**
* pwm停止输出时,立刻将pwm设置成空闲时电平
*/
PWM_abrupt_shutdown,
};
/*设置pwm空闲时的电平枚举*/
enum pwm_idle_level {
/*pwm 空闲时电平为低*/
PWM_idle_low,

/* pwm 空闲时电平为高 */
PWM_idle_high,
};
/*设置pwm的精度优先*/
enum pwm_accuracy_priority {
/* 优先满足pwm的目标频率的精度,级数可能不准确*/
PWM_accuracy_freq_first,

/* 优先满足pwm的级数设置,pwm频率可能不准确 */
PWM_accuracy_levels_first,
};