Ardunio_PWM 原理及实现

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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值