在这篇文章中,我们解释了如何做PWM(脉冲宽度调制)控制使用arduino。如果你是电子新,我们有一篇详细的文章解释脉冲宽度调制.我们在本教程中使用了两个例子来解释PWM,这将帮助您学习如何使用PWM控制LED亮度和如何使用PWM控制直流电机速度。

使用arduino的PWM控制。

PWM控制是一种非常常用的跨负载功率控制方法。该方法实现简单,效率高。PWM信号本质上是一个高频方波(通常大于1KHz)。这个方波的占空比是变化的,以改变提供给负载的功率。占空比通常用百分比表示,可以用以下公式表示:%占空比= (T/ (T+ T)) * 100.在哪里T方波是高的还是低的T是方波低的时间。当占空比增加时,负载上的功率下降增加,当占空比减少时,负载上的功率下降。一个典型的PWM功率控制器方案的框图如下所示。

PWM控制器框图

控制信号是我们给PWM控制器作为输入的信号。根据PWM控制器的设计,可以是模拟信号,也可以是数字信号。控制信号包含了需要对负载施加多少功率的信息。PWM控制器接受控制信号,并根据要求调整PWM信号的占空比。不同占空比的PWM波如下图所示。

PWM波占空比

在上述波形中,你可以看到频率是相同的,但开、关时间是不同的。这里展示了arduino PWM控制的两个应用。arduino控制LED亮度,arduino控制电机转速。

使用arduino控制LED亮度。

这可能是使用arduino的PWM控制的最简单的例子。在这里,LED的亮度可以用电位器来控制。电路图如下所示。

Led亮度控制arduino在电路中,50K电位器的滑块连接到arduino的模拟输入引脚A0。LED连接在arduino的数字引脚12处。R1为限流电阻。这个程序的操作很简单。Arduino读取模拟输入引脚A0 (POT滑块)处的电压。使用这个读数进行必要的计算,并根据它调整占空比。下面的程序说明了逐步的工作。

程序。
Int PWM = 12;//分配引脚12到可变pwm int pot = A0;//将模拟输入A0赋给变量pot int t1 = 0;//声明变量t1 int t2 = 0;//声明变量t2 void setup() // setup loop {pinMode(pwm, OUTPUT);//声明pin 12为输出pinMode(pot, INPUT);//声明引脚A0为输入}void loop() {t2= analogRead(pot);//读取A0处的电压,保存在t2中//从1000中减去t2,将结果保存在t1中digitalWrite(pwm, HIGH);//设置引脚12 HIGH delayMicroseconds(t1); // waits for t1 uS (high time) digitalWrite(pwm, LOW); // sets pin 12 LOW delayMicroseconds(t2); // waits for t2 uS (low time) }
的例子。

下面的例子可以帮助您更好地理解这些东西。

假设调整电位器的滑块,使其滑块处的电压为3V。由于滑块端子连接到A0引脚,A0引脚的电压也是3V。arduino中的analogRead功能读取模拟输入引脚的电压(0到5V之间),将其转换为0到1023之间的数字值并存储在一个变量中。

因为这里的模拟输入电压是3伏,数字读数将是3/(5/1023),等于613。这个613将被保存到变量t2(低时间)。然后从1000减去t2,结果是387存储在变量t1中(高时间)。然后数字引脚在t1 uS时接通,在t2 uS时关闭,重复这个循环。结果将是一个高时间= 387 uS低时间= 613 uS的方波,时间周期始终为1000uS。此波形的占空比为(387/(387+613))*100,等于38.7%。波形看起来就像下面所示的那样。

利用arduino实现LED的pwm控制

电机速度控制使用arduino。

arduino直流电机调速的电路图如下图所示。该电路的工作原理和程序与LED亮度控制相同。唯一的区别是,使用晶体管的附加电机驱动电路包括在电路中。arduino的每个数字引脚只能sink或source 40mA。直流电机通常消耗比这多得多,它是不安全的直接连接重负荷的数字引脚。

arduino直流电机速度控制电路图中,电位器的滑块连接到arduino的模拟输入引脚A0。电阻R1限制晶体管Q1的基极电流。电机作为集电极负载连接到晶体管上。电容C1旁路电机产生的电压尖峰和噪声。这个滤波器电容是非常重要的,如果没有它,电路可能不能正常工作。

程序。
Int PWM = 12;//分配引脚12到可变pwm int pot = A0;//将模拟输入A0赋给变量pot int t1 = 0;//声明变量t1 int t2 = 0;//声明变量t2 void setup() // setup loop {pinMode(pwm, OUTPUT);//声明pin 12为输出pinMode(pot, INPUT);//声明引脚A0为输入}void loop() {t2= analogRead(pot);//读取A0处的电压,保存在t2中//从1000中减去t2,将结果保存在t1中digitalWrite(pwm, HIGH);//设置引脚12 HIGH delayMicroseconds(t1); // waits for t1 uS (high time) digitalWrite(pwm, LOW); // sets pin 12 LOW delayMicroseconds(t2); // waits for t2 uS (low time) }

笔记。

  • 在上面显示的两个电路中,arduino应该通过9V外部电源输入插孔供电。
  • 电位器的+5V电源可以从arduino板上的5V稳压器输出取下。
  • 我在测试时使用的直流电机额定为9V/100mA。
  • 我在测试时使用的LED是通用的4mm亮绿色LED。
  • 2N2222能处理的最大集电极电流为800mA。在选择电机时要记住这一点。
  • 操作arduino板时要非常小心。任何错误的连接都可能损坏单板
作者

6评论

  1. 拉尔

    请解释为什么选择1000作为减法的上限,假设锅是满的,它是5v ie,它将成为1023,所以1000 - 1023 = -23,这将不会成为一个错误

  2. 沙赫巴兹

    我该如何连接交流电机/风扇

  3. 阿玛

    你好,
    这个基本程序和基本电路设计很好,也很有帮助,
    谢谢

  4. 里斯

    你好,
    我尝试过这个电路,我发现电机发出可听到的噪音,因为PWM的~500Hz频率,我尝试过改变定时器预分器,但它最终把模拟时序。
    有什么办法可以消除噪音,保持类比吗?

  5. 尼古拉斯•里德

    因此,如果我要修改电机速度控制使用arduino运行2个电机(并行)运行@ 12v .4A在一个pwm通道,电容额定值和晶体管额定值必须是什么?一个NTE293 npn晶体管就足够了吗?如果是的话,R1是否需要改变呢?

    我的特殊应用程序是运行6 pwm通道控制2个计算机风扇每通道共57.6W与以上电机额定值。空间有限,所以我将使用arduino微处理器。我想有一个小的给予虽然与晶体管,所以如果我以后得到一个风扇略高瓦,它不会烧毁系统;因此想要从800mA的限制切换到2n2222a。

    当涉及到数学的时候,我不是最懂的,所以请原谅我,如果它完全搅乱了等式和极限。我希望我的意图已经表明,如果你能帮忙,那就太好了。

    谢谢你,尼克

  6. Leyart席尔瓦

    你好先生们
    我们有飞机开发一个Inveter使用PWM原理,请协助我开发它与您急需的想法。
    问候
    leyart席尔瓦

Baidu