=
=
=
基于Mega2560的Arduino的PWM的调制模拟输出analogWrite
一:PWM的介绍:
PWM是一种调制方式,那么为什么会有这种方式存在?
大家可能知道Arduino有模拟输入引脚,这些引脚是通过A/D转换操作的,而一般的数字引脚却只能输入HIGH或LOW电平,那么中间电平可否输出呢?比如2v的电平如何输出?于是PWM应运而生。PWM的高明之处在于:它输出的仍然是HIGH或者LOW电平,但可以间歇性周期性输出,则利用取平均值的方法,可以达到满意的输出效果。
一个简单的例子:在0~5s内输出5v的电平,那么0~5s的平均电压就是5v,而倘若我在0~2.5s输出5v,在2.5~5s输出0v(占空比50%),那么这5s内平均电平就是2.5v,显然可以达到我们想要的效果。但仍有问题:倘若你的周期很长,就像上面例子所说,周期5s,点亮一个LED灯(LOW亮,HIGH灭),那么LED灯显然是前2.5s灭,后2.5s亮,显然达不到调灯暗亮的效果。但当周期被缩小之后比如20ms,这时候亮与灭只是很短时间内的事,肉眼根本看不到亮灭的变化,因而LED灯表现的就是亮度变暗。于是我们知道:PWM调制的周期一般比较短。PWM只是用数字输出替代模拟量输出,因此单方面还是不行的,这就要求我们的设备还要支持PWM的调制。(比如舵机等)。因而PWM的周期也不能任意短,还需要满足我们设备的调制要求。
我这里只是非常通俗的理解,如果还有疑问请查阅相关资料。
二:analogWrite()
功能:
analogWrite()实现对引脚设置PWM的要求。可以被用来控制LED等,电机转动,舵机等。使用此函数后,引脚会产生稳定的方波,直到下一次对引脚做其他操作。大多数引脚的PWM频率大约为490Hz。在Uno以及相似的板子上,pin5和pin6有大约980Hz的频率。Leonardo板子的pin3和pin11也有980Hz的频率。
在大多数的Arduino板子上(用ATmega168或者ATmega328的板子),在引脚3,5,6,9,10和11有PWM功能;在Arduino Mega板子上,在2~13和44~46引脚有PWM功能。使用ATmega8的老板子只在9,10和11引脚支持analogWrite()。
Arduino Due板子在2到13引脚和DAC0,DAC1引脚支持analogWrite()。但是ADC0和DAC1是采用D/A转换的方式输出,它们确实输出的是模拟量而不是由PWM调制输出的。
另外,使用analogWrite()不需要再用pinMode()设置引脚为输出。
形式:
analogWrite(pin,value)
参数:
pin:写入的引脚;
value:占空比,在0~255之间。(0时候为关,即LOW;255为开,即HIGH)
返回值:none
注:5pin和6pin产生的PWM输出会比设置的占空比高,这是因为millis()和delay()函数与它们使用相同的内部时钟。
示例:
int ledPin = 9; // LED connected to digital pin 9 int analogPin = 3; // potentiometer connected to analog pin 3 int val = 0; // variable to store the read value void setup() { pinMode(ledPin, OUTPUT); // sets the pin as output } void loop() { val = analogRead(analogPin); // read the input pin //fantaxy025025:这里应该使用map函数 analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255 }
现在我们来看看为何Servo库detach时候要连9或10pin。首先舵机需要20ms的控制周期,可见9,10脚在使用Servo库的时候其引脚PWM频率应该大概为1/0.02=50Hz,也就是这两引脚的PWM周期恰好满足了舵机的控制要求。我们来看看Servo库相关资料:
The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.
可见,Servo使用时候会disable PWM,说明Servo的控制原理并不是利用Arduino本来的PWM输出,而是自己重新模拟了PWM。并且,现在的Arduino最多可支持48路motors,说明attach只限定于9,10口肯定是不合理的。我们再接着看,到attach()函数的说明页:
Attach the Servo variable to a pin. Note that in Arduino 0016 and earlier, the Servo library supports only servos on only two pins: 9 and 10.
于是真相大白了:Arduino 0016版本的Servo library编写时候只支持9,10pin,这里的0016当然不是Arduino的硬件版本,而是Arduino IDE的软件版本!那么,自己的软件版本到底是多少呢?不用想了,现在肯定不止0016版本了!你可以打开Arduino IDE安装目录,找到revisions.txt文本文件打开看看(可以从后往前找,这是版本我更新史啊!),可以看到:ARDUINO 0016 - 2009.05.30。09年时候发行的才是0016版本!所以现在就放心使用Servo library吧。
另外提醒下:使用多个舵机时候最好使用额外电源供电。
参考:https://blog.csdn.net/yibu_refresh/article/details/40891627
=
=
=
相关推荐
Arduino Mega 2560是一款基于ATmega2560的微控制器板,它拥有大量的数字输入/输出引脚、模拟输入引脚,以及各种实用的功能,如UART接口、SPI通信等。这使得它非常适合于那些需要大量I/O端口的应用场合。 ### 引脚...
【作品名称】:基于Arduino MEGA2560的智能物流小车 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于Arduino ...
这款开发板基于Atmel的ATmega2560芯片,拥有大量的输入/输出引脚和强大的功能,常用于复杂的嵌入式系统项目。"Rev3"代表这是该设计的第三个修订版,通常意味着在前几代的基础上进行了优化和改进。 描述中提到的"用...
Arduino Mega2560 是一款基于 ATmega2560 微控制器的核心电路板,具有 54 路数字输入输出、16 路模拟输入、4 路 UART 接口、一个 16MHz 晶体振荡器、一个 USB 口、一个电源插座、一个 ICSP 头和一个复位按钮。...
本解析基于提供的部分原理图内容,将详细探讨Arduino Mega 2560的核心组件及其工作原理。 #### 一、核心组件与供电系统 **1. 微处理器**: ATMEGA2560-16AU作为Arduino Mega 2560的主控芯片,拥有256KB的闪存存储...
基于Arduino MEGA 2560和ESP8266 WiFi模块的IoT设备原型 硬件: Arduino的MEGA 2560 ESP8266设备通过串口3连接到Mega 2560 DHT11传感器连接到第二个数字引脚 软件: Arduino草图,有关内部使用过的库的信息 我...
您可以按照以下说明在没有PCB的情况下自行连接,也可以使用Chris Tersteeg提供的布局构建PCB: : 材料清单: Arduino Mega 2560 R3-原始的Arduino或高品质的复制品。 1602键盘防护-Arduino版本SD卡屏蔽-带有电平转换...
【串口总线舵机SDK】是用于控制舵机的一种软件工具,特别适用于Arduino Mega2560开发板。该SDK允许用户通过串行通信接口(UART)与舵机进行高效交互,实现精确的角度控制、速度调整、模式切换等功能。 在【安装串口...
Arduino Mega2560 的 IO 口包括 54 路数字输入输出口,其中 16 路可以作为 PWM 输出。它还具有 16 路模拟输入口、4 路 UART 接口、一个 16MHz 晶体振荡器、一个 USB 口、一个电源插座、一个 ICSP 头和一个复位按钮...
Arduino Mega 2560是一款基于Atmel AVR系列微控制器的开源硬件开发平台,它在Arduino UNO的基础上扩展了更多的输入输出引脚以及更强的处理能力。标题中的"arduino-mega2560"指的是这个项目或资源是关于Arduino Mega ...
Arduino Mega 2560是一款强大的微控制器,拥有大量的数字和模拟输入/输出引脚,适合处理复杂的硬件接口任务。 首先,我们需要了解LCD12864B的基本工作原理。这种显示器通常使用SPI(Serial Peripheral Interface)...
Arduino Mega2560是一款基于ATmega2560微控制器的开源电子原型平台,广泛应用于各种DIY项目和物联网应用。它具有大量的输入/输出(I/O)引脚、模拟输入通道以及串行通信接口,使其成为复杂项目理想的开发板。 在...
AVR-STM32-Arduino-Mega2560 (3).pdsprj
Arduino Mega 2560是一款基于ATmega2560微控制器的扩展版Arduino开发板,它拥有更多的数字输入/输出引脚、模拟输入引脚以及额外的串行通信接口,因此在需要处理大量数据或连接多个外部设备的项目中较为常用。...
Arduino MEGA 2560 R3 微控制器具有 54 组数字 I/Oinput/output 端(其中 14 组可做 PWM 输出),16 组模拟比输入端,4 组 UART(hardwareserial ports),使用 16 MHz crystal oscillator。由于具有 bootloader,...
Arduino Mega2560是一款基于ATmega2560微控制器的开源电子原型平台,被广泛应用于各种创意项目和DIY制作中。这款控制器拥有丰富的数字输入/输出引脚、模拟输入口以及强大的处理能力,使得它在物联网、机器人、自动化...
在Arduino中,脉宽调制(PWM)是一种常见的技术,用于模拟信号输出或控制LED亮度、电机速度等。PWM通过改变占空比来实现电压或电流的模拟,即在一个固定周期内高电平和低电平的时间比例。本篇将详细介绍一个经典的...
Arduino Mega 2560 R3 是一个基于Atmel公司的AVR微控制器的开源电子原型平台,被广泛用于DIY项目、机器人制作、物联网设备和其他嵌入式系统中。这个平台以其易用性和丰富的扩展性著称,尤其适合初学者和专业开发者。...
Arduino Mega 2560(AD)是一款基于Atmel公司的AVR微控制器的开源硬件平台,广泛用于电子制作、物联网项目、机器人制作等创新领域。它提供了大量的数字和模拟输入/输出引脚,以及充足的存储空间和处理能力,使得用户...
- analogWrite():向支持PWM的引脚输出模拟值。 - delay():使程序暂停指定的毫秒数。 - Serial类:进行串口通信,包括serialWrite()、available()、read()、flush()等函数。 - 时间函数:如millis()返回程序运行的...