例如,如果我需要设置 100 赫兹的频率,我tone
使用 PWM 设置频率的功能。现在我需要使用 PWM 在 0 - 5 伏特之间改变幅度。是否可以使用tone
和analogWrite
一起固定频率,即 100 赫兹并analogWrite
改变幅度?
让我知道是否还有其他选择,因为我在同一个引脚上尝试了上述命令音调和模拟写入,但它不起作用。
您不能使用该tone
功能来做到这一点。查看https://en.wikipedia.org/wiki/Pulse-width_modulation以了解如何使用 PWM 生成“频率”。这张图片可能会有所帮助:
如果你真的需要不同的电压,你要么需要在输出引脚上添加外部组件(至少是一个简单的分压器),要么只使用analogWrite
. 请注意,在后一种情况下,可能会出现时间问题,具体取决于代码的复杂性。
编辑
你考虑过数字电位器吗?阅读它的描述后,它几乎符合您的需求。
[...] 控制立体声音响的音量 [...]
它的功能与普通电位器非常相似,我认为它应该适合您。
原帖
答案是否定的,因为tone
会以设定的频率输出脉冲,但随后analogWrite
会要求引脚输出其他东西。微控制器可能会“混淆”,并且可能不会做你想让它做的事情。
解决这个问题的一种更机械的方法是使用电位器。它几乎是一个可变电阻器,会根据旋钮的位置改变其电阻。为什么这项工作是不涉及脉冲的,你唯一要做的就是降低信号的强度而不修改它。
你可以
适合第一个解决方案的代码是
#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;
}
对于第二种解决方案,您可以使用两个引脚,然后使用一些东西来混合输出。例如
如果您需要一些原理图,请询问..