0

例如,如果我需要设置 100 赫兹的频率,我tone使用 PWM 设置频率的功能。现在我需要使用 PWM 在 0 - 5 伏特之间改变幅度。是否可以使用toneanalogWrite一起固定频率,即 100 赫兹并analogWrite改变幅度?

让我知道是否还有其他选择,因为我在同一个引脚上尝试了上述命令音调和模拟写入,但它不起作用。

4

3 回答 3

1

您不能使用该tone功能来做到这一点。查看https://en.wikipedia.org/wiki/Pulse-width_modulation以了解如何使用 PWM 生成“频率”。这张图片可能会有所帮助:

脉宽调制波形

如果你真的需要不同的电压,你要么需要在输出引脚上添加外部组件(至少是一个简单的分压器),要么只使用analogWrite. 请注意,在后一种情况下,可能会出现时间问题,具体取决于代码的复杂性。

于 2016-11-14T21:12:17.707 回答
0

编辑

你考虑过数字电位器吗?阅读它的描述后,它几乎符合您的需求。

[...] 控制立体声音响的音量 [...]

它的功能与普通电位器非常相似,我认为它应该适合您。


原帖

答案是否定的,因为tone会以设定的频率输出脉冲,但随后analogWrite会要求引脚输出其他东西。微控制器可能会“混淆”,并且可能不会做你想让它做的事情。

解决这个问题的一种更机械的方法是使用电位器。它几乎是一个可变电阻器,会根据旋钮的位置改变其电阻。为什么这项工作是不涉及脉冲的,你唯一要做的就是降低信号的强度而不修改它。

于 2016-11-15T02:55:35.490 回答
0

你可以

  1. 使用analogWrite并丢弃tone函数,模仿tone函数的行为;
  2. 使用外部电路。

适合第一个解决方案的代码是

#define TONE_PERIOD 10 /* Period in milliseconds */
unsigned long lastPulseStart;
byte volume;

void setup()
{
    volume = ...;
    lastPulseChange = millis();
}

void loop()
{
    if (lastPulseStart - millis() < TONE_PERIOD/2)
        analogWrite(pin, volume);
    else if (lastPulseStart - millis() < TONE_PERIOD)
        analogWrite(pin, 0);
    else
        lastPulseStart += TONE_PERIOD;
}

对于第二种解决方案,您可以使用两个引脚,然后使用一些东西来混合输出。例如

  • 一个 AND 端口(音调到一个输入,analogWrite 到另一个;and 端口应该在滤波器之前);
  • 带有启用输入的缓冲区(音调进入启用,模拟写入线路;这可以在滤波器之前或之后);
  • 如果您使用的是放大器并且它有一个启用引脚,请使用它(当然音调进入启用,模拟写入线路);
  • 一个外部 ADC(在这种情况下,您将使用音调作为电压参考,音量应作为 ADC 的值传递);
  • 如果您已将扬声器直接连接到输出,则可以将模拟写入输出发送到扬声器,并在扬声器的另一个引脚上放置一个 NMOS,由音调输出驱动。

如果您需要一些原理图,请询问..

于 2016-11-15T14:37:29.000 回答