Arduino笔记3·PWM的原理和效果

Posted by 橙叶 on Sun, Mar 18, 2018

在笔记1中提到了PWM,PWM实现了使用数字信号控制模拟电路的功能。

笔记2中则演示了制作电压表的过程,原理十分简单,而且得到了可视化的输出(SerialChart)。那么我们可以用电压表功能来一窥PWM。

PWM的波形

先看一下代码:
int pin = A0;
int pwmpin=11
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(pwmpin,OUTPUT);
  analogWrite(pwmpin, 200);  //设置PWM
}

void loop() { // put your main code here, to run repeatedly: int sensorValue = analogRead(pin); //读取电位值 float voltage= sensorValue * (5.0 / 1023.0); //换算成伏特 Serial.println(voltage, DEC); //打印结果 }

仍然是上一篇电压表的代码,不过在setup(){} 加了这样两句:

pinMode(pwmpin,OUTPUT);
analogWrite(pwmpin, 200);  //设置PWM

第一句的作用我们已经知道,将11号针脚设置为输出。而第二句则是设置PWM的参数。

analogWrite(Pin,Value)

与analogRead()很像,它们似乎联系紧密,就像digitalWrite()和digitalRead(),然而他们两个并不是一回事,针脚更是被划分到了Arduino的两边,彼此隔海(PCB)相望。

Pin是指针脚,而Value则控制占空比。

Value的取值在0~255之间,0即为占空比为0%,255即为占空比为100%。

占空比

占空比描述了PWM产生的波形中,脉宽与一个周期的比值。

$$D = \frac{PW}{T}$$

T为一个周期,PW为脉冲宽度。比如周期为1ms,PW为0.8ms,那么占空比就是80%,换算成analogWrite()的参数就是[latex]{255}\times{0.8}=204[/latex]。

效果

将代码上传到Arduino,然后使用一根导线连接针脚A0和11,打开SerialChart,看到了什么?

应用

在简单的实验中,PWM功能常被用来调节电流的大小,而复杂一些的,可以利用占位比的变化来传输数据,典型的例子有舵机和步进电机。

对业余的我来说,只研究简单的应用就够了。不同的占位比能够输出不同的电压,计算方法很简单,输出电压的最大值为5v,有效值即为占位比乘以最大值:

$$E= {D}\cdot{E_m}$$

如果我们要输出1.5v的电流,应该怎么做呢?首先计算出Value:

$$Value = \frac{{E}\cdot{255}}{E_m}$$

得到[latex]Value=87[/latex]。此时PWM针脚与1.5v的直流效果相同。

可以调节亮度的LED灯

完成了理论分析,就可以付诸于实践了。做一个能调节亮度的LED灯,可以利用串口读取数值,然后转换为Value的值。

连线(材料:LED1,220Ω电阻1,面包板*1,导线若干):

代码:

#include<stdlib.h>
int pin = 11;
int val;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);  //设置串口波特率
  pinMode(pin,OUTPUT);  
  Serial.println("Please type in the Value.(0~9)");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()>0){
    val = Serial.read(); //读取串行端口的值
    val = val-'0';  
    if(val>=0&&val<=9){;
      int value = val*255/9;
      analogWrite(pin,value);  //设定PWM参数
      }
    else Serial.println("The value is out of acceptable range.");
  }
 }

编译上传后,打开串口监视器,在输入栏里输入1~9的数字,可以看到LED的亮度随数字的大小的不同而改变。



comments powered by Disqus