mt6582总共有7路PWM,6582 Android 4.4版本pwm程序为mediatek/kernel/drivers/pwm/mt_pwm.c,而lk部分的pwm程序为mediatek/platform/mt6582/lk/pwm.c,由于都是同一个平台的程序,所以这两个程序是相通的,我们只需要看一个就可以了。

pwm程序提供了两个主要的接口供外部调用,它们是pwm_set_easy_config()、pwm_set_spec_config(),那么这两个接口函数就分别对应两个结构体类型,是struct pwm_easy_config、struct pwm_spec_cofnig。这两个结构体类型定义如下:

struct pwm_easy_config {U32 pwm_no;U32 duty;U32 clk_src;U32 clk_div;U16 duration;BOOL pmic_pad;
};struct pwm_spec_config {U32 pwm_no;U32 mode;U32 clk_div;U32 clk_src;BOOL intr;BOOL pmic_pad;union {// for old modestruct _PWM_OLDMODE_REGS {U16 IDLE_VALUE;U16 GUARD_VALUE;U16 GDURATION;U16 WAVE_NUM;U16 DATA_WIDTH;U16 THRESH;}PWM_MODE_OLD_REGS;// for fifo modestruct _PWM_MODE_FIFO_REGS {U32 IDLE_VALUE;U32 GUARD_VALUE;U32 STOP_BITPOS_VALUE;U16 HDURATION;U16 LDURATION;U32 GDURATION;U32 SEND_DATA0;U32 SEND_DATA1;U32 WAVE_NUM;}PWM_MODE_FIFO_REGS;};
};

在调用这两个接口函数之前,肯定是要先定义这两个结构体成员,并对其做初始化操作。那么这两个结构体应该怎样初始化呢,以便得到我们想要的波形,这便是本文的重点。

那么首先来看struct pwm_spec_config这个结构体。
pwm_no: pwm number,虽然mt6582有7路pwm,但是这里取值只能是PWM1~PWM5,也就是说只有5路pwm。
mode: pwm的模式,主要有两种模式old mode和fifo mode。
clk_div: 时钟分频,取值有CLK_DIV1、CLK_DIV2、CLK_DIV4、CLK_DIV8、CLK_DIV16、CLK_DIV32、CLK_DIV64、CLK_DIV128。
clk_src: 如果是old mode,那么取值只能是PWM_CLK_OLD_MODE_BLOCK、PWM_CLK_OLD_MODE_32K。如果是fifo mode,那么取值只能是PWM_CLK_NEW_MODE_BLOCK、PWM_CLK_NEW_MODE_DIV_BY_1625。
intr: 暂时不支持。
pmic_pad: 在6582平台上是无效的,设置成false(从代码里面看设不设置都没有关系,因为根本就没有使用该成员)。

接下来就要具体分析old mode和fifo mode了。

1. old mode
IDLE_VALUE: 取值有IDLE_FALSE和IDLE_TRUE,IDLE_VALUE主要是设置pwm波形输出完成之后,该gpio口输出电平高低状态,如果为false,则输出低电平,如果为true,则输出高电平。
GUARD_VALUE、GDURATION: 这里文档上面说的不是很明白,根据datasheet的意思呢GDURATION表示两个完整的pwm波形之间的时间间隔,如果为0,表示没有时间间隔,在old mode下,该值必须为0,而GUARD_VALUE为间隔时输出电平高低状态,应该同IDLE_VALUE一样,如果为false,表示输出低电平,如果为true表示输出高电平,在old mode下,忽略这两个成员就可以了。
WAVE_NUM: pwm波形次数,如果为0,只有在disable pwm时才会停止pwm波形输出。
DATA_WIDTH: 用于控制一次完整的波形输出时间,计算公式为(T = 1/(clk_src/clk_div) * (DATA_WIDTH+1)),例如clk_src选择为26MHz,clk_div选择1分频,DATA_WIDTH为99,则波形周期为T=1/(26/1) * (99+1)=3.85usec。
THRESH: 控制一次完整波形的高电平输出时间,即占空比,计算公式为(T = 1/(clk_src/clk_div) * (THRESH+1)),即如果要输出方波,那么这个值应该取值为(DATA_WIDTH+1)/2 - 1。

在old mode下,还有一点需要说明的是,clk_src如果为PWM_CLK_OLD_MODE_BLOCK,那么pwm的clock就是26MHz,如果是PWM_CLK_OLD_MODE_32K,那么实际clock应该是26MHz/1625=16KHz,不要理解错了。

2. fifo mode
fifo mode是非old mode,并且PWMx_CON的SRCSEL位应该置0,那么pwm才是fifo mode。
IDLE_VALUE: 同old mode类似。
GUARD_VALUE、GDURATION: 同上面类似。
HDURATION、LDURATION: 高低电平持续时间,计算公式为(T = 1/(clk_src/clk_div) * (VALUE+1)),例如clk_src选择为26MHz,clk_div选择1分频,HDURATION=1,那么高电平持续时间为T=1/(26/1) * (1+1)=77nsec,如果LDURATION=3,那么低电平持续时间为T=1/(26/1) * (3+1)=154nsec,需要注意的是高电平持续时间和低电平持续时间可以不同。
send_data0、send_data1: 两个32bit数据,共组成64bit数据,表示转换成二进制时,1代表高电平,0代表低电平。
STOP_BITPOS_VALUE: 在fifo mode下,实际传输的停止位,最大值为63(因为最多传输64bit),例如send_data0 = 0x0000ff11,send_data1 = 0xffffffff,如果STOP_BITPOS_VALUE=63,那么所有的bit都将被传输,波形如图所示。

如果STOP_BITPOS_VALUE=31,那么只有32bit数据被传输,也就是send_data1是被屏蔽了的,波形如图所示。
如果STOP_BITPOS_VALUE=15,那么只有16bit数据被传输,波形如图所示。
如果STOP_BITPOS_VALUE=7,那么只有8bit数据被传输,波形如图所示。
wave_num: 同上面类似。

struct pwm_spec_config这个结构看完了,那么再来看struct pwm_easy_config这个结构。
pwm_no: 同pwm_spec_config一样。
duty: pwm占空比,如果该值大于100,那么会被强制置成100。
duration: 在old mode下相当于DATA_WIDTH,即波形输出时间,计算公式为(T = (clk_src/clk_div) * duration)。
pmic_pad: 同pwm_spec_config一样。
clk_src: clk_src注意了,old mode和fifo mode取值是不一样的,pwm_set_easy_config函数就是根据这个取值来判断到底是old mode还是fifo mode的,取值同pwm_spec_config一样。
clk_div: 同pwm_spec_config一样。

需要注意的是在fifo mode下HDURATION和LDURATION值都为duration,即高电平和低电平持续时间是一样的。而duty值决定send_data0和send_data1,值越大,高电平持续时间也就越长。

通过上面可以看到,old mode就能完成大部分的需求了。

参考文档:mt6582 datasheet、PWM_Customer_Document_MT6752_MT6732.pdf

mt6582 pwm相关推荐

  1. MTK 驱动(47)---使用PWM配置背光如何配置,及频率计算

    [MT6582_LCD]使用PWM配置背光如何配置,及频率计算 2016年07月08日 10:10:22 阅读数:1175 MT6582 使用PWM配置背光及频率计算 [SOLUTION]   以GP ...

  2. RTT设备与驱动之PWM

    这里将PWM当成一个设备:PWM简介 上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比 ...

  3. 51单片机 小车 L298N pwm调速 串口控制 按键控制

    难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...

  4. 【转载】 stm32之PWM

    发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...

  5. 开关电源三种控制模式:PWM/PFM/PSM

    1. PWM/PFM/PSM 三种控制模式的定义 通常来说﹐开关电源(DC-DC)有三种最常见的调制方式分别为: 脉冲宽度调制(PWM) 脉冲频率调制(PFM) 脉冲跨周期调制(PSM) 在功率集成电 ...

  6. 使用 RPI.GPIO 模块的脉宽调制(PWM)功能

    脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法.在树莓派上,可以通过对GPIO的编程来实现PWM. 创建一个 PWM 实例: p = GPIO. ...

  7. 树莓派c语言输出pwm波,树莓派硬件PWM输出程序

    一:实验现象 对于树莓派硬件PWM只有1号引脚(wiringPi),单独测试该引脚时,可以输出不同占空比控制led灯成呼吸灯的效果 二:程序步骤 1,初始化wiringPi的库函数; 2,设置对应的P ...

  8. linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证

    兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证日本KOBISHI蜂鸣器.jjb器 .蜂鸣器BZ-35VR DC24V.济南千斗工业出售,货期短.价格低.保证 这里只对必须用1/2duty的 ...

  9. 全程pwm调光_dc调光的手机有哪些

    dc调光的手机有哪些?目前已经发布的黑鲨游戏手机2.黑鲨游戏手机Helo均为全程DC调光,魅族16系列手机,OPPO的Reno,一加7等手机已经是支持DC调光. dc调光的手机有哪些 1.据悉,目前已 ...

最新文章

  1. 用Flutter改造ZS项目小记一:界面显示一张图片
  2. linux下短链接出现TIME_WAIT耗尽端口号的解决方法
  3. Smart Paster...great tool to paste large strings into Vs.net
  4. 原生 ajax查询,原生ajax啦啦啦
  5. left outer join 和 right outer join 和 join 的区别
  6. jzoj2152-终极数【堆】
  7. spring整合kafka项目生产和消费测试结果记录(一)
  8. 后端学 Angular 2 —— 组件间通信
  9. Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索
  10. HTML网页设计:十一、表单
  11. 等比例压缩图片文件大小
  12. 计算机在会计中的应用书籍,Excel在会计中的应用
  13. 强化学习(1)-什么是强化学习
  14. c语言 库函数理解,C语言库函数理解
  15. 绕过CDN查找真实IP方法
  16. html注册新浪邮箱代码,JS仿新浪邮箱点击联系人添加Email地址
  17. 有备无患 婚宴发言经典串场词摘录
  18. SSE实现后端向前页面推送实时数据,是长链接不是连接一次就断开
  19. 交易系统解析(八)证券公司与基金公司系统综述
  20. 秋招面试题“背”好了,那简历呢?

热门文章

  1. 刚刚开通,感受一下此地气氛
  2. 江苏计算机学业水平测试多少分过关,江苏学业水平测试2021年考试时间:合格性考试30分能过吗?...
  3. 如何在jsp里面写java代码
  4. Linux – cp: omitting directory 复制文件失败
  5. AI产品经理入门手册(上)
  6. 大数运算(4)——大数乘法
  7. 数据规整:连接、联合与重塑(数据分析)
  8. C语言第八次上机实验
  9. 计算机网络管理员4级考试题,2015计算机软考网络管理员试题及答案(三)
  10. STM32的RTC管脚作为Tamper使用(RTC-TAMPER)