我正在使用 3 个 PWM + USB(3 个不同的 TIM)来生成 3 个 80khz 方波,当它们开始在 50kHz 附近工作时,我注意到主循环没有执行(我有一个闪烁的 1 秒 LED)。 USB 的优先级为 0,而 PWM 的优先级为 1(可以更改)。这是因为目标波频率是通过 USB 给出的。
在PWM回调中,由于波可以加速或减速,因此我调用了一个函数,该函数详细说明下一个CCR/ARR应该计算哪个值,以便获得平滑的加速。
我的理解是,所需的计算能力开始增长,中断很多,填补了可用的插槽。
我能做的是通过使用一个简单的布尔变量在主循环中调用上面的函数,该变量在 PWM 回调函数中变为 true,并在主函数调用函数后变为 false。
例如,我担心这种方法可能会导致不太完美的 70/100khz 方波(由于需要 main() 计算时间,可能是 63khz 或 95khz)。
那么有没有办法让主要的人也优先考虑呢? 例如,主要是检查 5ms/10ms/50ms/1s 是否通过。
没有办法也给主要的人一种优先级呢?这 主要基本上是检查是否通过了 5ms/10ms/50ms/1s 例。
否,根据定义,main 以最低优先级运行,空闲。但是,您可以在 sysstick(或任何其他中断)中运行内容,以赋予常规任务更高的优先级。但是,如果您真的没有时间,更改优先级将无济于事。
在PWM回调中,由于波可以加速或减速,因此我 调用一个函数,详细说明下一个 CCR/ARR 的值 应该计数以便平稳加速。
我建议你改用DMA。
一开始,您提前计算一部分值。然后,使用 DMA(计时器具有 DMA 请求)将新值写入计时器,递增源地址,并让它在硬件中运行。定时器可以选择缓冲寄存器,使其仅在溢出时更新以防止故障。 在一半传输中断时,计算循环源缓冲区的下一部分。等等。
您可以将多个计时器同步并连接在一起。你只需要有点困惑。