深入解析PWM背光设备树配置与驱动实现

pwm背光控制 PWM(脉冲宽度调制)控制MIPI(Mobile Industry Processor Interface)屏幕背光的原理基于PWM信号的占空比(Duty Cycle)调整来控制背光LED的亮度。PWM是一种非常有效的技术,用于模拟模拟信号,通过调节电平信号的高低状态持续时间来控制设备,如LED背光。 阅读详情

1. 从点亮屏幕说起:PWM背光到底是什么?

大家好,我是老张,在嵌入式显示这块摸爬滚打十多年了,调试过的屏幕没有一千也有八百。今天咱们不聊那些高大上的显示算法,就聊聊最基础、也最让人头疼的问题之一:屏幕背光。尤其是用PWM(脉冲宽度调制)控制的背光,很多新手朋友一看到设备树里那一堆参数就发怵,驱动代码更是云里雾里。别急,今天我就用最“人话”的方式,带你彻底搞懂PWM背光的设备树配置和驱动实现,保证你听完就能上手调。

想象一下,你手里有一块开发板,屏幕接好了,系统也跑起来了,但屏幕就是不亮,或者亮得刺眼,又或者亮度调节起来一卡一卡的。这些问题,十有八九都出在背光配置上。PWM背光,简单说,就是用一种“开关”技术来控制亮度。它不是通过改变电压大小来调光(那是模拟调光),而是通过快速开关LED背光源,并控制“开”的时间占总时间的比例(也就是占空比)来模拟不同的亮度。开关速度极快,人眼感觉不到闪烁,只觉得亮度变了。这种方式效率高,控制精准,是嵌入式显示里的主流方案。

那么,在Linux系统里,我们怎么告诉内核:“嘿,我这块屏的背光是PWM控制的,用的是哪个PWM控制器、哪个通道、频率多少、怎么映射亮度值呢?”答案就是设备树(Device Tree)。设备树就像一个“硬件配置清单”,内核启动时会读取它,从而知道该如何初始化和管理硬件。对于PWM背光,我们需要在这个清单里详细描述它的所有特性。接下来,我们就钻进这个清单里,看看每一项到底是什么意思,怎么写才对。

2. 庖丁解牛:逐行解读PWM背光设备树节点

原始文章里给了一个非常典型的pwm-backlight设备树节点例子,我们就以它为蓝本,把每一行代码掰开揉碎了讲明白。你完全可以把这段代码当成模板,根据自己的硬件稍作修改。

backlight: backlight {
    status = "okay";
    compatible = "pwm-backlight";
    pwms = <&pwm1 0 25000 0>;
    brightness-levels = <0 1 2 3 ... 255>;
    default-brightness-level = <200>;
    // enable-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
};

2.1 核心身份证:compatible属性

compatible = "pwm-backlight"; 这一行是重中之重,可以说是背光节点的“灵魂”。它定义了该设备与哪个内核驱动匹配。内核里有一个专门的驱动文件,比如 drivers/video/backlight/pwm_bl.c,它的设备匹配表里就会声明自己对 "pwm-backlight" 这个字符串兼容。如果这里写错了,内核就找不到对应的驱动,你的背光自然就无法初始化。我见过不少新手把这里写成 "pwm,backlight" 或者 "backlight-pwm",结果调试半天发现驱动根本没起来。所以,第一要务就是确保这个字符串和内核驱动里的定义一字不差。

2.2 动力之源:pwms属性详解

