📜  Arduino PWM

📅  最后修改于: 2020-12-27 09:51:58             🧑  作者: Mango

Arduino PWM

PWM(脉冲宽度调制)是一种控制平均电压的方法。这是电压脉冲流,可减少电信号提供的电功率。有效电压由PWM信号的电压脉冲流中单个脉冲的宽度控制。

PWM引脚的常见用途包括控制LED直流电动机

LED中的PWM控制光的频率。这意味着LED将以我们的眼睛可以检测到的频率打开/关闭。

直流电动机中的PWM的作用类似于直流信号的脉冲序列。直流电动机根据PWM脉冲的宽度接收高或低电功率输入。

我们还可以将PWM用于电压调节,音频信号生成,设备控制(泵,液压系统等),伺服电机等。

PWM原理

Arduino中的数字输入/输出引脚的状态为HIGH(1)或LOW(0)。

这里,

高电平表示电压约为5V。

LOW表示电压等于0伏。

PWM是一个方波信号,表示为:

矩形脉冲的占空比如下所示:

这里,

t o :信号为高电平时的信号持续时间。

t c :这是信号的总持续时间,即高电平和低电平的总和。

PWM波的占空比

如上所述,占空比是脉冲宽度与信号总宽度之比。

考虑下图:

上图显示了不同占空比下的波形。

我们可以通过调节PWM占空比来控制Arduino中直流电动机的有效电压。

例如,

Arduino UNO

Arduino UNO板包含14个数字输入/输出引脚,其中引脚11、10、9、6、5和3是PWM引脚。 pinMode(),digitalRead(),digitalWrite()函数控制非PWM引脚的操作。

pinMode()函数用于将特定的引脚声明为输入/输出。 digitalRead用于读取引脚的高电平或低电平状态。

我们需要使用analogWrite()来设置PWM(脉冲宽度调制)脉冲的占空比。

让我们详细讨论analogWrite()。

AnalogWrite()

它将PWM值或模拟值写入引脚。我们可以借助AnalogWrite()来点亮亮度变化的LED。它也可用于以不同的速度驱动电动机。

当调用analogWrite()函数,指定的PWM引脚会生成特定占空比的稳定矩形波,直到在该引脚上调用下一个analogWrite()为止。

每个Arduino板上都有PWM引脚。对于特定板上存在的某些PWM引脚,频率也可能有所不同。

例如,

Arduino Leonardo / Micro的PWM引脚为3、5、6、9、10、11和13。引脚3和11的频率为980Hz,而其他PWM引脚的频率为490Hz。

语法为:

analogWrite(pin, value)

哪里,

引脚:板上指定的PWM引脚

value :确定占空比的值,介于0到255之间。

此处使用的数据类型为int

注意:analogWrite()函数与analogRead()或模拟引脚无关。

AnalogRead()和analogWrite()有什么区别?

下面列出了AnalogRead()和analogWrite()之间的主要区别:

  • AnalogRead()用于读取模拟值,而analogWrite()函数用于写入PWM值。
  • AnalogRead()的范围是0到1023,而analogWrite()的范围是0到255。

让我们看一个例子。

对于PWM引脚,我们将指定该值,而不是HIGH或LOW。

例如,

高= 255

低= 0

考虑下面的代码:

void setup()
{
  pinMode(10, OUTPUT); // the declared pin must be among the PWM pins.
}
void loop()
{
  analogWrite(10, 255); // 255 is the highest value.
  //We can modify the value as per the required brightness.
  delay(1000); 
  analogWrite(10, 0);
  delay(1000); // time delay of 1 second or 1000 milliseconds
}

在此,LED将以全亮度点亮。

让我们讨论一个控制LED亮度的示例。

如何计算Arduino PWM?

上面讨论的AnalogWrite()函数用于在Arduino中生成PWM信号。

与模拟信号关联的值是从0到255。它表示256个级别的值。

Arduino读取的最大电压为5V。

我们可以使用以下公式确定输出PWM电压:

代码示例

让我们讨论一种控制连接到PWM引脚的LED亮度的方法。

在这里,我们已将LED连接到PWM引脚6。

考虑下面的代码。

void setup()
{
  pinMode(6, OUTPUT); // the declared pin must be among the PWM pins.
}
void loop()
{
  analogWrite(6, 255); // brightness increases as value increases
  delay(1000); 
  analogWrite(6, 180);// brightness level
  delay(1000); 
  analogWrite(6, 80); 
  delay(1000); 
  analogWrite(6, 20); // brightness decreases as value decreases
  delay(1000); 
}

在上面的示例中,LED的亮度将根据指定的亮度值降低。