RK平台PWM开发总结

电子说

1.4w人已加入

描述

 

 

一、PWM 基础原理与 RK 平台特性

 

(一)PWM 核心原理

 

脉宽调制(PWMPulse Width Modulation)通过微处理器数字输出控制模拟电路,核心是调整输出波形的周期(信号重复的时间间隔)和占空比(一个周期内高电平持续时间占比),实现对电压、亮度等物理量的精准调控,广泛应用于测量、通信、功率控制等领域。

 

 

(二)RK 平台 PWM 关键特性

 

1.支持模式:共 3 种模式,不同模式用途差异显著

 

 

Continuous mode(连续模式):持续输出固定周期和占空比的波形,是最常用模式,主要用于背光控制、电机调速等场景

 

 

One-shot mode(单触发模式):仅输出一个完整波形后停止,适用于单次触发的控制场景(如单次脉冲信号触发)

 

 

Capture mode(捕获模式):用于捕获外部输入波形的高低电平宽度,典型应用是红外遥控解码(配合中断实现键值识别)

 

 

1.硬件配置:内置 4 通道,每个通道对应独立控制单元,支持多设备同时使用 PWM 功能

 

 

2.内核兼容性:覆盖 Linux 3.104.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 0 25000 0>;    brightness-levels = <0 1 ... 255>; // 256级亮度,0~255对应0%~100%占空比    default-brightness-level = <200>; // 默认亮度(第200级)    enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; // 背光使能引脚};

参数说明

 

 

参数 1index(通道索引),默认 0RK 平台每个 PWM 芯片仅 个通道)

 

 

参数 2:周期(单位:ns),如 25000ns 对应 40KHz 频率

 

 

参数 3:极性(可选),PWM_POLARITY_INVERTED表示负极性,仅“pwm-cells=3” 时需配置

 

 

版本差异示例

 

 

Linux 3.10pwm-cells=2):pwms = <&pwm 0 25000>;

 

 

Linux 4.4/4.19pwm-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 > period10000ns=10μs,对应 100KHz 频率)

 

 

占空比:echo 5000 > duty_cycle5000ns,占空比 50%

 

 

极性:echo normal > polaritynormal = 正极性,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 = <0xf4 KEY_UP>, <0xf1 KEY_DOWN>; // 键值与功能映射    };};

打开调试开关:

  •  
echo 1 > 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 = <1 19 RK_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 中定义 pinctrldts 中覆盖配置,示例

 

 

(三)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 寄存器

 

 

五、思维导图总结

 

脉宽调制  

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分