pwms = <&pwm1 0 25000 0>; 这行定义了PWM背光的“发动机”。它包含四个参数,每个都至关重要。

  1. &pwm1:这是一个句柄(phandle),指向你芯片设备树中定义的PWM控制器节点。比如你的SoC可能有PWM0、PWM1、PWM2等多个PWM控制器,这里 &pwm1 就表示使用名为 pwm1 的那个控制器。你需要在设备树的其他地方定义好这个 pwm1 节点,并确保其 status = "okay"。
  2. 0:这是PWM的通道号。一个PWM控制器通常可以输出多路独立的PWM信号(比如通道0、通道1)。你需要根据硬件原理图,确认背光控制线连接到了控制器的哪个通道上。接错了通道,信号就送不到背光电路。
  3. 25000:这是PWM信号的周期值,单位是纳秒(ns)。它决定了PWM的频率。周期 T = 25000 ns,那么频率 F = 1 / T = 1 / (25000 * 10^-9) = 40000 Hz = 40 kHz。为什么是40kHz?因为人耳能听到的最高频率大约20kHz,选择40kHz以上的PWM频率可以完全避免可闻的噪声(线圈或电容发出的滋滋声)。同时,频率也不能太高,否则开关损耗会增大。20kHz-100kHz是一个常见的选择范围。
  4. 0:这是PWM的极性。这个参数非常关键,直接关系到你的亮度调节是正着来还是反着来。
    • 极性为0(正极性):表示占空比越大,输出有效电平时间越长,背光越亮。当软件设置亮度值为最大值(比如255)时,PWM输出占空比为100%(常高),背光最亮;亮度为0时,占空比0%(常低),背光熄灭。这是最直观的模式。
    • 极性为1(负极性):逻辑则完全相反。占空比越大,输出有效电平时间越短,背光越暗。设置亮度255对应占空比0%(背光最亮?这里容易混淆),亮度0对应占空比100%(背光熄灭)。这种模式通常用于背光电路是低电平有效的设计。极性设反是最常见的导致背光“开关逻辑颠倒”或“调光反了”的坑! 一定要对照原理图确认背光使能电平。

2.3 亮度曲线映射表:brightness-levels数组

brightness-levels 这个数组是连接软件抽象亮度值和硬件实际PWM占空比的桥梁。软件(比如Android系统)认为亮度是一个从0到255的线性值,但LED背光的亮度-电流(或亮度-占空比)关系往往不是线性的,可能是对数的,或者为了避开某段低效区间,我们需要一个映射表。

  • 数组长度:通常是256个元素,对应亮度值0-255。但也可以是其他长度,驱动会以数组索引作为亮度输入。
  • 数组值:每个值代表在该亮度索引下,你希望输出的PWM占空比基准值(注意,还不是最终占空比)。这个值的范围一般是0到scale(通常是数组中的最大值,如255)。
  • 核心作用:实现非线性调光,或解决硬件非线性问题。比如原始文章末尾提到的“占空比到20%就黑了,到80%就满了”。这是因为背光驱动芯片或LED本身在低占空比时已经不发光,在高占空比时已饱和。这时,我们可以把brightness-levels数组的前50个值都设成同一个较小的数(比如50),把后55个值都设成同一个较大的数(比如200),中间的值再均匀过渡。这样,软件调节0-255时,硬件占空比只在我们关心的50-200这个有效区间内变化,避免了无效调节。

2.4 初始亮度与使能引脚

  • default-brightness-level:这个值不是直接的亮度值,而是brightness-levels数组的索引。例如 <200> 表示使用 brightness-levels 数组中第200个元素(从0开始数)对应的值作为开机初始亮度。这解决了系统刚启动、尚未收到用户空间(如Android设置)亮度配置时的“黑屏”或“闪瞎眼”问题。
  • enable-gpios(可选):很多背光电路除了PWM调光,还有一个独立的使能引脚(ENABLE)。这个GPIO用于控制背光电源的完全开启或关闭,比PWM调光到0%更省电。在设备树中配置这个GPIO后,驱动会在需要开启背光时将其置为有效电平,关闭时置为无效电平。如果你的硬件没有这个引脚,直接删除这行配置即可,驱动会通过将PWM占空比设为0%来关闭背光。

3. 驱动如何工作:从设备树到点亮屏幕

配置好了设备树,我们来看看内核里的 pwm_bl.c 驱动是怎么把这些冷冰冰的数字变成屏幕上的光明的。这个过程就像一场精心编排的接力赛。

3.1 探针:驱动的起点

当内核启动,匹配到 compatible = "pwm-backlight" 后,就会调用 pwm_backlight_probe 函数。这是所有故事的开始。

static int pwm_backlight_probe(struct platform_device *pdev)
{
    // ... 省略部分代码
    // 1. 解析设备树
    ret = pwm_backlight_parse_dt(&pdev->dev, pb);
    // 2. 申请PWM资源
    pb->pwm = devm_pwm_get(&pdev->dev, NULL);
    // 3. 配置PWM周期
    pwm_set_period(pb->pwm, pb->period);
    // 4. 注册背光设备
    bl_dev = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, pb,
                       &pwm_backlight_ops, &props);
    // 5. 关联帧缓冲(FB)通知
    backlight_register_fb(bl_dev);
    // ... 
}

