软件 pwm 作为 linux 内核模块
Sofware pwm as linux kernel module
我需要为 linux 内核实现 PWM 模块,它应该是高分辨率的(在我的 400MHz ARM cpu 上超过 10kHz 会很酷)
谁能给我一个建议,我可以为此目的使用什么?
内核版本为 2.6.28.9。
设备没有硬件 PWM 驱动程序。
现在我使用一个内核定时器,其频率由 CONFIG_HZ 设置。此配置的默认值为100HZ,但对我来说太小了,最大值为4kHZ,但这仍然不够
Pulse-width modulation 在软件中很难做到。理论上,您所要做的就是在 CPU 中找到一个分辨率足够好的计时器,附加一个 IRQ 处理程序并启动它。
如果你看时钟,你不能在 400 MHz 上做 10 kHz PWM 感觉很疯狂 CPU - 你将有 400000/10 = 40000 CPU 个周期pulse哪个够用?
也许不是。 linux 内核使用中断本身来进行内核调用。然后你有其他中断(DMA, NMIs,其他定时器,...)。根据定时器中断的优先级,其中一些可以阻止它。这意味着网络操作或其他事情可能会延迟您的 IRQ 处理程序。如果您使用 Linux 内核 APIs 来处理中断,那么您会遇到更多问题:内核不会调用您的处理程序。相反,真正的 IRQ 处理程序将收集有关中断的一些信息并将其作为任务附加到链中。
最终,内核将查看该链并处理其中的任务。
另一个问题是 CPU 也不会立即响应 IRQ。有你不能中断的操作码。
这会导致很多抖动。
如果您想尝试一下,那么您应该在汇编程序中编写您自己的 IRQ 处理程序,它会执行所有处理 - 获取 IRQ 并写入新的输出值。不要使用标准 linux 中断 API。然后你将不得不为这个定时器禁用中断API(或者内核可能会删除你的处理程序)。
您必须使用在您的 CPU 中具有非常非常高优先级的计时器 - 任何可能延迟它的事情都会毁了您的一天。
即使您有 40K CPU 个周期要花费:总是有其他软件也想要一口。所以你可能无法 运行 其他任何东西。
"Use a hardware PWM if you want somewhat precise timing. Software will have too much deviation, jitter, etc. Even with massive effort it will be far from being good (not to speak of perfect)."
上述答案并不完全正确,尽管它显示了 PWM 的一些问题:
问题是,无论输出信号是来自硬件 PWM 发生器还是来自软件控制的 GPIO,应用程序必须在单个 PWM 周期内执行所有计算.
否则,抖动将被观察为不正确的平均 PWM 值或不正确的平均信号相移。
换句话说,使用HW PWM的唯一好处是可以对PWM脉冲边沿进行异步计算,但它们必须与PWM周期begin/end同步。
我需要为 linux 内核实现 PWM 模块,它应该是高分辨率的(在我的 400MHz ARM cpu 上超过 10kHz 会很酷) 谁能给我一个建议,我可以为此目的使用什么? 内核版本为 2.6.28.9。 设备没有硬件 PWM 驱动程序。 现在我使用一个内核定时器,其频率由 CONFIG_HZ 设置。此配置的默认值为100HZ,但对我来说太小了,最大值为4kHZ,但这仍然不够
Pulse-width modulation 在软件中很难做到。理论上,您所要做的就是在 CPU 中找到一个分辨率足够好的计时器,附加一个 IRQ 处理程序并启动它。
如果你看时钟,你不能在 400 MHz 上做 10 kHz PWM 感觉很疯狂 CPU - 你将有 400000/10 = 40000 CPU 个周期pulse哪个够用?
也许不是。 linux 内核使用中断本身来进行内核调用。然后你有其他中断(DMA, NMIs,其他定时器,...)。根据定时器中断的优先级,其中一些可以阻止它。这意味着网络操作或其他事情可能会延迟您的 IRQ 处理程序。如果您使用 Linux 内核 APIs 来处理中断,那么您会遇到更多问题:内核不会调用您的处理程序。相反,真正的 IRQ 处理程序将收集有关中断的一些信息并将其作为任务附加到链中。
最终,内核将查看该链并处理其中的任务。
另一个问题是 CPU 也不会立即响应 IRQ。有你不能中断的操作码。
这会导致很多抖动。
如果您想尝试一下,那么您应该在汇编程序中编写您自己的 IRQ 处理程序,它会执行所有处理 - 获取 IRQ 并写入新的输出值。不要使用标准 linux 中断 API。然后你将不得不为这个定时器禁用中断API(或者内核可能会删除你的处理程序)。
您必须使用在您的 CPU 中具有非常非常高优先级的计时器 - 任何可能延迟它的事情都会毁了您的一天。
即使您有 40K CPU 个周期要花费:总是有其他软件也想要一口。所以你可能无法 运行 其他任何东西。
"Use a hardware PWM if you want somewhat precise timing. Software will have too much deviation, jitter, etc. Even with massive effort it will be far from being good (not to speak of perfect)."
上述答案并不完全正确,尽管它显示了 PWM 的一些问题:
问题是,无论输出信号是来自硬件 PWM 发生器还是来自软件控制的 GPIO,应用程序必须在单个 PWM 周期内执行所有计算. 否则,抖动将被观察为不正确的平均 PWM 值或不正确的平均信号相移。
换句话说,使用HW PWM的唯一好处是可以对PWM脉冲边沿进行异步计算,但它们必须与PWM周期begin/end同步。