在笔记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 }仍然是上一篇电压表的代码,不过在setup(){} 加了这样两句: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); //打印结果 }
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