在 pwm_backlight_parse_dt 函数里,驱动会做我们之前提到的所有解析工作:读取 brightness-levels 数组、default-brightness-level 索引、pwms 参数(周期、极性),以及可选的 enable-gpios。解析出来的数据会存到一个叫 pwm_bl_data 的结构体里,这是驱动的核心数据结构。

3.2 核心算法:亮度值如何转为PWM信号?

驱动里最精妙的部分,莫过于 compute_duty_cycle 这个函数。它负责把上层传来的一个抽象的“亮度值”(比如200),转换成具体的PWM占空比时间(纳秒)。

static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
{
    unsigned int lth = pb->lth_brightness; // 通常为0,背光完全关闭的阈值
    int duty_cycle;

    // 步骤1:通过映射表转换亮度值
    if (pb->levels) // 如果定义了brightness-levels数组
        duty_cycle = pb->levels[brightness]; // 查表得到映射值
    else
        duty_cycle = brightness; // 否则直接使用亮度值

    // 步骤2:计算实际的占空比时间(纳秒)
    // 公式:占空比时间 = (映射值 * (周期 - 阈值)) / 比例因子 + 阈值
    return (duty_cycle * (pb->period - lth) / pb->scale) + lth;
}

我来解释一下这个公式:

  • pb->period:就是设备树里 pwms 的第三个参数,比如25000纳秒。
  • pb->scale:通常是 brightness-levels 数组中的最大值。如果数组是0-255,那scale就是255。它的作用是把0-255的映射值归一化到0-period的时间范围内。
  • lth:这是一个阈值,表示背光完全熄灭所需的最小占空比时间。通常为0,表示占空比为0时背光就灭了。有些背光电路在占空比非常小时(比如1%)还能微亮,这时可以设置一个很小的lth值来确保能完全关断。

举个例子:假设 period=25000, scale=255, lth=0,亮度值brightness=200,且brightness-levels[200] = 200(线性映射)。 那么计算过程是:(200 * (25000 - 0)) / 255 + 0 ≈ 19607 ns。 这意味着,在这个亮度下,PWM信号在一个25000纳秒的周期内,高电平将持续约19607纳秒,占空比约为78.4%。

3.3 更新状态:谁在触发亮度变化?

计算好占空比后,通过 pwm_config() 函数配置硬件PWM控制器,再通过 pwm_enable() 或GPIO操作控制背光电源,屏幕亮度就改变了。那么,是谁在调用 backlight_update_status 来触发这一系列操作呢?主要有三个来源:

  1. 系统初始化:在probe函数最后,驱动会调用backlight_update_status,使用default-brightness-level设置初始亮度。
  2. 用户空间Sysfs接口:驱动注册背光设备后,会在 /sys/class/backlight/ 下生成一个以设备命名的目录(如 rk28_bl),里面有几个关键文件:
    • brightness:当前亮度值,可读写。当你用 echo 100 > brightness 命令时,就会触发 backlight_store_brightness 函数,最终调用 backlight_update_status。
    • max_brightness:最大亮度值,只读。
    • bl_power:背光电源开关(与FB Blank状态关联)。 这是应用程序和脚本调节亮度的标准方式。
  3. 帧缓冲(Framebuffer)事件通知:这是实现“熄屏”功能的关键。驱动在probe时调用了 backlight_register_fb,注册了一个通知回调函数 fb_notifier_callback。当系统休眠、锁屏或运行屏保时,帧缓冲驱动会发出 FB_EVENT_BLANK 事件(比如 FB_BLANK_POWERDOWN)。这个回调函数接收到事件后,会将背光设备的 fb_blank 状态置为相应的值,并再次调用 backlight_update_status。此时,驱动可能会将亮度设为0,或者通过 enable-gpios 直接关闭背光电源,从而实现熄屏省电。

4. 实战排坑:常见问题与调试技巧

理论说得再多,不如踩几个坑来得实在。下面是我总结的几个在调试PWM背光时最常见的问题和解决方法。

4.1 背光不亮

