PWM杂项

PWM 是脉冲宽度调制 (Pulse Width Modulation) 的缩写,是一种常用的在数字系统中控制模拟电路或者电源的技术。其基本原理是通过控制一系列方波的高电平时间宽度,以实现对模拟信号等的精细控制。下面简单介绍下 PWM 的基本工作流程:

  1. PWM 信号是周期性的,具有固定的周期。在每个周期中,PWM 信号首先在高电平开始,然后在一定时间后切换至低电平,直至下一个周期。

  2. 这个处于高电平的时间(被称为脉冲宽度)可以被改变。如果脉冲宽度增加,那么 PWM 信号在一个周期内保持高电平的时间就更长;反之,如果脉冲宽度减少,那么 PWM 信号在一个周期内保持高电平的时间就更短。

  3. 如果你测量 PWM 信号在一段时间内的平均电压,你会发现它基本上正比于高电平时间占总周期的百分比。这就是所谓的占空比(duty cycle)。如果占空比为100%,PWM 信号将一直保持在高电平;如果占空比为0%,PWM 信号将一直保持在低电平。

  4. 通过调节占空比,你可以非常精确地控制设备的电源,例如电机的转速、LED 的亮度等。

总的来说,PWM 就是通过控制电平高低的时间比例,来控制电气设备的运行状态。这项技术广泛应用在电气工程的各个领域。

在 Linux 内核中,设备树(Device Tree)用于描述硬件架构,包括不同设备之间的连接和各自的配置参数。如果你的内核已经有了 PWM 的驱动代码,但是设备树没有相应的配置,那你需要在设备树源文件中添加相应的节点。以下是一个基本的设备树节点配置示例,该示例为 PWM 控制器配置了一个设备节点:

pwm0: pwm@01c21000 {
    compatible = "allwinner,sun4i-a10-pwm";
    reg = <0x01c21000 0x20>;
    clocks = <&osc24M>;
    #pwm-cells = <3>;
    status = "okay";
};

在上述示例中,compatible 字段告诉内核应该使用哪个驱动来驱动这个设备。reg 字段包含了PWM控制器的物理内存地址。clocks字段是这个PWM设备所引用的时钟源, #pwm-cells = <3>;表示这个PWM控制器可以控制3个PWM通道。status = "okay" 使得设备处于激活状态。

对于你的具体硬件和内核版本,你应该参考 PWM控制器厂商的数据手册、Linux内核源代码和文档以正确配置你的设备树节点。比如,有些PWM控制器可能需要添加其他的属性字段,比如输入时钟频率(clocks)、通道数(#pwm-cells)、中断(如果支持的话)等。

配置完成后,你需要使用 dtc(设备树编译器)将设备树源文件(以 .dts 为扩展名)编译为设备树二进制文件(以 .dtb 为扩展名),然后将这个 .dtb 文件传递给内核以配置设备。

在PWM(脉宽调制)驱动中,channel(通道)通常指的是单个PWM输出信号。一个PWM控制器(驱动器)设备可能具有一个或多个通道,每个通道可以独立产生一个PWM输出信号。每个PWM通道一般都有自己独立的占空比(duty cycle)和频率控制设置。占空比是指一个PWM周期内高电平状态所占的时间占整个周期时间的比例,这个比例可以通过软件控制以实现对PWM信号形状的控制;而频率则决定了PWM周期的长度。

因此,同一个PWM控制器设备的不同通道可以被独立控制以输出不同的PWM信号。比如在嵌入式系统中常见的LED背光控制,DC电机控制,声音产生等,都可以利用PWM控制器的一个或多个通道来实现。

PWM控制器的通道数因硬件而异。一些较简单的控制器可能只有一个通道,而高级的控制器可能有多达数十个通道。选择哪种控制器取决于特定应用的需求。例如,对于需要独立控制多个LED灯,或者需要同时控制多个电动机的应用,一个具有多个通道的PWM控制器是有益的。每个通道都能产生一个独立的PWM波形,能够独立调节其占空比和频率。这允许每个LED或电动机具有独立的亮度或速度控制。

在一个典型的微控制器上,如STM32系列,可能有多个定时器(timer)设备,每个定时器可以提供一个或多个PWM通道。例如,STM32F103系列的定时器通常提供最多4个PWM通道。

再比如一些比较常见的面向嵌入式开发的Linux硬件,比如树莓派,其GPIO接口支持1-2个PWM通道的输出。

总的来说,一个PWM控制器包含多少个PWM通道,主要取决于具体的硬件设计和应用需求。具体的信息应参阅相关硬件的数据手册和技术规格。

在PWM(脉宽调制)术语中,“invert”(反转)通常是指对PWM信号进行反向,也就是将原先的高电平变为低电平,原先的低电平变为高电平。在标准的PWM信号中,占空比(duty cycle)定义了在一个PWM周期内,信号为高电平的时间所占的比例。例如,如果一个PWM信号的占空比为75%,那么在每个PWM周期中,该信号将会有75%的时间处于高电平状态。

如果对这个PWM信号进行反转(invert),那么在每个PWM周期中,该信号将会有75%的时间处于低电平状态,剩下的25%时间处于高电平状态。

这个 “invert” 功能在很多PWM应用中都会用到,因为在某些场合下,设备可能会对PWM信号的低电平反应敏感,而在其他场合,设备可能对高电平反应敏感。因此,"invert"功能可以用来控制设备是在PWM信号的高电平期间还是低电平期间进行操作。

PWM(脉宽调制)的占空比和频率参数通常不是在驱动代码中硬编码(写死)的。这些参数通常需要在运行时动态设置,以满足不同的应用需求。例如,控制LED灯的亮度,控制直流电机的转速等。驱动代码的主要任务是实现设置这些参数的功能,并提供一个接口供应用程序或其他内核组件来调用。在内核空间,驱动程序一般会通过 PWM API来实现这些功能。例如,pwm_config()函数可以用于设置PWM的周期和占空比,pwm_enable()pwm_disable()函数可以用于启用和禁用PWM输出。

在用户空间,通常可以通过sysfs接口来动态配置PWM参数。例如,通过修改/sys/class/pwm/pwmchipX/pwmY/period/sys/class/pwm/pwmchipX/pwmY/duty_cycle文件的内容可以改变PWM的频率和占空比。

所以,PWM的占空比和频率是可以动态调整的,并不会在驱动中写死。

猜你喜欢

转载自blog.csdn.net/qq_41483419/article/details/133347739
PWM