我正在尝试理解 GPIO,并阅读了一堆不同的博客文章,我想我已经接近了它,但仍然在为一些事情苦苦挣扎。
我已经看到一些关于 GPIO 只能使用二进制值的参考,但其他帖子说该值可以是 0-255。我假设这是模拟和数字 GPIO 之间的区别。那是对的吗?单个 GPIO 引脚是否可以同时用作模拟和数字引脚?
我正在尝试理解 GPIO,并阅读了一堆不同的博客文章,我想我已经接近了它,但仍然在为一些事情苦苦挣扎。
我已经看到一些关于 GPIO 只能使用二进制值的参考,但其他帖子说该值可以是 0-255。我假设这是模拟和数字 GPIO 之间的区别。那是对的吗?单个 GPIO 引脚是否可以同时用作模拟和数字引脚?
GPIO 引脚是“通用输入/输出”引脚。默认情况下只有高或低(电压电平,高是微控制器的电源电压,低通常是接地,或 0V)。但是“高”和“低”的电平通常以电压作为电源电压的比例给出。因此,通常高于电源电压 66% 的任何东西都被认为是逻辑电平“高”,这意味着只要电平在被认为“高”的范围内,一些低压设备就可以与高压设备通信。例如,1.8–2.7V 低功耗微控制器或 GPS 接收器将无法直接与 5V 微控制器通信,因为低压设备认为“高”,而高压设备根本不会认为它高。这是为了使用 GPIO 作为输入引脚,
有时,您可以通过将 GPIO 引脚配置为供其他板载设备(如“模数”(ADC)转换器使用)来使用 SINGLE 引脚作为“模拟”值。该引脚设置为 ADC 上的通道,现在它充当 ADC 的输入,而不是普通的 GPIO 引脚。然后,您可以设置 ADC 进行采样,并读取 ADC 的结果寄存器值,以获取 0-1024 等数字(如果它是 10 位分辨率)。
正如有人提到的那样,可以在软件中使用 GPIO 引脚来产生脉冲宽度调制 (PWM) 信号的效果,通常以低速进行 GPIO 切换。大多数微控制器都有专用的 PWM 发生器,可以配置为使用 GPIO 引脚作为输出引脚,与使用软件控制 GPIO 生成 PWM 信号相比,这些发生器非常快速且稳定得多。PWM 用于“平均”或“%”风格的信号,并允许您执行昏暗灯光和控制电机速度等操作。
GPIO 引脚通常按组排列,称为端口。在小型控制器中,它们可能是 8 位架构,因此端口通常分为 8 个,并且可以通过读取代表这些逻辑高/低值的“数据寄存器”同时读取它们的值引脚。同样,您可以将引脚设置为输出,然后将 8 位写入数据寄存器,微控制器 GPIO 控制器将读取寄存器的更改值,并根据您刚刚设置的值将引脚驱动为高电平或将引脚拉低。
在 ARM Cortex A8 和 A9 等较新的控制器中,如 Raspberry Pi 和 BeagleBone,它们的 GPIO 控制器和不同的选项非常复杂。它们使用 32 位架构,因此大多数 GPIO 引脚排列成 32 引脚块,即使并非所有引脚都实际可用(有些可能是专用的或未启用)。BeagleBone(我之前研究过)对于它的大量引脚有一些非常棒的选项,有时您需要使用“引脚复用”工具,它允许您为某些东西设置某些引脚的特殊模式像 PWM、脉冲捕获、定时器输出、模拟 (ADC) 通道输入,甚至(无论如何在 BeagleBone 上)映射到 ARM 内核上可用的工业子处理器,但被视为独立处理器,需要它们自己的引脚映射连接到外部世界。
您很可能指的是 Arduino 的模拟输出,它通常使用带有软件 PWM的 GPIO 引脚。GPIO 通常具有三种状态。输出高、输出低和输入/高阻(高阻抗,不影响输出)。
PWM 快速将输出从输出高电平切换到输出低电平(周期),以创建平均值(占空比),允许看起来像模拟值的东西。通过以 50%(或 128)占空比切换二进制 GPIO,输出仍然是二进制的,但平均为高和低之间的一半。
想想一个灯泡。您会看到它打开或关闭。但它确实每秒打开和关闭 60 次,速度如此之快,以至于您不会注意到它的闪烁速度非常快。但是手动打开和关闭灯泡真的很慢,你会注意到它在闪烁。255 表示 100% 开启,小于 255 表示 100% 开启。
这就是二进制 GPIO 可以像 255 状态模拟引脚一样工作的方式。
一个 GPIO 位可以是 0 或 1。一个 8 位 GPIO 端口,由 8 个连续位组成,范围可以在 00000000 和 11111111 之间,或十进制的 255。这与“模拟”的概念关系不大