了解GPIO模拟和数字


11

我正在尝试了解GPIO,并阅读了许多不同的博客文章,我想我已经快要掌握它了,但仍在努力解决一些问题。

我见过一些关于GPIO的参考,它们只能使用二进制值,但是其他帖子说该值可以在0-255之间。我假设这是模拟和数字GPIO之间的差异。那是对的吗?一个GPIO引脚能否同时充当模拟和数字引脚?


作为对某些答案的补充...二进制值是指数字输入或输出。它可以是1(应该是电源电压,称为“ hi”或“ on”)或0(表示0V,称为“ lo”或“ off”)。那是1位分辨率。模拟输入的范围通常为0V至VCC(电源电压)。具有8位分辨率的数字芯片会将此模拟输入转换为范围为0-255(二进制:00000000-11111111)的8位数字信号,因为2 ^ 8-1 = 255(二进制表示以2为底,8来自8位)部分和“-1”,因为数字内容从0开始计数,而不是1)。
Kurt E. Clothier 2014年

Answers:


14

GPIO引脚是“通用输入/输出”引脚。默认情况下,这仅是高电平或低电平(电压电平,高电平是微控制器的电源电压,低电平通常是地或0V)。但是“高”和“低”的电平通常以电压与电源电压的比例给出。因此,通常高于电源电压66%的任何东西都被认为是逻辑电平“高”,这意味着某些低电压设备可以与高压设备通信,只要该电平落在“高”范围内即可。例如,一个1.8–2.7V的低功耗微控制器或GPS接收器将无法直接与5V的微控制器通信,因为低电压设备将其视为“高”,而高电压设备根本不会认为它是高。这用于使用GPIO作为输入引脚,

有时,您可以通过配置GPIO引脚以供其他板载设备(如“模拟到数字”(ADC)转换器)使用,来将SINGLE引脚用于“模拟”值。该引脚设置为ADC上的一个通道,现在用作ADC的输入,而不是普通的GPIO引脚。然后,可以将ADC设置为采样,并读取ADC的结果寄存器值(如果分辨率为10位,则为0-1024)。

正如有人提到的那样,可以在软件中使用GPIO引脚来产生脉冲宽度调制(PWM)信号的效果,通常以低速进行GPIO切换。大多数微控制器都有专用的PWM发生器,可以将其配置为使用GPIO引脚作为输出引脚,与使用软件控制GPIO生成PWM信号相比,它们非常快速且稳定得多。PWM用于“平均”或“%”样式的信号,并允许您执行诸如昏暗的灯光之类的事情并控制电动机的速度。

GPIO引脚通常按组排列,称为端口。在小型控制器中,它们可能是8位架构,因此端口通常分为8个端口,并且可以通过读取表示这些端口逻辑高/低值的“数据寄存器”来同时读取所有值。针脚。同样,您可以将引脚设置为输出,然后将8位写入数据寄存器,而微控制器GPIO控制器将读取寄存器的更改值,然后根据您刚刚设置的值将其驱动为高电平或将其拉低。

在像Raspberry Pi和BeagleBone这样的较新的控制器(如ARM Cortex A8和A9)中,它们的GPIO控制器和不同的选项非常复杂。它们使用32位架构,因此,即使不是所有的GPIO引脚实际上都可用(某些引脚可能专用或未启用),大多数GPIO引脚仍布置在32引脚模块中。BeagleBone(我之前研究过)的大量针脚有一些非常不错的选择,有时您需要使用“针脚复用器”工具,该工具可用于设置某些针脚的特殊模式例如PWM,脉冲捕获,计时器输出,模拟(ADC)通道输入,甚至(无论如何在BeagleBone上)映射到ARM内核上可用的工业子处理器,但它们被认为是独立处理器,需要按顺序使用自己的引脚映射与外界联系。


您能否举个例子“如何将单个引脚用于'模拟'值”?
帕维尔(Pavel)2015年

@ JimJim2000只是通过RC滤波器的开/关流或适当的PWM流,以在输出上产生平滑的模拟“平均”电压。
KyranF

7

您很可能是指Arduino的模拟输出,通常使用带有软件PWM的GPIO引脚。GPIO通常具有三种状态。高输出,低输出和输入/高阻态(高阻抗,不影响输出)。

PWM快速将输出从“输出高”切换到“输出低”(周期),以创建平均值(占空比),从而产生类似于模拟值的值。通过以50%(或128)的占空比切换二进制GPIO,输出仍然是二进制的,但平均到高电平和低电平之间的一半。

想想一个灯泡。您看到它打开或关闭。但是它确实每秒打开和关闭60次,如此之快,以至于您不会注意到它的闪烁真的很快。但是,请务必缓慢缓慢地手动打开和关闭灯泡,然后您会发现灯泡闪烁。255表示打开100%,小于255表示打开100%。

这就是二进制GPIO可以充当255状态模拟引脚的方式。


谢谢@Passerby,这很清楚。我不是特别关注arduino,而是莓pi和beaglebone。您的意思是说任何引脚的值都可以在0到255之间吗?我对表示值可以是二进制的文档和其他值可以为0-255的文档感到困惑。
2014年

1
@pedalpete RPI和Arduino在人群和想法上有很多重叠之处。但是0到255的PWM是任意的。可以是0到65535,也可以是0到16。0到255是8位精度。255或65535或100%。GPIO仅具有二进制开和关,但您可以使用PWM假装它可以具有更多的开或关功能。这是一种有用的,故意的错觉。
路人2014年

2
灯泡每秒不闪烁60次。灯丝加热并保持加热状态
Scott Seidman 2014年

0

GPIO位可以为0或1。8位GPIO端口由8个连续的位组成,范围为00000000至11111111,即十进制255。这与“模拟”的概念无关


谢谢斯科特,尽管我认为我现在比以前更加困惑。什么是GPIO端口?如果我有一个GPIO引脚(例如在Raspberry Pi上),那么每个引脚都被视为端口吗?如果是这样,每个引脚是否都可以使用上述0-255的十进制范围?
2014年

忽略我的最后一个问题,我明白您现在对端口的含义。
2014年
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.