这是最让人焦虑的问题。别慌,按照以下步骤排查:

  1. 检查硬件连接:首先用万用表或示波器测量背光供电(VCC)是否正常,使能引脚(如果有)电平是否正确。这是最基本的一步,却经常被忽略。
  2. 检查PWM信号:用示波器探头点到PWM控制引脚上。上电后,你应该能看到一个方波信号。
    • 如果完全没有信号:说明PWM控制器可能没初始化。检查设备树中PWM控制器的节点(如 &pwm1)状态是否为 okay,时钟、引脚复用(pinctrl)配置是否正确。
    • 如果有信号但频率/占空比不对:对照设备树 pwms 参数检查。用示波器测量周期是否是你设置的(如25000ns对应40kHz)。测量高电平时间,看是否随 brightness 文件写入的值而变化。
  3. 检查驱动加载:使用 dmesg | grep -i backlight 或 dmesg | grep -i pwm 查看内核日志,确认 pwm-backlight 驱动是否成功匹配并 probe。查看是否有错误信息。
  4. 检查Sysfs接口:ls /sys/class/backlight/ 看是否存在你的背光设备目录。进去后 cat max_brightness 看最大值,然后尝试 echo 128 > brightness,同时用示波器观察PWM占空比是否变化。

4.2 亮度调节非线性或范围不对

这就是前面提到的“20%就黑,80%就满”的问题。根本原因是软件设定的256级亮度,硬件并没有线性地响应整个范围。

解决方案就是定制 brightness-levels 数组。你需要找出背光有效的PWM占空比范围。方法如下:

  1. 暂时将设备树中的 brightness-levels 注释掉,或者改为一个简单的线性数组 <0 1 2 ... 255>。
  2. 启动系统,通过Sysfs从0到255缓慢调节亮度,同时用肉眼观察屏幕或使用光度计测量。
  3. 记录下屏幕刚刚开始发光时对应的亮度值(比如50),以及屏幕达到最大亮度不再变化时对应的亮度值(比如200)。这个区间 [50, 200] 就是有效区间。
  4. 重新编写 brightness-levels 数组。目标是让软件亮度0-255均匀地映射到硬件有效区间50-200。你可以写个小脚本生成这个数组:前50个值都填50,后55个值都填200,中间从50到200均匀(或根据实测曲线非线性)填充150个值。这样,用户从最暗调到最亮,手感就是均匀的。

4.3 熄屏后再亮屏,亮度恢复异常

有时会发现,熄屏后重新亮屏,亮度会跳到一个默认值,而不是熄屏前的值。

  • 检查default-brightness-level:这个值只在驱动初始化时使用一次。亮屏恢复的亮度应该由用户空间程序(如Android的SettingsProvider)保存和恢复。确保你的用户空间逻辑正确。
  • 检查帧缓冲通知:确保 fb_notifier_callback 工作正常。可以在驱动里添加打印,看熄屏和亮屏事件是否被正确接收和处理。
  • 检查背光设备的状态保存:在 backlight_update_status 被调用时,驱动会更新 struct backlight_device 的 props.brightness 属性。用户空间程序应该读取这个属性来保存状态。

调试时,一个很好用的命令是 cat /sys/kernel/debug/pwm,它可以列出系统中所有注册的PWM设备及其当前状态(使能与否、周期、占空比)。另一个是直接操作GPIO,如果你的背光有使能引脚,可以手动 echo 1 > /sys/class/gpio/gpioXXX/value 来测试背光电源是否正常。

5. 进阶思考:更优的配置与设计

掌握了基础配置和调试,我们可以想得更远一点,如何让背光系统更优?

关于PWM频率的选择:40kHz是一个常见值,但并非唯一。提高频率(如100kHz以上)可以进一步消除任何可能的噪声,并且由于开关速度远超人眼视觉暂留,能有效减少低亮度下的闪烁感,对眼睛更友好。但频率越高,开关损耗会略微增加。你可以根据硬件手册和实际测试(用手机摄像头对着屏幕,看是否有滚动条纹)来调整 pwms 中的周期参数。

关于亮度曲线的精细校准:brightness-levels 数组给了我们极大的灵活性。你完全可以引入一个更科学的亮度曲线,例如伽马校正。人眼对亮度的感知是非线性的(遵循幂律)。你可以预先计算一个伽马值为2.2的映射表填入 brightness-levels,这样软件线性增加的亮度值,在人眼看来就是均匀变化的,用户体验会好很多。这比简单的线性映射要高级得多。

多级背光控制:在一些复杂的显示模组中,可能同时存在全局背光(PWM控制)和局部调光区(多个独立LED,每个都可能由独立的PWM或GPIO控制)。这时,一个 pwm-backlight 节点就不够用了。你可能需要:

  1. 为全局背光保留一个 pwm-backlight 节点。
  2. 为每个局部调光区创建独立的背光控制设备,这可能需要你编写一个自定义的背光驱动,在驱动内部管理多个PWM或GPIO。
  3. 在用户空间,需要一个管理器来协调全局和局部背光,根据显示内容动态调整。这属于高端显示技术(如Mini-LED背光)的范畴,设备树和驱动设计会复杂得多,但核心思想仍是PWM控制和亮度映射。

