PWM
1 功能概述
介绍的PWM模块包含三部分,分别为独立输出模式、互补输出模式以及PWM输入信号捕捉三个模式, 其中独立输出与互补输出都是芯片信号输出,信号捕捉是获得外部信号。
bk7236具有12路PWM输出,输出时其时钟源选择的是26M,每一路的周期及占空比都可以单独配置,channel如下:
channel
GPIO
channel
GPIO
0
GPIO6
6
GPIO32
1
GPIO7
7
GPIO33
2
GPIO8
8
GPIO34
3
GPIO9
9
GPIO35
4
GPIO24
10
GPIO36
5
GPIO25
11
GPIO37
2 代码路径
demo路径:
components\bk_cli\cli_pwm.c
3 cli命令简介
demo运行依赖的宏配置:
NAME
Description
File
value
CONFIG_PWM
support PWM
middleware\soc\bk7236\bk7236.defconfig
y
demo支持的命令如下表:
Command
Param
Description
pwm_driver init {26M|DCO}
26M|DCO:clk source,default 26M
init the resoure common to all PWM channels
pwm_driver deinit
none
free all resource related to pwm
pwm {chan} init {period_v} {duty_v}
[duty2_v][duty3_v]
chan: pwm channel
power up and config the pwm channel, set the period and duty cycle
note: this chip supports 3 duty cycle , parameter duty2_v and duty3_v are optional
period_v:pwm periord
duty_v: duty cycle
duty2_v: second level reversal
duty3_v: third level reversal
pwm {chan} duty {period_v} {duty_v}
[duty2_v] [duty3_v]
chan: pwm channel
configure the period and duty cycle.
note: parameter duty2_v and duty3_v are option.
period_v:pwm periord
duty_v: duty cycl
duty2_v: second level reversal
duty3_v: third level reversal
pwm {chan} {start|stop|deinit}
chan: pwm channel
read data_size bytes of data from
start|stop|deinit:
pwm {chan} signal {low|high}
chan: pwm channel
set the initial signal to high|low
low|high: initial signal level
pwm_group init {chan1} {chan2}
{period} {chan1_duty} {chan2_duty}
chan1: pwm channel
init the PWM group
The PWM group is a channel pair that has following attributes: -The period is same -The initial signal level is opposite -Start and stop at the same time
chan2: pwm channel
period: pwm periord
chan1_duty: chan1 duty cycle
chan2_duty: chan2 duty cycle
pwm_group {start|stop|deinit}
chan: pwm channel
start|stop|deinit the PWM group
start|stop|deinit:
pwm_group config {group} {period}
{chan1_duty} {chan2_duty}
group: pwm channel
Configure the duty and period of a PWM group
period: pwm periord
chan1_duty: chan1 duty cycle
chan2_duty: chan2 duty cycle
pwm_capture {chan} init {pos|neg|edge}
chan: pwm channel
calculate the cycles between two different pos-edge|neg-edge|edges
pos|neg|edge: counting mode
pwm_capture {chan} {start|stop|deinit}
chan: pwm channel
start|stop|deinit pwm capture func
start|stop|deinit
4 演示介绍
demo执行的步骤如下:
1、准备好逻辑分析仪,连接方式如下:
pwm通道0----GPIO6 pwm通道1----GPIO7
2、PWM独立输出模式
对PWM驱动进行初始化:
pwm_driver init
2.1 普通输出
pwm 0 init 5 3 0 0 //占空比60% pwm 0 start
波形如下:
2.2 一个周期内3次翻转电平
pwm 0 duty 6 1 2 3 pwm 0 start
波形如下:
2.3 设置初始电平为低
pwm 0 signal low pwm 0 duty 6 1 2 3 pwm 0 start
波形如下:
2.4 period > (D1+D2+D3)
pwm 0 duty 7 1 2 3
波形如下:
3、PWM互补模式
互补模式可以避免死区产生的问题。互补输出其作用是为了避免关闭前一个设备和打开后一个设备时 因为开关速度的问题出现同时开启状态而增加负荷的情况(在没有彻底关闭前打开了后一个设备), 尤其是电流过大时容易造成短路等损坏设备。
依次执行以下命令:
pwm_driver init pwm_group init 0 1 15 5 6 pwm_group start
波形如下:
4、输入捕获模式
PWM输入捕获模式是普通输入模式一种特殊应用,是将TIMx输入映射了两个Cx信号(输入捕获装置C1和C2), 其中一个捕获上升沿,另一个捕获下降沿。这样可以在中断中去读上升沿和下降沿对应寄存器中的计数,从而得出周期和占空比。 其中一个捕获通道计算两次都是上升沿的时间,即周期T;而另一个通道则计算一次下降沿和之前上升沿之差,这样得到高电平时长, 从而可以求得周期T和占空比。
将外部1k Hz信号接入GPIO6,依次输入以下命令:
pwm_driver init pwm_capture 0 init pwm_capture 0 init pos pwm_capture 0 start
在中断函数中计算出计数值 value=658f,以上升沿或者下降沿计数,则输入信号频率约为 26M/0x658f = 1k
输入命令:
pwm_capture 0 init edge pwm_capture 0 start
在中断函数中会计算出计数值 value=32c7,以边沿计数,则输入信号频率约为 26M/0x32c7 = 2k
备注
注意:根据参数的配置,在相同周期内,占空比可以进行调整。但每次调整配置都在下一个周期才会生效; 在PWM进行init和duty设置时,必须 period > (D1+D2+D3)。