Posso usar o GPIO para modulação por largura de pulso (PWM)?

97

Posso usar o GPIO como uma saída de modulação por largura de pulso ?

Nesse caso, como eu faria isso e quantas saídas PWM distintas e simultâneas posso ter?

berry120
fonte
Você provavelmente precisa especificar qual modelo está usando. Eles são todos ligeiramente diferentes.
precisa saber é o seguinte
2
@ user1147688 Esta pergunta foi feita quando havia apenas um modelo!
precisa saber é o seguinte

Respostas:

76

Conforme sugerido por Alex Chamberlain , a biblioteca WiringPi parece oferecer suporte à saída PWM de hardware em um ou dois pinos GPIO, dependendo do modelo, e PWM de software em qualquer um dos outros pinos GPIO. Enquanto isso, a biblioteca RPIO.PWM executa PWM por DMA em qualquer pino GPIO. Efetivamente, essa é uma solução intermediária entre o PWM de hardware e software, fornecendo uma resolução de tempo de 1 µs em comparação com 100 µs com o Software PWM da WiringPi [1] .

Qual dessas opções é adequada para seus aplicativos depende de quantas saídas PWM você precisa e de qual desempenho deseja dessas saídas.

Se o seu aplicativo tolerar baixa resolução e instabilidade alta , você poderá usar um software ou um loop de sincronização assistido por DMA. Se você deseja maior precisão / menor instabilidade PWM, pode precisar de assistência com o hardware.

Quando o software PWM pode ser adequado?

