打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Arduino PWM
PWM是啥玩意儿?
  PWM是“怕玩命”的缩写,英文写法是“Pulse-width modulation”,也有些外行人士把它翻译成“脉冲宽度调制”。Arduino有很多种版本,这篇文章里是以ATmega168为例,有用过其他型号的兄弟请补充。
  对于没有听说过PWM的同学,请先参考一下我的另一篇博客Arduino的模拟输入和输出。
  PWM是用占空比不同的方波,来模拟“模拟输出”的一种方式。靠,这个太拗口了,简而言之就是电脑只会输出0和1,那么想输出0.5怎么办呢?于是输出01010101….,平均之后的效果就是0.5了。早这么说就了然了嘛。
  


  PWM有神马作用?
  举几个例子说明:
  1.通过简单的滤波电路,就可以生成真正的模拟输出量;
  2.控制灯光亮度,调节电机转速;请注意这和1不是重复的,因为不需要滤波就可以实现
  3.控制舵机角度,这个请参考 Arduino开发板实验三:舵机控制
  4.输出信号,例如接喇叭的时候可以发声
  如何产生PWM?
  Arduino有三种方式可以产生PWM。第一种:
  用analogWrite(pin, val)命令
  其中pin是腿的编号,传说中只能用3,5,6,9,10,11这几条;val是0~255的整数值,对应电压从0到 5V。注意,那几个脚的编号,指的是ATmega168的pin编号,Arduino的板子会用这几个管脚支持更多路的PWM输出,例如我的Arduino Mega168就支持0~13共14个PWM输出。
  具体的使用可以看下面的示例代码:
  int pin = 8; //0~13
  void setup()
  {
  pinMode(pin, OUTPUT);
  }
  void loop()
  {
  analogWrite(pin, 128);
  delay(500);
  }
  这种方式产生的方波周期大概是20ms左右(50Hz),不需要占用额外的cpu命令时间。据说99%的同学看到这里就可以下课了,技术宅请继续看第二种方式:
  手动用代码实现PWM
  int pin = 38;  //这个可以随意点
  void setup()
  {
  pinMode(pin, OUTPUT);
  }
  void loop()
  {
  digitalWrite(pin, HIGH);
  delayMicroseconds(100);
  digitalWrite(pin, LOW);
  delayMicroseconds(1000 - 100);
  }
  上面这段代码会产生一个PWM=0.1的,周期为1ms的方波(1000Hz),这种方式的优缺点很明显:
  1,PWM的比例可以更精确;
  2,周期和频率可控制;
  3,所有的pin脚都可以输出,不局限于那几个脚;
  4,缺点:CPU干不了其他事情了;
  好吧,缺点只有一个,却非常致命,以至于上面这些基本都是废话。但是对于周期比较大的PWM,可以用算法模拟CPU的多任务系统,从而在输出PWM的同时做点兼职。
  那么能不能既调节PWM的频率和周期,又不要占用额外的CPU时间呢?请看第三种方式:
  使用PWM寄存器
  ATmega168有三个时钟,名字分别叫Timer0, Timer1和Timer2。每个时钟都使用了两个寄存器,其中一个是设定值例如128,另一个则从0开始不断递增,到1024之后溢出回到0。那么当两个值相同的时候,Timer就会把某个管脚反相。不同的Timer之间频率是相同的,占空比则根据设置值不同。
  占空比有了,那么周期怎么控制呢?有一种叫做时钟控制器的东东,这个控制器可以设置周期为CPU周期的某个倍数,例如1,8,64,256,1024等等,Timer0和Timer1共用一个控制器,Timer2和它们是独立的。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Arduino小车
Arduino学习笔记A4 
51单片机
Arduino Uno输出自定义频率的PWM(详解)
Tiny85哒哒哒
【CurieTimerZero】一个额外的定时器
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服