Arduino产生PWM的3种方法!

PWM是个啥?
有人翻译成:脉冲宽度调制
PWM 是用占空比不同的方波,来模拟“模拟输出”的一种方式。简而言之就是电脑只会输出 0 和 1,那么想输出 0.5 怎么办呢?于是输出 01010101….,平均之后的效果就是 0.5 了。

PWM有什么作用?
1.通过简单的滤波电路,就可以生成真正的模拟输出量;
2.控制灯光亮度,调节电机转速;请注意这和 1 不是重复的,因为不需要滤波就可以实现
3.控制舵机角度,这个请参考 Arduino 开发板实验三:舵机控制
4.输出信号,例如接喇叭的时候可以发声

第一种:用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 命令时间。

第二种:手动用代码实现 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寄存器

ATmega168 有三个时钟,名字分别叫 Timer0, Timer1 和 Timer2。每个时钟都使用了两个寄存器,其中一个是设定值例如 128,另一个则从 0 开始不断递增,到 1024 之后溢出回到 0。那么当两个值相同的时候,Timer 就会把某个管脚反相。不同的 Timer 之间频率是相同的,占空比则根据设置值不同。

占空比有了,那么周期怎么控制呢?

有一种叫做时钟控制器的东东,这个控制器可以设置周期为 CPU 周期的某个倍数,例如 1,8,64,256,1024 等等,Timer0 和 Timer1 共用一个控制器,Timer2 和它们是独立的。

Atmega 168/328  的时钟们ATmega328P 有三个时钟,Timer0,Timer1 和 Timer2。每个时钟都有两个比较寄存器,可以
同时支持两路输出。其中比较寄存器用于控 制 PWM 的占空比,具体的原理等会儿会介绍。大多数情况下,每个时钟的两路输出会有相同的频率,但是可以有不同的占空比(取决于那两个比较寄存器的设置)每个时钟都有一个“预定标器”,它的作用是设置 timer 的时钟周期,这个周期一般是有Arduino 的系统时钟除以一个预设的因子来实现的。这个因子一 般是 1,8,64,256 或 1024 这样的数值。Arduino 的系统时钟周期是 16MHz,所以这些 Timer 的频率就是系统时钟除以这个预设值的标定 值。需要注意的是,Timer2 的时钟标定值是独立的,而 Timer0 和 Timer1使用的是相同的。这些时钟都可以有多种不同的运行模式。常见的模式包 括“快速 PWM”和“相位修正 PWM”,这两种 PWM 的定义也会在后面解释。这些时钟可以从 0 计数到 255,

也可以计数到某个指定的值。例如 16 位 Timer1 就可以支持计数到 16 位(2 个字节)。

除了比较寄存器外,还有一些其他的寄存器用来控制时钟。例如 TCCRnA 和 TCCRnB 就是用来设置时钟的计数位数。这些寄存器包含了很多位(bit),它们分别的作用如下:

脉冲生成模式控制位(WGM):用来设置时钟的模式

时钟选择位(CS):设置时钟的预定标器

输出模式控制位(COMnA 和 COMnB):使能/禁用/反相 输出 A 和输出 B

输出比较器(OCRnA 和 OCRnB):当计数器等于这两个值时,输出值根据不同的模式进行变化。不同时钟的这些设置位稍有不同,所以使用的时候需要查一下资料。其中 Timer1 是一个 16 位的时钟,Timer2 可以使用不同的预定标器。

