一、PWM基础原理与RK平台特性
(一)PWM核心原理
脉宽调制(PWM,Pulse Width Modulation)通过微处理器数字输出控制模拟电路,核心是调整输出波形的周期(信号重复的时间间隔)和占空比(一个周期内高电平持续时间占比),实现对电压、亮度等物理量的精准调控,广泛应用于测量、通信、功率控制等领域。
(二)RK平台PWM关键特性
1.支持模式:共3种模式,不同模式用途差异显著
◦Continuous mode(连续模式):持续输出固定周期和占空比的波形,是最常用模式,主要用于背光控制、电机调速等场景
◦One-shot mode(单触发模式):仅输出一个完整波形后停止,适用于单次触发的控制场景(如单次脉冲信号触发)
◦Capture mode(捕获模式):用于捕获外部输入波形的高低电平宽度,典型应用是红外遥控解码(配合中断实现键值识别)
1.硬件配置:内置4通道,每个通道对应独立控制单元,支持多设备同时使用PWM功能
2.内核兼容性:覆盖Linux 3.10、4.4及以上(含4.19)内核版本,不同版本在驱动接口、DTS配置上存在差异
二、RK平台PWM开发操作流程
(一)驱动相关配置
1.驱动文件路径与差异
◦统一路径:drivers/pwm/pwm-rockchip.c(所有内核版本通用)

◦内核版本差异:
Linux 3.10:使用原始接口(pwm_config()、pwm_enable()、pwm_disable()),仅支持Continuous mode
Linux 4.4及以上(含4.19):将参数配置与使能/禁用封装为pwm_apply_state()函数,支持一次修改多个参数(周期、占空比、极性),效率更高,同样仅支持Continuous mode
1.DTS节点配置:需根据内核版本调整参数数量,与“pwm-cells”值对应

