Firefly开源社区

标题: [fireflyP] PWM使用 [打印本页]

作者: zhansb    时间: 2016-7-27 09:41
标题: [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
其主要的配置选项有:
  1.     PWM_SHOT               =(0 << 1)   
  2.     PWM_CONTINUMOUS        =(1 << 1)
  3.     PWM_CAPTURE         =(1 << 2)

  4.     PWM_DUTY_POSTIVE       =(1 << 3)
  5.     PWM_DUTY_NEGATIVE      =(0 << 3)

  6.     PWM_INACTIVE_POSTIVE   =(1 << 4)
  7.     PWM_INACTIVE_NEGATIVE  =(0 << 4)

  8.     PWM_OUTPUT_LEFT        =(0 << 5)
  9.     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,代码如下:
  1. $ sudo python
  2. >>> from fireflyP import Gpio
  3. >>> Gpio.init()
  4. >>> g7a1=Gpio('GPIO7A1')
  5. >>> g7a1.set_mux(1)
复制代码

初始化PWM,并配置频率为1MHz(period=1000ns),占空比为50%(duty=500ns):
  1. >>> from fireflyP import Pwm
  2. >>> Pwm.init()
  3. >>> print('Set PWM1: freq=1MHz,duty=50%')
  4. >>> pwm.set_config(1000,500)
  5. >>> pwm.start()
复制代码

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


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

先关闭原来的PWM输出:

  1. >>> pwm.stop()
复制代码
重新配置:

  1. >>> shot_counter=2
  2. >>> config = Pwm.PWM_OUTPUT_LEFT | Pwm.PWM_LP_DISABLE | Pwm.PWM_SHOT | Pwm.PWM_DUTY_POSTIVE | Pwm.PWM_INACTIVE_NEGATIVE | (shot_counter << 24)
  3. >>> pwm.set_config(1000000,100000, config)
  4. >>> pwm.start()
复制代码
出来波形的效果是:


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



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

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





















作者: RedFish    时间: 2017-6-10 13:23
请问PWM波是只能在有相应功能的引脚上使用吗




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1