Arduino产生PWM的3种方法相关推荐

  1. arduino利用三种方法产生pwm波使用l298n驱动12v小车电机(附电路连接图和pwm详解)

    前段时间参加硕士复试,有一道题是pwm是什么,如何产生pwm,录取成功后接下来在这里写一下吧! 1.脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0 ...

  2. [Arduino]烧写Arduino BootLoader的几种方法

    [Arduino]烧写Arduino BootLoader的几种方法 身为Arduino 电子工程师,很多时候都会涉及到自制各种功能的Arduino 电路板(亦或者说是功能扩展板),但是从网上或者其他 ...

  3. 【Arduino串口数据保存到excel中常用三种方法】

    [Arduino串口数据保存到excel中常用三种方法] 1. 前言 2. 利用excel自带Data Streamer读取 2.1 启用 Data Streamer 加载项 2.2 刷写代码并将微控 ...

  4. arduino win10闪退_解决Win10天气应用闪退的两种方法

    Windows系统中都自带天气应用,但是安装了Win10系统后,就发现,打开天气应用出现闪退的情况,其他应用都正常,这要怎么解决呢?下面小编告诉大家解决Win10天气应用闪退的两种方法. 方法一 1. ...

  5. pwm原理及arduino使用pwm教程详解(超详细超基础)

    文章目录 前言 一.PWM到底是什么 二.arduino使用PWM 总结 前言 此篇文章以一个通俗的方式带你了解PWM信号,写得非常详细和基础,但是在实际arduino编程中也够用了.如果有瑕疵的地方 ...

  6. Arduino应用——PWM控制直流电机风扇

    Arduino应用--PWM控制直流电机风扇 PWM原理 实验器件 功能描述 接线图/原理图 实现代码 结果 最近在使用arduino UNO开发板完成课程小作业.其中一个要求设计一个电风扇控制系统, ...

  7. Arduino基础篇(四)-- 如何玩转Arduino的PWM

    文章目录 1 简单认识 PWM 1.1 PWM简介 1.2 PWM的作用 1.3 产生PWM的引脚 2 使用PWM 2.1 传统方式 2.2 使用寄存器 参考 1 简单认识 PWM 1.1 PWM简介 ...

  8. 用Arduino剖析PWM脉宽调制

    PWM(Pulse Width Modulation)简介 PWM,也就是脉冲宽度调制,用于将一段信号编码为脉冲信号(一般是方波信号).是在数字电路中 达到 模拟输出效果的一种手段.即:使用数字控制产 ...

  9. 金字塔型php的9x9乘法口诀表,python中打印金字塔和九九乘法表的几种方法

    # 打印九九乘法表 for i in range(1,10): for j in range(1,i+1): # x=i*j # print(i,'*',j,'=',x,end=' ') print( ...

最新文章

  1. nb-iot模块的at指令_ESP8266-学习-01 系列了解模块针脚及烧录
  2. nginx日志分割脚本
  3. TortoiseSVN使用方法
  4. call,apply,bind的用法与区别
  5. poj 1250 解题(链表法)
  6. Linux创建sqlite数据库文件,SQLite数据库的创建与附加
  7. IaaS、PaaS、SaaS、BaaS、FaaS、APaaS、IPaaS、IDaaS、DaaS
  8. 如何选择漏电保护器规格型号_电涌保护器(SPD)选择有哪几个关键的参数?SPD如何使用和安装?...
  9. android自定义rx库,Android下载库(OkHttp3+Retrofit2+RxJava2)
  10. 泰坦尼克号幸存者预测(分类)
  11. c语言双字节异或,C语言 按位异或实现加法
  12. 【路径规划】基于matlab蚁群算法机器人大规模栅格地图最短路径规划【含Matlab源码 1860期】
  13. Ubuntu 16.04 Wifi列表是空的(搜索不到Wifi)的解决方法
  14. Java英文技术网站
  15. @angular/http和@angular/common/http 区别
  16. 逻辑航线信息学系列教程:二进制(Binary)
  17. 解释计算机概念BIOS,电脑BIOS的小常识
  18. 图形学学习笔记4——平面图形裁剪
  19. vue 一个页面根据状态渲染不同的组件 使用currentView动态渲染
  20. ip后面的斜杠24是什么意思?(/24)(子网掩码)(32位中的前24位为1,即255.255.255.0,用二进制表示为:11111111.11111111.11111111.00000000)

热门文章

  1. castle windsor学习-----XML Inline Parameters 内联参数
  2. HTML5小游戏《智力大拼图》发布,挑战你的思维风暴
  3. VMware上安装ubuntu 13.04
  4. 越心虚越藏着掖着,越藏越掖越脱节
  5. java多态性详解——父类引用子类对象
  6. 汇编中常用的DOS系统调用功能号
  7. 汇编语言随笔(15)- 对键盘输入进行处理(int 9 和 int 16h 中断例程)
  8. NSkyKit 项目实践-Dagger2
  9. java程序向mysql插入中文变问号
  10. 230:Borrowers