[fireflyP] PWM使用

本帖最后由 zhansb 于 2016-7-27 09:41 编辑

模块安装请参考:http://developer.t-firefly.com/thread-10503-1-2.html

fireflyP的PWM跟GPIO类似的方式,使用独立于内核的PWM接口,即两边的控制互相独立。所以在控制PWM时,要注意内核是否申请和控制了该PWM,重复控制会导致不可预计的问题。

在python中使用help(Pwm)可以打印Pwm使用的方法,主要的接口有:
| init()
| Init PWM function
| implement it before using Pwm
|
| set_config(self, period, duty, config=10)
| set PWM period and duty.
| :period: ns
| :duty: ns
| :config: set PWMx_CTRL value except PWMx_CTRL.scale
|
| start(self)
| Start PWM
|
| stop(self)
| Stop PWM

PWM使用的流程比较简单,大致如下:
1.PWM对应引脚的mux需要先设置为PWM,可参考上一篇《[fireflyP] GPIO使用》
2.初始化Pwm: Pwm.init()
3.申请使用的PWM,如:pwm=Pwm(‘PWM1’)
4.设置PWM的周期和占空时间,period, duty单位均为ns,如pwm.set_config(1000,500),即设置PWM的周期为1us(1000ns),占空比为50%(500ns)
5.打开PWM: pwm.start()
6.关闭PWM: pwm.stop()

set_config接口中的参数config这边详细讲一下:
config默认的配置是
config = Pwm.PWM_OUTPUT_LEFT | Pwm.PWM_LP_DISABLE | Pwm.PWM_CONTINUMOUS | Pwm.PWM_DUTY_POSTIVE | Pwm.PWM_INACTIVE_NEGATIVE
其主要的配置选项有:

    PWM_SHOT               =(0 << 1)
    PWM_CONTINUMOUS        =(1 << 1)
    PWM_CAPTURE         =(1 << 2)

    PWM_DUTY_POSTIVE       =(1 << 3)
    PWM_DUTY_NEGATIVE      =(0 << 3)

    PWM_INACTIVE_POSTIVE   =(1 << 4)
    PWM_INACTIVE_NEGATIVE  =(0 << 4)

    PWM_OUTPUT_LEFT        =(0 << 5)
    PWM_OUTPUT_ENTER       =(1 << 5)

PWM有三种运行模式:
PWM_SHOT:产生有效次波形
PWM_CONTINUMOUS:连续产生波形
PWM_CAPTURE:捕获输入的波形,目前fireflyP不支持该种模式

PWM 占空比极性:PWM_DUTY_POSTIVE,PWM_DUTY_NEGATIVE 控制占空比时的输出电平

PWM 空闲时输出极性:PWM_INACTIVE_POSTIVE,PWM_INACTIVE_NEGATIVE 控制无效输出时的电平

PWM 输出对齐模式:PWM_OUTPUT_LEFT,PWM_OUTPUT_ENTER
datasheet里面的表格可以比较清晰的说明这两种模式:

具体的PWM功能介绍可以参考RK3288 datasheet “51.3 Functional description ”。

下面用举几个例子介绍一下PWM的使用:
我们使用PWM1来做验证,先看PWM1引脚的定义:

PWM1对应的GPIO引脚定义是GPIO7A1,在GRF_GPIO7A_IOMUX寄存器中,有GPIO7A1 mux功能的介绍:

因此mux=1时,即可把GPIO7A1 配置为PWM1,代码如下:

$ sudo python
>>> from fireflyP import Gpio
>>> Gpio.init()
>>> g7a1=Gpio('GPIO7A1')
>>> g7a1.set_mux(1)

初始化PWM,并配置频率为1MHz(period=1000ns),占空比为50%(duty=500ns):

>>> from fireflyP import Pwm
>>> Pwm.init()
>>> print('Set PWM1: freq=1MHz,duty=50%')
>>> pwm.set_config(1000,500)
>>> pwm.start()

示波器量出来的波形如下:

我们接着继续使用PWM来输出一定数量的波形,比如输出3个频率为1KHz(period=1000000ns),占空比为10%(duty=100000ns)的波形:

先关闭原来的PWM输出:

>>> pwm.stop()

重新配置:

>>> shot_counter=2
>>> config = Pwm.PWM_OUTPUT_LEFT | Pwm.PWM_LP_DISABLE | Pwm.PWM_SHOT | Pwm.PWM_DUTY_POSTIVE | Pwm.PWM_INACTIVE_NEGATIVE | (shot_counter << 24)
>>> pwm.set_config(1000000,100000, config)
>>> pwm.start()

出来波形的效果是:

这里可能有些同学有疑问,明明shot_counter=2,为什么出来是3个呢,datasheet中有段说明:

意思是设置成N个的时候,会出来N+1个,比如0时就1个,2的话输出3个,以此类推。

完整的demo可以参考github上的demo/pwm_test.py

请问PWM波是只能在有相应功能的引脚上使用吗