您的位置:首页 > 编程语言 > C语言/C++

Ardunio_PWM 原理及实现

2015-07-07 23:30 351 查看
PWM 就是pulse width Modulation的缩写,意思就是脉冲宽度调制。通过调整输出信号占空比达到改变输出平均电压的目的。

例如端口的电压有两个,0V和5V。 如果要获得3V的电压可以通过分压来实现,但是如果我想输出的电压在0V 3V 3.5V 5V 这四个数值之间来回变动的话,单纯的分压是不行的(因为不能一直不停的切换电阻)。这种情况下就该使用PWM了,对于Ardunio的数字端口而言,只有两个数值,0或者1. 表示低电平或者是高电平。 我们把0 代表0V,数字1 代表5V。如果我们让Ardunio在一秒钟内输出500个信号,如果这500个信号全是1111111.....  那就以为着电压是5V。 如果全部信号都为0  那就以为着电压是0V。
 如果是是10101010....这样 1和0交替出现的话,各出现一半,那么输出的电压就是2.5V啦。 于此可知3.5V电压是如何输出的。

因为本文作者使用的是Ardunio uno, 所以只有 3, 5, 6, 9, 10, 11 插口支持PWM。 本文中是采用11号插口来实现的。

在Ardunio中实现PWM的方式有三种,第一种是通过analogWrite(pin, value) 函数来实现PWM。第二种是用户自己动手实现PWM的方式,第三种是使用PWM寄存器的方式。

下面是电路的实际图



附上使用ardunio analogWrite(pin,value)的代码, 这里需要提醒一点的是使用analogWrite(pin, value)时可以不用提前将 pin插口设置为output模式。pinMode(pin,input)(这点在Ardunio的官方文档中有说明)

// the value about the brightness of the light
int brightness = 0;
// the increment or the decrement of the brightness of the light
int fadeAmount = 5;
int led = 11;
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(led, brightness);
delay(50);
brightness += fadeAmount;
if(brightness == 0 || brightness == 255){
fadeAmount = - fadeAmount;
}
}

第二种方式是用户自己编写PWM的代码.
下面是用户自己写的PWM的代码,其含义是在一秒钟内产生了300个1信号,代表5V,还产生了700个0信号,代表0V,这样所产生的电压是0.3* 5 = 1.5V 因为还要考虑图中串联了一个电阻的情况。  这样讲就实现了电源电压的可控调节。

int pin = 8;
void setup() {
// put your setup code here, to run once:
pinMode(pin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(pin, HIGH);
delayMicroseconds(300);
digitalWrite(pin, LOW);
delayMicroseconds(1000-300);
}

有关第三种方法PWM寄存器方式,希望读者baidu或者google来自己自行学习了解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ardunio c++ 硬件