模拟 I/O

analogReference(type)

描述:
配置用于模拟输入的基准电压(即输入范围的最大值)。选项有:
DEFAULT:默认5V(Arduino板为5V)或3.3伏特(Arduino板为3.3V)为基准电压。
INTERNAL:在ATmega168和ATmega328上以1.1V为基准电压,以及在ATmega8上以2.56V为基准电压(Arduino Mega无此选项)
INTERNAL1V1:以1.1V为基准电压(此选项仅针对Arduino Mega)
INTERNAL2V56:以2.56V为基准电压(此选项仅针对Arduino Mega)
EXTERNAL:以AREF引脚(0至5V)的电压作为基准电压。
参数: type:使用哪种参考类型(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, 或者 EXTERNAL)

注意:
改变基准电压后,之前从analogRead()读取的数据可能不准确。
警告:
不要在AREF引脚上使用使用任何小于0V或超过5V的外部电压。如果你使用AREF引脚上的电压作为基准电压,你在调用analogRead()前必须设置参考类型为EXTERNAL。否则,你将会削短有效的基准电压(内部产生)和AREF引脚,这可能会损坏您Arduino板上的单片机。 另外,您可以在外部基准电压和AREF引脚之间连接一个5K电阻,使你可以在外部和内部基准电压之间切换。请注意,总阻值将会发生改变,因为AREF引脚内部有一个32K电阻。这两个电阻都有分压作用。所以,例如,如果输入2.5V的电压,最终在在AREF引脚上的电压将为2.5 * 32 /(32 + 5)= 2.2V。

analogRead()

描述:
从指定的模拟引脚读取数据值。 Arduino板包含一个6通道(Mini和Nano有8个通道,Mega有16个通道),10位模拟数字转换器。这意味着它将0至5伏特之间的输入电压映射到0至1023之间的整数值。这将产生读数之间的关系:5伏特/ 1024单位,或0.0049伏特(4.9 mV)每单位。输入范围和精度可以使用analogReference()改变。 它需要大约100微秒(0.0001)来读取模拟输入,所以最大的阅读速度是每秒10000次。
语法:

analogRead(pin)

参数:
pin:从输入引脚(大部分板子从0到5,Mini和Nano从0到7,Mega从0到15)读取数值。
返回值:
从0到1023的整数值

注意:
如果模拟输入引脚没有连入电路,由analogRead()返回的值将根据多项因素(例如其他模拟输入引脚,你的手靠近板子等)产生波动。

例子:

int analogPin = 3;     // 电位器(中间的引脚)连接到模拟输入引脚3
                       // 另外两个引脚分别接GND和+5V
int val = 0;           // 定义变量来存储读取的数值
 
void setup()
{
  Serial.begin(9600);          //  设定波特率为9600
}
 
void loop()
{
  val = analogRead(analogPin);    // 从输入引脚读取数值
  Serial.println(val);             // 显示读取的数值
}

analogWrite()

描述:
从一个引脚输出模拟值(PWM)。可用于让LED以不同的亮度点亮或驱动电机以不同的速度旋转。analogWrite()输出结束后,该引脚将产生一个稳定的特殊占空比方波,直到下次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。PWM信号的频率大约是490赫兹。
在大多数arduino板(ATmega168或ATmega328),只有引脚3,5,6,9,10和11可以实现该功能。在aduino Mega上,引脚2到13可以实现该功能。老的Arduino板(ATmega8)的只有引脚9、10、11可以使用analogWrite()。在使用analogWrite()前,你不需要调用pinMode()来设置引脚为输出引脚。
analogWrite函数与模拟引脚analogRead函数没有直接关系。
语法:

analogWrite(pin, value)

参数:
pin:用于输入数值的引脚。
value:占空比:0(完全关闭)到255(完全打开)之间。

说明和已知问题:
引脚5和6的PWM输出将高于预期的占空比(输出的数值偏高)。这是因为millis()和delay()功能,和PWM输出共享相同的内部定时器。这将导致大多时候处于低占空比状态(如:0 - 10),并可能导致在数值为0时,没有完全关闭引脚5和6。

例子:
通过读取电位器的阻值控制LED的亮度

nt ledPin = 9;      // LED连接数字引脚9
 
int analogPin = 3;   // 电位器连接到模拟引脚3
 
int val = 0;         // 定义变量存以储读值
 
void setup()
 
{
 
  pinMode(ledPin, OUTPUT);   // 设置引脚为输出
 
}
 
void loop()
 
{
 
  val = analogRead(analogPin);   // 从输入引脚读取数值
 
  analogWrite(ledPin, val / 4);  //以val / 4的数值点亮LED(因为analogRead读取的数值从0到1023,而analogWrite输出的数值从0到255)
}