关闭

Ardunio_PWM 原理及实现

标签: ardunioc++硬件
641人阅读 评论(0) 收藏 举报
分类:

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来自己自行学习了解。




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:341014次
    • 积分:6604
    • 等级:
    • 排名:第3581名
    • 原创:331篇
    • 转载:14篇
    • 译文:0篇
    • 评论:116条
    最新评论