Gerando PWM na Raspberry Pi

raspberry-pi

Introdução

A modulação por largura de pulso (MLP), mais conhecida pela sigla em inglês PWM (Pulse-Width Modulation), é uma técnica de modulação que gera uma onda quadrada, baseada na variação da largura de pulso de acordo com um valor chamado de duty cycle. Embora essa técnica de modulação possa ser utilizada para codificar a informação para transmissão, a sua utilização principal é permitir o controle da energia fornecida aos dispositivos elétricos, especialmente motores. Neste artigo apresentarei como implementar o PWM na Raspberry Pi.

Em dois posts anteriores foi referenciada a modulação PWM. No artigo de Fabio Souza foi abordado o controle de saídas PWM em um Arduino, e no artigo de Rodrigo Almeida, com a colaboração de seus alunos, também foi estudado o controle de motores utilizando PWM.

O termo duty cycle (ciclo de trabalho) descreve a proporção de tempo em nível alto de tensão em um intervalo regular ou período de tempo. O tempo em baixo nível de tensão corresponde à baixa potência, quando o duty cycle fica abaixo de 50%, porque a potência está desligada pela maior parte do tempo. E para valores acima de 50% temos uma potência maior conforme o duty se aproxima de 100%. O duty cycle é expresso em porcentagem, sendo 100% o valor máximo.

A modulação por largura de pulso usa uma onda de pulso retangular cujo pulso é modificado resultando em uma variação do valor médio da forma de onda. Se nós considerarmos um pulso de forma de onda f(t), com período T, valor mínimo Ymin, valor máximo Ymax e duty cycle D, a valor médio da onda é dado por:

valor_media_PWM

(Eq. 1)

Como f(t) é um pulso de onda, seu valor é Ymax para 0 < t < D*T e Ymin para D*T < t < T. A expressão se torna:

valor_media_PWM02

(Eq. 2)

Aplicações

As aplicações de PWM são inúmeras. Veremos apenas algumas no texto a seguir.

Servo Motor

O PWM pode ser usado para controlar servo motores. O ângulo é determinado pela duração de um pulso que é aplicado ao fio de controle. A posição do servo não é definida pelo ciclo PWM (isto é, tempo de ON vs OFF), mas apenas pela duração do pulso. O servo espera um pulso a cada 20 ms, no entanto, isto pode variar dentro de uma ampla gama que difere de servo para servo. O comprimento do pulso determina a distância que o motor irá percorrer. Por exemplo, um pulso de 1,5 ms irá fazer motor girar para a posição de 90 graus (posição neutra).

Telecomunicações

Em telecomunicações, PWM é uma forma de modulação de sinal em que as larguras dos pulsos correspondem a valores específicos de dados codificados em uma extremidade e descodificados na outra. Pulsos de vários comprimentos, a própria informação, serão enviados em intervalos regulares (a frequência portadora da modulação).

Entrega de Potência

PWM pode ser utilizado para controlar a quantidade de energia fornecida a uma carga, sem incorrer nas perdas que resultam da entrega de potência linear por meios resistivos. Desvantagens potenciais para esta técnica são as pulsações definidas pelo ciclo de trabalho, a freqüência de comutação e as propriedades da carga. Com uma frequência de comutação suficientemente elevada e, quando necessário, utilizando filtros eletrônicos passivos suplementares, o trem de pulsos pode ser suavizado e a forma de onda média analógica recuperada.

Este é o método usado em fontes chaveadas, como as fontes de computadores. Dessa forma ela entrega apenas a potência “exigida” pela carga, economizando energia elétrica quando possível e proporcionando um melhor controle da potência.

Reguladores de Tensão

PWM é também usado em reguladores de tensão eficientes. Ao mudar a tensão para a carga, com o ciclo de trabalho adequado, a saída se aproximará de uma tensão do nível desejado. O ruído de comutação é geralmente filtrado com um indutor e um capacitor.

PWM na Raspberry Pi
Figura 1: Raspberry Pi

PWM na Raspberry Pi

O controlador PWM incorpora as seguintes características:

  • Duas saídas independentes de bit-streams, alimentadas por uma frequência fixa;
  • Bit-streams configuradas individualmente para saída PWM ou uma versão serializada de uma palavra de 32 bits;
  • As saídas PWM têm resoluções de saída e entrada variáveis;
  • Modo serializado configurado para carregar dados e/ou ler dados de um bloco FIFO, que pode armazenar até oito palavras de 32 bits;
  • Ambos os modos são alimentados por clk_pwm que normalmente é 100MHz, mas pode ser variado pelo gerenciador de clock.

Gerando PWM na Raspberry Pi

Utilizando a biblioteca wiringPI é possível gerar PWM por software ou por hardware na Raspberry Pi. Vamos nos focar no uso do PWM por hardware. Para iniciarmos o uso do PWM por hardware chamamos a função: 