backlight: backlight {compatible ="pwm-backlight";pwms = <&pwm0 0250000>;brightness-levels = <01...255>;// 256级亮度,0~255对应0%~100%占空比default-brightness-level = <200>;// 默认亮度(第200级)enable-gpios = <&gpio1 13GPIO_ACTIVE_HIGH>;// 背光使能引脚};
◦参数说明
参数1:index(通道索引),默认0(RK平台每个PWM芯片仅1个通道)
参数2:周期(单位:ns),如25000ns对应40KHz频率
参数3:极性(可选),PWM_POLARITY_INVERTED表示负极性,仅“pwm-cells=3”时需配置
◦版本差异示例
Linux 3.10(pwm-cells=2):pwms = <&pwm 0 25000>;
Linux 4.4/4.19(pwm-cells=3):pwms = <&pwm 0 25000 PWM_POLARITY_INVERTED>;
◦背光场景扩展配置:需添加亮度等级、默认亮度、使能引脚等参数,示例如下
(二)PWM工作流程(以Linux 4.4为例,Continuous mode)
1.状态应用(Apply State):触发PWM参数配置流程,先判断是否需要加锁
◦需加锁:先执行Lock操作,避免配置过程中参数被篡改
◦无需加锁:直接进入参数配置
1.参数配置
◦必选:配置周期(Period)和占空比(Duty Cycle)
◦可选:若支持极性配置(pwm-cells=3),设置极性(Normal/Inverted)
1.锁操作:若之前加锁,配置完成后执行Unlock
2.使能/禁用控制
◦需使能(Enable PWM=yes):执行Enable操作,PWM开始输出波形
◦需禁用(Enable PWM=no):执行Disable操作,PWM停止输出
1.状态同步(Sync State):确保硬件状态与配置参数一致,完成流程
(三)用户空间使用(通过/sys/class/pwm接口)
1.导出PWM通道:进入/sys/class/pwm/pwmchip0/,执行echo 0 > export,生成pwm0目录(关闭通道执行echo 0 > unexport)
2.配置参数:进入pwm0目录,通过文件写入配置
◦周期:echo 10000 > period(10000ns=10μs,对应100KHz频率)
◦占空比:echo 5000 > duty_cycle(5000ns,占空比50%)
◦极性:echo normal > polarity(normal =正极性,inversed =负极性)
1.使能输出:echo 1 > enable(禁用执行echo 0 > enable)
三、RK平台PWM主要用途
(一)背光控制(最典型场景)
基于Continuous mode,通过调整PWM占空比控制背光亮度:
•正极性:亮度等级0~255对应占空比0%~100%(等级越高越亮)
•负极性:亮度等级与占空比反向(等级越高越暗)
•应用:显示屏背光调节,如手机、平板、电视等设备
(二)红外遥控解码(基于Capture mode)
1.原理:PWM捕获红外接收头输出的高低电平宽度,触发中断后CPU读取寄存器值,根据NEC编码协议(RK平台仅支持NEC)解码用户码和键值码
2.操作流程
&remotectl {handle_cpu_id = <2>;// 中断处理CPU核心(4核0~3,双核0~1)ir_key1{rockchip,usercode = <0x4040>;rockchip,key_table = <0xf4KEY_UP>, <0xf1KEY_DOWN>;// 键值与功能映射};};
◦打开调试开关:
echo1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
◦记录键值:按下遥控器按键,通过打印获取usercode(如0x4040)和键值(如0xe9)
◦添加键值到DTS:在&remotectl {}节点中配置usercode和key_table,示例
(三)其他用途
•电机调速:通过调整PWM占空比控制电机转速(如风扇、小功率电机)
•电压调节(PWM Regulator):配合电源管理模块,输出不同占空比的PWM信号实现电压动态调整
四、常见问题与解决方案
(一)U-Boot与Kernel衔接问题
1.问题现象:U-Boot中使用PWM调压后,进入Kernel阶段PWM失效(如电压不足死机)
2.原因:
◦Kernel未同步U-Boot阶段的PWM硬件状态(如clock count)
◦两者时钟源频率、极性、周期配置不一致
1.解决方案
◦更新驱动文件:drivers/pwm/pwm-rockchip.c
◦统一配置:U-Boot与Kernel的GPLL时钟频率(PWM时钟挂在GPLL下)、极性、周期保持一致;U-Boot频率通过开机log查看,Kernel频率通过cat /sys/kernel/debug/clock/clock_tree | grep gpll查看
(二)PWM Regulator引脚上下拉配置问题
1.问题现象:系统重启(reboot)后,PWM Regulator默认电压变化
2.原因:重启时GRF寄存器不复位,但PWM控制器复位,引脚上下拉配置为“none”导致状态异常
3.解决方案
// dtsi中定义pwm2_pin_pull_down: pwm2-pin-pull-down {rockchip,pins = <119RK_FUNC_1 &pcfg_pull_down>;};// dts中覆盖&pwm2 {status ="okay";pinctrl-names ="active";pinctrl-0= <&pwm2_pin_pull_down>;};
◦确认硬件默认上下拉:通过原理图查看引脚标识(“d”=下拉,“u”=上拉,如RK3399 PWM2引脚GPIO1_C3/PWM2_d为默认下拉)
◦DTS配置引脚上下拉:在dtsi中定义pinctrl,dts中覆盖配置,示例
(三)PWM波形示波器无法检测
1.第一步:检查PWM是否工作(通过Counter Register寄存器)
◦寄存器值变化:PWM工作正常,问题在引脚
可能原因:iomux配置错误(引脚功能未切换为PWM)、io-domain配置错误、外部硬件干扰
解决方案:重新配置iomux和io-domain,排查硬件接线或干扰源
◦寄存器值无变化:PWM工作异常,问题在核心配置
可能原因:时钟未使能、PWM未使能、duty>period(占空比配置无效)、RK3368未配置GRF_SOC_CON15寄存器bit12=1
解决方案:使能时钟和PWM,修正duty与period关系,RK3368额外配置GRF寄存器
五、思维导图总结
-
PWM
+关注
关注
116文章
5894浏览量
226597 -
微处理器
+关注
关注
11文章
2440浏览量
86149 -
脉宽调制
+关注
关注
3文章
238浏览量
39489
发布评论请先 登录
基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制PWM外设
【瑞芯微RK1808计算棒试用体验】RK3399 平台使用RK1808 加速棒总结
记录总结一下基于RK3128平台的LCD驱动调试步骤
Firefly-RK3288PWM输出介绍
RK平台Linux IOMMU开发:从原理到实战
RK平台PWM开发总结
评论