Compreendendo o GPIO analógico e digital

11

Estou tentando entender o GPIO, e li várias postagens diferentes no blog e acho que estou quase conseguindo, mas ainda estou lutando com algumas coisas.

Eu já vi algumas referências ao GPIO apenas poderem trabalhar com valores binários, mas outras postagens que dizem que o valor pode ser de 0 a 255. Estou assumindo que essa é a diferença entre GPIO analógico e digital. Isso está correto? É possível que um único pino GPIO possa atuar como analógico e digital?

pedalpete
fonte
Como acompanhamento de algumas das respostas ... O valor binário refere-se a uma entrada ou saída digital. Pode ser 1 (que deve ser a tensão da fonte, chamada "oi" ou "ligado") ou 0 (significando 0V, chamado "lo" ou "desligado"). Essa é a resolução de 1 bit. Uma entrada analógica pode ser uma faixa, normalmente de 0V a VCC (a tensão da fonte). Um chip digital com resolução de 8 bits converterá essa entrada analógica em um sinal digital de 8 bits no intervalo de 0 a 255 (binário: 00000000 - 11111111), porque 2 ^ 8 - 1 = 255 (base binária 2, o 8 é do 8 bits parte e "- 1" porque o material digital começa a contar em 0, e não 1).
Kurt E. Clothier

Respostas:

14

Um pino GPIO é um pino de 'entrada / saída de uso geral'. Por padrão, isso é apenas alto ou baixo (níveis de tensão, alta sendo a tensão de alimentação do microcontrolador, baixa geralmente sendo aterrada ou 0V). Mas os níveis de 'alto' e 'baixo' são geralmente dados em tensões como uma proporção da tensão de alimentação. Portanto, qualquer coisa geralmente acima de 66% da tensão de alimentação é considerada um nível lógico 'alto', o que significa que alguns dispositivos de baixa tensão podem conversar com dispositivos de alta tensão, desde que os níveis caiam dentro do que é considerado 'alto'. Um microcontrolador de baixa potência de 1,8–2,7V ou receptor de GPS, por exemplo, terá problemas para se comunicar diretamente com um microcontrolador de 5V, porque o que o dispositivo de baixa tensão vê como 'alto' o dispositivo de alta tensão nem pensa que é alto. Isso é para usar o GPIO como um pino de entrada,

Às vezes, você pode usar um pino ÚNICO para valores 'analógicos', configurando o pino GPIO para ser usado por outros dispositivos integrados, como um conversor 'analógico para digital' (ADC). O pino está definido como um canal no ADC e agora atua como uma entrada para o ADC, não como um pino GPIO normal. Em seguida, você pode definir o ADC para obter uma amostra e ler o valor do registro de resultados do ADC para números como 0-1024, se a resolução for de 10 bits.

Como alguém mencionou, um pino GPIO pode ser usado em software para fornecer o efeito de um sinal PWM (Pulsed Width Modulation), geralmente em baixa velocidade para alternar o GPIO. A maioria dos microcontroladores possui geradores PWM dedicados que podem ser configurados para usar um pino GPIO como pino de saída, e estes são muito rápidos e muito mais estáveis ​​do que o uso de software para controlar o GPIO para gerar um sinal PWM. O PWM é usado para sinais no estilo 'médio' ou '%' e permite que você faça coisas como luzes fracas e controle a velocidade de um motor.

Os pinos GPIO geralmente são organizados em grupos, chamados Portas. Em controladores pequenos, eles podem ser de arquitetura de 8 bits, portanto as portas geralmente são agrupadas em lotes de 8 e seus valores podem ser lidos ao mesmo tempo, lendo um 'registro de dados' que representa os valores lógico alto / baixo desses alfinetes. Da mesma forma, você pode definir os pinos como saídas e, em seguida, gravar 8 bits em um registro de dados, e o controlador GPIO dos microcontroladores lerá os valores alterados do registro e elevará o pino ou o puxará para baixo, dependendo do valor que você acabou de definir.

