【问题标题】:Arduino Uno same frequency on ALL PWM pins所有 PWM 引脚上的 Arduino Uno 频率相同
【发布时间】:2014-11-20 02:25:02
【问题描述】:

我正在控制一个 BLDC 电机,其中一个逆变器/驱动器 IC 进行开关工作。 我需要为驱动器提供 6 个相同频率的 PWM 信号。确切的频率并不重要,只要它在 5kHz 到 10kHz 之间并且所有 PWM 引脚都相同。

我目前正在使用 Arduino Uno,我不确定如何将每个 PWM 引脚(3、5、6、9、10、11)编程为与定时器(0、1 和 2)相同的频率) 对于特定引脚具有不同的时钟速度。

  • 管脚 5 和 6:由 timer0 控制,基频 62500Hz
  • 管脚 9 和 10:由 timer1 控制,基频 31250Hz
  • 11、3脚:定时器2控制,基频31250Hz

timer1 和 timer2 可以,可以按预分频器值 8 (7812.5Hz) 缩小。不确定如何让 timer0 达到相同的频率?

http://playground.arduino.cc/Main/TimerPWMCheatsheet

我确信解决方法相对简单。是否可以将 timer0 的频率除以一个不是预分频器值的数字,比如 40?

提前致谢。

帕特。

【问题讨论】:

  • 如果您需要在所有引脚上使用相同的信号,为什么不只使用一个引脚?

标签: arduino arduino-uno pwm motordriver


【解决方案1】:

您尚未包含电机控制器的芯片编号,但我很确定您无法使用六个不同的计时器实现您想要的效果。问题是不同引脚上的 PWM 都必须同步,而不仅仅是在适当的时间内打开和关闭。

相反,您应该使用单个计时器并在正确同步时切换所有输出。这个page 在“Bit-banging Pulse Width Modulation”一节中有一个示例的开头。您必须对其进行修改以切换更多引脚。

那个例子可能还不够好。相反,您应该使用中断服务程序来切换引脚。这样一来,PWM 运行更加独立,并允许循环功能做更多事情。

您的例程将附加到定时器上的输出比较中断,并且您必须将各种 PWM 输出的值保存在一些易失性变量中。输出比较寄存器将设置为在下一次切换时唤醒。当例程运行时,它将执行切换并为切换设置输出比较寄存器。时序和同步的详细信息将取决于您的控制器的数据表。

循环函数可以读取输入并调整易失性变量以改变电机速度。

还有电机驱动器可以为您完成所有这些工作。您只需提供方向和速度,芯片就会为您创建 6 个 PWM。

【讨论】:

  • 感谢 UncleO 的回复,这是我的一个爱好,我正在尝试为电动滑板制作电子速度控制器 (ESC)。我正在使用的驱动程序是 STGIPS20K60。 st.com/web/catalog/sense_power/FM148/SC1276/… 3 个不同定时器上 6 个不同引脚的同步问题您可能是对的。我想这样的事情以前会做过很多次。我会做更多的研究并回复你。
  • @Pato88 Atmel 有一些源代码,但可能需要对其进行修改才能在 Uno 上运行。 here 是要查看的文档和源代码列表,包括 pdfzip
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多