最后,设备树和驱动是紧密配合的。当你修改设备树参数后,一定要确保内核驱动能够正确解析和使用它们。最好的学习方法,就是找一块开发板,亲手修改这些参数,然后用示波器和Sysfs接口观察变化,把理论变成肌肉记忆。调试背光的过程,其实就是和硬件对话的过程,耐心和细致的观察永远是最好的工具。

PWM调光实战:如何用Arduino精准控制MIPI屏幕背光亮度(附代码) 本文详细介绍了如何使用Arduino通过PWM技术精准控制MIPI屏幕的背光亮度。从硬件电路搭建(如MOSFET驱动)、PWM基础配置与频率优化,到实现视觉均匀的伽马校正与自动亮度调节(集成环境光传感器),提供了完整的实战指南和示例代码,帮助开发者实现高效、无闪烁的背光控制。 阅读详情

相关推荐

[Linux外设驱动详解]PWM Backlight 驱动详解

PWM背光驱动(pwm_bl.c)详解:该驱动通过PWM信号控制LCD背光亮度,支持设备树配置、CIE 1931亮度曲线和电源管理。核心功能包括:1) 通过pwm_config()设置占空比控制亮度;2) 电源管理(regulator/gpio控制);3) 支持非线性亮度调节(CIE 1931 L*标准),匹配人眼感知特性。关键数据结构为pwm_bl_data,包含PWM设备、亮度等级表等配置。驱动实现了背光开启/关闭、占空比计算和状态更新等核心操作,特别针对人眼非线性感知特性进行了优化处理。

Just Linux! 1463

Hi3798 PWM输出控制背光

一、PWM配置说明 Hi3798 具有3个PWM输出端口。通过查阅《Hi3798M V200 低功耗方案 使用指南.pdf》可得: 通过查阅Hitool工具可以查看到三个PWM端口的寄存器分别为: 通过原理图可得,采用PWM0来控制背光。 所以在程序当中需要将GPIO2_1(ioshare_17)服用为PMC_CORE0。 devmem w 0xF8A21044 0x000...

老谭_酸菜的博客 2268

PWM背光控制技术:从原理到MIPI屏幕的实战应用

本文深入解析了PWM背光控制技术的核心原理,重点阐述了占空比与频率对视觉体验的影响。通过MIPI屏幕的实战应用案例,详细介绍了硬件连接方案与Linux驱动编写要点,并探讨了环境光自适应、低蓝光等高级功能实现与常见问题调试技巧,为显示驱动开发提供实用指南。

weixin_29204121的博客 345

S3C6410 LCD 背光PWM控制研究

一般LCD的背光LED是通过PWM控制,调节PWM的占空比即可调整背光亮度。 比如S3C6410的GPF15,即PWM1,可连接LCD的背光控制接口,进行背光控制。 其工作流程如下: 1)在linux中,通过控制sys目录参数修改背光,如: /sys/devices/platform/s3c-lcd # echo 200 > backlight_level 2)该操作影响/driver/

c654162067的专栏 931

嵌入式开发实战:PWM背光驱动在设备树中的配置详解(附常见问题排查)

本文详细解析了嵌入式Linux开发中PWM背光驱动在设备树中的配置方法,重点介绍了Rockchip平台的实战经验。从设备树节点配置、硬件适配技巧到驱动工作原理和常见问题排查,提供了一站式解决方案,帮助开发者高效实现背光控制。

weixin_26843605的博客 349

Linux背光驱动框架解析:以GP7101为例对比3种背光控制方案(PWM/I2C/GPIO)

本文深入解析Linux背光驱动框架,以GP7101为例详细对比PWM、I2C和GPIO三种背光控制方案的实现差异。通过分析RK3566平台上的背光驱动架构,揭示backlight_device_register和backlight_ops等核心机制,提供GP7101的I2C接口实战代码和调试技巧,帮助开发者优化嵌入式显示系统的背光控制。

weixin_26878995的博客 320

十二、使用PWM调整LCD背光亮度