Em controladores mais novos, como o ARM Cortex A8 e A9, como no Raspberry Pi e BeagleBone, seus controladores GPIO e opções diferentes são muito complicados. Eles usam uma arquitetura de 32 bits; portanto, a maioria dos pinos GPIO é organizada em blocos de 32 pinos, mesmo que nem todos sejam realmente utilizáveis ​​(alguns podem ser dedicados ou não habilitados). O BeagleBone (no qual trabalhei antes) tem algumas opções realmente impressionantes para sua grande quantidade de pinos, e às vezes você precisará usar uma ferramenta 'pin mux', que permite configurar os modos especiais de certos pinos para coisas como PWM, captura de pulso, saídas de timer, entradas de canal analógico (ADC) e até mesmo (no BeagleBone de qualquer maneira) mapeamento para os subprocessadores industriais disponíveis no núcleo ARM, mas são considerados processadores independentes e precisam de seu próprio mapeamento de pinos. estar conectado ao mundo exterior.

KyranF
fonte
Você poderia dar um exemplo de como "SINGLE pin pode ser usado para valores 'analógicos'"?
Pavel
@ JimJim2000 apenas um fluxo de ligar / desligar ou PWM adequado através de um filtro RC para produzir uma tensão "média" analógica suave na saída.
KyranF
7

Você provavelmente está se referindo à saída analógica do Arduino, que geralmente usa um pino GPIO com o software PWM . O GPIO normalmente possui três estados. Saída alta, Saída baixa e Entrada / Alto-Z (alta impedância, onde não afeta a saída).

O PWM alterna rapidamente uma saída de Saída alta para Saída baixa (período), para criar uma média (Ciclo de serviço), permitindo algo que se parece com um valor analógico. Ao alternar um GPIO binário em um ciclo de trabalho de 50% (ou 128), a saída ainda é binária, mas a média fica na metade do caminho entre Alto e Baixo.

Pense em uma lâmpada. Você vê Ligado ou Desligado. Mas é realmente ligar e desligar 60 vezes por segundo, tão rápido que você nem percebe que está piscando muito rápido. Mas ligue e desligue a lâmpada manualmente bem devagar e você percebe que está piscando. Por 255, significa 100% ativado e menos de 255 é uma fração de 100% ativado.

É assim que um GPIO binário pode agir como um pino analógico de 255 estados.

Transeunte
fonte
Obrigado @Passerby, isso é muito mais claro. Não estou olhando especificamente para o arduino, mas para o raspberry pi e o beaglebone. O que você está dizendo significa que qualquer pino pode ter um valor entre 0 e 255? Estou ficando confuso entre a documentação que diz que um valor pode ser binário versus outros que dizem que um valor pode ser de 0 a 255.
Pedalpete 28/03
1
@pedalpete, o RPI e o Arduino têm muita sobreposição na multidão e nas idéias. Mas um PWM de 0 a 255 é arbitrário. Pode ser de 0 a 65535 ou 0 a 16. 0 a 255 são 8 bits de precisão. Onde 255 ou 65535 ou o que for 100%. Um GPIO possui apenas Binário ativado e desativado, mas você usa o PWM para fingir que pode ter mais do que apenas ativar ou desativar. É uma ilusão de ótica útil e intencional.
quer
2
Uma lâmpada não pisca 60 vezes por segundo. O filamento aquece-se e estadias aquecido
Scott Seidman
0

Um bit GPIO pode ser 0 ou 1. Uma porta GPIO de 8 bits, composta por 8 bits consecutivos, pode variar entre 00000000 e 11111111 ou 255 decimal. Isso tem pouco a ver com o conceito de "analógico"

Scott Seidman
fonte
Obrigado Scott, embora eu esteja mais confuso agora do que antes. O que é uma porta GPIO? Se eu tiver um pino GPIO (exemplo em um Raspberry Pi), cada pino é considerado uma porta? Nesse caso, cada pino é capaz de trabalhar com o referido intervalo de 0 a 255?
pedalpete
Ignore minha última pergunta, entendo o que você quer dizer com uma porta agora.
Pedalpete 28/03