AnalogRead(0)或AnalogRead(A0)


14

arduino参考说明您将使用以下代码从模拟引脚5读取值:

int val1 = analogRead(5);

但是,要从数字引脚5进行读取,您需要将相同的引脚号传递给digitalRead

int val2 = digitalRead(5);

您不应该使用analogRead(A5)代替analogRead(5)吗?

如果没有,那么以下代码会做什么:

int val3 = analogRead(A5);

Answers:


28

要回答Tyilo的特定问题:

analogRead(5)并将digitalRead(5)从两个不同的地方读取。前者将从模拟信道读5A5并后者将从销5,该读恰好是一个数字销。因此,是的,如果您想读取模拟引脚,digitalRead则应使用A5

为什么?

analogRead内部需要一个通道号,但也可以给它提供一个引脚号。如果确实给它提供了一个PIN号,它将把它转换成其相应的通道号。据我所知,这analogRead是唯一在内部使用通道号的功能,是唯一允许使用通道号的功能,并且是此未记录的引脚到通道转换的唯一功能。为了理解这一点,让我们从一些示例开始。

如果要analogRead在第一个模拟引脚上使用,A0可以执行analogRead(0)使用通道号或analogRead(A0)使用引脚号的操作。如果要使用引脚号变体,analogRead请将引脚号转换为A0正确的通道号0

如果要digitalWrite在第一个模拟引脚上使用,A0只能这样做digitalWrite(A0, x)digitalWrite在内部不使用模拟通道,也不允许您将其传递给通道号。好吧,它可以您,但您会选择错误的引脚。同样适用于digitalRead甚至analogWrite

针脚到通道的转换又analogRead如何呢?该功能的源代码可以在参考资料中找到。hardware/arduino/avr/cores/arduino/wiring_analog.c您将看到它根据板的类型进行了一些简单的减法。在A0/ A1/ A2/等。常数代表模拟通道的引脚号,可在需要引用模拟输入的任何地方使用。因此,它们是在Arduino代码中使用的最佳选择,因为很明显,即使使用不同的功能,也使用相同的物理端口。这些常数的定义取决于您的电路板。

例如,这是Arduino Uno中的模拟引脚定义代码 hardware/arduino/avr/variants/standard/pins_arduino.h

static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;

为了进行比较,这是Arduino Mega的模拟引脚定义代码:

static const uint8_t A0 = 54;
static const uint8_t A1 = 55;
static const uint8_t A2 = 56;
[...]
static const uint8_t A13 = 67;
static const uint8_t A14 = 68;
static const uint8_t A15 = 69;

关于模拟引脚的EE进一步讨论:我可以将Arduino上的模拟引脚用于项目吗?


1
尽管我完全按照您的解释,但是我对Arduino参考感到困惑,该参考包含错误的信息。
Tyilo

1
您也可以analogRead模拟引脚!另一方面,analogWrite可以在模拟和PWM引脚上使用。
Tyilo

1
@Tyilo我使用从源代码中获取的一些更准确的信息更新了响应。
凯文·马克

3
可以在任何引脚上调用analogWrite(),但它仅在PWM引脚上执行某些操作。在非PWM数字引脚和所有模拟引脚上,它仅调用digitalWrite()。
baldengineer

3
@powtac-人们普遍认为arduino文档相当可恶,至少在此附近。不要觉得您缺少什么,不是您,而是arduino人。
康纳·沃尔夫,

3

我花了几个小时。我以为我遇到了硬件问题。原来我打错了电话analogRead()

不正确的(错误的从样本代码DFRobot 😣):

val = analogRead(0); //connect sensor to Analog 0

正确:

val = analogRead(A0); //connect sensor to Analog 0

更新analogRead()获取GPIO引脚号。A0等是#define用于Arduino引脚编号,其中A0 == 36

注意:在FireBeetle ESP32上,引脚标记为“ IO36 / A0”(GPIO36)等于Arduino A0,但“ IO39 / A1”(GPIO39)等于Arduino A3(not A1),“ IO34 / A2”(GPIO34)等于Arduino A6(notA2)等

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.