和手机一样,开发板中也带有调整背光亮度的功能。 调整背光亮度依赖于PWM,它通过调节脉冲宽度来控制背光亮度,此方式需要使用PWM驱动。本章将对其进行讲解。 一、用户空间调整背光亮度 一般应用程序可以通过/sys/class/目录下的节点间接调整各个外设的参数。如下图,可通过命令行来控制背光亮度。设备节点不同开发板的目录不一定相同,读者需自行测试。 如果读者...

aa508508的博客 9554

深入解读T113 RGB屏幕设备树:从时序参数到PWM背光,一篇搞定驱动配置

本文深入解析全志T113芯片RGB屏幕设备树配置,涵盖时序参数设置、PWM背光控制及电容触摸屏调试。通过详细代码示例和参数说明,帮助开发者快速掌握T113 RGB屏幕驱动配置技巧,解决常见显示问题,提升开发效率。

weixin_29159127的博客 482

imx6q上的背光驱动分析

pwm-backlight { compatible = "pwm-backlight"; pwms = ; brightness-levels = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3

Android开发 6420

保姆级教程:在RK3588开发板上点亮一块MIPI DSI屏幕(附完整设备树配置)

本文提供了一份详细的RK3588开发板MIPI DSI屏幕驱动配置指南,涵盖硬件准备、设备树配置、屏幕参数设置及调试技巧。通过完整的设备树配置示例和实用调试命令,帮助开发者快速点亮MIPI DSI屏幕并优化显示性能,特别适合嵌入式Linux开发新手。

weixin_30904593的博客 1102

RK3399平台开发系列讲解(内核设备树篇)3.19、Rockchip PWM Backlight 设备树配置与驱动分析

Rockchip PWM Backlight 设备树配置与驱动分析

内核笔记 4329

Linux Backlight 背光子系统解析:从 PWM 到 sysfs 的完整控制链

背光控制看似简单——调亮度而已。任何一环出问题,都可能表现为:无法调节亮度、上电无背光、开机闪屏、亮度跳变等。本文从底层到上层,覆盖 U-Boot 早期背光初始化、Linux 内核 backlight 子系统、设备树配置、以及调试方法。

weixin_42885531的博客 179

Linux驱动:基于imx6ull分析PWM驱动及backlight屏幕背光驱动

文章目录1、PWM驱动1.1 驱动分析1.2 使用方法2、backlight驱动2.1 驱动分析2.2 调试方法 1、PWM驱动 1.1 驱动分析 先看设备树文件imx6ull.dtsi的PWM节点,以PWM1为例(绑定说明:Documentation/devicetree/bindings/pwm/imx-pwm.txt): pwm1: pwm@02080000 { compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; reg = <0x02

weixin_44498318的博客 1958

RK3288 添加backlight lcd接口

一、首先,设置背光: (1)添加设备树节点: compatible:驱动匹配名称; pwm:&lt;pwm选择 通道选择 频率&gt;; brightness-levels:背光调节等级; default-bightness-level:默认等级; enable-gpios:使能引脚; 使能pwm通道。 (2)驱动流程分析: 驱动文件位置:/kernel/driver/v...

linux_qian的博客 2907

RK3568平台(PWM篇)PWM Backlight控制背光亮度

以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。

weixin_49303682的博客 4418

【国产化信创实践】宝兰德bes中间件集成springboot

【国产化信创实践】宝兰德bes中间件集成springboot

项目管理、软件工厂、vue研发、Java研发、中国文化等。 1万+

正点原子 STM32MP135 LCD 背光反相控制,这么干就对了!

在 STM32MP135 的 LCD 背光控制中,如果 PWM 控制信号反了,该怎么破? 别担心,跟着这份教程,轻松实现背光反向控制,让开发板“亮”起来!

正点原子Linux工程师 589

【Linux系统】Kdenlive软件多机位同音频视频同步化处理

Kdenlive简介 官网链接:https://kdenlive.org/zh/ 命令行安装: apt-get install kdenlive Kdenlive能够进行多轨道视频编辑,可以使用和调整多条音频、视频轨道。每条轨道可以按需进行单独锁定、静音。 Kdenlive多机位同音频视频同步化处理步骤 1. 新建Kdenlive文件 选择<文件>-<新建>,建立新的kdenlive文件,初始设置为<视频轨:2>,<音频轨:2>。 视.

qq_31550269的博客 1887
上一篇: Flutter开发入门:从零开始配置Flutter环境
下一篇: W5500服务器断线重连难题:Keep-Alive机制解析与实战优化
人间清醒863
博客等级 码龄3年 33粉丝 1544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值