Posso usar o GPIO como uma saída de modulação por largura de pulso ?
Em caso afirmativo, como eu faria para fazer isso e quantas saídas PWM distintas e simultâneas posso ter?
Comentários
- Você provavelmente precisa especificar qual modelo você ‘ está usando. Todos eles são ligeiramente diferentes.
- @ user1147688 Esta pergunta foi feita quando havia apenas um modelo!
Resposta
Conforme sugerido por Alex Chamberlain , a biblioteca WiringPi aparece para suportar a saída PWM de hardware em um ou dois pinos GPIO, dependendo do modelo, e software PWM em qualquer um dos outros pinos GPIO. Enquanto isso, a biblioteca RPIO.PWM faz PWM por DMA em qualquer pino GPIO. Efetivamente, esta é uma casa intermediária entre hardware e software PWM, fornecendo uma resolução de temporização de 1 µs em comparação com 100 µs com WiringPi “s Software PWM [1] .
Qual destes é adequado para seus aplicativos depende de quantas saídas PWM você precisa e qual desempenho deseja dessas saídas.
Se seu aplicativo é tolerante com baixa resolução de temporização e jitter , então você pode usar um software ou loop de temporização assistido por DMA. Se desejar maior precisão / menor jitter PWM, então você pode precisar de assistência de hardware.
Quando o software PWM é adequado?
Se você deseja piscar um monte de LEDs com diferentes cadências visíveis humanas (10 “s de hertz) com os requisitos de resposta soft real-time , então o loop de software poderia lidar com tantos PWM “s quantos pinos GPIO você tiver.
Quando o hardware PWM pode ser adequado?
Se você deseja controlar um servidor o motor com requisitos de resposta em tempo real rígido , então você precisará usar o hardware PWM. Mesmo assim, você pode ter problemas para garantir uma resposta em tempo real para o servo loop que vincula a entrada do codificador à saída PWM.
Um servo loop estável precisa ler encoders em uma taxa regular (low jitter), escrever valores de saída PWM revisados em uma taxa regular e a latência entre eles deve ser corrigida (low jitter em geral). Se você não puder fazer isso, terá que subentender (fazer um ajuste suave) do motor para evitar que ele se torne instável sob carga. Isso é difícil de fazer com um sistema operacional multitarefa sem suporte de baixo nível.
E se eu precisar de mais saídas de PWM de hardware?
Se você precisar executar mais loops de servo do que saídas de PWM de hardware, provavelmente precisará transferi-los para outro dispositivo para garantir desempenho em tempo real, relegando seu Raspberry Pi a um supervisor soft em tempo real.
Uma opção seria algo como Adafruit PWM / Servo Driver de 16 canais e 12 bits – interface I²C – PCA9685 que permitiria a você controlar 16 saídas PWM com apenas alguns pinos de GPIO para o barramento I²C. Para um exemplo de seu uso, confira a postagem I²C 16 Channel PWM / Servo Breakout – Working nos fóruns do Raspberry Pi.
1. Agradecimentos a dm76 pela sugestão, no entanto heather diz que RPIO.PWM pode não funcionar mais para modelos pi mais recentes.
Comentários
- Posso usar a abordagem de software PWM para operar motores DC?
- @gideon – Sim, os amplificadores de potência do motor que usei tomaram PWM como entrada.
- FYI, a biblioteca RPI ( pythonhosted.org/RPIO/pwm_py.html ) parece ter uma resolução muito melhor (1us) em comparação com WiringPi com Resolução 100us
- @MarkBooth – Sem probs. A biblioteca é realmente bem escrita e pode ser usada como substituto direto para RPi.GPIO, o que é muito útil se você iniciou um projeto com o último e depois percebeu que os sinais PWM eram necessários …
- RPIO. PWM pode não funcionar mais para modelos pi mais recentes, eu acho.
Resposta
Hardware PWM
Sim, há uma saída de hardware PWM no Raspberry Pi, conectado a 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 do fórum ).
Exemplo de código
Você pode usar o Biblioteca WiringPi para controlar o pino PWM; você pode olhar o código para evitar incluir a biblioteca inteira.
Software PWM
O Raspberry Pi não é adequado para nenhum software PWM sério, pois o Linux não é um sistema operacional em tempo real .
Comentários
- Pergunta, qual é a definição ou um exemplo de software PWM sério? E o que são ” sistemas operacionais em tempo real ” e há alguma chance de obter um em um Pi
- @AnthonyBlake Bem, provavelmente você pode controlar o brilho de uma luz usando o software PWM, mas suspeito que o motor parará. Porém, ‘ não há necessidade de fazer PWM de software, o hardware é mais simples e eficaz. Os sistemas operacionais em tempo real serão melhor explicados pelo Google; eles garantem certas coisas sobre por quanto tempo e frequência o software é executado.
- @AnthonyBlake A ” Sistema operacional em tempo real ” (RTOS) é um sistema operacional que lhe dá garantia sobre o limite de tempo superior de execução. Como dizer ao programa ” Sim, você terá algum tempo de execução em 33 ms (tolerância de 2 ms com mais ou menos) para inverter aquele bit de pino GPIO para dar ao seu motor de passo um sinal exato janela de tempo em que ele precisa. E você pode confiar nisso! ” Há ‘ um RT Linux por aí. Não ‘ não sei se ‘ foi portado para o RPi (ainda).
- Desculpe Alex, eu não ‘ t intencionalmente roubou outra parte de sua resposta, mas ‘ acabei de notar que chegamos à mesma postagem do fórum por caminhos diferentes .
- Modelos mais novos com 40 pinos têm um segundo PWM de hardware conectado ao GPIO19 (pino 35).
Resposta
O Pis recente tem dois canais PWM de hardware. Além disso, pulsos PWM cronometrados por hardware podem ser gerados independentemente em todos os GPIO conectados ao cabeçalho de expansão de 40 pinos.
Na prática, isso significa que há 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.
Comentários
- Boa resposta! Como posso usar esses dois HW PWMs? Preciso controlar 2 servos, sei que dizes servoblaster e pigpio para isso, mas só me pergunto sobre o HW PWM, porque não consigo encontrar nada sobre eles … existem alguns documentos para ele por aí? Tenho um RPi 2 V1.1 para testes.
- C , Python , linha de comando pigs .
- A carga pesada da CPU não deve ‘ causar um diferença. A carga pesada da rede pode fazer a diferença para o gpioServo, especialmente se a amostragem for de 1 MHz em vez dos 200 kHz padrão. A frequência é 50 (Hz), a faixa de ciclos de trabalho será de 0 – 1000000 (mapeado para o valor subjacente verdadeiro de 0 – 5000000). 1 ms é 1 ms em 20 ms, portanto, um ciclo de trabalho de 5%, então 50000, 1,5 ms- > 7,5% – > 75000, 2 ms – > 10% – > 100000.
- Página 102 de BCM2835 ARM Peripherals mostra os vários modos que o GPIO pode ser atribuído. Procure on-line quais GPIOs são direcionados para os vários cabeçalhos de expansão do modelo Pi.
- @ user1147688 PLLD (500 MHz) é usado como o relógio PWM principal. Devido à forma como ” ele ” funciona, a frequência do núcleo PWM é 250 MHz. Para poder ligar e desligar (bastante essencial para PWM), o máximo é 125 MHz. Você poderia dobrar os números usando PLLC (1000 MHz), mas esse PLL varia com a velocidade do clock do núcleo.
Resposta
Não é exatamente um sistema operacional em tempo real, mas o RISC OS para Raspberry Pi é multitarefa cooperativa, então você pode facilmente executar um aplicativo que tem 100% de CPU, você pode gerenciar seus tempos muito melhor. Só não espere fazer nada além de seu próprio código.
Comentários
- Li em algum lugar que há um limite de hardware quanto à troca frequência de um pino de saída também. Acho que era em torno de 20 MHz. Portanto, não ‘ espere poder extrair 300 MHz PWM ou qualquer coisa desse tipo, mesmo com 100 % De uso da CPU.
- @Wallacoloo: Quais aplicativos exigem 300 MHz PWM?
- @PeterMortensen: Bem, eu não ‘ não sei como o rádio transmissores e outros geram seus sinais, mas alguns podem fazê-lo com PWM. PiFM faz isso a 100 MHz. Isso parece contradizer meu comentário, então eu me pergunto se talvez o pino ainda possa ser comandado nessa frequência, mas ‘ s apenas que a capacitância do pino atenua tais sinais, de modo que uma onda quadrada de 100 MHz pode realmente oscilar de, por exemplo, (1,0 V, 2,3 V) em vez do total (0 V, 3,3 V) faixa.
Resposta
Encontrei esta biblioteca ( pi -blaster ) que afirma ser “extremamente eficiente: não usa a CPU e fornece pulsos muito estáveis.”
Eu não testei ainda, mas vou atualizar assim que o fizer (provavelmente hoje)
Comentários
- Eu ‘ tenho tentado isso, mas até agora sem sorte. Pelo que posso dizer, não ‘ realmente troca o hardware?
- Só quero dar um jeito nisso. O Pi-blaster funcionou para mim onde essas outras respostas não.