<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jackslab.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=Arduino_I%2FO_%E4%B9%8B%E6%A8%A1%E6%8B%9F%E8%BE%93%E5%87%BA</id>
		<title>Arduino I/O 之模拟输出 - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=Arduino_I%2FO_%E4%B9%8B%E6%A8%A1%E6%8B%9F%E8%BE%93%E5%87%BA"/>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=Arduino_I/O_%E4%B9%8B%E6%A8%A1%E6%8B%9F%E8%BE%93%E5%87%BA&amp;action=history"/>
		<updated>2026-08-12T10:09:11Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.19.2</generator>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=Arduino_I/O_%E4%B9%8B%E6%A8%A1%E6%8B%9F%E8%BE%93%E5%87%BA&amp;diff=2696&amp;oldid=prev</id>
		<title>Comcat：以“ 模拟输出，即用于输出的 pin （管脚，也叫 GPIO）能输出“连续”的电压值，不像数字输出只能输出 0V 和 5V   模拟输出对应的...”为内容创建页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=Arduino_I/O_%E4%B9%8B%E6%A8%A1%E6%8B%9F%E8%BE%93%E5%87%BA&amp;diff=2696&amp;oldid=prev"/>
				<updated>2014-06-25T09:01:28Z</updated>
		
		<summary type="html">&lt;p&gt;以“ 模拟输出，即用于输出的 pin （管脚，也叫 GPIO）能输出“连续”的电压值，不像数字输出只能输出 0V 和 5V   模拟输出对应的...”为内容创建页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
模拟输出，即用于输出的 pin （管脚，也叫 GPIO）能输出“连续”的电压值，不像数字输出只能输出 0V 和 5V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
模拟输出对应的函数是：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
analogWrite(pin，value)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
value 取值 0 ~ 255，值越小输出电压越低。可以看作把 5V 电压“均分”成 256 份，value 值看作取多少份&lt;br /&gt;
&lt;br /&gt;
用于模拟输出的 pin，在大多数 Arduino 板子上（用 ATMEGA168 和 ATMEGA328）只能是 pin 3, 5, 6, 9, 10, 11。在 Arduino Mega 上为 2 ~ 13&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
把一个普通 LED 发光二极管，正极接在 pin 3 上，负极接地，如下程序可以实现 LED 由暗变亮的过程（LED 的亮度对电压敏感）：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
uint8_t brightness = 0;&lt;br /&gt;
uint8_t led_pin = 3;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(led_pin, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  analogWrite(led_pin, brightness++);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  analogWrite(led_pin, 0);&lt;br /&gt;
  if(brightness &amp;gt;= 12) brightness = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;深入模拟输出&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于只有 '0' 和 '1' 的数字电路，要产生类似模拟信号的连续输出，用的是 PWM (Pulse Width Modulation) 技术。&lt;br /&gt;
&lt;br /&gt;
PWM (Pulse Width Modulation)，即：脉冲宽度调制，是一种使用数字方法获得模拟结果（连续）的技术。数字电路产生方波（一种在开/关之间跳变的信号），比较容易&lt;br /&gt;
&lt;br /&gt;
如下一段程序使用 Arduino 的数字输出 pin 4，产生一段方波（其周期为 1ms）：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
uint8_t pin = 4;&lt;br /&gt;
uint16_t cycle = 1000;    // 周期是 1000 微秒&lt;br /&gt;
uint16_t duty = 500;      // 高电平持续时间是 500 微秒&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(pin, OUTPUT);&lt;br /&gt;
  digitalWrite(pin, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(pin, HIGH);&lt;br /&gt;
  delayMicroseconds(duty);&lt;br /&gt;
  digitalWrite(pin, LOW);&lt;br /&gt;
  delayMicroseconds(cycle - duty);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
示波器的波形是这样的：&lt;br /&gt;
&lt;br /&gt;
[[文件:square-wave-500us.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
下面这个程序：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
uint8_t pin = 4;&lt;br /&gt;
uint16_t cycle = 1000;    // 周期是 1000 微秒&lt;br /&gt;
uint16_t duty = 800;      // 高电平持续时间是 800 微秒&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(pin, OUTPUT);&lt;br /&gt;
  digitalWrite(pin, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(pin, HIGH);&lt;br /&gt;
  delayMicroseconds(duty);&lt;br /&gt;
  digitalWrite(pin, LOW);&lt;br /&gt;
  delayMicroseconds(cycle - duty);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
也生成方波，周期也是 1ms，不同的是，一个周期内高电平的持续时间占整个周期的80%，更方便地，常把这个 80% 称为占空比&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
示波器的波形：&lt;br /&gt;
&lt;br /&gt;
[[文件:square-wave-800us.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PWM 是使用数字输出，通过控制高电平和低电平所占的时间，就能模拟出介于高电平（5V）和低电平（0V）之间的电压。高电平的持续时间称为脉冲宽度。要获得不同的模拟值，你只需要改变（调制）脉冲的宽度。&amp;lt;b&amp;gt;如果这个高-低组合的变化速度足够快，在LED示例中的结果看起来就象是一个稳定在0－5V之间的电压在控制LED的亮度&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
对于下面的程序：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(5, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  analogWrite(3, 127);&lt;br /&gt;
  analogWrite(5, 204);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在 Arduino Leonardo 上，pin 3 的输出波形为：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:analogwrite-128-osc.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在 Arduino Leonardo 上，pin 5 的输出波形为：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:analogwrite-205-osc.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
可以看出，在 Arduino Leonardo 上，analogWrite() 使用的方波周期为 1ms；127 时，占空比为 50%；204 时，占空比为 80&lt;br /&gt;
&lt;br /&gt;
使用万用表的直流电压挡，测得 pin 3 的电压为 2.5V (5V x 50%)，pin 5 的电压为 4V (5V x 80%)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	</feed>