Para configurar a frequência do sinal PWM devemos usar as funções pwmSetClock() e pwmSetRange(). O intervalo válido para pwmSetClock() parece ir de 2 a 4095, enquanto o intervalo válido para pwmSetRange() é de até 4096. Tanto o intervalo (range) quanto o clock afetam a frequência.

O intervalo (range) também afeta a resolução, por isso, embora possa ser possível a utilização de valores muito baixos, há um limite prático para o quão baixo você provavelmente vai querer ir. Por exemplo, se você usa o intervalo de 4, você poderia alcançar altas frequências, mas estaria habilitado apenas a configurar o ciclo de trabalho para 0/4, 1/4, 2/4, 3/4 or 4/4.

O clock do PWM da Raspberry Pi tem uma frequência base de 19,2 MHz. Essa frequência, divida pelo argumento de pwmSetClock(), é a frequência em que o contador PWM é incrementado. Quando o contador atinge um valor igual ao intervalo especificado, ele reinicia para zero. Enquanto o contador é menor do que o ciclo de trabalho especificado, a saída é alta, caso contrário, a saída é baixa.

Isso significa que, se você deseja definir o PWM para ter uma freqüência específica, você pode usar a seguinte relação:

Código fonte de um exemplo:

Para compilar na própria Raspberry, digite:

Referências

PWM – Wikipedia

Driver de PWM pra Rasp

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Hardware » Gerando PWM na Raspberry Pi
Comentários:
Notificações
Notificar
guest
12 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Mauro Assis
07/07/2015 14:06

Vinícius,

Muito bom o seu post, parabéns.

Vc acha que seria possível controlar o movimento de quatro servos somente usando o Pi? Quer dizer, vc acha que ele geraria os pulsos com a precisão necessária?

[],

Mauro

Vinicius Maciel
vinifr
Reply to  Mauro Assis
07/07/2015 14:28

A Raspberry tem apenas um PWM por hardware, que fica no pino 18. Então se a frequência que você pretende usar não for muito alta, é possível sim. Pelo meus testes valores acima de 2KHz já não fica muito preciso. Usando um RTOS atrelado ao Linux, como o Xenomai, é possível melhorar esse tempo.

Mas se você precisa de uma frequência maior, a Beaglebone Black é mais apropriada, já que tem 8 PWMs por hardware: http://beagleboard.org/support/bone101 e 25 PRU I/Os, que são IOs de baixa latência.

Mauro Assis
Reply to  vinifr
10/07/2015 09:49

Pois é, o problema é justamente esse, os servos trabalham com frequências em torno de 2 kHz. Não creio que ele controlará os servos direito. Fiz um projeto com dois servos pequenos e ele não deu conta. Achei que pudesse ter um outro jeito, mas acabei de crer que rola não.

O bom e barato é colocar um Arduino mini do lado do Pi, plugar um no outro via i2c ou serial ou whatever e cada um no seu quadrado…

Tks!

Vinicius Maciel
vinifr
Reply to  Mauro Assis
10/07/2015 09:57

Mas você já tentou a solução indicada aqui? https://www.raspberrypi.org/forums/viewtopic.php?t=36572&p=308067 … Dá pra gerar pulsos de até 1us, o que dá 1MHz.

Mauro Assis
Reply to  vinifr
10/07/2015 10:15

Pois é, Vinicius, mas isso é em um pino, tanto é que no exemplo ele nem define o onde o servo será ligado.

Por outro lado, a resolução é grande, ou seja, daria para fazer uma brincadeira com um 74HC595 para multiplexar a saída.. como o 595 trabalha a até 100 Mhz, ele não interferiria. Aí moveria-se um servo de cada vez, e se bobear daria para fazer isso até “simultaneamente”, ou seja, dando a ilusão que os servos se movem juntos. Tem que ver só como ele funciona com 3V3.

Vou testar isso no finde…

Vinicius Maciel
vinifr
Reply to  Mauro Assis
10/07/2015 10:20

Não não, na verdade você pode usar até 8 pinos, pelo menos de acordo com esse código indicado pelo cara do fórum: https://github.com/metachris/RPIO/blob/master/source/c_pwm/servod.c#L62

Mauro Assis
Reply to  vinifr
10/07/2015 14:31

Uai, bicho, não é que vc tem razão??? Vou testar lá, depois dou notícias.

Tks!

Vinicius Maciel
vinifr
Reply to  Mauro Assis
07/07/2015 14:49
Flavio Andrade
Flavio Andrade
03/11/2014 20:59

kra, post muito interessante e bem explicado….

trackback
07/04/2015 08:58

[…] Gerando PWM com a Raspberry PI, artigo escrito por Vinicius Maciel […]

trackback
11/12/2014 02:37

[…] Gerando PWM com a Raspberry Pi [13], escrito por Vinicius […]

trackback
26/11/2014 00:30

[…] PWM com a Raspberry PI [19], escrito por Vinicius […]

Talvez você goste:

Séries

Menu