我正在处理基于arduino mega的四轴飞行器,并试图使4台电动机的PWM频率-每个400hz。我发现了一个有趣的解决方案,其中使用4个ATmega2560 16位定时器通过PWM控制4个ESC,使其可以达到400hz的频率。 ESC处理的正常脉冲宽度为700至2000µs。1秒/ REFRESH_INTERVAL = 1 / 0.0025 = 400hz。this is servo.h lib:#define MIN_PULSE_WIDTH 700 // the shortest pulse sent to a servo#define MAX_PULSE_WIDTH 2000 // the longest pulse sent to a servo#define DEFAULT_PULSE_WIDTH 1000 // default pulse width when servo is attached#define REFRESH_INTERVAL 2500 // minimum time to refresh servos in microseconds#define SERVOS_PER_TIMER 1 // the maximum number of servos controlled by one timer#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)问题是要使其工作,每个PWM应由1个16位定时器控制。否则,如果在1个计时器上使用2 escs,则将产生200hz。因此,所有16位定时器都在忙于控制4个ESC,但我仍然需要从接收器读取输入PPM。为此,我至少需要一个不再有的16位定时器。它仍然是一个8位定时器空闲位,它只能读取0..255数字,而普通数字escs的工作方式是1000..2000和其他东西。因此,如果我将相同的16位计时器用于pwm和ppm读数,会发生什么情况?能行吗?它会大大降低速度吗?我将arduino与控制数据过滤,调试和填充的Raspberry Pi配合使用,将ppm读数移到Raspberry会更好吗? 最佳答案 要回答您的问题之一:  因此,如果我将相同的16位计时器用于pwm和ppm,将会发生什么情况  阅读?能行吗?是。当换针中断触发时,您可能只是读取当前的TCNT值,以了解距上一个以来已经有多长时间了。这不会以任何方式干扰定时器的硬件PWM操作。  它会大大降低速度吗?不可以。PWM由专用硬件完成,同时运行的软件操作不会影响其速度,也不会影响您为相应定时器激活的任何ISR。因此,您可以让计时器根据需要生成PWM,并且仍将其用于a)从中读取当前计数器值,b)钩住输出比较和/或溢出ISR以创建软件扩展的计时器。根据您的评论进行编辑:请注意,无论PWM是否处于活动状态,TCNT寄存器中的实际值随时都是当前计时器(滴答)计数。同样,定时器OVerflow中断(TOV)可以在任何模式下使用。这两个属性允许通过以下步骤为其他任意时间测量任务制作一个软件扩展的计时器:为您要使用的计时器/计数器安装并激活计时器溢出中断。在ISR中,您基本上只增加了一个(volatile!)全局变量(例如timer1OvfCount),该变量有效地计数了定时器的溢出,从而扩展了实际的定时器范围。然后可以将当前的绝对刻度数计算为timer1OvfCount * topTimerValue + TCNTx。当发生事件(例如,一个引脚的上升沿)时,在处理例程(例如,引脚更改ISR)中,您将读取当前的计时器/计算器(TCNT)值和timer1OvfCount并将这些值存储在另一个全局变量中(例如),可以有效地开始您的时间测量。当第二个事件发生时,例如在处理例程(例如,引脚更改ISR)中,一个引脚的下降沿将读取当前的计时器/计算机(TCNT)值和startTimestamp。现在,在timer1OvfCount中具有信号开始的时间戳,在另一个变量中具有信号结束的时间戳。这两个时间戳之间的差异恰好是您要跟踪的脉冲的持续时间。但是要考虑两点:当使用相位校正PWM模式时,定时器将在递增计数和递减计数之间交替切换。这使得查找自上一个TOV中断以来经过的实际滴答数变得更加复杂。一个代码首先读取TCNT然后读取startTimestamp与TOV ISR之间可能存在竞争状态。可以通过禁用中断,然后读取TCNT,然后读取timer1OvfCount,然后检查TOV中断标志来解决。如果设置了该标志,则有一个未决的,未处理的溢出中断->使能中断并重复。但是,我很确定周围有几个库函数可以维护软件扩展的计时器/计数器,这些计时器/计数器可以为您完成所有的计时器处理。关于c++ - 使用4个16位定时器进行400hz PWM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27900997/
10-11 22:58
查看更多