本帖最后由 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输出:
- >>> 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
|