Se você quiser piscar vários LEDs com diferentes cadências visíveis humanas (10 'de hertz) com requisitos de resposta em tempo real , então o loop do software pode lidar com tantos PWMs quanto os pinos GPIO.

Quando o PWM de hardware pode ser adequado?

Se você deseja controlar um servo motor com requisitos de resposta em tempo real , precisará usar o PWM de hardware. Mesmo assim, você pode ter problemas para garantir uma resposta em tempo real para o loop servo que liga a entrada do codificador à saída PWM.

Um loop servo estável precisa ler os codificadores a uma taxa regular (jitter baixo), escrever os valores de saída PWM revisados ​​a uma taxa regular e a latência entre eles deve ser fixa (jitter baixo geral). Se você não puder fazer isso, terá que subestimar (afinar) seu motor para evitar que ele se torne instável sob carga. É difícil fazer isso com um sistema operacional multitarefa sem suporte de baixo nível.

E se eu precisar de mais saídas PWM de hardware?

Se você precisar executar mais servo-loops do que as saídas PWM de hardware, provavelmente precisará transferi-los para outro dispositivo para garantir um desempenho em tempo real, relegando o seu Raspberry Pi a ser um supervisor em tempo real .

Uma opção seria algo como o driver PWM / Servo Adafruit de 16 canais e 12 bits - interface I²C - PCA9685, que permitiria controlar 16 saídas PWM com apenas alguns pinos de GPIO para o barramento I²C. Para um exemplo de seu uso, consulte a publicação I²C 16 Channel PWM / Servo Breakout - Working nos fóruns do Raspberry Pi.

1. Graças a dm76 pela sugestão, no entanto, heather diz que o RPIO.PWM pode não funcionar mais nos modelos pi mais recentes.

Mark Booth
fonte
Posso usar a abordagem PWM de software para executar motores de corrente contínua?
Gideon
@gideon - Sim, todos os amplificadores de potência do motor que utilizei utilizaram o PWM como entrada.
Mark Booth
2
FYI, a biblioteca RPI ( pythonhosted.org/RPIO/pwm_py.html ) parecem ter uma resolução muito melhor (1us) em comparação com WiringPi com 100us resolução
dm76
@MarkBooth - Sem probs. A biblioteca é muito bem escrita e pode ser usada como substituto do RPi.GPIO, o que é muito útil se você iniciou um projeto com o último e percebeu posteriormente que eram necessários sinais PWM ...
dm76
RPIO.PWM pode não funcionar mais para modelos pi mais recentes, eu acho.
urze
39

PWM de hardware

Sim, há uma saída PWM de hardware no Raspberry Pi, conectada à P1-12 (GPIO18). Além disso, as saídas PWM podem ser adicionadas usando uma interface I²C ou SPI ; algumas pessoas tiveram sucesso com isso ( postagem no fórum ).

Código de exemplo

Você pode usar a biblioteca WiringPi para controlar o pino PWM; você pode olhar o código para evitar a inclusão de toda a biblioteca.

Software PWM

O Raspberry Pi não é adequado para nenhum software sério de PWM, pois o Linux não é um sistema operacional em tempo real.

Alex Chamberlain
fonte
1
Pergunta, qual é a definição ou um exemplo de software PWM sério? E o que são "sistemas operacionais em tempo real" e existe alguma chance de conseguir um em um Pi
AnthonyBlake 17/08/12
@AnthonyBlake Bem, você provavelmente pode controlar o brilho de uma luz usando o software PWM, mas suspeito que um motor irá parar. Porém, não há necessidade de fazer o software PWM, o hardware é mais simples e mais eficaz. Os sistemas operacionais em tempo real serão melhor explicados pelo Google; eles garantem certas coisas sobre quanto tempo e frequentemente o software é executado.
Alex Chamberlain
2
@AnthonyBlake Um "SO em tempo real" (RTOS) é um sistema operacional que oferece uma garantia no limite superior de tempo de execução. Como dizer ao programa "Sim, você terá algum tempo de execução em 33 ms (tolerância de 2 ms ou mais) para inverter esse bit GPIO do GPIO para dar ao seu motor de passo um sinal na janela de tempo exata quando ele precisar. E você pode confiar naquilo!" Há um RT Linux por aí. Não sei se já foi portado para o RPi.
orithena
Desculpe, Alex, não roubei intencionalmente outra parte da sua resposta, mas acabei de perceber que chegamos ao mesmo post do fórum por diferentes rotas.
Mark Booth
2
Os modelos mais novos com 40 pinos têm um segundo PWM de hardware conectado ao GPIO19 (pino 35).
Kevin
12

Os Pis recentes têm dois canais PWM de hardware. Além disso, os pulsos PWM cronometrados por hardware podem ser gerados independentemente em todo o GPIO conectado ao cabeçalho de expansão de 40 pinos.

Na prática, isso significa que existem dois canais PWM altamente precisos e todos os outros GPIOs podem ter PWM estilo Arduino (800 Hz, 0 desligado - 255 totalmente ligado).

Por exemplo, servoblaster e meu pigpio , etc.

joan
fonte
Boa resposta! Como posso usar esses dois HW PWMs? Eu preciso controlar 2 servos, eu sei que você diz que servoblaster e pigpio são bons para isso, mas eu me pergunto sobre o HW PWM, porque não consigo encontrar nada sobre eles ... existem alguns documentos para isso por aí? Eu tenho um RPi 2 V1.1 para testes.
26416 Kozuch
2
A carga pesada da CPU não deve fazer diferença. A carga pesada da rede pode fazer a diferença para o gpioServo, especialmente se for amostrada a 1 MHz e não aos 200 kHz padrão. A frequência é 50 (Hz), o intervalo de ciclos de serviço será de 0 a 1000000 (mapeado para o verdadeiro valor subjacente de 0 a 5000000). 1 ms é 1 ms em 20 ms; portanto, um ciclo de trabalho de 5%, portanto, 50000, 1,5ms-> 7,5% -> 75000, 2ms-> 10% -> 100000.
joan
1
A página 102 do BCM2835 ARM Peripherals mostra os vários modos aos quais o GPIO pode ser atribuído. Procure on-line quais GPIO são direcionados para os vários cabeçalhos de expansão do modelo Pi.
Joan
1
@ user1147688 PLLD (500 MHz) é utilizado como o relógio PWM principal. Devido à maneira como "ele" funciona, a frequência do núcleo PWM é de 250 MHz. Para poder ligar e desligar (essencial para o PWM), o máximo é 125 MHz. Você pode dobrar os números usando PLLC (1000 MHz), mas esse PLL varia com a velocidade do clock do núcleo.
21716
2

Não é um sistema operacional em tempo real, mas o RISC OS para Raspberry Pi é multitarefa cooperativa, para que você possa executar facilmente um aplicativo que tenha 100% da CPU, para gerenciar melhor seus tempos. Só não espere fazer mais nada além do seu próprio código.

John
fonte
Li em algum lugar que também há um limite de hardware para a frequência de comutação de um pino de saída. Eu acho que foi em torno de 20 MHz. Portanto, não espere ser capaz de extrair 300 MHz PWM ou qualquer coisa desse tipo, mesmo com 100% de uso da CPU.
Ponkadoodle
@ Wallacoloo: Quais aplicativos requerem 300 MHz PWM?
Peter Mortensen
2
@ PeterMortensen: Bem, eu não sei como transmissores de rádio e outros geram seus sinais, mas alguns podem fazê-lo com PWM. O PiFM faz isso em 100 MHz. Porém, isso parece contradizer o meu comentário, então eu me pergunto se talvez o pino ainda possa ser comandado nessa frequência, mas é apenas que a capacitância do pino atenua esses sinais, para que uma onda quadrada de 100 MHz possa realmente oscilar, por exemplo (1,0 V , 2,3 V) em vez da faixa completa (0 V, 3,3 V).
precisa saber é o seguinte
2

Eu encontrei esta biblioteca ( pi-blaster ) que afirma ser "extremamente eficiente: não usa a CPU e fornece pulsos muito estáveis".

Ainda não testei, mas atualizarei assim que o fizer (provavelmente hoje)

Glantucan
fonte
Eu tenho tentado isso, mas até agora sem sorte. Até onde eu sei, não muda realmente o hardware?
precisa saber é o seguinte
1
Só quero esbarrar nisso. Pi-blaster trabalhou para mim onde essas outras respostas não.
Seph Reed